add knecht
This commit is contained in:
68
knecht/cmd/logs.go
Normal file
68
knecht/cmd/logs.go
Normal file
@@ -0,0 +1,68 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user