diff --git a/pub_event[rungame,endgame](sync).ash b/pub_event[rungame,endgame](sync).ash index a0fa249..041cb00 100644 --- a/pub_event[rungame,endgame](sync).ash +++ b/pub_event[rungame,endgame](sync).ash @@ -1,12 +1,32 @@ #!/bin/ash # shellcheck shell=ash # -# +ERROR_LOG="/recalbox/share/system/logs/savesync-error.log" + +# --- Logger Function --- +log() { + local timestamp + local level="$1" + local msg="$2" + mkdir -p "$(dirname \"$ERROR_LOG\")" + timestamp=$(date '+%Y-%m-%d %H:%M:%S') + local log_line="[$timestamp] [$level] $msg" + + if [ "$level" = "ERROR" ]; then + printf "%s\n" "$log_line" >> "$ERROR_LOG" + fi + + mosquitto_pub -h 127.0.0.1 -p 1883 -t /Recalbox/EmulationStation/Event "SaveLog=${log_line}" + + # printf "%s\n" "$log_line" >> "$LOG_FILE" 2>/dev/null + [ "$DEBUG_MODE" -eq 1 ] && printf "%s\n" "$log_line" +} + eventfile="/tmp/es_state.inf" # 1. Check if the file exists and is not empty if [ ! -s "$eventfile" ]; then - echo "Error: $eventfile is missing or empty." + log "ERROR" "$eventfile is missing or empty." exit 1 fi @@ -14,13 +34,19 @@ fi PAYLOAD=$(cat "$eventfile") # 3. Publish (using double quotes to handle spaces/newlines in the file) -mosquitto_pub -h 127.0.0.1 -p 1883 -t /Recalbox/EmulationStation/Event -m "$PAYLOAD" +mosquitto_pub -h 127.0.0.1 -p 1883 -t /Recalbox/EmulationStation/Event "$PAYLOAD" # 4. Optional: check if the publish succeeded if [ $? -eq 0 ]; then - echo "Successfully published event." + log "INFO" "Successfully published event." else - echo "Failed to connect to mosquitto broker." + log "ERROR" "Failed to connect to mosquitto broker." + exit 1 fi -sleep 4 +mosquitto_sub -h 127.0.0.1 -p 1883 -t /Recalbox/EmulationStation/Event | while IFS="=" read -r key value +do + case "$key" in + "SaveSync") exit "$value" ;; + esac +done diff --git a/savesync.conf b/savesync.conf index fa8cf92..091b38a 100644 --- a/savesync.conf +++ b/savesync.conf @@ -1,4 +1,3 @@ -export LOG_FILE="/recalbox/share/system/logs/es_event_monitor.log" -export DEBUG_MODE=1 # Set to 0 to only log to file, 1 to also print to screen -export RNAME="saves" -export RPATH="gamepi-tv" +LOG_FILE="/recalbox/share/system/logs/savesync_monitor.log" +DEBUG_MODE=1 +REMOTE_BASE="saves:gamepi-tv" diff --git a/savesync[start](permanent).ash b/savesync[start](permanent).ash index 44d5897..1bb93b0 100644 --- a/savesync[start](permanent).ash +++ b/savesync[start](permanent).ash @@ -2,20 +2,34 @@ # shellcheck shell=ash # --- Configuration --- -LOG_FILE="/recalbox/share/system/logs/es_event_monitor.log" -DEBUG_MODE=1 -REMOTE_BASE="saves:gamepi-tv" +. /recalbox/share/system/config/savesync/savesync.conf + + +# --- MQTT Publish Function --- +mqtt_publish() { + + local msg="$1" + +} + # --- Logger Function --- log() { - local level="$1" - local msg="$2" - mkdir -p "$(dirname "$LOG_FILE")" - local timestamp=$(date '+%Y-%m-%d %H:%M:%S') - local log_line="[$timestamp] [$level] $msg" - - printf "%s\n" "$log_line" >> "$LOG_FILE" 2>/dev/null - [ "$DEBUG_MODE" -eq 1 ] && printf "%s\n" "$log_line" + local timestamp + local level="$1" + local msg="$2" + mkdir -p "$(dirname "$LOG_FILE")" + timestamp=$(date '+%Y-%m-%d %H:%M:%S') + local log_line="[$timestamp] [$level] $msg" + + mosquitto_pub -h 127.0.0.1 -p 1883 -t /Recalbox/EmulationStation/Event "SaveLog=${log_line}" + + # printf "%s\n" "$log_line" >> "$LOG_FILE" 2>/dev/null + [ "$DEBUG_MODE" -eq 1 ] && printf "%s\n" "$log_line" +} + +send_continue() { + mosquitto_pub -h 127.0.0.1 -p 1883 -t /Recalbox/EmulationStation/Event "SaveContinue=1" } log "INFO" "--- ES Event Daemon Started ---" @@ -31,7 +45,8 @@ do "GamePath") this_game_path="$value" # Logic: Change .gba/.zip to .srm - this_save_path="${value%.*}.srm" + this_save_path="$(echo "${value%.*}.srm" | sed 's|roms|saves|')" + this_backup_path="$(dirname "$this_save_path" | sed 's|roms|archives|')" ;; "Action") this_action="$value" ;; "State") @@ -52,7 +67,8 @@ do if [ "$local_size" -lt "$remote_size" ]; then log "WARN" "Cloud save is LARGER ($remote_size vs $local_size). Restoring..." - rclone copyto "$remote_full" "$this_save_path" + mkdir -p "$(dirname "${this_backup_path}")" + rclone copyto "$remote_full" "$this_save_path" --backup-dir "$this_backup_path" else log "INFO" "Local save is safe. Running update check..." rclone update "$remote_full" "$this_save_path" @@ -67,7 +83,7 @@ do rclone update "$this_save_path" "$REMOTE_BASE/$this_system_id/" log "INFO" "Sync Complete." fi - + # Reset variables for the next event block this_system_id=""; this_game_path=""; this_save_path=""; this_action="" ;;