Скрипты Minecraft

Управление сервером Debian/Ubuntu

nano server.sh
#!/bin/bash

#------------------------------------------------------------------------------
#   Управление сервером Minecraft
#   Версия 1.3
#   Автор: FLIP (ArtShefer)
#
#   Разреши скрипту исполняться:
# chmod +x server.sh
#
#   Вызвать справку:
# ./server.sh help
#------------------------------------------------------------------------------



#------------------------------------------------------------------------------
#   Конфигурация
#------------------------------------------------------------------------------


#   Индивидуальное имя для проекта
name="mc"

#   Минимальный объем оперативной памяти (G - Гбайт)
min="1G"

#   Максимальный объем оперативной памяти (G - Гбайт)
max="2G"

#   Имя ядра сервера
#core="server.jar"
core="server.jar"

#   Полный путь к каталогу с сервером
#path="/home/user/servermc"
path="/home/user/servermc"

#   Путь к java
#java="/usr/bin/java"
java="/usr/bin/java"

#   Параметры java
#javaopt="-server -Dfile.encoding=UTF-8"
javaopt="-server -Dfile.encoding=UTF-8"

#   Параметры ядра
#coreopt="--nogui"
coreopt="--nogui"

#   Имя для screen (используется индивидуальное имя проекта)
#screen="mc"
screen=$name

#   Полный путь к каталогу для бекапов
#bakpath="/home/user/backup"
bakpath="/home/user/backup"

#   Префикс для бекапа (используется индивидуальное имя проекта)
#bakname="mc"
bakname=$name

#   Удаление бекапов старее указанных дней
baktime=7

#   Имя для службы (используется индивидуальное имя проекта)
#   Для установки в /etc/systemd/system
#   Так же для службы используется данный скрипт
#   После переименовании скрипта, потребуется переустановка службы
#service="mc-daemon"
service="$name-daemon"



#------------------------------------------------------------------------------
#   Ядро
#------------------------------------------------------------------------------


scriptHelp() {
echo ""
echo "Использование:    $0 [Параметр] ..."
echo "Перед запуском сервера необходимо запустить проверки:"
echo "  $0 test"
echo ""
echo "Параметры запуска:"
echo "  help            - показать эту справку"
echo "  test            - запустить проверки"
echo "  start           - запустить сервер"
echo "  stop            - остановить сервер"
echo "  restart         - перезагрузить сервер"
echo "  status          - статус сервера"
echo "  backup          - создать бекап сервера"
echo ""
echo "  save            - сохранить мир (save-all)"
echo "  say сообщение   - сказать от имени сервера (say)"
echo "  me сообщение    - сказать от имени сервера (me)"
echo "  cmd команда     - передать команду серверу"
echo ""
echo "Параметры запуска требующие пароль суперпользователя (ROOT):"
echo "  install         - установка службы (демона)"
echo "  remove          - удаление службы (демона)"
echo "  reinstall       - переустановка службы (демона)"
echo ""
echo "СЛУЖБА"
echo " Установка службы для сервера, позволит запускать сервер автоматически"
echo " при старте системы без добавления в cron, а так же позволит"
echo " безопасно завершить работу сервера при выключении/перезагрузки системы"
echo " Будет доступно управление через systemctl, служба $service"
echo ""
echo "БЕКАП"
echo " Сделать бекап можно только при выключенном сервере"
echo " Если во время запуска бекапа был запущен сервер, он его остановит"
echo " и запустит после завершения работы. При этом предупредит игроков о"
echo " перезагрузке сервера, за минуту до начала выполнения резервной копии"
echo ""
echo "  майнкрафт для мальчиков, факторка для мужиков"
}



daemonpath="/etc/systemd/system/$service.service"



mineCMD() {
/usr/bin/screen -p 0 -S $screen -X stuff "$*\n"
}



checkServer() {
if [ $(/usr/bin/screen -ls | grep ".$screen"$'\t' | wc -l) -eq 1 ]; then
        return 1
else
        return 0
fi
}



checkScreen() {
if [ -f "/usr/bin/screen" ]; then
        return 1
else
        return 0
fi
}



checkJava() {
if [ -f $java ]; then
        return 1
else
        return 0
fi
}



checkCore() {
if [ -f $path/$core ]; then
        return 1
else
        return 0
fi
}



checkBackup() {
if [ -d $bakpath ]; then
        return 1
else
        return 0
fi
}



checkService() {
if [ -f $daemonpath ]; then
        return 1
else
        return 0
fi
}



checkEula() {
if [ -f $path/eula.txt ]; then
        if [ $(cat $path/eula.txt | grep eula=true | wc -l) -eq 1 ]; then
                return 0
        else
                return 1
        fi
else
        return 0
fi
}



scriptTest() {

checkScreen
if [ $? -eq 1 ]; then
        echo "+ screen установлен"
else
        echo "- Программа screen не установлена"
        echo "  Подсказка для установки:"
        echo "  # apt-get install screen"
fi

checkJava
if [ $? -eq 1 ]; then
        echo "+ java установлена"
else
        echo "- Программа java не установлена"
        echo "  Подсказка для установки:"
        echo "  # apt-get install default-jdk"
fi

checkCore
if [ $? -eq 1 ]; then
        echo "+ Ядро сервера найдено"
else
        echo "- Ядро сервера не найдено"
        echo "  Подсказка:"
        echo "  Настрой скрипт и/или проверь наличие ядра в каталоге"
fi

checkBackup
if [ $? -eq 1 ]; then
        echo "+ Каталог для бекапов найден"
else
        echo "- Не найден каталог для бекапов (не обязательно)"
        echo "  Подсказка:"
        echo "  Настрой скрипт и/или проверь наличие каталога"
fi

checkService
if [ $? -eq 1 ]; then
        echo "+ Служба сервера найдена $service"
else
        echo "- Служба сервера не найдена (не обязательно)"
        echo "  Подсказка для установки:"
        echo "  Запусти скрипт с параметром install"
fi
}



