Maybe someone finds this useful and/or can improve on it.
For the Update Function I use narc0tiqs Python Updater: https://github.com/narc0tiq/factorio-updater
It runs in a Standalone folder (can be used for multiple Servers on the same Machine), runs Factorio in a Screen and can do the following things:
start: Stop a running Server, check for updates and start (+ stuff commands in, like for creative mode, disabled here)
stop: Stop a running Server
reset: Generate a new Map
message: Send a Message to the Server Console (or the Game)
update: Check for Updates, If updates are availible, do a 5 min Countdown, then stop, install updates and restart
I call the Update every 30 mins or so via Crontab. Since it only downloads when a new Update is availible, this shouldnt be a Problem.
Again, this thing is NOT good, It just works (for me). Feel free to modify and improve it, maybe reply with better versions...
Code: Select all
#!/bin/bash
script=/dev/null
# Variablen
# Name of Screen
screenName="Factorioserver2"
# Path_To_Factorio
pfad="/home/factorio/server/Server2/"
# Path to Savegame
savegame="/home/factorio/server/Server2/saves/Server2.zip"
# Serverport
port="39100"
# Path to update script
update="/home/factorio/server/update_factorio.py"
# Commands to run after Start
# commands="/c remote.call(\"creative-mode\", \"enable\") ^M /c remote.call(\"creative-mode\", \"enable\") ^M"
# Commands
# update
# update="python /home/factorio/server/update_factorio.py -xa ${pfad}/bin/x64/factorio"
# start
start="${pfad}bin/x64/factorio --start-server ${savegame} --server-settings ${pfad}data/server-settings.json --port $port"
# create screen
scr="screen -d -m -S $screenName"
# Befehl
echo "$1"
case "$1" in
# START
start)
echo stoppe Factorio auf $screenName - Bitte warten
screen -S $screenName -X stuff ^C
sleep 30s
echo beende alle Screens ${screenName}
screen -ls | grep ${screenName} | cut -d. -f1 | tr --delete "\t" | xargs kill -9; screen -wipe;
echo screens
echo ${screenName}
sleep 1s
echo checking updates and starting on screen ${screenName}
${scr}
python ${update} -xa ${pfad}/bin/x64/factorio
wait
screen -S $screenName -X screen ${start}
sleep 30s
screen -S $screenName -X stuff "${commands}"
echo Factorioserver gestartet
screen -ls | grep ${screenName}
;;
# STOP
stop)
screen -S $screenName -X stuff ^C
sleep 30s
screen -ls | grep ${screenName} | cut -d. -f1 | tr --delete "\t" | xargs kill -9; screen -wipe;
;;
# RESET
reset)
# server Stoppen
screen -S $screenName -X stuff ^C
sleep 30s
screen -ls | grep ${screenName} | cut -d. -f1 | tr --delete "\t" | xargs kill -9; screen -wipe;
# altes Save löschen
rm ${savegame}
# neues Save anlegen
${pfad}bin/x64/factorio --create ${savegame}
# server starten
${scr}
screen -S $screenName -X screen ${update}
screen -S $screenName -X screen ${start}
;;
# MESSAGE
message)
screen -S $screenName -X stuff "$2 ^M"
;;
# Check Update
update)
rm ${pfad}/update.h1
mv ${pfad}/update.h ${pfad}/update.h1
python /home/factorio/server/update_factorio.py -xa ${pfad}/bin/x64/factorio > ${pfad}/update.h
updy=$(tail -n 1 ${pfad}/update.h | cut -c1-2)
echo ${updy}
if [ "${updy}" == "No" ]
then
echo No Updates availible
else
screen -S $screenName -X stuff "the Server is going down for Updates in 15 Minutes. ^M"
sleep 5m
screen -S $screenName -X stuff "the Server is going down for Updates in 10 Minutes. ^M"
sleep 5m
screen -S $screenName -X stuff "the Server is going down for Updates in 5 Minutes. ^M"
sleep 4m
screen -S $screenName -X stuff "the Server is going down for Updates in 1 Minutes. ^M"
sleep 30s
screen -S $screenName -X stuff "the Server is going down for Updates in 30 Seconds. ^M"
sleep 25s
screen -S $screenName -X stuff "the Server is going down for Updates now. ^M"
sleep 5s
screen -S $screenName -X stuff ^C
sleep 30s
screen -ls | grep ${screenName} | cut -d. -f1 | tr --delete "\t" | xargs kill -9; screen -wipe;
echo screens
echo ${screenName}
sleep 1s
${scr}
python ${update} -xa ${pfad}/bin/x64/factorio
wait
screen -S $screenName -X screen ${start}
sleep 30s
screen -S $screenName -X stuff "${commands}"
fi
;;
# SONST
*)
echo "start/stop/reset/message/update"
exit 1
;;
esac