Files
homelab/knecht/cmd/logs.go
2026-04-04 15:05:08 +02:00

81 lines
1.6 KiB
Go

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.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()
}