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.
This commit is contained in:
parent
c502b0d5e0
commit
e5eff8ede0
|
@ -121,7 +121,7 @@ func GetValue(i interface{}, path string) (interface{}, error) {
|
||||||
v := reflect.ValueOf(i)
|
v := reflect.ValueOf(i)
|
||||||
if v.IsValid() == false { return nil, ErrKey }
|
if v.IsValid() == false { return nil, ErrKey }
|
||||||
i = v.MapIndex(reflect.ValueOf(p)).Interface()
|
i = v.MapIndex(reflect.ValueOf(p)).Interface()
|
||||||
case reflect.Array:
|
case reflect.Array, reflect.Slice:
|
||||||
return i, nil
|
return i, nil
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
return i, nil
|
return i, nil
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"base": "alpine",
|
"base": "alpine",
|
||||||
"packages": [
|
"packages": [
|
||||||
"tmux", "vim", "ripgrep",
|
"tmux", "vim", "ripgrep",
|
||||||
"go"
|
"go", "tailscale",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
70
main.go
70
main.go
|
@ -5,6 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
|
@ -21,6 +22,7 @@ type Config struct {
|
||||||
type SystemConfig struct {
|
type SystemConfig struct {
|
||||||
Base string
|
Base string
|
||||||
Packages []string
|
Packages []string
|
||||||
|
SystemPackages []string `json:"system_packages"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type NetworkingConfig struct {
|
type NetworkingConfig struct {
|
||||||
|
@ -100,8 +102,9 @@ func main() {
|
||||||
// Scripted actions for the service
|
// Scripted actions for the service
|
||||||
|
|
||||||
// Add service packages to the global list
|
// Add service packages to the global list
|
||||||
pkgs := &config.System.Packages
|
config.System.Packages = append(
|
||||||
*pkgs = append(*pkgs, s.Packages...)
|
config.System.Packages,
|
||||||
|
s.Packages...)
|
||||||
|
|
||||||
// If a proxy definition exists, append it
|
// If a proxy definition exists, append it
|
||||||
if s.Proxy != "" {
|
if s.Proxy != "" {
|
||||||
|
@ -199,36 +202,47 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse package list
|
// 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
|
slices.Sort(config.System.Packages)
|
||||||
fmt.Println("Installing packages")
|
slices.Sort(config.System.SystemPackages)
|
||||||
var installString = []string{"add", "--no-interactive", "--no-progress"}
|
|
||||||
var testArgs, args []string
|
config.System.Packages = append(
|
||||||
var out []byte
|
config.System.SystemPackages,
|
||||||
testArgs = append(installString, "-s")
|
config.System.Packages...)
|
||||||
testArgs = append(testArgs, config.System.Packages...)
|
config.System.Packages = slices.Compact(
|
||||||
out, err = exec.Command("/sbin/apk", testArgs...).CombinedOutput()
|
config.System.Packages)
|
||||||
if err != nil {
|
|
||||||
fmt.Println("===")
|
p := strings.Join(config.System.Packages, "\n")
|
||||||
fmt.Println(err)
|
err = os.WriteFile("/config/etc/apk/world",[]byte(p), 0444)
|
||||||
fmt.Println(string(out))
|
if err != nil {
|
||||||
fmt.Println("===")
|
fmt.Println("Error creating package list")
|
||||||
fmt.Println("Error preparing packages")
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
args = append(installString, config.System.Packages...)
|
// Install and remove packages
|
||||||
out, err = exec.Command("/sbin/apk", args...).CombinedOutput()
|
{
|
||||||
if err != nil {
|
fmt.Println("Installing packages")
|
||||||
fmt.Println("===")
|
args := []string{"add", "-s", "-u", "-l"}
|
||||||
fmt.Println(err)
|
out, err := exec.Command("/sbin/apk", args...).CombinedOutput()
|
||||||
fmt.Println(string(out))
|
if err != nil {
|
||||||
fmt.Println("===")
|
fmt.Println("===")
|
||||||
fmt.Println("Error installing packages")
|
fmt.Println(err)
|
||||||
return
|
fmt.Println(string(out))
|
||||||
|
fmt.Println("===")
|
||||||
|
fmt.Println("Error updating packages")
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// (Re)start services
|
// (Re)start services
|
||||||
|
|
|
@ -2,7 +2,11 @@
|
||||||
|
|
||||||
system: {
|
system: {
|
||||||
base: "alpine",
|
base: "alpine",
|
||||||
packages: [],
|
system_packages: [
|
||||||
|
"alpine-base", "doas", "linux-lts", "syslinux",
|
||||||
|
"ifupdown-ng", "util-linux", "mount",
|
||||||
|
"podman", "podman-compose",
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
services: {
|
services: {
|
||||||
|
|
Loading…
Reference in a new issue