From 53da037048c268cae87286f0b0e318386afeeb4d Mon Sep 17 00:00:00 2001 From: maziggy Date: Wed, 25 Mar 2026 09:53:14 +0100 Subject: [PATCH] Add WiFi safeguard to SpoolBuddy install script APT hook backs up NetworkManager WiFi connections before dpkg runs and restores them if they get wiped. Prevents headless SpoolBuddy Pis from losing WiFi after apt upgrade (observed with Bookworm kernel/raspi-config updates clearing system-connections/). --- CHANGELOG.md | 1 + spoolbuddy/install/install.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06d992895..0a4ebe468 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to Bambuddy will be documented in this file. ### Improved - **Spool Notes in Assign Spool Modal** ([#793](https://github.com/maziggy/bambuddy/issues/793)) — Spool cards in the Assign Spool modal now show the spool's note as a hover tooltip, making it easier to identify spools by tracking IDs or other metadata stored in notes. Works with both internal inventory and Spoolman-synced spools. Requested by @LegionCanadian. +- **WiFi Safeguard for SpoolBuddy Pi** — The install script now drops an APT hook (`/etc/apt/apt.conf.d/80-preserve-wifi`) that backs up NetworkManager WiFi connections before every `apt upgrade` and restores them if they get wiped. Prevents headless SpoolBuddy Pis from losing WiFi connectivity after Raspberry Pi OS package upgrades (observed with Bookworm kernel/raspi-config updates that clear `/etc/NetworkManager/system-connections/`). ### Fixed - **Database Connection Pool Exhaustion on Large Printer Farms** — Users with 100+ printers connected simultaneously experienced `QueuePool limit of size 10 overflow 20 reached, connection timed out` errors. Increased the SQLAlchemy connection pool from 30 total (10 base + 20 overflow) to 220 (20 base + 200 overflow), and raised the SQLite busy_timeout from 5 to 15 seconds to reduce write contention under heavy concurrent MQTT updates. diff --git a/spoolbuddy/install/install.sh b/spoolbuddy/install/install.sh index c58d2b738..e329eb25d 100755 --- a/spoolbuddy/install/install.sh +++ b/spoolbuddy/install/install.sh @@ -433,6 +433,35 @@ install_system_packages() { run_with_progress "Installing system packages" apt-get install -y $SYSTEM_PACKAGES } +install_wifi_safeguard() { + # Protect WiFi credentials from being wiped by apt upgrades. + # Raspberry Pi OS Bookworm migrated from wpa_supplicant/dhcpcd to + # NetworkManager, but certain package upgrades (raspberrypi-sys-mods, + # raspi-config, NetworkManager itself) can delete saved connections + # from /etc/NetworkManager/system-connections/. This hook backs them + # up before dpkg runs and restores them if they vanish. + local hook_file="/etc/apt/apt.conf.d/80-preserve-wifi" + + if [[ -f "$hook_file" ]]; then + success "WiFi safeguard already installed" + return + fi + + # Only install if NetworkManager is the active network manager + if ! systemctl is-active --quiet NetworkManager 2>/dev/null; then + return + fi + + cat > "$hook_file" << 'APTEOF' +// Preserve NetworkManager WiFi connections across apt upgrades. +// Installed by SpoolBuddy — prevents headless Pis from losing WiFi. +DPkg::Pre-Invoke { "if [ -d /etc/NetworkManager/system-connections ] && [ -n \"$(ls -A /etc/NetworkManager/system-connections/ 2>/dev/null)\" ]; then cp -a /etc/NetworkManager/system-connections/ /etc/NetworkManager/system-connections.bak/; fi"; }; +DPkg::Post-Invoke { "if [ -d /etc/NetworkManager/system-connections.bak ] && [ -z \"$(ls -A /etc/NetworkManager/system-connections/ 2>/dev/null)\" ]; then cp -a /etc/NetworkManager/system-connections.bak/* /etc/NetworkManager/system-connections/ && nmcli general reload 2>/dev/null; fi"; }; +APTEOF + + success "WiFi safeguard installed (${hook_file})" +} + # ───────────────────────────────────────────────────────────────────────────── # SpoolBuddy Installation # ───────────────────────────────────────────────────────────────────────────── @@ -1305,6 +1334,7 @@ main() { # ── Step 2: System packages ─────────────────────────────────────────── install_system_packages + install_wifi_safeguard detect_python || error "Failed to install Python 3.10+" echo ""