package cmd import ( "fmt" "os/exec" "runtime" "github.com/spf13/cobra" ) var logsCmd = &cobra.Command{ Use: "logs", Short: "Open the Dozzle log viewer in the browser", RunE: func(cmd *cobra.Command, args []string) error { cfg, _, _, err := setup() if err != nil { return err } // Derive logs URL from Portainer URL (same base domain) // e.g. https://portainer.home.jens.pub → https://logs.home.jens.pub logsURL := deriveLogsURL(cfg.Portainer.URL) fmt.Printf("Opening %s\n", logsURL) return openBrowser(logsURL) }, } func init() { rootCmd.AddCommand(logsCmd) } func deriveLogsURL(portainerURL string) string { // Replace "portainer." prefix with "logs." return fmt.Sprintf("https://logs.%s", domainFromURL(portainerURL)) } func domainFromURL(u string) string { // Strip scheme and find domain after first dot u = stripScheme(u) for i, c := range u { if c == '.' { return u[i+1:] } } return u } func stripScheme(u string) string { for _, prefix := range []string{"https://", "http://"} { if len(u) > len(prefix) && u[:len(prefix)] == prefix { return u[len(prefix):] } } return u } func openBrowser(url string) error { var cmd *exec.Cmd switch runtime.GOOS { case "darwin": cmd = exec.Command("open", url) case "linux": cmd = exec.Command("xdg-open", url) default: return fmt.Errorf("unsupported platform: %s", runtime.GOOS) } return cmd.Start() }