Files
archivmail/cmd/archivmail/cmd_update.go
T
sysops 0ecde0c1ef feat(cli): archivmail update — Wrapper für update.sh
Statt update.sh manuell zu suchen/laden kann jetzt
`archivmail update` (als root) ausgeführt werden. Nutzt
/opt/archivmail/update.sh falls vorhanden, sonst Download von Gitea.
2026-06-12 23:45:15 +02:00

57 lines
1.4 KiB
Go

package main
import (
"fmt"
"os"
"os/exec"
)
const updateScriptURL = "https://gitea.perlbach24.de/scripte/archivmail/raw/branch/main/update.sh"
const updateScriptPath = "/opt/archivmail/update.sh"
// runUpdate fetches and executes update.sh, which pulls the latest version
// from git, rebuilds frontend + backend, and restarts the services.
// Usage: archivmail update
func runUpdate(args []string) {
if os.Geteuid() != 0 {
fmt.Fprintln(os.Stderr, "archivmail update: muss als root ausgeführt werden (sudo archivmail update)")
os.Exit(1)
}
script := updateScriptPath
if _, err := os.Stat(script); err != nil {
var dlErr error
script, dlErr = downloadUpdateScript()
if dlErr != nil {
fmt.Fprintf(os.Stderr, "archivmail update: %s nicht gefunden und Download fehlgeschlagen: %v\n", updateScriptPath, dlErr)
os.Exit(1)
}
defer os.Remove(script)
}
cmd := exec.Command("bash", script)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
if err := cmd.Run(); err != nil {
fmt.Fprintf(os.Stderr, "archivmail update: %v\n", err)
os.Exit(1)
}
}
func downloadUpdateScript() (string, error) {
tmp, err := os.CreateTemp("", "archivmail-update-*.sh")
if err != nil {
return "", err
}
tmp.Close()
cmd := exec.Command("curl", "-fsSL", updateScriptURL, "-o", tmp.Name())
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
os.Remove(tmp.Name())
return "", err
}
return tmp.Name(), nil
}