Archived
1
This repository has been archived on 2025-08-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2024-12-23 01:55:48 +03:00

203 lines
5.3 KiB
Go

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
}