From e5eff8ede0e87dfd8c296b32e74bd70ff21875bc Mon Sep 17 00:00:00 2001 From: root Date: Mon, 17 Mar 2025 21:02:50 -0400 Subject: [PATCH] Alpine will automatically add/remove packages based on the contents of /etc/apk/world. Start leveraging this. Bug: the two package arrays were not being merged, but rather overwritten. --- config.go | 2 +- goolinux.json | 2 +- main.go | 70 ++++++++++++++++++++++++++------------------ services/alpine.json | 6 +++- 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/config.go b/config.go index 5efb1dc..98b8226 100644 --- a/config.go +++ b/config.go @@ -121,7 +121,7 @@ func GetValue(i interface{}, path string) (interface{}, error) { v := reflect.ValueOf(i) if v.IsValid() == false { return nil, ErrKey } i = v.MapIndex(reflect.ValueOf(p)).Interface() - case reflect.Array: + case reflect.Array, reflect.Slice: return i, nil case reflect.String: return i, nil diff --git a/goolinux.json b/goolinux.json index ac753c1..ddef79f 100644 --- a/goolinux.json +++ b/goolinux.json @@ -4,7 +4,7 @@ "base": "alpine", "packages": [ "tmux", "vim", "ripgrep", - "go" + "go", "tailscale", ] }, diff --git a/main.go b/main.go index f4247ee..6076b2d 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "os" "os/exec" "path" + "slices" "strings" "text/template" @@ -21,6 +22,7 @@ type Config struct { type SystemConfig struct { Base string Packages []string + SystemPackages []string `json:"system_packages"` } type NetworkingConfig struct { @@ -100,8 +102,9 @@ func main() { // Scripted actions for the service // Add service packages to the global list - pkgs := &config.System.Packages - *pkgs = append(*pkgs, s.Packages...) + config.System.Packages = append( + config.System.Packages, + s.Packages...) // If a proxy definition exists, append it if s.Proxy != "" { @@ -199,36 +202,47 @@ func main() { } // Parse package list + { + var err error - // Add extra packages needed - // ... + err = os.MkdirAll("/config" + "/etc/apk/", 0555) + if err != nil { + fmt.Println("Error creating config directory.") + fmt.Println(err) + return + } - // Install packages - fmt.Println("Installing 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 + slices.Sort(config.System.Packages) + slices.Sort(config.System.SystemPackages) + + config.System.Packages = append( + config.System.SystemPackages, + config.System.Packages...) + config.System.Packages = slices.Compact( + config.System.Packages) + + p := strings.Join(config.System.Packages, "\n") + err = os.WriteFile("/config/etc/apk/world",[]byte(p), 0444) + if err != nil { + fmt.Println("Error creating package list") + fmt.Println(err) + 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 + // Install and remove packages + { + fmt.Println("Installing packages") + args := []string{"add", "-s", "-u", "-l"} + 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 updating packages") + return + } } // (Re)start services diff --git a/services/alpine.json b/services/alpine.json index 194e329..d9c6260 100644 --- a/services/alpine.json +++ b/services/alpine.json @@ -2,7 +2,11 @@ system: { base: "alpine", - packages: [], + system_packages: [ + "alpine-base", "doas", "linux-lts", "syslinux", + "ifupdown-ng", "util-linux", "mount", + "podman", "podman-compose", + ], } services: {