Restore im neu erstellten Container: fehlende Systemteile nachziehen
"omd restore" brach ab mit
ERROR: apache user www-data must be member of group cmk
Die Ursache liegt nicht im Backup. Beim Anlegen einer Site traegt
"omd create" den Apache-Benutzer in die Gruppe der Site ein - das steht
in /etc/group, und das liegt im Container, nicht im Bind-Mount. Wird der
Container neu erstellt, ist /etc/group wieder der Stand aus dem Abbild,
waehrend die Site unveraendert weiterlebt. Der offizielle Entrypoint
erkennt das und legt Gruppe und Benutzer neu an, nimmt www-data dabei
aber nicht in die Gruppe auf. Im Betrieb faellt es nicht auf: die Site
laeuft, die Oberflaeche antwortet. Erst user_verify beim Restore prueft
es.
Direkt dahinter der zweite Halt:
ERROR: fstab entry for /omd/sites/cmk/tmp does not exist
omd laesst einen fehlenden /etc/fstab ausdruecklich durchgehen ("seen in
some containers") - das Abbild liefert aber eine Datei mit einer
Kommentarzeile, also greift die Ausnahme nicht.
Beides am Abbild checkmk/check-mk-raw:2.4.0-latest nachgestellt: Site im
Bind-Mount anlegen, Container verwerfen, neuen Container mit demselben
Mount starten - die Gruppenzugehoerigkeit ist weg und der Restore bricht
mit genau dieser Meldung ab. Nach "gpasswd -a www-data cmk" und dem
fstab-Eintrag laeuft er durch.
container_fix_site_system stellt beides her, vor jedem restore und
import (do_restore ist die gemeinsame Stelle) und nach jedem "up", damit
auch ein von Hand aufgerufenes omd nicht darueber stolpert. Der
Apache-Benutzer und das Kommando zum Eintragen kommen aus
share/omd/distro.info - derselben Quelle, aus der omd sie liest, statt
"www-data" fest zu verdrahten. Passt schon alles, bleibt die Funktion
still.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1763,6 +1763,14 @@ cmd_up() {
|
||||
fi
|
||||
npm_enabled || npm_teardown_container
|
||||
ok "Stack gestartet."
|
||||
|
||||
# Nach dem Neuerstellen des Containers fehlen die Systemteile der
|
||||
# Site (siehe container_fix_site_system). Gleich nachziehen, damit
|
||||
# nicht erst ein spaeteres "omd restore" darueber stolpert.
|
||||
if container_running "$CMK_CONTAINER_NAME"; then
|
||||
container_fix_site_system "${CMK_SITE_ID:-cmk}" || true
|
||||
fi
|
||||
|
||||
cmd_status
|
||||
}
|
||||
|
||||
@@ -2372,6 +2380,77 @@ cmd_prune() {
|
||||
# =====================================================================
|
||||
# Restore / Import (gemeinsame Implementierung)
|
||||
# =====================================================================
|
||||
# =====================================================================
|
||||
# Systemteile im Container nachziehen
|
||||
#
|
||||
# Beim Anlegen einer Site traegt "omd create" den Apache-Benutzer in
|
||||
# die Gruppe der Site ein. Wird der Container spaeter neu erstellt -
|
||||
# bei jedem "up" mit geaendertem Image etwa -, ist /etc/group wieder
|
||||
# der Stand aus dem Abbild, waehrend die Site im Bind-Mount liegt und
|
||||
# bleibt. Der Entrypoint legt Gruppe und Benutzer dann zwar neu an,
|
||||
# nimmt www-data aber NICHT in die Gruppe auf.
|
||||
#
|
||||
# Im Betrieb faellt das nicht auf: die Site laeuft, die Oberflaeche
|
||||
# antwortet. "omd restore" prueft es aber und bricht ab mit
|
||||
# ERROR: apache user www-data must be member of group <site>
|
||||
#
|
||||
# Der zweite Stolperstein: "omd restore --reuse" will einen
|
||||
# fstab-Eintrag fuer das tmp-Verzeichnis sehen. Fehlt /etc/fstab ganz,
|
||||
# laesst omd das durchgehen ("seen in some containers") - im Abbild
|
||||
# liegt aber eine Datei mit einer Kommentarzeile, also greift die
|
||||
# Ausnahme nicht.
|
||||
#
|
||||
# Beides ist Zustand des Containers, nicht der Daten. Es muss nach
|
||||
# jedem Neuerstellen wieder hergestellt werden.
|
||||
# =====================================================================
|
||||
container_fix_site_system() { # site [--quiet]
|
||||
local site="$1" quiet="${2:-}"
|
||||
local out
|
||||
out="$(ct sh -c '
|
||||
set -e
|
||||
site="'"$site"'"
|
||||
info=/omd/versions/default/share/omd/distro.info
|
||||
au="$(sed -n "s/^APACHE_USER[[:space:]]*=[[:space:]]*//p" "$info" 2>/dev/null | head -1)"
|
||||
[ -n "$au" ] || au=www-data
|
||||
getent group "$site" >/dev/null || exit 0
|
||||
|
||||
# Apache-Benutzer in die Gruppe der Site
|
||||
case " $(id -nG "$au" 2>/dev/null) " in
|
||||
*" $site "*) ;;
|
||||
*)
|
||||
add="$(sed -n "s/^ADD_USER_TO_GROUP[[:space:]]*=[[:space:]]*//p" "$info" 2>/dev/null | head -1)"
|
||||
if [ -n "$add" ]; then
|
||||
cmd="$(printf "%s" "$add" | sed "s/%(user)s/$au/; s/%(group)s/$site/")"
|
||||
sh -c "$cmd" >/dev/null 2>&1 || usermod -aG "$site" "$au" >/dev/null 2>&1
|
||||
else
|
||||
usermod -aG "$site" "$au" >/dev/null 2>&1
|
||||
fi
|
||||
echo "GRUPPE $au -> $site"
|
||||
;;
|
||||
esac
|
||||
|
||||
# fstab-Eintrag fuer das tmp-Verzeichnis
|
||||
mp="/omd/sites/$site/tmp"
|
||||
if [ -f /etc/fstab ] && ! grep -q "uid=$site," /etc/fstab 2>/dev/null; then
|
||||
printf "tmpfs %s tmpfs noauto,user,mode=751,uid=%s,gid=%s 0 0\n" \
|
||||
"$mp" "$site" "$site" >> /etc/fstab
|
||||
echo "FSTAB $mp"
|
||||
fi
|
||||
' 2>/dev/null)" || return 0
|
||||
|
||||
[ -n "$out" ] || return 0
|
||||
if [ -z "$quiet" ]; then
|
||||
local l
|
||||
while IFS= read -r l; do
|
||||
case "$l" in
|
||||
GRUPPE*) log "Apache-Benutzer ${l#GRUPPE } in die Gruppe aufgenommen (nach dem Neuerstellen des Containers verloren gegangen)." ;;
|
||||
FSTAB*) log "fstab-Eintrag fuer ${l#FSTAB } ergaenzt - ohne ihn verweigert 'omd restore' den Dienst." ;;
|
||||
esac
|
||||
done <<<"$out"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
do_restore() {
|
||||
local file="$1" as_site="$2" reuse="$3" kill_opt="$4" nostart="$5" mode="$6"
|
||||
|
||||
@@ -2472,6 +2551,10 @@ EOF
|
||||
$RUNTIME cp "$tmp/payload.tar.gz" "$CMK_CONTAINER_NAME:/var/tmp/cmkrestore.tar.gz"
|
||||
rm -rf "$tmp"
|
||||
|
||||
# Die Pruefungen von "omd restore" setzen Systemteile voraus, die ein
|
||||
# neu erstellter Container nicht mehr hat - vorher nachziehen.
|
||||
container_fix_site_system "$target"
|
||||
|
||||
log "Fuehre 'omd restore ${rargs[*]-} ' aus ..."
|
||||
if ! ct omd restore ${rargs[@]+"${rargs[@]}"} /var/tmp/cmkrestore.tar.gz; then
|
||||
ct sh -c 'rm -f /var/tmp/cmkrestore.tar.gz' || true
|
||||
|
||||
Reference in New Issue
Block a user