first commit
This commit is contained in:
202
internal/space_worker/role.go
Normal file
202
internal/space_worker/role.go
Normal file
@@ -0,0 +1,202 @@
|
||||
package space_worker
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"playbookctl/internal/types"
|
||||
"playbookctl/internal/utils"
|
||||
"slices"
|
||||
)
|
||||
|
||||
func (app *SpaceWorker) CreateRole(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))
|
||||
|
||||
app.log.Trace(fmt.Sprintf("try create '%s' dir", name))
|
||||
if err := os.Mkdir(rolePath, 0755); os.IsExist(err) {
|
||||
app.log.Warn(fmt.Sprintf("Папка \"%s\" уже существует", name))
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, dir := range []string{"defaults", "files", "tasks", "templates", "vars"} {
|
||||
app.log.Trace(fmt.Sprintf("try create %s/%s dir", name, dir))
|
||||
if err := utils.CreateDir(filepath.Join(rolePath, dir)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, dir := range []string{"defaults", "vars"} {
|
||||
app.log.Trace(fmt.Sprintf("try create %s/%s/main.yml", name, dir))
|
||||
if err := utils.WriteEmptyYaml(filepath.Join(rolePath, dir, "main.yml")); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
{ // tasks dir
|
||||
app.log.Trace("generate main task")
|
||||
if err := generateMainTask(name, rolePath, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("create install task")
|
||||
if err := utils.WriteEmptyYaml(filepath.Join(rolePath, "tasks", "install.yml")); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
app.log.Trace("generate readme")
|
||||
if err := generateReadme(name, rolePath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("read playbook.yml")
|
||||
playbook, err := types.ReadPlaybook(app.workDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("append role to playbook.yml")
|
||||
playbook.Roles = append(playbook.Roles, name)
|
||||
|
||||
app.log.Trace("write playbook.yml")
|
||||
if err := types.WritePlaybook(app.workDir, playbook); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Info(fmt.Sprintf("Роль %s создана", name))
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateMainTask(name string, path string, withBackup bool) error {
|
||||
var mainTask []types.MainTask
|
||||
|
||||
if withBackup {
|
||||
mainTask = make([]types.MainTask, 4)
|
||||
} else {
|
||||
mainTask = make([]types.MainTask, 1)
|
||||
}
|
||||
|
||||
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 {
|
||||
buffer := &bytes.Buffer{}
|
||||
|
||||
buffer.WriteString(fmt.Sprintf("# %s\n\n", name))
|
||||
buffer.Write(staticReadme)
|
||||
|
||||
return os.WriteFile(filepath.Join(path, "README.MD"), buffer.Bytes(), 0644)
|
||||
}
|
||||
|
||||
func (app SpaceWorker) RemoveRole(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))
|
||||
|
||||
app.log.Trace(fmt.Sprintf("try remove '%s' dir", name))
|
||||
if err := os.RemoveAll(rolePath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("read playbook.yml")
|
||||
playbook, err := types.ReadPlaybook(app.workDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("remove role from playbook.yml")
|
||||
idx := slices.Index(playbook.Roles, name)
|
||||
if idx >= 0 {
|
||||
playbook.Roles = slices.Delete(playbook.Roles, idx, idx+1)
|
||||
}
|
||||
|
||||
app.log.Trace("write playbook.yml")
|
||||
if err := types.WritePlaybook(app.workDir, playbook); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Info(fmt.Sprintf("Роль %s удалена", name))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) ListRoles() error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
app.log.Trace("try read playbook.yml")
|
||||
playbook, err := types.ReadPlaybook(app.workDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println("Доступные роли:")
|
||||
for _, roleName := range playbook.Roles {
|
||||
fmt.Printf(" - %s\n", roleName)
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user