155 lines
3.7 KiB
Go
155 lines
3.7 KiB
Go
package space_creator
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"playbookctl/internal/types"
|
|
"playbookctl/internal/utils"
|
|
"playbookctl/internal/utils/logger"
|
|
)
|
|
|
|
//goland:noinspection SpellCheckingInspection
|
|
var (
|
|
//go:embed static/gitignore.txt
|
|
staticGitIgnore []byte
|
|
|
|
//go:embed static/editorconfig.txt
|
|
staticEditorConfig []byte
|
|
|
|
//go:embed static/dd.datetime.sh
|
|
staticLibDatetime []byte
|
|
|
|
//go:embed static/dd.restore.sh
|
|
staticLibRestore []byte
|
|
|
|
//go:embed static/dd.sethostname.sh
|
|
staticLibSetHostname []byte
|
|
)
|
|
|
|
type ServerProps struct {
|
|
Name string
|
|
Host string
|
|
Port uint16
|
|
User string
|
|
}
|
|
|
|
type SpaceCreator struct {
|
|
log *logger.Logger
|
|
|
|
// Рабочая папка
|
|
workDir string
|
|
}
|
|
|
|
func NewSpaceCreator(verbose logger.LogVerbose, workDir string) *SpaceCreator {
|
|
return &SpaceCreator{
|
|
log: &logger.Logger{Verbose: verbose},
|
|
workDir: workDir,
|
|
}
|
|
}
|
|
|
|
// CreateSpace Создать пространство
|
|
func (app *SpaceCreator) CreateSpace(name string, props *ServerProps) error {
|
|
app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir))
|
|
app.log.Debug(fmt.Sprintf("space name: %s", name))
|
|
app.log.Debug(fmt.Sprintf("server props: %+v", props))
|
|
|
|
spacePath := filepath.Join(app.workDir, name)
|
|
|
|
app.log.Trace(fmt.Sprintf("try create folder '%s'", name))
|
|
if err := os.Mkdir(spacePath, 0755); os.IsExist(err) {
|
|
return fmt.Errorf("Папка \"%s\" уже существует\n", name)
|
|
}
|
|
|
|
for _, dir := range []string{"roles", "library", "vars"} {
|
|
app.log.Trace(fmt.Sprintf("try create folder '%s/%s'", name, dir))
|
|
if err := os.Mkdir(filepath.Join(spacePath, dir), 0755); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
type StaticPair struct {
|
|
Name string
|
|
Data []byte
|
|
}
|
|
|
|
{ // root dir
|
|
app.log.Trace("generate hosts.yaml")
|
|
if err := generateHosts(spacePath, props); err != nil {
|
|
return err
|
|
}
|
|
|
|
app.log.Trace("generate playbook.yml")
|
|
if err := generatePlaybook(spacePath); err != nil {
|
|
return err
|
|
}
|
|
|
|
app.log.Trace("generate default.host.txt")
|
|
if err := utils.WriteStringFile(filepath.Join(spacePath, "default.host.txt"), props.Name); err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, pair := range []StaticPair{
|
|
{".gitignore", staticGitIgnore},
|
|
{".editorconfig", staticEditorConfig},
|
|
} {
|
|
app.log.Trace(fmt.Sprintf("export %s", pair.Name))
|
|
if err := utils.SaveStaticFile(filepath.Join(spacePath, pair.Name), pair.Data); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
{ // library dir
|
|
for _, pair := range []StaticPair{
|
|
{"dd.datetime.sh", staticLibDatetime},
|
|
{"dd.restore.sh", staticLibRestore},
|
|
{"dd.sethostname.sh", staticLibSetHostname},
|
|
} {
|
|
app.log.Trace(fmt.Sprintf("export library/%s", pair.Name))
|
|
if err := utils.SaveStaticFile(filepath.Join(spacePath, "library", pair.Name), pair.Data); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
{ // vars dir
|
|
app.log.Trace(fmt.Sprintf("create vars/%s.vars.yml", props.Name))
|
|
err := utils.WriteEmptyYaml(filepath.Join(spacePath, "vars", fmt.Sprintf("%s.vars.yml", props.Name)))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
app.log.Info(fmt.Sprintf("Пространство \"%s\" создано.", name))
|
|
return nil
|
|
}
|
|
|
|
func generateHosts(spacePath string, props *ServerProps) error {
|
|
hosts := types.THosts{
|
|
props.Name: types.THostProps{
|
|
Host: props.Host,
|
|
Port: props.Port,
|
|
User: props.User,
|
|
Interpreter: types.DefaultInterpreter,
|
|
},
|
|
}
|
|
|
|
return types.WriteHosts(spacePath, &hosts)
|
|
}
|
|
|
|
func generatePlaybook(spacePath string) error {
|
|
playbook := types.Playbook{
|
|
Hosts: "all",
|
|
GatherFacts: true,
|
|
PreTasks: []types.Task{{
|
|
Name: "Include vars",
|
|
IncludeVars: "vars/{{ inventory_hostname }}.vars.yml",
|
|
}},
|
|
Roles: []string{},
|
|
}
|
|
|
|
return types.WritePlaybook(spacePath, &playbook)
|
|
}
|