package cmd import ( "fmt" "io" "os" "github.com/spf13/cobra" "github.com/warkanum/unitdore/config" "github.com/warkanum/unitdore/initsys" ) var uninstallAllFlag bool var uninstallCmd = &cobra.Command{ Use: "uninstall | --all", Short: "Stop, disable and remove the service file for a unit (or all with --all)", Long: `Uninstall stops, disables and removes the service file of the named unit. With --all (same as 'uninstallall') it does so for every installed unit in reverse startup order.`, Args: nameOrAll(&uninstallAllFlag), RunE: func(cmd *cobra.Command, args []string) error { cfg, ini, err := loadInit() if err != nil { return err } if uninstallAllFlag { uninstallAll(cfg, ini, os.Stdout) return nil } return uninstallOne(cfg, ini, args[0], os.Stdout) }, } func init() { uninstallCmd.Flags().BoolVar(&uninstallAllFlag, "all", false, "uninstall all installed units") rootCmd.AddCommand(uninstallCmd) } func uninstallOne(cfg *config.Config, ini initsys.Init, name string, w io.Writer) error { u, err := installedUnit(cfg, ini, name) if err != nil { return err } prefix, suffix := cfg.Prefix, cfg.Suffix fmt.Fprintf(w, " ■ disabling %s...\n", ini.ServiceName(*u, prefix, suffix)) if err := ini.Disable(*u, prefix, suffix); err != nil { return fmt.Errorf("disabling unit: %w", err) } path, _ := ini.UnitPath(*u, prefix, suffix) fmt.Fprintf(w, " ✗ removing %s...\n", path) if err := ini.Uninstall(*u, prefix, suffix); err != nil { return fmt.Errorf("removing service file: %w", err) } fmt.Fprintf(w, " ✓ uninstalled: %s\n", name) return nil }