scriptMsgRestart() {
mineCMD "say Перезагрузка сервера через минуту!"
sleep 30
mineCMD "say Перезагрузка сервера через 30 секунд!"
sleep 20
mineCMD "say Перезагрузка сервера через 10 секунд!"
sleep 5
mineCMD "say Перезагрузка сервера через 5 секунд!"
sleep 1
mineCMD "say Перезагрузка сервера через 4 секунды!"
sleep 1
mineCMD "say Перезагрузка сервера через 3 секунды!"
sleep 1
mineCMD "say Перезагрузка сервера через 2 секунды!"
sleep 1
mineCMD "say Перезагрузка сервера через 1 секунду!"
sleep 1
}



scriptBackup() {
checkBackup
if [ $? -eq 1 ]; then
        checkServer
        if [ $? -eq 1 ]; then
                serverRun=1
                scriptMsgRestart
                mineStop
                sleep 1
        else
                serverRun=0
        fi
        find $bakpath -name "*.tar.gz" -type f -mtime $baktime -delete
        backupname=$bakname"_backup_"$(date +'%Y-%m-%d-%H%M%S')".tar.gz"
        tar cfvz $bakpath/$backupname $path/
        if [ $serverRun -eq 1 ]; then
                mineStart
        fi
else
        echo "Не найден каталог для бекапов"
        echo "Запусти тест:"
        echo "$0 test"
fi
}



scriptRoot() {
if [ $(groups $USER | grep sudo | wc -l) -eq 1 ]; then
        sudo $0 $*
else
        su root -c "$0 $*"
fi
}



mineStart() {
checkEula
if [ $? -eq 1 ]; then
        echo "Необходимо принять лицензионное соглашение Eula"
        echo "В фале eula.txt замени false на true"
fi
echo "cd" $path "&&" $java -Xms$min -Xmx$max $javaopt -jar $path/$core $coreopt
cd $path && /usr/bin/screen -dmS $screen $java -Xms$min -Xmx$max $javaopt -jar $path/$core $coreopt
}



mineStartDaemon() {
sleep 5
mineStart
}



mineSave() {
mineCMD "save-all"
}



mineStop() {
mineCMD "stop"
checkServer
while [ $? -eq 1 ]
do
        checkServer
done
}



mineRestart() {
scriptMsgRestart
mineStop
sleep 1
mineStart
}



mineStatus() {
checkServer
if [ $? -eq 1 ]; then
        echo "Сервер запущен"
else
        echo "Сервер не запущен"
fi
}



mineSay() {
mineCMD $*
}



mineMe() {
mineCMD $*
}



runUser() {
        if [ -n "$1" ]
        then
        case $1 in
                help)
                        scriptHelp
                        ;;
                test)
                        scriptTest
                        ;;
                start)
                        mineStart
                        ;;
                start-daemon)
                        mineStartDaemon
                        ;;
                stop)
                        mineStop
                        ;;
                restart)
                        mineRestart
                        ;;
                status)
                        mineStatus
                        ;;
                install)
                        scriptRoot install $USER
                        ;;
                remove)
                        scriptRoot remove
                        ;;
                backup)
                        scriptBackup
                        ;;
                save)
                        mineSave
                        ;;
                say)
                        mineSay $*
                        ;;
                me)
                        mineMe $*
                        ;;
                cmd)
                        cmd=$*
                        mineCMD ${cmd:4}
                        ;;
                *)
                        echo "Ты ошибся приятель!"
                        scriptHelp
                        ;;
        esac
        else
                echo Запусти: $0 help
        fi
}



daemonWrite() {
echo $* >> $daemonpath
}



daemonInstall() {
if [[ $2 == "" ]];then
        echo "Запусти команду от пользователя"
else
        checkService
        if [ $? -eq 1 ]; then
                echo "Служба сервера уже существует $service"
        else

                scriptserver=$( realpath $0 )

                daemonWrite "[Unit]"
                daemonWrite "Description=Minecraft Server $name"
                daemonWrite "After=network.target"
                daemonWrite ""
                daemonWrite "[Service]"
                daemonWrite "Type=oneshot"
                daemonWrite "RemainAfterExit=yes"
                daemonWrite "User=$2"
                daemonWrite "Restart=no"
                daemonWrite "ExecStart=$scriptserver start-daemon"
                daemonWrite "ExecStop=$scriptserver stop"
                daemonWrite ""
                daemonWrite "[Install]"
                daemonWrite "WantedBy=multi-user.target"
                daemonWrite ""

                systemctl daemon-reload
                systemctl enable $service.service

                echo "Служба $service установлена"
        fi
fi
}



daemonRemove() {
checkService
if [ $? -eq 1 ]; then
        systemctl disable $service.service
        rm $daemonpath
        systemctl daemon-reload
        echo "Служба $service удалена"
else
        echo "Служба $service не существует"
fi
}



runRoot() {
        if [ -n "$1" ]
        then
        case $1 in
                install)
                        daemonInstall $*
                        ;;
                remove)
                        daemonRemove
                        ;;
                reinstall)
                        daemonRemove
                        daemonInstall $*
                        ;;
                *)
                        echo "Ты ошибся приятель!"
                        scriptHelp
                        ;;
        esac
        fi
}



if [[ $EUID -ne 0 ]]; then
    runUser $*
else
    runRoot $*
fi