package cmd import ( "fmt" "github.com/spf13/cobra" "github.com/warkanum/unitdore/config" "github.com/warkanum/unitdore/systemd" ) var dryRun bool var installCmd = &cobra.Command{ Use: "install", Short: "Generate and install systemd unit files for all enabled units", Long: `Install generates .service files for all enabled units and writes them to the appropriate systemd directory. It does not enable or start them. Use --dry-run to preview the generated unit files without writing anything.`, RunE: runInstall, } func init() { installCmd.Flags().BoolVar(&dryRun, "dry-run", false, "preview unit files without writing") rootCmd.AddCommand(installCmd) } func runInstall(cmd *cobra.Command, args []string) error { cfg, err := config.Load(configPath) if err != nil { return err } prefix, suffix := cfg.Prefix, cfg.Suffix installed := 0 skipped := 0 removed := 0 for _, u := range cfg.Units { if !u.Enabled { // Remove unit file if it exists for disabled units if systemd.IsInstalled(u, prefix, suffix) { if dryRun { fmt.Printf(" ~ would remove: %s\n", systemd.ServiceName(u, prefix, suffix)) } else { if err := systemd.Uninstall(u, prefix, suffix); err != nil { fmt.Printf(" ✗ failed to remove %s: %v\n", u.Name, err) } else { fmt.Printf(" - removed: %s (disabled)\n", systemd.ServiceName(u, prefix, suffix)) removed++ } } } else { skipped++ } continue } if dryRun { content, err := systemd.Generate(u, prefix, suffix) if err != nil { fmt.Printf(" ✗ %s: %v\n", u.Name, err) continue } path, _ := systemd.UnitPath(u, prefix, suffix) fmt.Printf("\n--- %s ---\n%s\n", path, content) installed++ continue } if err := systemd.Install(u, prefix, suffix); err != nil { fmt.Printf(" ✗ failed: %s: %v\n", u.Name, err) } else { path, _ := systemd.UnitPath(u, prefix, suffix) fmt.Printf(" ✓ installed: %s\n", path) installed++ } } if !dryRun { fmt.Printf("\nDone. Installed: %d Removed: %d Skipped: %d\n", installed, removed, skipped) } return nil }