Skip to main content

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