117 lines
2.4 KiB
Go
117 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"io/fs"
|
|
"log"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"code.rocketnine.space/tslocum/beehive"
|
|
)
|
|
|
|
func main() {
|
|
var (
|
|
festoonsDir string
|
|
festoon string
|
|
outDir string
|
|
)
|
|
flag.StringVar(&festoonsDir, "festoons", "", "path to festoons directory")
|
|
flag.StringVar(&festoon, "festoon", "", "name of festoon")
|
|
flag.StringVar(&outDir, "out", "", "path to output directory")
|
|
flag.Parse()
|
|
|
|
if strings.TrimSpace(festoon) == "" {
|
|
log.Fatal("festoon is required")
|
|
}
|
|
|
|
match, err := regexp.MatchString(`^[a-zA-Z0-9]+$`, festoon)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
} else if !match {
|
|
log.Fatalf("invalid festoon: %s", festoon)
|
|
}
|
|
|
|
if strings.HasSuffix(festoonsDir, "/") {
|
|
festoonsDir = strings.TrimSuffix(festoonsDir, "/")
|
|
}
|
|
festoonPath := path.Join(festoonsDir, festoon)
|
|
|
|
copyDataDir := path.Join(festoonPath, "data")
|
|
|
|
fileInfo, err := os.Stat(outDir)
|
|
if err != nil {
|
|
if !os.IsNotExist(err) {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
err = os.MkdirAll(outDir, 0700)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
} else if !fileInfo.IsDir() {
|
|
log.Fatalf("invalid output directory: %s", outDir)
|
|
}
|
|
|
|
// TODO
|
|
deployment := &beehive.Deployment{
|
|
ID: 1,
|
|
UID: 108,
|
|
Festoon: festoon,
|
|
Worker: &beehive.Worker{
|
|
IP: "127.0.0.1",
|
|
},
|
|
}
|
|
|
|
err = interpolateAndCopy(path.Join(festoonPath, "docker-compose.yml"), path.Join(outDir, "docker-compose.yml"), deployment)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
outDataPath := path.Join(outDir, "data")
|
|
|
|
fileInfo, err = os.Stat(copyDataDir)
|
|
if err != nil {
|
|
if !os.IsNotExist(err) {
|
|
log.Fatal(err)
|
|
}
|
|
} else if fileInfo.IsDir() {
|
|
err = filepath.WalkDir(copyDataDir, func(filePath string, d fs.DirEntry, err error) error {
|
|
relativePath := strings.TrimPrefix(filePath, copyDataDir)
|
|
if relativePath == "" {
|
|
return err
|
|
} else if !strings.HasPrefix(relativePath, "/") {
|
|
log.Fatalf("unexpected file path: %s", relativePath)
|
|
}
|
|
relativePath = relativePath[1:]
|
|
|
|
outPath := path.Join(outDataPath, relativePath)
|
|
|
|
if d.IsDir() {
|
|
err = os.MkdirAll(outPath, 0700)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return err
|
|
}
|
|
|
|
return interpolateAndCopy(filePath, outPath, deployment)
|
|
})
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func interpolateAndCopy(inFile string, outFile string, d *beehive.Deployment) error {
|
|
data, err := interpolate(inFile, nil, d)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return os.WriteFile(outFile, data, 0600)
|
|
}
|