package cmd import ( "fmt" "github.com/spf13/cobra" "os" "path/filepath" "playbookctl/internal/space_worker" "playbookctl/internal/types" "playbookctl/internal/utils/logger" ) var ( flagRestoreTimestamp string flagRestoreInventory string ) func NewCommandRestore() *cobra.Command { restoreCmd := &cobra.Command{ Use: "restore [role1, role2, ...]", Short: "восстановить резервную копированию пространства", Args: restoreCheckArgsE, ValidArgsFunction: ArgRoleCompletion, RunE: restoreRunE, } restoreCmd.Flags().Uint8Var(&flagAnsibleVerbose, "ansible-verbose", 0, "ansible verbose mode (0-3)") restoreCmd.Flags().StringVar(&flagAnsibleBin, "ansible-bin", "/usr/bin/ansible-playbook", "путь к ansible-playbook") restoreCmd.Flags().BoolVar(&flagGenOnly, "generate-only", false, "только сгенерировать исполняемую команду") restoreCmd.Flags().StringVar(&flagTargetHost, "target", "", "имя целевого хоста") restoreCmd.Flags().StringVar(&flagRestoreTimestamp, "timestamp", "latest", "выбор времени бекапа") restoreCmd.Flags().StringVar(&flagRestoreInventory, "inventory", "", "выбор хост бекапа") if err := restoreCmd.MarkFlagFilename("ansible-bin"); err != nil { fmt.Println(err) os.Exit(1) } return restoreCmd } func restoreCheckArgsE(_ *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 restoreRunE(_ *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.Restore(flagTargetHost, flagRestoreTimestamp, flagRestoreInventory, args...) }