beehive/cmd/workerbee/main.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)
}