=================================================================== RCS file: /cvs/mtctl/mtctl_default.sh,v retrieving revision 1.2 retrieving revision 1.4 diff -u -p -r1.2 -r1.4 --- mtctl/mtctl_default.sh 2021/09/02 16:17:35 1.2 +++ mtctl/mtctl_default.sh 2021/10/19 10:05:56 1.4 @@ -3,7 +3,7 @@ # Purpose: Minetest server Control # License: Copyright (C) 2021 by Miniontoby #--------------------------------------------------------------------- -VERSION="1.0" +VERSION="1.3" config=[] config[0]="no"; config[1]="/usr/local/share/minetest/" @@ -15,7 +15,7 @@ mtinfo() { echo -e "mtctl: $MSG" | sed -e 's/\\n/\\nmtctl: /' } mthelp() { - echo -e "usage: mtctl start|stop|restart|status|create worldname\n mtctl list|help|version|check_updates"; exit 1 + echo -e "usage: mtctl start|stop|restart|status|create|backup worldname\n mtctl list|help|version|check_updates"; exit 1 } if [ "x$1" == "x" ]; then mthelp; exit 1; fi @@ -99,7 +99,9 @@ mtstatus() { CHECK="Offline" fi EXTRA="\n" - else if [ "$CHECK" == "Failed" ]; then EXTRA=" \n"; fi; fi + elif [ "$CHECK" == "Failed" ]; then EXTRA=" \n"; + elif [ "$CHECK" == "Backup failed" ]; then EXTRA=" \n"; + elif [ "$CHECK" == "Backup success" ]; then EXTRA=" \n"; fi echo -ne "\r$NAME($CHECK)$EXTRA" } @@ -167,8 +169,15 @@ restartMT() { } statusMT() { - SetWorld "$1"; - mtstatus "Ok" + SetWorld "$1" + GetPIDS "$WORLDDIR" "$NAME" + if [ "x$FOO$BAR" \!= "x" ]; then + STATUS="Online" + else + STATUS="Offline" + fi + LASTLOG="`tail -n 5 $LOGDIR/$NAME.log`" + echo -e "mtctl.$1 - The Minetest Server Control\n Active: $STATUS\n Process: $FOO\n Main PID: $BAR\n\n$LASTLOG" } listMT() { @@ -191,12 +200,69 @@ createMT() { echo -ne "\nUsername: "; read USERNAME cd $WORLDBASE; mkdir $NAME; cd $NAME - echo -e "server_name = $NAME\nserver_description = $SERVER_DESCRIPTION\nport = $PORT\nmotd = $MOTD\nfixed_map_seed = $SEED\ncreative_mode = $CREATIVE_MODE\nenable_damage = $ENABLE_DAMAGE\nenable_pvp = $ENABLE_PVP\nname = $USERNAME\nserver_announce = true\nserverlist_url = servers.minetest.net" > world.conf + echo -e "server_name = $NAME\nserver_description = $SERVER_DESCRIPTION\nport = $PORT\nmotd = $MOTD\nfixed_map_seed = $SEED\ncreative_mode = $CREATIVE_MODE\nenable_damage = $ENABLE_DAMAGE\nenable_pvp = $ENABLE_PVP\nname = $USERNAME\nserver_announce = true\nserverlist_url = servers.minetest.net\nsqlite_synchronous = 0\nserver_unload_unused_data_timeout = 900\nserver_map_save_interval = 900.0" > world.conf echo -e "creative_mode = $CREATIVE_MODE\nenable_damage = $ENABLE_DAMAGE\nauth_backend = sqlite3\nbackend = sqlite3\nplayer_backend = sqlite3\ngameid = minetest\nworld_name = $NAME" > world.mt echo -ne "\nWorld created!\nWant to start the world?(yes/no): "; read startit if [[ "$startit" == "yes" ]]; then /usr/bin/mtctl start $NAME; fi echo -e "\nSuccess: \033[1;32mDone \033[m\nFeel free to join your new server at port $PORT" } + +backupMT() { + SetWorld "$1" + # Backup script from mtlbak by Minix + # Copyright (C) 2021 Minix from FreedomTest (freedomtest@protonmail.com) + + BACKUP_DIR="$CONFDIR/backups/$NAME" + LOG_FILE="$LOGDIR/backup_$NAME.log" + mkdir -p $BACKUP_DIR + echo -ne "" >> $LOG_FILE + + if [ -f /tmp/$(basename $WORLDDIR)_local_backup_in_progress ]; then + echo "\nBackup for $(basename $WORLDDIR) on $(date) aborted because another backup is already in progress, this may be caused by a backup that is taking longer than expected" >> $LOG_FILE + mtinfo "Backup for $(basename $WORLDDIR) on $(date) aborted because another backup is already in progress, this may be caused by a backup that is taking longer than expected" + exit 1 + fi + + touch /tmp/$(basename $WORLDDIR)_local_backup_in_progress + rm $BACKUP_DIR/map.sqlite.tmp* 2> /dev/null #Cleaning in case of crashed attempts + + echo -e "\n$(date) backup started" >> $LOG_FILE + mtstatus "Backup started" + + try=0 + while [ $try -lt 5 ]; do + echo "Starting backup attempt #$(expr $try + 1) on $(date)" >> $LOG_FILE + sqlite3 $WORLDDIR/map.sqlite ".backup $BACKUP_DIR/map.sqlite.tmp" 2> /dev/null + if [ $? -eq 0 ]; then + mv $BACKUP_DIR/{map.sqlite.tmp,map.sqlite} + #Backup auth.sqlite and players.sqlite files properly + until sqlite3 $WORLDDIR/auth.sqlite ".backup $BACKUP_DIR/auth.sqlite" 2> /dev/null; do + continue + done + until sqlite3 $WORLDDIR/players.sqlite ".backup $BACKUP_DIR/players.sqlite" 2> /dev/null; do + continue + done + rsync -ptrW --delete --exclude "*.sqlite" $WORLDDIR/ $BACKUP_DIR/ + echo "Backup finished succesfully on $(date)" >> $LOG_FILE + mtstatus "Backup success" + rm /tmp/$(basename $WORLDDIR)_local_backup_in_progress 2> /dev/null + exit 0 + else + rm $BACKUP_DIR/map.sqlite.tmp 2> /dev/null + try=$(expr $try + 1) + if [ $try -eq 5 ]; then + echo "Backup failed 5 times, aborting on $(date)" >> $LOG_FILE + mtstatus "Backup failed" + rm /tmp/$(basename $WORLDDIR)_local_backup_in_progress 2> /dev/null + exit 1 + else + echo "map.sqlite backup attempt #$try failed, retrying in 60 seconds" >> $LOG_FILE + sleep 60 + fi + fi + done +} + #--------------------------------------------------------------------- # Handle the actions