New version
This commit is contained in:
		
							parent
							
								
									7eaa3521dc
								
							
						
					
					
						commit
						f9fe3be0ae
					
				
					 1 changed files with 214 additions and 174 deletions
				
			
		| 
						 | 
					@ -1,201 +1,241 @@
 | 
				
			||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
#ClayGarth.com 
 | 
					# ClayGarth.com - Sequential Factorio server manager using INI config
 | 
				
			||||||
game=factorio
 | 
					# Fancy terminal output version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CONFIG_FILE="/home/factorio/servers-config.ini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
############################## SAVE AND STOP FUNCTIONS ######################
 | 
					timestamp() {
 | 
				
			||||||
stop() {
 | 
					    date +"%Y-%m-%d %H:%M:%S"
 | 
				
			||||||
    echo "Stopping $server server."
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Try to save before forcing the screen closed.
 | 
					section() {
 | 
				
			||||||
    screen -p 0 -S $server -X eval "stuff /quit\015" >> /dev/null 2>&1
 | 
					    echo -e "${BOLD}${CYAN}\n=============================="
 | 
				
			||||||
 | 
					    echo -e "$1"
 | 
				
			||||||
 | 
					    echo -e "==============================${RESET}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LOG_FILE="/home/$game/servers/$server/factorio-current.log"
 | 
					status() {
 | 
				
			||||||
    MONITOR_STRING="Goodbye"
 | 
					    # $1 = message, $2 = color
 | 
				
			||||||
 | 
					    echo -e "${2}${BOLD}[$(timestamp)]${RESET} $1"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    echo "Monitoring the $server server's log file for save confirmation."
 | 
					# Monitor a server's log for "Opening socket for broadcast" and show a ready message
 | 
				
			||||||
 | 
					monitor_server_ready() {
 | 
				
			||||||
 | 
					    local server="$1"
 | 
				
			||||||
 | 
					    local log_file="/home/factorio/servers/${server}/factorio-current.log"
 | 
				
			||||||
 | 
					    local status_file="/tmp/factorio_server_ready_${server}"
 | 
				
			||||||
 | 
					    rm -f "$status_file"
 | 
				
			||||||
 | 
					    if timeout 120 grep -m 1 "Opening socket for broadcast" <(tail -n 0 -F "$log_file") > /dev/null; then
 | 
				
			||||||
 | 
					        touch "$status_file"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Check if the monitor string is already present in the log file
 | 
					# Stop a single server, monitor for clean shutdown, and cleanup
 | 
				
			||||||
    if grep -q "$MONITOR_STRING" "$LOG_FILE"; then
 | 
					stop_server() {
 | 
				
			||||||
        echo "The $server server was already stopped!"
 | 
					    local server="$1"
 | 
				
			||||||
 | 
					    local log_file="/home/factorio/servers/${server}/factorio-current.log"
 | 
				
			||||||
 | 
					    local monitor_string="Goodbye"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    section "🛑 Stopping ${server} server"
 | 
				
			||||||
 | 
					    screen -p 0 -S "$server" -X stuff $'/quit\n' >> /dev/null 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    status "Monitoring $server log for shutdown confirmation: $log_file" "$YELLOW"
 | 
				
			||||||
 | 
					    if [ -f "$log_file" ] && grep -q "$monitor_string" "$log_file"; then
 | 
				
			||||||
 | 
					        status "$server was already stopped." "$GREEN"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        # Tail the log file and monitor for the specified string
 | 
					        if [ -f "$log_file" ] && timeout 30 tail -n 0 -F "$log_file" | grep -q "$monitor_string"; then
 | 
				
			||||||
        # Wait for the server to fully save before starting the server instead of force quitting the screen
 | 
					            status "$server has saved and stopped cleanly." "$GREEN"
 | 
				
			||||||
        if timeout 30 tail -n 0 -F "$LOG_FILE" | grep -q "$MONITOR_STRING"; then
 | 
					 | 
				
			||||||
            echo "The $server server has saved successfully."
 | 
					 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            echo "Timeout reached. The $server server did not save within 30 seconds."
 | 
					            status "Timeout: $server did not shut down cleanly in 30 seconds." "$RED"
 | 
				
			||||||
            screen -S $server -p 0 -X stuff "^C" >> /dev/null 2>&1
 | 
					            screen -S "$server" -p 0 -X stuff "^C" >> /dev/null 2>&1
 | 
				
			||||||
            sleep 2
 | 
					            sleep 2
 | 
				
			||||||
            screen -X -S $server quit >> /dev/null 2>&1
 | 
					            screen -X -S "$server" quit >> /dev/null 2>&1
 | 
				
			||||||
            sleep 1
 | 
					            sleep 1
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					    # Cleanup
 | 
				
			||||||
 | 
					    status "Cleaning up $server server files..." "$BLUE"
 | 
				
			||||||
    
 | 
					    cd "/home/factorio/servers/$server/saves" 2>/dev/null && rm ./*.tmp.zip >> /dev/null 2>&1
 | 
				
			||||||
    # Removes the .temp save game to fix loading issues.
 | 
					    cd "/home/factorio/servers/$server/" 2>/dev/null && rm -f .lock >> /dev/null 2>&1
 | 
				
			||||||
    # Technically a fix, but it needs to go through each server's files.
 | 
					    cp /home/factorio/mods/mod-settings.dat /home/factorio/mods/default/ > /dev/null 2>&1
 | 
				
			||||||
    cd /home/$game/servers/$server/saves || exit 1
 | 
					    cp /home/factorio/mods/mod-list.json /home/factorio/mods/default/ > /dev/null 2>&1
 | 
				
			||||||
    rm ./*.tmp.zip >> /dev/null 2>&1
 | 
					    status "Cleanup completed for $server." "$GREEN"
 | 
				
			||||||
    echo "=============================="
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Start a single server with its config
 | 
				
			||||||
 | 
					start_server() {
 | 
				
			||||||
 | 
					    local server="$1"
 | 
				
			||||||
 | 
					    local port="$2"
 | 
				
			||||||
 | 
					    local settings="$3"
 | 
				
			||||||
 | 
					    local config="$4"
 | 
				
			||||||
 | 
					    local mod_directory="$5"
 | 
				
			||||||
 | 
					    local use_whitelist="$6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    local factorio_executable="/home/factorio/factorio/bin/x64/factorio"
 | 
				
			||||||
stopall(){
 | 
					    if [ ! -x "$factorio_executable" ]; then
 | 
				
			||||||
    server="test"
 | 
					        status "Error: Factorio executable not found or not executable at $factorio_executable" "$RED"
 | 
				
			||||||
    stop
 | 
					        exit 1
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    server="ribbon"
 | 
					 | 
				
			||||||
    stop
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    server="family"
 | 
					 | 
				
			||||||
    stop
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    server="private"
 | 
					 | 
				
			||||||
    stop
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
################################ UPDATE FUNCTION ##################################
 | 
					 | 
				
			||||||
update(){
 | 
					 | 
				
			||||||
# 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
 | 
					 | 
				
			||||||
        echo "Newer Factorio version available. Updating $VERSION_FILE and downloading..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Update version.txt with the new Factorio version
 | 
					 | 
				
			||||||
        echo "$FACTORIO_VERSION_NO_PERIODS" > "$VERSION_FILE"
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
	# Update Factorio
 | 
					 | 
				
			||||||
	cd /home/$game || exit 1
 | 
					 | 
				
			||||||
	wget https://www.factorio.com/get-download/stable/headless/linux64 -O factorio.tar.xz
 | 
					 | 
				
			||||||
	tar -xf factorio.tar.xz
 | 
					 | 
				
			||||||
	rm -f factorio.tar.xz
 | 
					 | 
				
			||||||
	#mod updater
 | 
					 | 
				
			||||||
	#default mods, most servers will use this mod dir
 | 
					 | 
				
			||||||
	#servers w/ special mods will need a new line under here and a new dir created for them.
 | 
					 | 
				
			||||||
	/usr/bin/python3 /home/factorio/mod_updater.py -s /home/factorio/servers/Master/server-settings.json -m /home/factorio/mods/default --token 2674c79ebc4fb9e04c29 --username clash --fact-path /home/factorio/factorio/bin/x64/factorio --update
 | 
					 | 
				
			||||||
	#/usr/bin/python3 /home/factorio/mod_updater.py -s /home/factorio/servers/Master/server-settings.json -m /home/factorio/mods/dad --token 2674fb9e04c29 --username clash --fact-path /home/factorio/factorio/bin/x64/factorio --update
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "Factorio is already up-to-date. No need to download an update."
 | 
					 | 
				
			||||||
        echo "=============================="
 | 
					 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
else
 | 
					
 | 
				
			||||||
    # Create version.txt if it doesn't exist
 | 
					    local start_command="$factorio_executable --start-server-load-latest --server-settings $settings --config $config --executable-path /home/factorio/factorio/bin/x64/ --mod-directory $mod_directory --port $port"
 | 
				
			||||||
    echo "$FACTORIO_VERSION_NO_PERIODS" > "$VERSION_FILE"
 | 
					    if [ "$use_whitelist" = "true" ]; then
 | 
				
			||||||
    echo "Factorio version file created."
 | 
					        start_command="$start_command --use-server-whitelist true"
 | 
				
			||||||
fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    section "🚀 Starting ${server} server"
 | 
				
			||||||
 | 
					    status "Command: $start_command" "$CYAN"
 | 
				
			||||||
 | 
					    /usr/bin/screen -dmS "$server" $start_command
 | 
				
			||||||
 | 
					    sleep 2
 | 
				
			||||||
 | 
					   if screen -list | grep -q "\.${server}[[:space:]]"; then
 | 
				
			||||||
 | 
					       status "$server started successfully." "$GREEN"
 | 
				
			||||||
 | 
					       # Start log monitor in the background
 | 
				
			||||||
 | 
					       monitor_server_ready "$server" &
 | 
				
			||||||
 | 
					   else
 | 
				
			||||||
 | 
					       status "Error: Failed to start $server." "$RED"
 | 
				
			||||||
 | 
					       exit 1
 | 
				
			||||||
 | 
					   fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Update Factorio and mods
 | 
				
			||||||
 | 
					update_factorio() {
 | 
				
			||||||
 | 
					    section "⬆️  Updating Factorio and Mods"
 | 
				
			||||||
 | 
					    local FACTORIO_API="https://factorio.com/api/latest-releases"
 | 
				
			||||||
 | 
					    local FACTORIO_RESPONSE FACTORIO_VERSION FACTORIO_VERSION_NO_PERIODS VERSION_FILE CURRENT_VERSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################ BASH ARGUMENTS ################################
 | 
					    FACTORIO_RESPONSE=$(curl -s "$FACTORIO_API")
 | 
				
			||||||
 | 
					    FACTORIO_VERSION=$(echo "$FACTORIO_RESPONSE" | jq -r '.stable.headless')
 | 
				
			||||||
 | 
					    FACTORIO_VERSION_NO_PERIODS=$(echo "$FACTORIO_VERSION" | tr -d '.')
 | 
				
			||||||
 | 
					    VERSION_FILE="/home/factorio/factorio_version.txt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$1" = "--update" ];
 | 
					    if [ -f "$VERSION_FILE" ]; then
 | 
				
			||||||
then
 | 
					        CURRENT_VERSION=$(cat "$VERSION_FILE")
 | 
				
			||||||
    update
 | 
					        if [ "$FACTORIO_VERSION_NO_PERIODS" -gt "$CURRENT_VERSION" ]; then
 | 
				
			||||||
    echo "updated"
 | 
					            status "New Factorio version available. Updating..." "$YELLOW"
 | 
				
			||||||
 | 
					            echo "$FACTORIO_VERSION_NO_PERIODS" > "$VERSION_FILE"
 | 
				
			||||||
 | 
					            cd /home/factorio || exit 1
 | 
				
			||||||
 | 
					            wget https://www.factorio.com/get-download/stable/headless/linux64 -O factorio.tar.xz
 | 
				
			||||||
 | 
					            tar -xf factorio.tar.xz
 | 
				
			||||||
 | 
					            chmod +x /home/factorio/factorio/bin/x64/factorio > /dev/null 2>&1
 | 
				
			||||||
 | 
					            rm -f factorio.tar.xz
 | 
				
			||||||
 | 
					            status "Factorio updated to $FACTORIO_VERSION." "$GREEN"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            status "Factorio is already up-to-date." "$GREEN"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        echo "$FACTORIO_VERSION_NO_PERIODS" > "$VERSION_FILE"
 | 
				
			||||||
 | 
					        status "Factorio version file created." "$GREEN"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #status "Updating mods..." "$BLUE"
 | 
				
			||||||
 | 
					    cp /home/factorio/mods/mod-list.json /home/factorio/mods/default/ > /dev/null 2>&1
 | 
				
			||||||
 | 
					    #status "Mods updated." "$GREEN"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Sequentially stop and/or start servers as specified in the INI file
 | 
				
			||||||
 | 
					process_servers() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    local action="$1" # "stop", "start", or "restart"
 | 
				
			||||||
 | 
					    local server port settings config mod_directory use_whitelist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while IFS= read -r line || [ -n "$line" ]; do
 | 
				
			||||||
 | 
					        if [[ $line =~ ^\[([^\]]+)\]$ ]]; then
 | 
				
			||||||
 | 
					            server="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        elif [[ $line =~ ^port=([0-9]+)$ ]]; then
 | 
				
			||||||
 | 
					            port="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        elif [[ $line =~ ^settings=(.+)$ ]]; then
 | 
				
			||||||
 | 
					            settings="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        elif [[ $line =~ ^config=(.+)$ ]]; then
 | 
				
			||||||
 | 
					            config="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        elif [[ $line =~ ^mod_directory=(.+)$ ]]; then
 | 
				
			||||||
 | 
					            mod_directory="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        elif [[ $line =~ ^use_whitelist=(.+)$ ]]; then
 | 
				
			||||||
 | 
					            use_whitelist="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					            if [ "$action" = "stop" ]; then
 | 
				
			||||||
 | 
					                stop_server "$server"
 | 
				
			||||||
 | 
					            elif [ "$action" = "start" ]; then
 | 
				
			||||||
 | 
					                start_server "$server" "$port" "$settings" "$config" "$mod_directory" "$use_whitelist"
 | 
				
			||||||
 | 
					            elif [ "$action" = "restart" ]; then
 | 
				
			||||||
 | 
					                stop_server "$server"
 | 
				
			||||||
 | 
					                start_server "$server" "$port" "$settings" "$config" "$mod_directory" "$use_whitelist"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done < "$CONFIG_FILE"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Argument handling
 | 
				
			||||||
 | 
					if [ "$1" = "--help" ]; then
 | 
				
			||||||
 | 
					    echo -e "${BOLD}Usage:${RESET}"
 | 
				
			||||||
 | 
					    echo -e "  ${YELLOW}--update${RESET} : Stop all servers, update, then start each server sequentially"
 | 
				
			||||||
 | 
					    echo -e "  ${YELLOW}--stop${RESET}   : Stop all servers sequentially"
 | 
				
			||||||
 | 
					    exit 0
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$1" = "--help" ];
 | 
					if [ "$1" = "--stop" ]; then
 | 
				
			||||||
then
 | 
					    section "🛑 Stopping All Servers"
 | 
				
			||||||
    echo "--update or --stop"
 | 
					    process_servers "stop"
 | 
				
			||||||
    exit
 | 
					    section "🧹 Cleaning up Screens"
 | 
				
			||||||
 | 
					    screen -wipe > /dev/null 2>&1
 | 
				
			||||||
 | 
					    status "Below is the list of active screen sessions. Each running server should appear here. If you don't see a server, it may not be running." "$YELLOW"
 | 
				
			||||||
 | 
					    screen -ls
 | 
				
			||||||
 | 
					    exit 0
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$1" = "--stop" ];
 | 
					if [ "$1" = "--update" ]; then
 | 
				
			||||||
then
 | 
					    section "🛑 Stopping All Servers"
 | 
				
			||||||
    stopall
 | 
					    process_servers "stop"
 | 
				
			||||||
    exit
 | 
					    update_factorio
 | 
				
			||||||
 | 
					    section "🚀 Starting All Servers"
 | 
				
			||||||
 | 
					    process_servers "start"
 | 
				
			||||||
 | 
					    section "🧹 Cleaning up Screens"
 | 
				
			||||||
 | 
					    screen -wipe > /dev/null 2>&1
 | 
				
			||||||
 | 
					    status "Below is the list of active screen sessions. Each running server should appear here. If you don't see a server, it may not be running." "$YELLOW"
 | 
				
			||||||
 | 
					    screen -ls
 | 
				
			||||||
 | 
					    exit 0
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Default: restart each server sequentially (stop, then start)
 | 
				
			||||||
 | 
					section "🔄 Restarting All Servers Sequentially"
 | 
				
			||||||
################################ ISSUE FIXES ################################
 | 
					process_servers "restart"
 | 
				
			||||||
 | 
					section "🧹 Cleaning up Screens"
 | 
				
			||||||
#fixes perms issues
 | 
					screen -wipe > /dev/null 2>&1
 | 
				
			||||||
chown -R $game:$game /home/$game/ > /dev/null 2>&1
 | 
					status "Below is the list of active screen sessions. Each running server should appear here. If you don't see a server, it may not be running." "$YELLOW"
 | 
				
			||||||
chmod -R 755 /home/factorio/mods > /dev/null 2>&1
 | 
					 | 
				
			||||||
chmod +x /home/$game/factorio/bin/x64/factorio > /dev/null 2>&1
 | 
					 | 
				
			||||||
#Copy mod settings, they sometimes get overwritten
 | 
					 | 
				
			||||||
cp /home/factorio/mods/mod-settings.dat /home/factorio/mods/default/ > /dev/null 2>&1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
######################################### UPDATE &RESTART Servers ###########################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#Starts a screen session for each server. 
 | 
					 | 
				
			||||||
#Change --server-settings , --config and --port for each server.
 | 
					 | 
				
			||||||
#Do NOT put $start in quotes when starting the screen. Even if ShellCheck tells you to.
 | 
					 | 
				
			||||||
cd /home/$game/factorio/bin/x64/ || exit 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#Stop all servers
 | 
					 | 
				
			||||||
stopall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#Update Factorio if needed
 | 
					 | 
				
			||||||
update
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#Start all servers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#TEST SERVER
 | 
					 | 
				
			||||||
server='test'
 | 
					 | 
				
			||||||
port='34198'
 | 
					 | 
				
			||||||
start="/home/$game/factorio/bin/x64/factorio --start-server-load-latest --server-settings /home/factorio/servers/$server/server-settings.json --config /home/factorio/servers/$server/config.ini --executable-path /home/factorio/factorio/bin/x64/ --mod-directory /home/factorio/mods/default/ --port $port"
 | 
					 | 
				
			||||||
echo "Starting test Server"
 | 
					 | 
				
			||||||
/usr/bin/screen -dmS $server $start
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#RIBBON SERVER
 | 
					 | 
				
			||||||
server='ribbon'
 | 
					 | 
				
			||||||
port='34196'
 | 
					 | 
				
			||||||
start="/home/$game/factorio/bin/x64/factorio --start-server-load-latest --server-settings /home/factorio/servers/$server/server-settings.json --config /home/factorio/servers/$server/config.ini --executable-path /home/factorio/factorio/bin/x64/ --mod-directory /home/factorio/mods/default/ --port $port"
 | 
					 | 
				
			||||||
#echo "Starting ribbon Server"
 | 
					 | 
				
			||||||
#/usr/bin/screen -dmS $server $start
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#FAMILY SERVER
 | 
					 | 
				
			||||||
server='family'
 | 
					 | 
				
			||||||
port='34197'
 | 
					 | 
				
			||||||
start="/home/$game/factorio/bin/x64/factorio --start-server-load-latest --server-settings /home/factorio/servers/$server/server-settings.json --config /home/factorio/servers/$server/config.ini --executable-path /home/factorio/factorio/bin/x64/ --mod-directory /home/factorio/mods/default/ --port $port"
 | 
					 | 
				
			||||||
echo "Starting family Server"
 | 
					 | 
				
			||||||
/usr/bin/screen -dmS $server $start
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#PRIVATE SERVER
 | 
					 | 
				
			||||||
server='private'
 | 
					 | 
				
			||||||
port='34199'
 | 
					 | 
				
			||||||
start="/home/$game/factorio/bin/x64/factorio --start-server-load-latest --server-settings /home/factorio/servers/$server/server-settings.json --config /home/factorio/servers/$server/config.ini --executable-path /home/factorio/factorio/bin/x64/ --mod-directory /home/factorio/mods/default/ --port $port"
 | 
					 | 
				
			||||||
echo "Starting private Server"
 | 
					 | 
				
			||||||
/usr/bin/screen -dmS $server $start
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "=============================="
 | 
					 | 
				
			||||||
screen -ls
 | 
					screen -ls
 | 
				
			||||||
echo "=============================="
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# After showing screens, check and display each server's ready status
 | 
				
			||||||
 | 
					while IFS= read -r line || [ -n "$line" ]; do
 | 
				
			||||||
 | 
					    if [[ $line =~ ^\[([^\]]+)\]$ ]]; then
 | 
				
			||||||
 | 
					        server="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        enabled=1
 | 
				
			||||||
 | 
					    elif [[ $line =~ ^use_whitelist=(.+)$ ]]; then
 | 
				
			||||||
 | 
					        use_whitelist="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					        if [ "$enabled" = "1" ]; then
 | 
				
			||||||
 | 
					            status_file="/tmp/factorio_server_ready_${server}"
 | 
				
			||||||
 | 
					            if [ -f "$status_file" ]; then
 | 
				
			||||||
 | 
					                status "$server is ONLINE and ready for connections!" "$GREEN"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                status "Waiting for $server to be ready for connections..." "$YELLOW"
 | 
				
			||||||
 | 
					                # Wait up to 2 minutes for the status file to appear
 | 
				
			||||||
 | 
					                if timeout 120 bash -c "while [ ! -f '$status_file' ]; do sleep 1; done"; then
 | 
				
			||||||
 | 
					                    status "$server is ONLINE and ready for connections!" "$GREEN"
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    status "Timeout: $server did not report as online within 2 minutes." "$RED"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            rm -f "$status_file"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        enabled=0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done < "$CONFIG_FILE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit 0
 | 
					exit 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue