Add Factorio/factcheck.sh
This commit is contained in:
		
							parent
							
								
									9c6dfdf8f8
								
							
						
					
					
						commit
						c1f8ffc946
					
				
					 1 changed files with 172 additions and 0 deletions
				
			
		
							
								
								
									
										172
									
								
								Factorio/factcheck.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								Factorio/factcheck.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,172 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					game=factorio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Color and style codes
 | 
				
			||||||
 | 
					RED='\033[1;31m'
 | 
				
			||||||
 | 
					GREEN='\033[1;32m'
 | 
				
			||||||
 | 
					YELLOW='\033[1;33m'
 | 
				
			||||||
 | 
					BLUE='\033[1;34m'
 | 
				
			||||||
 | 
					CYAN='\033[1;36m'
 | 
				
			||||||
 | 
					BOLD='\033[1m'
 | 
				
			||||||
 | 
					UNDERLINE='\033[4m'
 | 
				
			||||||
 | 
					RESET='\033[0m'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					timestamp() {
 | 
				
			||||||
 | 
					    date +"%Y-%m-%d %H:%M:%S"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section() {
 | 
				
			||||||
 | 
					    echo -e "${BOLD}${CYAN}\n=============================="
 | 
				
			||||||
 | 
					    echo -e "$1"
 | 
				
			||||||
 | 
					    echo -e "==============================${RESET}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					status() {
 | 
				
			||||||
 | 
					    # $1 = message, $2 = color
 | 
				
			||||||
 | 
					    echo -e "${2}${BOLD}[$(timestamp)]${RESET} $1"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					################################ UPDATE FUNCTION ##################################
 | 
				
			||||||
 | 
					update(){
 | 
				
			||||||
 | 
					    section "⬆️  Checking for Factorio Updates"
 | 
				
			||||||
 | 
					    # URL for the Factorio API
 | 
				
			||||||
 | 
					    FACTORIO_API="https://factorio.com/api/latest-releases"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Use curl to get the JSON response from the Factorio API
 | 
				
			||||||
 | 
					    FACTORIO_RESPONSE=$(curl -s "$FACTORIO_API")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Use jq to parse the JSON and extract the stable headless version
 | 
				
			||||||
 | 
					    FACTORIO_VERSION=$(echo "$FACTORIO_RESPONSE" | jq -r '.stable.headless')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Remove periods from the Factorio version number
 | 
				
			||||||
 | 
					    FACTORIO_VERSION_NO_PERIODS=$(echo "$FACTORIO_VERSION" | tr -d '.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Path to the file storing the current Factorio version
 | 
				
			||||||
 | 
					    VERSION_FILE="/home/$game/factorio_version.txt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Check if version.txt exists and if the latest Factorio version is newer
 | 
				
			||||||
 | 
					    if [ -f "$VERSION_FILE" ]; then
 | 
				
			||||||
 | 
					        CURRENT_VERSION=$(cat "$VERSION_FILE")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [ "$FACTORIO_VERSION_NO_PERIODS" -gt "$CURRENT_VERSION" ]; then
 | 
				
			||||||
 | 
					            status "Newer Factorio version available. Updating $VERSION_FILE and downloading..." "$YELLOW"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Update Factorio
 | 
				
			||||||
 | 
					            cd /home/$game || exit 1
 | 
				
			||||||
 | 
					            #NOTIFY
 | 
				
			||||||
 | 
					            DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/1299159784817299478/hE_NNiiMQ0maHa5UNXNsOHpRVugezXBdU1jgOXyZAqhEAAUPps0p_3M-5SBYnUt8a31e" #Personal server spam
 | 
				
			||||||
 | 
					            DISCORD_USERNAME="Factorio"
 | 
				
			||||||
 | 
					            DISCORD_AVATAR_URL="https://i.imgur.com/olnuoqL.png"
 | 
				
			||||||
 | 
					            discord_message="# Factorio update available\nRestarting server in one minute"
 | 
				
			||||||
 | 
					            curl -H "Content-Type: application/json" -X POST -d "{\"username\": \"$DISCORD_USERNAME\", \"content\": \"$discord_message\", \"avatar_url\": \"$DISCORD_AVATAR_URL\"}" "$DISCORD_WEBHOOK_URL"
 | 
				
			||||||
 | 
					            screen -S private -X stuff 'Server update available. Reboot in 1 minute\n'
 | 
				
			||||||
 | 
					            sleep 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /usr/bin/screen -dmS update /home/factorio/new_screen_start.sh --update
 | 
				
			||||||
 | 
					            status "Waiting 1min for server to boot before checking that they are running." "$BLUE"
 | 
				
			||||||
 | 
					            sleep 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            status "Factorio is already up-to-date. No need to download an update." "$GREEN"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        # Create version.txt if it doesn't exist
 | 
				
			||||||
 | 
					        echo "$FACTORIO_VERSION_NO_PERIODS" > "$VERSION_FILE"
 | 
				
			||||||
 | 
					        status "Factorio version file created." "$GREEN"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#run the update check
 | 
				
			||||||
 | 
					update
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CONFIG_FILE="/home/$game/servers-config.ini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section "🖥️  Checking Factorio Server Screens"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Parse enabled server names from config robustly (no brackets, no comments, no config header)
 | 
				
			||||||
 | 
					mapfile -t sessions < <(
 | 
				
			||||||
 | 
					  awk '/^\s*\[.*\]\s*$/ && $0 !~ /^\s*;/ { gsub(/^\s*\[|\]\s*$/,""); if (tolower($0)!="factorio/servers-config.ini") print $0 }' "$CONFIG_FILE"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					################################ LOG CHECK FOR CONNECTION REFUSAL ##################################
 | 
				
			||||||
 | 
					LOG_BASE="/home/factorio/servers"
 | 
				
			||||||
 | 
					error_found=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for server in "${sessions[@]}"; do
 | 
				
			||||||
 | 
					    LOG_FILE="$LOG_BASE/${server}/factorio-current.log"
 | 
				
			||||||
 | 
					    if [ -f "$LOG_FILE" ]; then
 | 
				
			||||||
 | 
					        # Check for both strings on the same line
 | 
				
			||||||
 | 
					        if grep -q "Refusing connection" "$LOG_FILE" && grep -q "UserVerificationMissing" "$LOG_FILE"; then
 | 
				
			||||||
 | 
					            error_found=true
 | 
				
			||||||
 | 
					            status "Detected 'Refusing connection' with 'UserVerificationMissing' in $LOG_FILE. Will restart servers." "$RED"
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$error_found" = true ]; then
 | 
				
			||||||
 | 
					    section "🚨 UserVerificationMissing Detected"
 | 
				
			||||||
 | 
					    #/usr/bin/bash /home/factorio/new_screen_start.sh
 | 
				
			||||||
 | 
					    exit 0
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					############################### CHECKING SCREENS ##################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "${#sessions[@]}" -eq 0 ]; then
 | 
				
			||||||
 | 
					    status "No enabled servers found in $CONFIG_FILE. Exiting." "$RED"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					status "Checking sessions: ${sessions[*]}" "$CYAN"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section "🧹 Cleaning up Dead Screens"
 | 
				
			||||||
 | 
					screen -wipe > /dev/null 2>&1
 | 
				
			||||||
 | 
					status "Dead screens cleaned up (if any)." "$BLUE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					should_start_script=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_screen_session() {
 | 
				
			||||||
 | 
					    local session_name="$1"
 | 
				
			||||||
 | 
					    if [ -n "$session_name" ]; then
 | 
				
			||||||
 | 
					        if screen -ls | grep -qE "\\.${session_name}[[:space:]]"; then
 | 
				
			||||||
 | 
					            status "🟢 Screen session '$session_name' is already active or detached." "$GREEN"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            status "🔴 Screen session '$session_name' is not active." "$RED"
 | 
				
			||||||
 | 
					            should_start_script=true
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for session in "${sessions[@]}"; do
 | 
				
			||||||
 | 
					    check_screen_session "$session"
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If any session is not active, run the screenstart.sh script
 | 
				
			||||||
 | 
					if [ "$should_start_script" = true ]; then
 | 
				
			||||||
 | 
					    section "🔄 Restarting Missing Servers"
 | 
				
			||||||
 | 
					    status "At least one specified screen session is not active. Starting the script." "$YELLOW"
 | 
				
			||||||
 | 
					    /usr/bin/bash /home/factorio/new_screen_start.sh
 | 
				
			||||||
 | 
					    summary_emoji="🟡"
 | 
				
			||||||
 | 
					    summary_msg="Some servers were not running and have been (re)started."
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    status "All specified screen sessions are active. No action needed." "$GREEN"
 | 
				
			||||||
 | 
					    summary_emoji="✅"
 | 
				
			||||||
 | 
					    summary_msg="All servers are online and all screens are active."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section "🧹 Active Screen Sessions"
 | 
				
			||||||
 | 
					screen -ls
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section "${summary_emoji} Summary"
 | 
				
			||||||
 | 
					status "$summary_msg" "$CYAN"
 | 
				
			||||||
 | 
					section "🏁 Check complete"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exit 0
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue