package main import ( "context" "fmt" "os" "sync" "github.com/spf13/cobra" ) var version = "1.0.0" var build = "2" var ( configFile string ctx context.Context cancel context.CancelFunc wg sync.WaitGroup ) //TODO create logic for gh vs gt repos func main() { rootCmd := &cobra.Command{ Use: "certman", Short: "CertMan", Long: "Certificate Manager", RunE: func(cmd *cobra.Command, args []string) error { return cmd.Help() }, } rootCmd.PersistentFlags().StringVarP(&configFile, "config", "c", "/etc/certman/certman.conf", "Configuration file") rootCmd.AddCommand(basicCmd("version", "Show version", versionCmd)) rootCmd.AddCommand(basicCmd("gen-key", "Generates encryption key", newKeyCmd)) rootCmd.AddCommand(basicCmd("dev", "Dev Function", devCmd)) var domainCertDir string newDomainCmd := &cobra.Command{ Use: "new-domain", Short: "Create config and directories for new domain", Args: cobra.ExactArgs(1), SilenceUsage: true, SilenceErrors: true, RunE: func(cmd *cobra.Command, args []string) error { dirOverridden := cmd.Flags().Changed("dir") return newDomain(args[0], domainCertDir, dirOverridden) }, } newDomainCmd.Flags().StringVar(&domainCertDir, "dir", "/var/local/certman/certificates/", "Alternate directory for certificates") rootCmd.AddCommand(newDomainCmd) var ( modeFlag string thinInstallFlag bool ) installCmd := &cobra.Command{ Use: "install", Short: "Create certman files and directories", RunE: func(cmd *cobra.Command, args []string) error { switch modeFlag { case "server", "client": return install(thinInstallFlag, modeFlag) default: return fmt.Errorf("invalid --mode %q (must be server or client)", modeFlag) } }, } installCmd.Flags().StringVar(&modeFlag, "mode", "client", "CertManager mode [server, client]") installCmd.Flags().BoolVarP(&thinInstallFlag, "thin", "t", false, "Thin install (skip creating dirs)") rootCmd.AddCommand(installCmd) daemonCmd := &cobra.Command{ Use: "daemon", Short: "Daemon management", RunE: func(cmd *cobra.Command, args []string) error { return cmd.Help() }, } daemonCmd.AddCommand(&cobra.Command{ Use: "start", Short: "Start the daemon", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { return runDaemonCmd() }, }) daemonCmd.AddCommand(&cobra.Command{ Use: "stop", Short: "Stop the daemon", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { return stopDaemonCmd() }, }) daemonCmd.AddCommand(&cobra.Command{ Use: "reload", Short: "Reload daemon configs", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { return reloadDaemonCmd() }, }) daemonCmd.AddCommand(&cobra.Command{ Use: "status", Short: "Show daemon status", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { return statusDaemonCmd() }, }) rootCmd.AddCommand(daemonCmd) if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func basicCmd(use, short string, commandFunc func(cmd *cobra.Command, args []string)) *cobra.Command { return &cobra.Command{ Use: use, Short: short, Run: commandFunc, } } // case "gen": // { // url := createGiteaRepo(domain) // if url == "" { // return // } // gitWorkspace.Repo, gitWorkspace.WorkTree = cloneRepo(url, gitWorkspace) // if gitWorkspace.Repo == nil { // return // } // cmd = exec.Command("lego", legoNewSiteArgs...) // } // case "renew": // { // gitWorkspace.Repo, gitWorkspace.WorkTree = cloneRepo(config.GetAsString("Git.server")+"/"+config.GetAsString("Git.org_name")+"/"+domain+"-certificates.git", gitWorkspace) // if gitWorkspace.Repo == nil { // return // } // cmd = exec.Command("lego", legoRenewSiteArgs...) // } // case "gen-cert-only": // { // cmd = exec.Command("lego", legoNewSiteArgs...) // } // case "renew-cert-only": // { // cmd = exec.Command("lego", legoRenewSiteArgs...) // } // case "git": // { // url := createGiteaRepo(domain) // if url == "" { // return // } // gitWorkspace.Repo, gitWorkspace.WorkTree = cloneRepo(url, gitWorkspace) // if gitWorkspace.Repo == nil { // return // } // err := addAndPushCerts(domain, gitWorkspace) // if err != nil { // return // } // os.Exit(0) // }