Installer Demon Template
#!/bin/bash
set -euo pipefail
# CONFIG
MEDIA_BASE="/media"
USB_LABEL="recharjme"
MONITOR_BIN="/usr/bin/NZK_System_Updater.sh"
SERVICE_FILE="/etc/systemd/system/NZK_System_Updater.service"
echo "=== Installing USB Update Monitor daemon ==="
# 1) Write daemon script
rm -f "$MONITOR_BIN"
cat >"$MONITOR_BIN" <<'EOF'
#!/bin/bash
set -euo pipefail
#!/bin/bash
set -euo pipefail
MEDIA_BASE="/media"
USB_LABEL="recharjme"
UPDATE_FLAG="/tmp/_updating"
TEMP_UPDATE_SCRIPT="/tmp/update.sh"
USB_MOUNT_PATH="" # Global variable to track current USB path
log(){ printf '%s - %s\n' "$(date '+%F %T')" "$*"; }
find_recharjme_usb(){
# Find any USB mount with label matching "recharjme" (case-insensitive)
for user_dir in "$MEDIA_BASE"/*; do
[ -d "$user_dir" ] || continue
for mount_dir in "$user_dir"/*; do
[ -d "$mount_dir" ] || continue
mount_name=$(basename "$mount_dir")
# Case-insensitive comparison
if [[ "${mount_name,,}" == "${USB_LABEL,,}" ]] && mountpoint -q "$mount_dir"; then
echo "$mount_dir"
return 0
fi
done
done
return 1
}
check_usb_connected(){
USB_MOUNT_PATH=$(find_recharjme_usb)
if [ -n "$USB_MOUNT_PATH" ]; then
return 0
else
USB_MOUNT_PATH=""
return 1
fi
}
restart_display_managers(){
log "Restarting display managers..."
systemctl restart gdm3 2>/dev/null || true
systemctl restart sddm 2>/dev/null || true
}
process_update(){
local update_file="$1"
log "Found update: $update_file"
: > "$UPDATE_FLAG"
log "Created update flag: $UPDATE_FLAG"
cp -f "$update_file" "$TEMP_UPDATE_SCRIPT"
chmod +x "$TEMP_UPDATE_SCRIPT"
log "Executing: $TEMP_UPDATE_SCRIPT"
bash "$TEMP_UPDATE_SCRIPT"
log "Update finished; cleaning"
rm -f "$TEMP_UPDATE_SCRIPT"
rm -f "$UPDATE_FLAG"
restart_display_managers
}
log "=== USB Update Monitor started ==="
shopt -s nullglob
while true; do
if check_usb_connected; then
log "Found RECHARJME USB at: $USB_MOUNT_PATH"
# Check if update is already in progress
if [ -f "$UPDATE_FLAG" ]; then
log "Update already in progress, waiting..."
sleep 3
continue
fi
# Look for update scripts
candidates=( "$USB_MOUNT_PATH"/update*.sh )
if [ ${#candidates[@]} -gt 0 ]; then
process_update "${candidates[0]}"
# Wait for USB disconnect with proper state checking
log "Waiting for USB disconnect..."
while check_usb_connected; do
sleep 2
done
log "USB disconnected; rebooting in 3 seconds..."
sleep 3
systemctl reboot
else
sleep 3
fi
else
# No USB connected, remove updating flag if it exists
if [ -f "$UPDATE_FLAG" ]; then
log "No USB connected, removing stale update flag"
rm -f "$UPDATE_FLAG"
fi
sleep 3
fi
done
EOF
chmod +x "$MONITOR_BIN"
# 2) Write systemd unit
rm -f "$SERVICE_FILE"
cat >"$SERVICE_FILE" <<EOF
[Unit]
Description=USB Update Monitor
After=local-fs.target
Wants=local-fs.target
[Service]
Type=simple
ExecStart=$MONITOR_BIN
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
EOF
# 3) Activate
systemctl daemon-reload
systemctl enable --now usb-update-monitor.service
systemctl restart usb-update-monitor.service || true
echo "=== Installed and running: usb-update-monitor.service ==="
systemctl --no-pager status usb-update-monitor.service || true