From f9f2413e44358efc12b95de78b1015820e40b1dc Mon Sep 17 00:00:00 2001 From: root Date: Sun, 2 Mar 2025 18:44:24 -0500 Subject: [PATCH] Import tool with package adding support and JSON configs. --- goolinux.conf | 28 ++++++++++++++++++++ goolinux.json | 28 ++++++++++++++++++++ main.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 goolinux.conf create mode 100644 goolinux.json create mode 100644 main.go diff --git a/goolinux.conf b/goolinux.conf new file mode 100644 index 0000000..b11f321 --- /dev/null +++ b/goolinux.conf @@ -0,0 +1,28 @@ +system.packages = [ vim, tmux, go, ]; +networking = { + hostname = "goolinux"; + domain = "goolinux.org"; + + firewall.enable = true; + firewall = { + allowedPorts = [ + 22, 80, 443, + 4533, + ]; + } +}; +services = { + ssh.enable = true; + proxy.enable = true; + + navidrome.enable = true; + navidrome = { + # provider = docker; + src = deluan/navidrome; + ports = [ 4533:4533 ]; + volumes = [ + /data/docker/navidrome:/data + /data/music:/music:ro + ]; + }; +}; diff --git a/goolinux.json b/goolinux.json new file mode 100644 index 0000000..39114ec --- /dev/null +++ b/goolinux.json @@ -0,0 +1,28 @@ +{ + +"system": { + "packages": [ + "tmux", "vim", "ripgrep", + "go" + ] +}, + +"networking": { +}, + +"services": { + "proxy": { "enable": "true" }, + "ssh": { "enable": "true" }, + "navidrome": { + "enable": "true", + "provider": "docker", + "src": "deluan/navidrome", + "ports": [ "4533:4533" ], + "volumes": [ + "/data/docker/navidrome:/data", + "/data/music:/music:ro" + ] + } +} + +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..3978e8b --- /dev/null +++ b/main.go @@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + + "github.com/bitly/go-simplejson" +) + +func main() { + var err error + + fd, err := os.Open("goolinux.json") + defer fd.Close() + if err != nil { + fmt.Println(err) + return + } + + userJSON, err := simplejson.NewFromReader(fd) + if err != nil { + fmt.Println(err) + return + } + + // Parse services + services := userJSON.Get("services").MustMap() + for service, _ := range services { + s := userJSON.Get("services").Get(service).MustMap() + if s["enable"] == "false" { continue } + + fmt.Printf("Service: %s\n", service) + for key, value := range s { + fmt.Printf(" %s: %s\n", key, value) + } + } + + // Parse package list + packages := userJSON.Get("system").Get("packages").MustStringArray() + fmt.Println(packages) + + // 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, 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, 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 + } +}