138 lines
2.7 KiB
Go
138 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"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
|
|
|
|
Src string
|
|
Ports []string
|
|
Volumes []string
|
|
|
|
Provider string
|
|
Packages []string
|
|
ConfigFiles []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 b strings.Builder
|
|
var s ServiceConfig
|
|
fmt.Printf("Service: %s\n", name)
|
|
|
|
// Read service config file
|
|
if service.Provider == "" { service.Provider = "system" }
|
|
fmt.Fprintf(&b, "services/%s/%s.json", name, service.Provider)
|
|
c, err := os.ReadFile(b.String())
|
|
if err != nil {
|
|
fmt.Println("Unknown 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)
|
|
|
|
// Add service packages to the global list
|
|
config.System.Packages = append(config.System.Packages, s.Packages...)
|
|
|
|
// Generate a config file
|
|
for _, f := range s.ConfigFiles {
|
|
var b strings.Builder
|
|
f := strings.Split(f, ":")
|
|
|
|
// Read service template file
|
|
fmt.Fprintf(&b, "services/%s/%s", name, f[0])
|
|
t, err := os.ReadFile(b.String())
|
|
if err != nil {
|
|
fmt.Println("No template for service: ", err)
|
|
return
|
|
}
|
|
|
|
tmpl, err := template.New(name).Parse(string(t))
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
fmt.Printf(" Installing %s to %s\n", f[0], f[1])
|
|
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
|
|
}
|
|
}
|