107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
package templater
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
|
|
"forge.cadoles.com/pcaseiro/templatefile/pkg/utils"
|
|
"github.com/imdario/mergo"
|
|
)
|
|
|
|
var CacheFilePath = "/var/cache/templater.db"
|
|
|
|
type TemplaterConfig struct {
|
|
Name string `json:"Name"`
|
|
TemplateDirectory string `json:"TemplateDirectory"`
|
|
RootDirectory string `json:"RootDirectory"`
|
|
Services map[string]Service `json:"Services"`
|
|
GlobalService Service `json:"Globals"`
|
|
}
|
|
|
|
func (tc *TemplaterConfig) loadCache() error {
|
|
// Load globals from cache
|
|
var cache Service
|
|
err := Load(CacheFilePath, &cache)
|
|
if err != nil {
|
|
fmt.Printf("Warning: No globals to load\n")
|
|
}
|
|
|
|
err = mergo.Merge(&tc.GlobalService, cache)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Create new configuration "object"
|
|
func (tc *TemplaterConfig) New(confpath string, templateDir string, rootDir string) error {
|
|
// Load stored globals if needed
|
|
lerr := tc.loadCache()
|
|
if lerr != nil {
|
|
return lerr
|
|
}
|
|
// Check if the configuration path is a Directory or a file
|
|
fileInfo, err := os.Stat(confpath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if fileInfo.IsDir() {
|
|
// The conf path is a directory we load all the files and merge data
|
|
files, err := ioutil.ReadDir(confpath)
|
|
if err != nil {
|
|
return fmt.Errorf("Templater configuration load failed with error: %v", err)
|
|
}
|
|
for _, file := range files {
|
|
fname := fmt.Sprintf("%s/%s", confpath, file.Name())
|
|
var ntc TemplaterConfig
|
|
err := Load(fname, &ntc)
|
|
if err != nil {
|
|
return fmt.Errorf("Templater configuration load failed with error: %v", err)
|
|
}
|
|
err = mergo.Merge(tc, ntc)
|
|
if err != nil {
|
|
return fmt.Errorf("Templater configuration load failed with error: %v", err)
|
|
}
|
|
}
|
|
} else {
|
|
// The conf path is a file we only load this file (of course)
|
|
err = Load(confpath, tc)
|
|
if err != nil {
|
|
return fmt.Errorf("Confiuration read failed with error: %v", err)
|
|
}
|
|
}
|
|
|
|
tc.TemplateDirectory = templateDir
|
|
tc.RootDirectory = rootDir
|
|
|
|
return nil
|
|
}
|
|
|
|
// Process the services contained in the configuration "object"
|
|
func (tc *TemplaterConfig) ManageServices(dryRun bool) error {
|
|
// Get global vars to add on each service
|
|
gbls := tc.GlobalService.Vars
|
|
|
|
if dryRun {
|
|
utils.DryRun = dryRun
|
|
}
|
|
|
|
for name, svr := range tc.Services {
|
|
err := mergo.Merge(&svr.Vars, gbls)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Printf("=== Working on service %s", name)
|
|
if err := svr.Manage(tc.TemplateDirectory, tc.RootDirectory); err != nil {
|
|
return err
|
|
}
|
|
log.Printf("=== Service %s processed", name)
|
|
log.Printf("")
|
|
}
|
|
return nil
|
|
}
|