=================================================================== RCS file: /cvs/mtctl/mtctl_default.sh,v retrieving revision 1.6 retrieving revision 1.9 diff -u -p -r1.6 -r1.9 --- mtctl/mtctl_default.sh 2022/05/29 14:33:42 1.6 +++ mtctl/mtctl_default.sh 2023/05/02 18:04:20 1.9 @@ -1,9 +1,9 @@ #--------------------------------------------------------------------- # Filename: mtctl -# Purpose: Minetest server Control -# License: Copyright (C) 2021 by Miniontoby +# Purpose: Minetest Server Control +# License: Copyright (C) 2021-2022 by Miniontoby #--------------------------------------------------------------------- -VERSION="1.4" +VERSION="1.6" 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|backup worldname\n mtctl list|help|version|check_updates" + echo -e "usage: mtctl start|stop|restart|status|create|backup|enable|disable worldname\n mtctl list|help|version|check_updates" } if [ "x$1" == "x" ]; then mthelp; exit 0; fi @@ -28,7 +28,7 @@ if [ \! -d $CONFDIR ]; then mkdir -p $CONFDIR || exit if [ \! -f $CONFDIR/config ]; then mtinfo "\nNo configfile found!\nCreating it now!\n\n" echo -n 'Use custom build minetest folder (yes/no): '; read MTBUILD - case $MTBUILD in + case $MTBUILD in YES|yes) MTBUILD='yes' EXAMPLEDIR="$HOME/minetest" ;; @@ -86,6 +86,7 @@ SetWorld() { NAME=$1; if [ "x$NAME" == "x" ]; then mthelp; exit 1; fi WORLDDIR=$WORLDBASE/$NAME; if [ \! -d $WORLDDIR ]; then mtstatus "Failed"; mtinfo "Error: World not found: $NAME"; exit 1; fi PORT=`grep '^port.*=' $WORLDDIR/world.conf | sed -e "s/^.*= *//" -e "s/ .*//"`; if [ "x$PORT" == "x" ]; then mtstatus "Failed"; mtinfo "Error: Port for $NAME not defined in cfg file"; exit 1; fi + OWNER=`grep '^name.*=' $WORLDDIR/world.conf | sed -e "s/^.*= *//" -e "s/ .*//"`; if [ "x$OWNER" == "x" ]; then mtstatus "Failed"; mtinfo "Error: Owner for $NAME not defined in cfg file"; exit 1; fi } mtstatus() { CHECK="$1" @@ -98,9 +99,9 @@ mtstatus() { CHECK="Offline" fi EXTRA="\n" - elif [ "$CHECK" == "Failed" ]; then EXTRA=" \n"; - elif [ "$CHECK" == "Backup failed" ]; then EXTRA=" \n"; - elif [ "$CHECK" == "Backup success" ]; then EXTRA=" \n"; 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" } @@ -118,10 +119,9 @@ startMT() { fi EXITFLAGWORLD=$EXITDIR/mtctlstop.$NAME - MINETEST_SUBGAME_PATH=${config[1]}/games + MINETEST_SUBGAME_PATH=${config[1]}/games # MAYBE Export if linux doesnt work - rm -f $EXITFLAGALL sleep 1; DIR=`pwd` || exit 1; cd $WORLDDIR || exit 1 F1=env_meta.txt; F2=env_meta.old; if [ -s $F1 ]; then N=`grep EnvArgsEnd $F1 | wc -l` || exit 1; if [ "x$N" == "x0" ]; then rm -f $F1 || exit 1; fi; fi; if [ -s $F1 ]; then rm -f $F2; cp -p $F1 $F2 || exit 1; else if [ -s $F2 ]; then rm -f $F1; cp -p $F2 $F1 || exit 1; else rm -f $F1 || exit 1; fi; fi cd $DIR || exit 1 @@ -143,10 +143,8 @@ stopMT() { if [ "x$FOO" \!= "x" ]; then kill -SIGINT $FOO - else - if [ "x$BAR" \!= "x" ]; then - kill -9 $BAR - fi + elif [ "x$BAR" \!= "x" ]; then + kill -9 $BAR fi mtstatus "Waiting" @@ -172,21 +170,21 @@ restartMT() { } statusMT() { - 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" + SetWorld "$1" + GetPIDS "$WORLDDIR" "$NAME" + if [ "x$FOO$BAR" \!= "x" ]; then + STATUS="Online" + else + STATUS="Offline" + fi + LASTLOG="`tail -n 5 $LOGDIR/$NAME.log 2> /dev/null`" + echo -e "mtctl.$1 - The Minetest Server Control\n Active: $STATUS\n Process: $FOO\n Main PID: $BAR\n\n$LASTLOG" } listMT() { for WORLDNAME in `ls $WORLDBASE 2> /dev/null | grep '^[a-zA-Z0-9]*$' | sort`; do SetWorld "$WORLDNAME" - mtinfo "World: $WORLDNAME Port: $PORT" + mtinfo "World: $WORLDNAME, Port: $PORT, Owner: $OWNER" done } @@ -195,16 +193,18 @@ createMT() { if [ "x$NAME" == "x" ]; then echo -e "Failed\nError: Worlds need a name\n"; exit 1; else if [ -d $WORLDBASE/$NAME ]; then echo -e "Failed\nError: World already exist\n"; exit 1; else echo -e "Server name: Ok"; fi; fi echo -ne "\nServer Description: "; read SERVER_DESCRIPTION PortCheck () { - CHECK='yes'; if [ -z "${PORT##*[!0-9]*}" ]; then CHECK='no'; ERROR="Ports are only numeric"; return; fi; for x in `ls /home/$MTUSER/minetest/worlds | sort`; do export WCFILE=$WORLDBASE/$x/world.conf; if [ -f $WCFILE ]; then export PORTF=`grep '^port.*=' $WCFILE | sed -e "s/^.*= *//" -e "s/ .*//"`; if [ "x$PORTF" == "x$1" ]; then CHECK='no'; ERROR="Port already in use"; return; fi; fi; done + CHECK='yes'; if [ -z "${PORT##*[!0-9]*}" ]; then CHECK='no'; ERROR="Ports are only numeric"; return; fi; for x in `ls $WORLDBASE | sort`; do export WCFILE=$WORLDBASE/$x/world.conf; if [ -f $WCFILE ]; then export PORTF=`grep '^port.*=' $WCFILE | sed -e "s/^.*= *//" -e "s/ .*//"`; if [ "x$PORTF" == "x$1" ]; then CHECK='no'; ERROR="Port already in use"; return; fi; fi; done } - while true; do echo -ne "\nPort: "; read PORT; PortCheck $PORT; if [ "$CHECK" == "no" ]; then echo -e "Failed\nError: $ERROR"; sleep 1; else echo -e "Ok"; break; fi; done + while true; do + echo -ne "\nPort: "; read PORT; PortCheck $PORT; if [ "$CHECK" == "no" ]; then echo -e "Failed\nError: $ERROR"; exit 1; else echo -e "Ok"; break; fi; + done echo -ne "\nMessage Of The Day [MOTD]: "; read MOTD; echo -ne "\nSeed: "; read SEED; echo -ne "\nCreative (true/false): "; read CREATIVE_MODE echo -ne "\nEnable Damage (true/false): "; read ENABLE_DAMAGE; echo -ne "\nEnable Player Versus Player [PVP] (true/false): "; read ENABLE_PVP 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\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\nbackend = SQLite3\nplayer_backend = SQLite3\nmod_storage_backend = SQLite3\nauth_backend = SQLite3\ngameid = minetest\nworld_name = $NAME" > world.mt + echo -e "creative_mode = $CREATIVE_MODE\nenable_damage = $ENABLE_DAMAGE\nbackend = sqlite3\nplayer_backend = sqlite3\nmod_storage_backend = sqlite3\nauth_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" @@ -245,7 +245,7 @@ backupMT() { until sqlite3 $WORLDDIR/players.sqlite ".backup $BACKUP_DIR/players.sqlite" 2> /dev/null; do continue done - rsync -ptrW --delete --exclude "*.sqlite" $WORLDDIR/ $BACKUP_DIR/ + 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 @@ -266,7 +266,60 @@ backupMT() { done } +startupMT() { + if [[ -f "$CONFDIR/startup" ]]; then + if [[ -f "$CONFDIR/.booted" ]]; then + exit 1 + fi + failed="" + while read -r line + do + /usr/bin/mtctl start "$line" || failed="$failed, $line" + done < "$CONFDIR/startup" + if [[ "x$failed" == "x" ]]; then + echo "Success!" + else + echo "Servers have failed to start$failed" + fi + touch $CONFDIR/.booted + fi +} +enableMT() { + SetWorld "$1" + if [[ -f "$CONFDIR/startup" ]]; then + INCLUDES=$(grep -x "$NAME" $CONFDIR/startup) + if [[ "X$INCLUDES" == "X$NAME" ]]; then + echo "$NAME is already enabled!" + return + fi + fi + if [[ $(crontab -l | egrep -v "^(#|$)" | grep -q '/usr/bin/mtctl startup'; echo $?) == 1 ]]; then + set -f + crontab -l > temp + echo '@reboot rm $HOME/.mtctl/.booted 2>/dev/null && /usr/bin/mtctl startup' >> temp + cat temp | crontab - + rm temp + set +f + fi + echo "$NAME" >> $CONFDIR/startup + echo "$NAME is enabled!" +} + +disableMT() { + SetWorld "$1" + if [[ -f "$CONFDIR/startup" ]]; then + INCLUDES=$(grep -x "$NAME" $CONFDIR/startup) + if [[ "X$INCLUDES" == "X$NAME" ]]; then + grep -xv "$NAME" $CONFDIR/startup > temp && mv temp $CONFDIR/startup + echo "$NAME is disabled!" + return + fi + fi + echo "$NAME is already disabled!" +} + + #--------------------------------------------------------------------- # Handle the actions ACTION="$1" @@ -295,6 +348,21 @@ case $ACTION in create) mtsetup createMT "$2" + ;; + backup) + mtsetup + backupMT "$2" + ;; + startup) + startupMT + ;; + enable) + #mtsetup + enableMT "$2" + ;; + disable) + #mtsetup + disableMT "$2" ;; version) mtinfo "Version: $VERSION"