Archived
1
This commit is contained in:
2024-12-19 23:43:01 +03:00
parent a6211a7b5d
commit d5d27c1037
5 changed files with 164 additions and 11 deletions

View File

@@ -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 <name>",
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 <name>",
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
}

View File

@@ -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 {

View File

@@ -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"))
}

View File

@@ -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)
}

Binary file not shown.