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
 
  