first commit
This commit is contained in:
103
internal/space_worker/backup.go
Normal file
103
internal/space_worker/backup.go
Normal file
@@ -0,0 +1,103 @@
|
||||
package space_worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"playbookctl/internal/utils"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (app *SpaceWorker) Backup(generateOnly bool, targetHost string, roles ...string) error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
var host string
|
||||
if targetHost != "" {
|
||||
host = targetHost
|
||||
} else {
|
||||
var err error
|
||||
host, err = app.GetDefaultHost()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
postBackupFile := fmt.Sprintf("/tmp/%s", time.Now().Format("20060102_150405"))
|
||||
|
||||
ansibleArgs, err := app.setupBackupAnsibleArgs(app.AnsibleVerbose, host, roles, postBackupFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
command := exec.Command(app.AnsibleBin, ansibleArgs...)
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
|
||||
app.log.Info(fmt.Sprintf("Target Host: %s", host))
|
||||
|
||||
if generateOnly {
|
||||
fmt.Println(strings.Join(command.Args, " "))
|
||||
return nil
|
||||
}
|
||||
|
||||
app.log.Debug(fmt.Sprintf("ansible command line: %s", command.Args))
|
||||
_ = command.Run()
|
||||
|
||||
app.log.Info("Download Files")
|
||||
|
||||
command = exec.Command("/bin/bash", "-c", postBackupFile)
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
_ = command.Run()
|
||||
|
||||
if err = utils.RemoveFile(postBackupFile); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
command = exec.Command("/bin/bash", "-c", postBackupFile+"_clean")
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
_ = command.Run()
|
||||
|
||||
if err = utils.RemoveFile(postBackupFile + "_clean"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) setupBackupAnsibleArgs(verbose uint8, targetHost string, roles []string, postBackupFile string) ([]string, error) {
|
||||
var ansibleArgs []string
|
||||
|
||||
switch verbose {
|
||||
case 1:
|
||||
ansibleArgs = append(ansibleArgs, "-v")
|
||||
case 2:
|
||||
ansibleArgs = append(ansibleArgs, "-vv")
|
||||
case 3:
|
||||
ansibleArgs = append(ansibleArgs, "-vvv")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "-i", "hosts.yml")
|
||||
ansibleArgs = append(ansibleArgs, "-l", targetHost)
|
||||
|
||||
if len(roles) > 0 {
|
||||
for _, role := range roles {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_backup_%s=true", role))
|
||||
}
|
||||
} else {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_backup=true")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_postbackup=true")
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_postbackup_file=%s", postBackupFile))
|
||||
|
||||
return append(ansibleArgs, "playbook.yml"), nil
|
||||
}
|
||||
119
internal/space_worker/host.go
Normal file
119
internal/space_worker/host.go
Normal file
@@ -0,0 +1,119 @@
|
||||
package space_worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"playbookctl/internal/types"
|
||||
"playbookctl/internal/utils"
|
||||
)
|
||||
|
||||
func (app *SpaceWorker) ListHosts() error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
app.log.Trace("try read hosts.yml")
|
||||
hosts, err := types.ReadHosts(app.workDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("try read default.host.txt")
|
||||
defaultHost, err := utils.ReadStringFile(filepath.Join(app.workDir, "default.host.txt"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println("Хосты:")
|
||||
for serverName, props := range *hosts {
|
||||
defaultMarker := ""
|
||||
if serverName == defaultHost {
|
||||
defaultMarker = " *"
|
||||
}
|
||||
fmt.Printf(" - %s [%s:%d] (%s)%s\n", serverName, props.Host, props.Port, props.User, defaultMarker)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) HostsAdd(name string, host string, port uint16, user string) error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
app.log.Trace("try read hosts.yml")
|
||||
hosts, err := types.ReadHosts(app.workDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("append new host to hosts.yml")
|
||||
(*hosts)[name] = types.THostProps{
|
||||
Host: host,
|
||||
Port: port,
|
||||
User: user,
|
||||
Interpreter: types.DefaultInterpreter,
|
||||
}
|
||||
|
||||
app.log.Trace("write hosts.yml")
|
||||
if err := types.WriteHosts(app.workDir, hosts); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace(fmt.Sprintf("create vars/%s.vars.yml", name))
|
||||
err = utils.WriteEmptyYaml(filepath.Join(app.workDir, "vars", fmt.Sprintf("%s.vars.yml", name)))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Info("Новый хост добавлен")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) HostRemove(name string) error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
app.log.Trace("try read hosts.yml")
|
||||
hosts, err := types.ReadHosts(app.workDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace("remove host from hosts.yml")
|
||||
delete(*hosts, name)
|
||||
|
||||
app.log.Trace("write hosts.yml")
|
||||
if err := types.WriteHosts(app.workDir, hosts); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Trace(fmt.Sprintf("remove vars/%s.vars.yml", name))
|
||||
err = utils.RemoveFile(filepath.Join(app.workDir, "vars", fmt.Sprintf("%s.vars.yml", name)))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Info("Хост удалён")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) SetDefaultHost(name string) error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
app.log.Trace("try write default.host.txt")
|
||||
err := utils.WriteStringFile(filepath.Join(app.workDir, "default.host.txt"), name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.log.Info(fmt.Sprintf("Хост '%s' установлен по-умолчанию", name))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) GetDefaultHost() (string, error) {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
app.log.Trace("try read default.host.txt")
|
||||
value, err := utils.ReadStringFile(filepath.Join(app.workDir, "default.host.txt"))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return value, nil
|
||||
}
|
||||
71
internal/space_worker/install.go
Normal file
71
internal/space_worker/install.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package space_worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (app *SpaceWorker) Install(generateOnly bool, targetHost string, roles ...string) error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
var host string
|
||||
if targetHost != "" {
|
||||
host = targetHost
|
||||
} else {
|
||||
var err error
|
||||
host, err = app.GetDefaultHost()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
ansibleArgs, err := app.setupInstallAnsibleArgs(app.AnsibleVerbose, host, roles)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
command := exec.Command(app.AnsibleBin, ansibleArgs...)
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
|
||||
app.log.Info(fmt.Sprintf("Target Host: %s", host))
|
||||
|
||||
if generateOnly {
|
||||
fmt.Println(strings.Join(command.Args, " "))
|
||||
} else {
|
||||
app.log.Debug(fmt.Sprintf("ansible command line: %s", command.Args))
|
||||
_ = command.Run()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) setupInstallAnsibleArgs(verbose uint8, targetHost string, roles []string) ([]string, error) {
|
||||
var ansibleArgs []string
|
||||
|
||||
switch verbose {
|
||||
case 1:
|
||||
ansibleArgs = append(ansibleArgs, "-v")
|
||||
case 2:
|
||||
ansibleArgs = append(ansibleArgs, "-vv")
|
||||
case 3:
|
||||
ansibleArgs = append(ansibleArgs, "-vvv")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "-i", "hosts.yml")
|
||||
ansibleArgs = append(ansibleArgs, "-l", targetHost)
|
||||
|
||||
if len(roles) > 0 {
|
||||
for _, role := range roles {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_install_%s=true", role))
|
||||
}
|
||||
} else {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_install=true")
|
||||
}
|
||||
|
||||
return append(ansibleArgs, "playbook.yml"), nil
|
||||
}
|
||||
139
internal/space_worker/restore.go
Normal file
139
internal/space_worker/restore.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package space_worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"playbookctl/internal/utils"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (app *SpaceWorker) Restore(targetHost string, timestamp string, inventory string, roles ...string) error {
|
||||
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
||||
|
||||
var host string
|
||||
if targetHost != "" {
|
||||
host = targetHost
|
||||
} else {
|
||||
var err error
|
||||
host, err = app.GetDefaultHost()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
preRestoreFile := fmt.Sprintf("/tmp/%s", time.Now().Format("20060102_150405"))
|
||||
|
||||
ansibleArgs, err := app.setupPreRestoreAnsibleArgs(app.AnsibleVerbose, host, roles, preRestoreFile, timestamp, inventory)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
command := exec.Command(app.AnsibleBin, ansibleArgs...)
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
|
||||
app.log.Info(fmt.Sprintf("Target Host: %s", host))
|
||||
|
||||
app.log.Info("Pre restore Ansible")
|
||||
_ = command.Run()
|
||||
|
||||
app.log.Info("Send files")
|
||||
command = exec.Command("/bin/bash", "-c", preRestoreFile)
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
_ = command.Run()
|
||||
|
||||
app.log.Info("Restore Ansible")
|
||||
ansibleArgs, err = app.setupRestoreAnsibleArgs(app.AnsibleVerbose, host, roles, preRestoreFile, timestamp, inventory)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
command = exec.Command(app.AnsibleBin, ansibleArgs...)
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
_ = command.Run()
|
||||
|
||||
app.log.Info("Clean temp files")
|
||||
command = exec.Command("/bin/bash", "-c", preRestoreFile+"_clean")
|
||||
command.Dir = app.workDir
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
_ = command.Run()
|
||||
|
||||
if err = utils.RemoveFile(preRestoreFile); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = utils.RemoveFile(preRestoreFile + "_clean"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) setupPreRestoreAnsibleArgs(verbose uint8, targetHost string, roles []string, preRestoreFile string, timestamp string, inventory string) ([]string, error) {
|
||||
var ansibleArgs []string
|
||||
|
||||
switch verbose {
|
||||
case 1:
|
||||
ansibleArgs = append(ansibleArgs, "-v")
|
||||
case 2:
|
||||
ansibleArgs = append(ansibleArgs, "-vv")
|
||||
case 3:
|
||||
ansibleArgs = append(ansibleArgs, "-vvv")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "-i", "hosts.yml")
|
||||
ansibleArgs = append(ansibleArgs, "-l", targetHost)
|
||||
|
||||
if len(roles) > 0 {
|
||||
for _, role := range roles {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_prerestore_%s=true", role))
|
||||
}
|
||||
} else {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_prerestore=true")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_restore_datetime=%s", timestamp))
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_restore_inventory=%s", inventory))
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_prerestore_file=%s", preRestoreFile))
|
||||
|
||||
return append(ansibleArgs, "playbook.yml"), nil
|
||||
}
|
||||
|
||||
func (app *SpaceWorker) setupRestoreAnsibleArgs(verbose uint8, targetHost string, roles []string, preRestoreFile string, timestamp string, inventory string) ([]string, error) {
|
||||
var ansibleArgs []string
|
||||
|
||||
switch verbose {
|
||||
case 1:
|
||||
ansibleArgs = append(ansibleArgs, "-v")
|
||||
case 2:
|
||||
ansibleArgs = append(ansibleArgs, "-vv")
|
||||
case 3:
|
||||
ansibleArgs = append(ansibleArgs, "-vvv")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "-i", "hosts.yml")
|
||||
ansibleArgs = append(ansibleArgs, "-l", targetHost)
|
||||
|
||||
if len(roles) > 0 {
|
||||
for _, role := range roles {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_restore_%s=true", role))
|
||||
}
|
||||
} else {
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_restore=true")
|
||||
}
|
||||
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_restore_datetime=%s", timestamp))
|
||||
ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_restore_inventory=%s", inventory))
|
||||
|
||||
return append(ansibleArgs, "playbook.yml"), nil
|
||||
}
|
||||
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
|
||||
}
|
||||
28
internal/space_worker/space_worker.go
Normal file
28
internal/space_worker/space_worker.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package space_worker
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"playbookctl/internal/utils/logger"
|
||||
)
|
||||
|
||||
var (
|
||||
//go:embed static/README.MD
|
||||
staticReadme []byte
|
||||
)
|
||||
|
||||
type SpaceWorker struct {
|
||||
log *logger.Logger
|
||||
|
||||
// Рабочая папка
|
||||
workDir string
|
||||
|
||||
AnsibleBin string
|
||||
AnsibleVerbose uint8
|
||||
}
|
||||
|
||||
func NewSpaceWorker(verbose logger.LogVerbose, workDir string) *SpaceWorker {
|
||||
return &SpaceWorker{
|
||||
log: &logger.Logger{Verbose: verbose},
|
||||
workDir: workDir,
|
||||
}
|
||||
}
|
||||
4
internal/space_worker/static/README.MD
Normal file
4
internal/space_worker/static/README.MD
Normal file
@@ -0,0 +1,4 @@
|
||||
## Переменные
|
||||
|
||||
| Name | Description | Default |
|
||||
|------|-------------|---------|
|
||||
Reference in New Issue
Block a user