Move MOTD into TTY login banner

This commit is contained in:
v3d 2026-06-29 23:08:56 +02:00
parent ed0b168ab6
commit bbbf80c25f
11 changed files with 137 additions and 29 deletions

View file

@ -42,13 +42,14 @@ export DEBIAN_FRONTEND=noninteractive
BACKUP_DIR=""
TRANSACTION_ACTIVE=0
declare -a MANAGED_PATHS=(
/etc/pivilion.defaults /etc/pivilion.php /etc/profile.d/pivilion-motd.sh
/etc/pivilion.defaults /etc/pivilion.php /etc/profile.d/pivilion-motd.sh /etc/issue.d/90-pivilion.issue
/etc/apache2/ports.conf /etc/apache2/conf-available/pivilion.conf
/etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-upload.conf
/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-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
@ -117,7 +118,7 @@ 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-dnsmasq.service pivilion-hostapd.service tor.service tor@default.service; do
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
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
@ -146,9 +147,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 tor.service tor@default.service 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
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-dnsmasq.service pivilion-hostapd.service tor.service tor@default.service; do
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
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 +172,7 @@ deploy_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" \
"$SOURCE_DIR/usr/local/lib/pivilion/boot-greeter.sh" /usr/local/lib/pivilion/
"$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/
install -m 0644 "$SOURCE_DIR/etc/tor/torrc.d/pivilion.conf" /etc/tor/torrc.d/pivilion.conf
@ -211,6 +212,43 @@ EOF
install -m 0644 "$SOURCE_DIR/etc/php/pivilion.ini" "/etc/php/$php_version/apache2/conf.d/99-pivilion.ini"
}
migrate_legacy_console_greeter() {
local tmp signatures=0
systemctl disable --now pivilion-boot-greeter.service 2>/dev/null || true
rm -f /etc/systemd/system/pivilion-boot-greeter.service /usr/local/lib/pivilion/boot-greeter.sh
[ -f /etc/rc.local ] || return 0
grep -q 'hostapd -B' /etc/rc.local && signatures=$((signatures + 1)) || true
grep -q 'ifconfig br0' /etc/rc.local && signatures=$((signatures + 1)) || true
grep -q 'iptables -t nat' /etc/rc.local && signatures=$((signatures + 1)) || true
grep -q 'service dnsmasq start' /etc/rc.local && signatures=$((signatures + 1)) || true
grep -q '/usr/local/lib/pivilion/mode.sh' /etc/rc.local && signatures=4 || true
if [ "$signatures" -ge 4 ]; then
cp -a /etc/rc.local "$BACKUP_DIR/legacy-rc.local"
atomic_from_stdin /etc/rc.local 0755 <<'EOF'
#!/bin/sh -e
# Pivilion startup is managed by pivilion-mode.service.
exit 0
EOF
log "Migrated legacy Pivilion rc.local; original saved in $BACKUP_DIR/legacy-rc.local"
elif grep -q '/var/lib/tor/hidden_service/hostname.*home/pi/torname' /etc/rc.local; then
cp -a /etc/rc.local "$BACKUP_DIR/legacy-rc.local"
if grep -Fq '_IP=$(hostname -I)' /etc/rc.local && grep -Fq 'My IP address is' /etc/rc.local; then
atomic_from_stdin /etc/rc.local 0755 <<'EOF'
#!/bin/sh -e
# Pivilion startup and the TTY banner are managed by systemd and agetty.
exit 0
EOF
else
tmp=$(mktemp)
grep -v '/var/lib/tor/hidden_service/hostname.*home/pi/torname' /etc/rc.local > "$tmp"
install -m 0755 "$tmp" /etc/rc.local
rm -f "$tmp"
fi
log "Migrated legacy Pivilion onion rc.local; original saved in $BACKUP_DIR/legacy-rc.local"
fi
}
configure_services() {
local tmp
log "Configuring services"
@ -228,10 +266,13 @@ EOF
if ! grep -Fqx '%include /etc/tor/torrc.d/*.conf' /etc/tor/torrc; then
tmp=$(mktemp); cp /etc/tor/torrc "$tmp"; printf '\n%%include /etc/tor/torrc.d/*.conf\n' >> "$tmp"; install -m 0644 "$tmp" /etc/tor/torrc; rm -f "$tmp"
fi
migrate_legacy_console_greeter
systemctl daemon-reload
systemctl enable apache2 pivilion-mode.service pivilion-boot-greeter.service
systemctl enable apache2 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
command -v agetty >/dev/null 2>&1 && agetty --reload >/dev/null 2>&1 || true
}
validate_install() {
@ -243,6 +284,9 @@ validate_install() {
dnsmasq --test || failed=1
php -l "$PIVILION_WEBROOT/gen.php" || failed=1
systemd-analyze verify /etc/systemd/system/pivilion-*.service || failed=1
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
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"
}
@ -259,7 +303,10 @@ EOF
check_install() {
local failed=0 file
for file in /etc/pivilion.defaults /var/lib/pivilion/install-state /usr/local/lib/pivilion/common.sh /usr/local/lib/pivilion/mode.sh /usr/local/lib/pivilion/diagnose.sh /etc/systemd/system/pivilion-mode.service; do
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/issue-banner.sh /etc/systemd/system/pivilion-mode.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