Add canonical boot configuration synchronization

This commit is contained in:
v3d 2026-06-30 16:29:51 +02:00
parent 254a9b9cf3
commit eda151065c
14 changed files with 424 additions and 50 deletions

View file

@ -1,7 +1,7 @@
#!/bin/bash
set -Eeuo pipefail
INSTALL_VERSION=2
INSTALL_VERSION=3
ACTION=install
case "${1:-}" in
'') ;;
@ -15,6 +15,8 @@ esac
SOURCE_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
source "$SOURCE_DIR/usr/local/lib/pivilion/common.sh"
PIVILION_CONFIG_PATHS="$(pivilion_boot_config_path) /etc/pivilion.conf /etc/pivilion.defaults"
export PIVILION_CONFIG_PATHS
pivilion_load_config || exit "$PIVILION_E_CONFIG"
cat <<'PIVILION_LOGO'
@ -48,12 +50,13 @@ declare -a MANAGED_PATHS=(
/etc/apache2/conf-enabled/pivilion.conf /etc/apache2/sites-enabled/000-default.conf
/etc/tor/torrc /etc/tor/torrc.d/pivilion.conf
/etc/systemd/system/pivilion-mode.service /etc/systemd/system/pivilion-dnsmasq.service
/etc/systemd/system/pivilion-config.service
/etc/systemd/system/pivilion-hostapd.service /etc/systemd/system/pivilion-boot-greeter.service
/etc/systemd/system/pivilion-login-banner.service /etc/rc.local
/usr/local/lib/pivilion /usr/local/bin/pivilion /usr/local/bin/pivilion-diagnose
/usr/local/bin/hotspot /usr/local/bin/onion /usr/local/bin/pikey /usr/local/bin/generator
/usr/local/bin/static /usr/local/bin/hotglue /usr/local/bin/htaccess
/var/lib/pivilion/install-state
/var/lib/pivilion/install-state /var/lib/pivilion/pivilion.conf.last-good
/etc/php/7.4/apache2/conf.d/99-pivilion.ini
/etc/php/8.2/apache2/conf.d/99-pivilion.ini
/etc/php/8.4/apache2/conf.d/99-pivilion.ini
@ -118,10 +121,11 @@ backup_managed_files() {
BACKUP_DIR=$(mktemp -d /var/backups/pivilion/install-$(date +%Y%m%d-%H%M%S).XXXXXX)
install -d -m 0700 "$BACKUP_DIR/files"
: > "$BACKUP_DIR/present"; : > "$BACKUP_DIR/missing"; : > "$BACKUP_DIR/enabled-services"; : > "$BACKUP_DIR/active-services"
for service in apache2 pivilion-mode.service pivilion-boot-greeter.service pivilion-login-banner.service pivilion-dnsmasq.service pivilion-hostapd.service tor.service tor@default.service; do
for service in apache2 pivilion-config.service pivilion-mode.service pivilion-boot-greeter.service pivilion-login-banner.service pivilion-dnsmasq.service pivilion-hostapd.service tor.service tor@default.service; do
systemctl is-enabled --quiet "$service" 2>/dev/null && printf '%s\n' "$service" >> "$BACKUP_DIR/enabled-services" || true
systemctl is-active --quiet "$service" 2>/dev/null && printf '%s\n' "$service" >> "$BACKUP_DIR/active-services" || true
done
MANAGED_PATHS+=("$(pivilion_boot_config_path)" "$(pivilion_boot_error_path)")
for path in "${MANAGED_PATHS[@]}"; do
relative=${path#/}
if [ -e "$path" ] || [ -L "$path" ]; then
@ -147,9 +151,9 @@ rollback() {
relative=${path#/}; rm -rf -- "$path"; install -d -m 0755 "$(dirname "$path")"; cp -a "$BACKUP_DIR/files/$relative" "$path"
done < "$BACKUP_DIR/present"
systemctl daemon-reload 2>/dev/null || true
systemctl disable apache2 pivilion-mode.service pivilion-boot-greeter.service pivilion-login-banner.service tor.service tor@default.service 2>/dev/null || true
systemctl disable apache2 pivilion-config.service pivilion-mode.service pivilion-boot-greeter.service pivilion-login-banner.service tor.service tor@default.service 2>/dev/null || true
while IFS= read -r path; do [ -n "$path" ] && systemctl enable "$path" 2>/dev/null || true; done < "$BACKUP_DIR/enabled-services"
for service in apache2 pivilion-mode.service pivilion-boot-greeter.service pivilion-login-banner.service pivilion-dnsmasq.service pivilion-hostapd.service tor.service tor@default.service; do
for service in apache2 pivilion-config.service pivilion-mode.service pivilion-boot-greeter.service pivilion-login-banner.service pivilion-dnsmasq.service pivilion-hostapd.service tor.service tor@default.service; do
grep -Fqx "$service" "$BACKUP_DIR/active-services" || systemctl stop "$service" 2>/dev/null || true
done
while IFS= read -r service; do [ -n "$service" ] && systemctl start "$service" 2>/dev/null || true; done < "$BACKUP_DIR/active-services"
@ -171,7 +175,7 @@ deploy_files() {
log "Deploying Pivilion files"
install -d -m 0755 /usr/local/lib/pivilion /usr/local/bin /etc/systemd/system /etc/tor/torrc.d /etc/profile.d /var/lib/pivilion
install -m 0644 "$SOURCE_DIR/usr/local/lib/pivilion/common.sh" /usr/local/lib/pivilion/common.sh
install -m 0755 "$SOURCE_DIR/usr/local/lib/pivilion/mode.sh" "$SOURCE_DIR/usr/local/lib/pivilion/diagnose.sh" \
install -m 0755 "$SOURCE_DIR/usr/local/lib/pivilion/mode.sh" "$SOURCE_DIR/usr/local/lib/pivilion/config-sync.sh" "$SOURCE_DIR/usr/local/lib/pivilion/diagnose.sh" \
"$SOURCE_DIR/usr/local/lib/pivilion/issue-banner.sh" /usr/local/lib/pivilion/
install -m 0755 "$SOURCE_DIR"/usr/local/bin/* /usr/local/bin/
install -m 0644 "$SOURCE_DIR"/etc/systemd/system/*.service /etc/systemd/system/
@ -186,6 +190,14 @@ PIVILION_WEBROOT=$PIVILION_WEBROOT
PIVILION_MODE=$PIVILION_MODE
PIVILION_HOTSPOT_SSID=$PIVILION_HOTSPOT_SSID
PIVILION_WIFI_INTERFACE=$PIVILION_WIFI_INTERFACE
PIVILION_WIFI_SSID=$PIVILION_WIFI_SSID
PIVILION_WIFI_PSK=$PIVILION_WIFI_PSK
PIVILION_WIFI_PSK_FOR_SSID=$PIVILION_WIFI_PSK_FOR_SSID
PIVILION_WIFI_COUNTRY=$PIVILION_WIFI_COUNTRY
PIVILION_HOTSPOT_CHANNEL=$PIVILION_HOTSPOT_CHANNEL
PIVILION_HOSTNAME=$PIVILION_HOSTNAME
PIVILION_GENERATOR_ENABLED=$PIVILION_GENERATOR_ENABLED
PIVILION_UPLOAD_MAX_SIZE=$PIVILION_UPLOAD_MAX_SIZE
EOF
install -d -m 0755 -o "$PIVILION_USER" -g "$PIVILION_GROUP" "$PIVILION_DIR" "$PIVILION_DIR/config"
@ -268,7 +280,7 @@ EOF
fi
migrate_legacy_console_greeter
systemctl daemon-reload
systemctl enable apache2 pivilion-mode.service pivilion-login-banner.service
systemctl enable apache2 pivilion-config.service pivilion-mode.service pivilion-login-banner.service
systemctl enable tor@default.service 2>/dev/null || systemctl enable tor.service
systemctl disable pivilion-dnsmasq.service pivilion-hostapd.service 2>/dev/null || true
/usr/local/lib/pivilion/issue-banner.sh
@ -287,6 +299,8 @@ validate_install() {
grep -q '^My IP address is ' /etc/issue.d/90-pivilion.issue || failed=1
grep -q '^@@@@@@@@@@@@@@@@@@@' /etc/issue.d/90-pivilion.issue || failed=1
grep -q 'StandardOutput=null' /etc/systemd/system/pivilion-login-banner.service || failed=1
[ -s "$(pivilion_boot_config_path)" ] || failed=1
[ -s /var/lib/pivilion/pivilion.conf.last-good ] || failed=1
if command -v shellcheck >/dev/null 2>&1; then shellcheck /usr/local/lib/pivilion/*.sh /usr/local/bin/pivilion* /usr/local/bin/hotspot /usr/local/bin/onion /usr/local/bin/pikey || failed=1; fi
[ "$failed" -eq 0 ] || return "$PIVILION_E_INSTALL"
}
@ -305,8 +319,9 @@ check_install() {
local failed=0 file
for file in /etc/pivilion.defaults /var/lib/pivilion/install-state /etc/issue.d/90-pivilion.issue \
/usr/local/lib/pivilion/common.sh /usr/local/lib/pivilion/mode.sh /usr/local/lib/pivilion/diagnose.sh \
/usr/local/lib/pivilion/config-sync.sh \
/usr/local/lib/pivilion/issue-banner.sh /etc/systemd/system/pivilion-mode.service \
/etc/systemd/system/pivilion-login-banner.service; do
/etc/systemd/system/pivilion-config.service /etc/systemd/system/pivilion-login-banner.service; do
if [ ! -e "$file" ]; then echo "Missing: $file" >&2; failed=1; fi
done
if [ "$failed" -eq 0 ]; then validate_install || failed=1; fi
@ -324,9 +339,11 @@ case "$ACTION" in
esac
backup_managed_files
PIVILION_COMMON_PATH="$SOURCE_DIR/usr/local/lib/pivilion/common.sh" bash "$SOURCE_DIR/usr/local/lib/pivilion/config-sync.sh" initialize
install_packages
deploy_files
configure_services
/usr/local/lib/pivilion/config-sync.sh apply
validate_install
write_install_state
systemctl is-active --quiet apache2 2>/dev/null && systemctl reload apache2 || true