203 lines
5.3 KiB
Go
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
|
|
}
|