goo/main.go

120 lines
2.2 KiB
Go

package main
import (
"fmt"
"os"
"os/exec"
"text/template"
"github.com/hjson/hjson-go/v4"
"dario.cat/mergo"
)
type Config struct {
System SystemConfig
Networking NetworkingConfig
Services map[string]ServiceConfig
}
type SystemConfig struct {
Packages []string
}
type NetworkingConfig struct {
}
type ServiceConfig struct {
Enable string
Provider string
Packages []string
Src string
Ports []string
Volumes []string
}
func main() {
var err error
var config Config
file, err := os.ReadFile("goolinux.json")
if err != nil {
fmt.Println(err)
return
}
err = hjson.Unmarshal(file, &config)
if err != nil {
fmt.Println(err)
return
}
// Parse services
for name, service := range config.Services {
var s ServiceConfig
fmt.Printf("Service: %s\n", name)
// Read service config file
c, err := os.ReadFile("services/" + name + ".json")
if err != nil {
fmt.Println("Unknown service: ", err)
return
}
// Read service template file
t, err := os.ReadFile("services/" + name + ".template")
if err != nil {
fmt.Println("No template for service: ", err)
return
}
// Parse service config
err = hjson.Unmarshal(c, &s)
if err != nil {
fmt.Println(err)
return
}
mergo.Merge(&s, service, mergo.WithOverride)
config.Services[name] = s
fmt.Printf(" %v\n", s)
tmpl, err := template.New(name).Parse(string(t))
if err != nil {
fmt.Println(err)
return
}
err = tmpl.Execute(os.Stdout, s)
}
// Parse package list
// Add extra packages needed
// ...
// Install packages
var installString = []string{"add", "--no-interactive", "--no-progress"}
var testArgs, args []string
var out []byte
testArgs = append(installString, "-s")
testArgs = append(testArgs, config.System.Packages...)
out, err = exec.Command("/sbin/apk", testArgs...).CombinedOutput()
if err != nil {
fmt.Println("===")
fmt.Println(err)
fmt.Println(string(out))
fmt.Println("===")
fmt.Println("Error preparing packages")
return
}
args = append(installString, config.System.Packages...)
out, err = exec.Command("/sbin/apk", args...).CombinedOutput()
if err != nil {
fmt.Println("===")
fmt.Println(err)
fmt.Println(string(out))
fmt.Println("===")
fmt.Println("Error installing packages")
return
}
}