package cmd import ( "fmt" "os/exec" "runtime" "strings" "github.com/spf13/cobra" ) var logsCmd = &cobra.Command{ Use: "logs [container]", Short: "Open Dozzle in the browser, optionally deep-linking to a container", Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg, client, _, err := setup() if err != nil { return err } logsBase := deriveLogsURL(cfg.Portainer.URL) if len(args) == 0 { fmt.Printf("Opening %s\n", logsBase) return openBrowser(logsBase) } containerName := args[0] id, err := client.FindContainer(containerName) if err != nil { return err } // Dozzle uses a short ID (first 12 chars) shortID := id if len(shortID) > 12 { shortID = shortID[:12] } url := logsBase + "/container/" + shortID fmt.Printf("Opening %s\n", url) return openBrowser(url) }, } func init() { rootCmd.AddCommand(logsCmd) } func deriveLogsURL(portainerURL string) string { domain := stripScheme(portainerURL) // Replace "portainer." prefix with "logs." if idx := strings.Index(domain, "."); idx != -1 { return "https://logs." + domain[idx+1:] } return "https://logs." + domain } func stripScheme(u string) string { for _, prefix := range []string{"https://", "http://"} { if strings.HasPrefix(u, 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() }