restic: don't fall back to parent's HOME when picking the cache dir
Agent runs as root (HOME=/root from systemd) with ProtectHome= read-only, so restic's `mkdir /root/.cache/restic` fails on the first call. Backups still completed (restic falls back to no-cache) but every job log started with a noisy red "unable to open cache" warning. Default to /var/lib/restic-manager unconditionally — that's already in the unit's ReadWritePaths and survives ProtectHome. ExtraEnv overrides still win for tests / unusual setups. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -229,18 +228,21 @@ func pumpPlain(r io.Reader, stream string, handle LineHandler) error {
|
|||||||
// HOME / XDG_CACHE_HOME are set explicitly because restic insists
|
// HOME / XDG_CACHE_HOME are set explicitly because restic insists
|
||||||
// on one or the other for its cache dir; without it the command
|
// on one or the other for its cache dir; without it the command
|
||||||
// fails before ever talking to the repo.
|
// fails before ever talking to the repo.
|
||||||
|
//
|
||||||
|
// Default to /var/lib/restic-manager — that's in the systemd unit's
|
||||||
|
// ReadWritePaths and survives ProtectHome=read-only. We do NOT fall
|
||||||
|
// back to the parent's HOME env var: the agent runs as root with
|
||||||
|
// HOME=/root, but ProtectHome makes /root read-only, so restic's
|
||||||
|
// `mkdir /root/.cache/restic` fails. ExtraEnv overrides win for
|
||||||
|
// callers that explicitly want a different cache location.
|
||||||
func (e Env) envSlice() []string {
|
func (e Env) envSlice() []string {
|
||||||
home := "/var/lib/restic-manager"
|
home := "/var/lib/restic-manager"
|
||||||
if h, ok := e.ExtraEnv["HOME"]; ok && h != "" {
|
if h, ok := e.ExtraEnv["HOME"]; ok && h != "" {
|
||||||
home = h
|
home = h
|
||||||
} else if h := os.Getenv("HOME"); h != "" {
|
|
||||||
home = h
|
|
||||||
}
|
}
|
||||||
xdg := home + "/.cache"
|
xdg := home + "/.cache"
|
||||||
if x, ok := e.ExtraEnv["XDG_CACHE_HOME"]; ok && x != "" {
|
if x, ok := e.ExtraEnv["XDG_CACHE_HOME"]; ok && x != "" {
|
||||||
xdg = x
|
xdg = x
|
||||||
} else if x := os.Getenv("XDG_CACHE_HOME"); x != "" {
|
|
||||||
xdg = x
|
|
||||||
}
|
}
|
||||||
out := []string{
|
out := []string{
|
||||||
"RESTIC_REPOSITORY=" + mergeRestCreds(e.RepoURL, e.RepoUsername, e.RepoPassword),
|
"RESTIC_REPOSITORY=" + mergeRestCreds(e.RepoURL, e.RepoUsername, e.RepoPassword),
|
||||||
|
|||||||
Reference in New Issue
Block a user