package main import ( "os" "os/exec" "path/filepath" "strings" "testing" ) // Run the real installer in a temporary tree with package/service/download // commands stubbed. This must never touch the host's init system or packages. func TestAgentInstallerOpenRC(t *testing.T) { for _, init := range []string{"openrc", "systemd"} { t.Run(init, func(t *testing.T) { root := t.TempDir() bin := filepath.Join(root, "bin") os.MkdirAll(bin, 0755) write := func(name, body string) { t.Helper() if err := os.WriteFile(filepath.Join(bin, name), []byte("#!/bin/sh\nset -eu\n"+body), 0755); err != nil { t.Fatal(err) } } write("id", "echo 0\n") write("uname", "echo x86_64\n") hash := strings.Repeat("a", 64) write("curl", `case "$1" in -fsSL) ;; *) exit 4 ;; esac if [ "$#" = 2 ]; then printf '%s' '{"browser_download_url":"https://example.test/proxmox-dashboard-linux-amd64"}'; exit; fi case "$2" in *.sha256) printf '%s\n' '`+hash+` proxmox-dashboard-linux-amd64' > "$4" ;; *) printf '#!/bin/sh\nprintf "%%s\\n" "$@" > "$CAPTURE"\n' > "$4" ;; esac `) write("sha256sum", "printf '%s\\n' '"+hash+" binary'\n") for _, name := range []string{"systemctl", "rc-service", "rc-update", "supervise-daemon"} { write(name, `printf '%s %s\n' "$(basename "$0")" "$*" >> "$CALLS"`+"\n") } raw, err := os.ReadFile("scripts/install-agent.sh") if err != nil { t.Fatal(err) } // Redirect every persistent absolute path, including those in generated scripts. s := string(raw) for _, prefix := range []string{"/etc/", "/var/lib/", "/usr/local/", "/run/", "/var/log/"} { s = strings.ReplaceAll(s, prefix, root+prefix) } for _, dir := range []string{"etc/systemd/system", "etc/init.d", "var/log"} { os.MkdirAll(filepath.Join(root, dir), 0755) } if init == "systemd" { os.MkdirAll(filepath.Join(root, "run/systemd/system"), 0755) } script := filepath.Join(root, "install.sh") os.WriteFile(script, []byte(s), 0700) env := append(os.Environ(), "PATH="+bin+":"+os.Getenv("PATH"), "DASHBOARD_URL=https://dashboard.test", "ENROLL_TOKEN=token", "AGENT_NAME=Alpine $(touch should-not-exist)", "VMID=102", "CALLS="+root+"/calls", "CAPTURE="+root+"/args") cmd := exec.Command("sh", script) cmd.Env = env if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("%v: %s", err, out) } calls, _ := os.ReadFile(root + "/calls") if init == "openrc" { if strings.Contains(string(calls), "systemctl") || !strings.Contains(string(calls), "rc-update add proxmox-dashboard-agent default") || !strings.Contains(string(calls), "rc-service proxmox-dashboard-agent restart") { t.Fatalf("%s", calls) } cmd = exec.Command("sh", root+"/usr/local/sbin/proxmox-dashboard-agent-run") cmd.Env = env if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("launcher: %v %s", err, out) } args, _ := os.ReadFile(root + "/args") if !strings.Contains(string(args), "Alpine $(touch should-not-exist)\n") { t.Fatalf("name was not passed literally: %s", args) } } else if !strings.Contains(string(calls), "systemctl restart proxmox-dashboard-agent.service") { t.Fatalf("%s", calls) } info, _ := os.Stat(root + "/etc/proxmox-dashboard-agent.env") if info.Mode().Perm() != 0600 { t.Fatalf("credentials permissions: %v", info.Mode()) } }) } }