package cmd import ( "fmt" "github.com/spf13/cobra" "os" "path/filepath" "playbookctl/internal/space_worker" "playbookctl/internal/types" "playbookctl/internal/utils/logger" ) func NewCommandBackup() *cobra.Command { backupCmd := &cobra.Command{ Use: "backup [role1, role2, ...]", Short: "выполнить резервное копирование пространства", Args: backupCheckArgsE, ValidArgsFunction: ArgRoleCompletion, RunE: backupRunE, } backupCmd.Flags().Uint8Var(&flagAnsibleVerbose, "ansible-verbose", 0, "ansible verbose mode (0-3)") backupCmd.Flags().StringVar(&flagAnsibleBin, "ansible-bin", "/usr/bin/ansible-playbook", "путь к ansible-playbook") backupCmd.Flags().BoolVar(&flagGenOnly, "generate-only", false, "только сгенерировать исполняемую команду") backupCmd.Flags().StringVar(&flagTargetHost, "target", "", "имя целевого хоста") if err := backupCmd.MarkFlagFilename("ansible-bin"); err != nil { fmt.Println(err) os.Exit(1) } return backupCmd } func backupCheckArgsE(_ *cobra.Command, args []string) error { if len(args) == 0 { return nil } workDir, err := filepath.Abs(flagWorkdir) if err != nil { return err } playbook, err := types.ReadPlaybook(workDir) if err != nil { return err } for _, roleName := range args { if !containsInSlice(roleName, playbook.Roles) { return fmt.Errorf("роли \"%s\" не существует или она не добавлена в playbook.yml", roleName) } } return nil } func backupRunE(_ *cobra.Command, args []string) error { workDir, err := filepath.Abs(flagWorkdir) if err != nil { return err } spaceWorker := space_worker.NewSpaceWorker(logger.LogVerbose(flagVerbose), workDir) spaceWorker.AnsibleBin = flagAnsibleBin spaceWorker.AnsibleVerbose = flagAnsibleVerbose return spaceWorker.Backup(flagGenOnly, flagTargetHost, args...) }