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 }