Files
ProxmoxDash/agent_installer_test.go

83 lines
3.3 KiB
Go

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())
}
})
}
}