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 } }