From 87752492d0dc7df3cf78011d5ce315a3eb0cad51 Mon Sep 17 00:00:00 2001 From: bndw Date: Fri, 23 Jan 2026 21:52:50 -0800 Subject: Restructure CLI with Cobra Replace custom switch-based routing with Cobra for cleaner command hierarchy. Reorganize commands into logical groups: - Root command handles deployment (--binary, --static, --domain, etc.) - App management at top level: list, logs, status, restart, remove - env subcommand group: list, set, unset - host subcommand group: init, status, update, ssh - Standalone: ui (renamed from webui), version Add version command with ldflags support for build info. --- cmd/deploy/logs.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 cmd/deploy/logs.go (limited to 'cmd/deploy/logs.go') diff --git a/cmd/deploy/logs.go b/cmd/deploy/logs.go new file mode 100644 index 0000000..2b016b8 --- /dev/null +++ b/cmd/deploy/logs.go @@ -0,0 +1,75 @@ +package main + +import ( + "fmt" + + "github.com/bdw/deploy/internal/ssh" + "github.com/bdw/deploy/internal/state" + "github.com/spf13/cobra" +) + +var logsCmd = &cobra.Command{ + Use: "logs ", + Short: "View logs for a deployment", + Args: cobra.ExactArgs(1), + RunE: runLogs, +} + +func init() { + logsCmd.Flags().BoolP("follow", "f", false, "Follow logs") + logsCmd.Flags().IntP("lines", "n", 50, "Number of lines to show") +} + +func runLogs(cmd *cobra.Command, args []string) error { + name := args[0] + follow, _ := cmd.Flags().GetBool("follow") + lines, _ := cmd.Flags().GetInt("lines") + + st, err := state.Load() + if err != nil { + return fmt.Errorf("error loading state: %w", err) + } + + host := hostFlag + if host == "" { + host = st.GetDefaultHost() + } + + if host == "" { + return fmt.Errorf("--host is required") + } + + app, err := st.GetApp(host, name) + if err != nil { + return err + } + + if app.Type != "app" { + return fmt.Errorf("logs are only available for apps, not static sites") + } + + client, err := ssh.Connect(host) + if err != nil { + return fmt.Errorf("error connecting to VPS: %w", err) + } + defer client.Close() + + journalCmd := fmt.Sprintf("journalctl -u %s -n %d", name, lines) + if follow { + journalCmd += " -f" + } + + if follow { + if err := client.RunStream(journalCmd); err != nil { + return fmt.Errorf("error fetching logs: %w", err) + } + } else { + output, err := client.Run(journalCmd) + if err != nil { + return fmt.Errorf("error fetching logs: %w", err) + } + fmt.Print(output) + } + + return nil +} -- cgit v1.2.3