diff --git a/cmd/role.go b/cmd/role.go index b6cc66f..43b91f7 100644 --- a/cmd/role.go +++ b/cmd/role.go @@ -8,6 +8,10 @@ import ( "playbookctl/internal/utils/logger" ) +var ( + flagBackupAdd bool +) + func NewCommandRole() *cobra.Command { roleCmd := &cobra.Command{ Use: "role", @@ -22,6 +26,7 @@ func NewCommandRole() *cobra.Command { //roleCmd.AddCommand(newCommandRoleAdd()) roleCmd.AddCommand(newCommandRoleList()) //roleCmd.AddCommand(newCommandRoleExport()) + roleCmd.AddCommand(newCommandRoleModify()) return roleCmd } @@ -54,7 +59,7 @@ func roleCreateRunE(_ *cobra.Command, args []string) error { func newCommandRoleRemove() *cobra.Command { createCmd := &cobra.Command{ - Use: "remove", + Use: "remove ", Aliases: []string{"delete", "rm", "del"}, Short: "удаляет роль из пространства", Args: cobra.ExactArgs(1), @@ -117,6 +122,8 @@ func roleAddRunE(_ *cobra.Command, args []string) error { return nil } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + func newCommandRoleExport() *cobra.Command { createCmd := &cobra.Command{ Use: "export", @@ -134,3 +141,33 @@ func roleExportRunE(_ *cobra.Command, args []string) error { } return nil } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +func newCommandRoleModify() *cobra.Command { + modifyCmd := &cobra.Command{ + Use: "modify ", + Short: "модифицировать роль", + Args: cobra.ExactArgs(1), + ValidArgsFunction: ArgRoleCompletion, + RunE: roleModifyRunE, + } + + modifyCmd.Flags().BoolVar(&flagBackupAdd, "backup-add", false, "добавить backup функцию") + + return modifyCmd +} + +func roleModifyRunE(_ *cobra.Command, args []string) error { + workDir, err := filepath.Abs(flagWorkdir) + if err != nil { + return err + } + + spaceWorker := sw.NewSpaceWorker(logger.LogVerbose(flagVerbose), workDir) + if flagBackupAdd { + return spaceWorker.ModifyRoleBackupAdd(args[0]) + } + + return nil +} diff --git a/internal/space_worker/space_worker.go b/internal/space_worker/space_worker.go index 2714c9c..f60d925 100644 --- a/internal/space_worker/space_worker.go +++ b/internal/space_worker/space_worker.go @@ -67,7 +67,7 @@ func (app *SpaceWorker) CreateRole(name string) error { { // tasks dir app.log.Trace("generate main task") - if err := generateMainTask(name, rolePath); err != nil { + if err := generateMainTask(name, rolePath, false); err != nil { return err } @@ -100,17 +100,42 @@ func (app *SpaceWorker) CreateRole(name string) error { return nil } -func generateMainTask(name string, path string) error { - buffer := &bytes.Buffer{} +func generateMainTask(name string, path string, withBackup bool) error { + var mainTask []types.MainTask - buffer.WriteString(utils.YamlHeader()) - buffer.WriteString(`- include_tasks: install.yml - when: > - (dd_install is defined and dd_install) -`) - buffer.WriteString(fmt.Sprintf(" or (dd_install_%s is defined and dd_install_%s)\n", name, name)) + if withBackup { + mainTask = make([]types.MainTask, 4) + } else { + mainTask = make([]types.MainTask, 1) + } - return os.WriteFile(filepath.Join(path, "tasks", "main.yml"), buffer.Bytes(), 0644) + mainTask[0] = types.MainTask{ + IncludeTasks: "install.yml", + When: fmt.Sprintf("(dd_install is defined and dd_install) "+ + "or (dd_install_%s is defined and dd_install_%s)", name, name), + } + + if withBackup { + mainTask[1] = types.MainTask{ + IncludeTasks: "backup.yml", + When: fmt.Sprintf("(dd_backup is defined and dd_backup) "+ + "or (dd_backup_%s is defined and dd_backup_%s)", name, name), + } + + mainTask[2] = types.MainTask{ + IncludeTasks: "pre-restore.yml", + When: fmt.Sprintf("(dd_prerestore is defined and dd_prerestore) "+ + "or (dd_prerestore_%s is defined and dd_prerestore_%s)", name, name), + } + + mainTask[3] = types.MainTask{ + IncludeTasks: "restore.yml", + When: fmt.Sprintf("(dd_restore is defined and dd_restore) "+ + "or (dd_restore_%s is defined and dd_restore_%s)", name, name), + } + } + + return types.WriteMainTask(path, &mainTask) } func generateReadme(name string, path string) error { @@ -174,6 +199,38 @@ func (app *SpaceWorker) ListRoles() error { return nil } +func (app *SpaceWorker) ModifyRoleBackupAdd(name string) error { + app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir)) + app.log.Debug(fmt.Sprintf("role name: %s", name)) + + rolePath := filepath.Join(app.workDir, "roles", name) + app.log.Debug(fmt.Sprintf("rolePath: %s", rolePath)) + + for _, file := range []string{"backup.yml", "pre-restore.yml", "restore.yml"} { + app.log.Trace(fmt.Sprintf("try create %s", file)) + if err := utils.WriteEmptyYaml(filepath.Join(rolePath, "tasks", file)); err != nil { + return err + } + } + + app.log.Trace("re-generate main task") + if err := generateMainTask(name, rolePath, true); err != nil { + return err + } + + app.log.Trace("try create backups dir") + if err := utils.CreateDirIfNotExists(filepath.Join(rolePath, "backups")); err != nil { + return err + } + + app.log.Trace("create .gitignore") + if err := utils.WriteStringFile(filepath.Join(rolePath, ".gitignore"), "backups/"); err != nil { + return err + } + + return nil +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (app *SpaceWorker) Install(generateOnly bool, targetHost string, roles ...string) error { diff --git a/internal/types/main_task.go b/internal/types/main_task.go new file mode 100644 index 0000000..cc673bc --- /dev/null +++ b/internal/types/main_task.go @@ -0,0 +1,33 @@ +package types + +import ( + "gopkg.in/yaml.v3" + "os" + "path/filepath" + "playbookctl/internal/utils" +) + +type MainTask struct { + IncludeTasks string `yaml:"include_tasks"` + When string `yaml:"when"` +} + +func ReadMainTask(roleDir string) (*[]MainTask, error) { + var mainTask []MainTask + { + bb, err := os.ReadFile(filepath.Join(roleDir, "tasks", "main.yml")) + if err != nil { + return nil, err + } + + if err := yaml.Unmarshal(bb, &mainTask); err != nil { + return nil, err + } + } + + return &mainTask, nil +} + +func WriteMainTask(roleDir string, mainTask *[]MainTask) error { + return utils.WriteYaml(mainTask, filepath.Join(roleDir, "tasks", "main.yml")) +} diff --git a/internal/utils/filesystem.go b/internal/utils/filesystem.go index f1100eb..338960e 100644 --- a/internal/utils/filesystem.go +++ b/internal/utils/filesystem.go @@ -13,6 +13,32 @@ func CreateDir(path string) error { return os.Mkdir(path, 0755) } +func CreateDirIfNotExists(path string) error { + exists, err := IsExistsDir(path) + if err != nil { + return err + } + + if !exists { + if err = CreateDir(path); err != nil { + return err + } + } + + return nil +} + +func IsExistsDir(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + func RemoveFile(path string) error { return os.Remove(path) } diff --git a/target/playbookctl b/target/playbookctl index 982aab9..af09638 100755 Binary files a/target/playbookctl and b/target/playbookctl differ