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.
57 lines
1.4 KiB
Go
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
|
|
}
|