diff --git a/deploy.sh b/deploy.sh index 3b09f61..607750b 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # WolfAdmin module for Wolfenstein: Enemy Territory servers. -# Copyright (C) 2015-2018 Timo 'Timothy' Smit +# Copyright (C) 2015-2019 Timo 'Timothy' Smit # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,191 +16,365 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -VERSION="1.2.0-dev" +curr_version="1.2.0-dev" -install() { - echo - - if [[ ! -d $fs_basepath/$fs_game ]]; then - while true; do - read -p "$fs_basepath/$fs_game does not exist, continue? (y/n) " yn - case $yn in - [Yy]* ) mkdir $fs_basepath/$fs_game; echo "created $fs_basepath/$fs_game"; break;; - [Nn]* ) echo 'exited without making changes'; exit;; - * ) echo 'please answer yes or no.';; - esac - done - fi +read_config() { + db_type=$(grep -oP '(?<=type = ")(sqlite3|mysql)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) - if [[ ! -d $fs_homepath/$fs_homedir/$fs_game ]]; then - while true; do - read -p "$fs_homepath/$fs_homedir/$fs_game does not exist, continue? (y/n) " yn - case $yn in - [Yy]* ) mkdir $fs_homepath/$fs_homedir/$fs_game; echo "created $fs_homepath/$fs_homedir/$fs_game"; break;; - [Nn]* ) echo 'exited without making changes'; exit;; - * ) echo 'please answer yes or no.';; - esac - done - fi - - if [[ -d $fs_basepath/$fs_game/luamods/wolfadmin ]]; then - while true; do - read -p "$fs_basepath/$fs_game/luamods/wolfadmin already exists, continue? (y/n) " yn - case $yn in - [Yy]* ) rm -r $fs_basepath/$fs_game/luamods/wolfadmin; echo 'removed old WolfAdmin luamod'; break;; - [Nn]* ) echo 'exited without making changes'; exit;; - * ) echo 'please answer yes or no.';; - esac - done + if [ $db_type == 'sqlite3' ]; then + db_file=$(grep -oP '(?<=file = ")([a-zA-Z0-9_]+\.db)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) + elif [ $db_type == 'mysql' ]; then + db_hostname=$(grep -oP '(?<=hostname = ")([a-zA-Z0-9]+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) + db_port=$(grep -oP '(?<=port = ")([0-9]{0,5})(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) + db_database=$(grep -oP '(?<=database = ")([a-zA-Z0-9_]+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) + db_username=$(grep -oP '(?<=username = ")([a-zA-Z0-9_]+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) + db_password=$(grep -oP '(?<=password = ")(.+)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml) fi echo +} +install_lualibs() { echo -n 'copying lualibs...' - cp -r lualibs/* $fs_basepath/$fs_game/lualibs + cp -r -u lualibs/ $fs_basepath/$fs_game/ echo 'done.' +} - echo -n 'copying luamods...' - cp -r luamods/* $fs_basepath/$fs_game/luamods +install_luascripts() { + echo -n 'copying luascripts...' + cp -r -u luascripts/ $fs_basepath/$fs_game/ echo 'done.' +} +install_configs() { echo -n 'copying configs...' - cp -n config/* $fs_homepath/$fs_homedir/$fs_game - echo 'done.' - - if [ -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 ]; then - rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 - echo 'removed old pk3' - install_pk3 - else - while true; do - read -p 'install pk3? (y/n) ' yn - case $yn in - [Yy]* ) install_pk3; break;; - [Nn]* ) echo 'pk3 not installed'; break;; - * ) echo 'please answer yes or no.';; - esac - done + cp -n config/* $fs_homepath/$fs_homedir/$fs_game/ + + if [ $db_type == 'sqlite' ]; then + sed -i -e "s/type = \"sqlite3\"/type = \"$db_type\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/file = \"wolfadmin.db\"/file = \"$db_file\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + elif [ $db_type == 'mysql' ]; then + sed -i -e "s/type = \"sqlite3\"/type = \"$db_type\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/file = \"wolfadmin.db\"/# file = \"wolfadmin.db\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/# hostname = \"localhost\"/hostname = \"$db_hostname\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/# port = 3306/port = \"$db_port\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/# database = \"wolfadmin\"/database = \"$db_database\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/# username = \"wolfadmin\"/username = \"$db_username\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml + sed -i -e "s/# password = \"suchasecret\"/password = \"$db_password\"/" $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml fi - if [ ! -x "$(command -v sqlite3)" ]; then - echo 'sqlite3 executable does not exist, cannot create database' - elif [[ -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db ]]; then - while true; do - read -p 'database already exists, overwrite? (y/n) ' yn - case $yn in - [Yy]* ) rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db; echo 'removed old database'; install_db; break;; - [Nn]* ) echo 'database not created'; break;; - * ) echo 'please answer yes or no.';; - esac - done - else - install_db - fi + echo 'done.' +} - echo +install_db_sqlite() { + echo "$fs_homepath/$fs_homedir/$fs_game/$db_file" - echo 'install process finished.' + echo -n 'initializing database...'; + sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file < database/new/sqlite.sql + echo 'done.' +} + +install_db_mysql() { + echo -n 'initializing database...'; + mysql -h $db_hostname -D $db_database -u $db_username -p$db_password < database/new/mysql.sql + echo 'done.' } install_pk3() { echo -n 'zipping pk3...'; - zip -r -q wolfadmin-$VERSION.pk3 pk3 + zip -r -q wolfadmin-$curr_version.pk3 pk3 echo 'done.' echo -n 'copying pk3...'; - cp wolfadmin-$VERSION.pk3 $fs_basepath/$fs_game + cp wolfadmin-$curr_version.pk3 $fs_basepath/$fs_game echo 'done.' } -install_db() { - echo -n 'initializing database...'; - sqlite3 $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db < database/new/sqlite.sql; - echo 'done.' -} - -update() { +install() { echo - if [[ ! -d $fs_basepath/$fs_game ]]; then - echo "$fs_basepath/$fs_game dir does not exist, cannot update" + if [ -d $fs_basepath/$fs_game/luascripts/wolfadmin ]; then + echo 'WolfAdmin has already been installed' exit - elif [[ ! -d $fs_homepath/$fs_homedir/$fs_game ]]; then - echo "$fs_homepath/$fs_game dir does not exist, cannot update" + fi + + install_lualibs + install_luascripts + + read -p 'db_type (sqlite3/mysql): ' db_type + + if [ -z $db_type ]; then + echo 'db_type cannot be empty' exit - elif [[ -d $fs_basepath/$fs_game/luamods/wolfadmin ]]; then - echo "$fs_basepath/$fs_game/luamods/wolfadmin does not exist, cannot update" + elif [ $db_type != 'sqlite3' ] && [ $db_type != 'mysql' ]; then + echo 'unknown db_type' exit fi - echo -n 'removing old WolfAdmin luamod...' - rm -r $fs_basepath/$fs_game/luamods/wolfadmin - echo 'done.' + if [ $db_type == 'sqlite3' ]; then + read -p 'db_file (wolfadmin.db): ' db_file - echo -n 'copying lualibs...' - cp -r lualibs/* $fs_basepath/$fs_game/lualibs + if [ -z $db_file ]; then + db_file='wolfadmin.db' + elif [[ $db_file != *.db ]]; then + echo 'db_file should end with .db' + exit + fi + + if [ -e $fs_homepath/$fs_homedir/$fs_game/$db_file ]; then + while true; do + read -p 'database already exists, append? (y/n) ' yn + case $yn in + [Yy]* ) install_db_sqlite; break;; + [Nn]* ) echo 'database not created'; break;; + * ) echo 'please answer yes or no.';; + esac + done + else + install_db_sqlite + fi + elif [ $db_type == 'mysql' ]; then + read -p 'db_hostname (localhost): ' db_hostname + + if [ -z $db_hostname ]; then + db_hostname='localhost' + fi + + read -p 'db_port (3306): ' db_port + + if [ -z $db_port ]; then + db_port=3306 + fi + + read -p 'db_database (wolfadmin): ' db_database + + if [ -z $db_database ]; then + db_database='wolfadmin' + fi + + read -p 'db_username (wolfadmin): ' db_username + + if [ -z $db_username ]; then + echo 'db_username cannot be empty' + exit + fi + + read -s -p 'db_password: ' db_password + + if [ -z $db_password ]; then + echo 'db_password cannot be empty' + exit + fi + + echo + + install_db_mysql + fi + + install_configs + + while true; do + read -p 'install pk3 (y/n) ' yn + case $yn in + [Yy]* ) install_pk3; break;; + [Nn]* ) echo 'pk3 not installed'; break;; + * ) echo 'please answer yes or no.';; + esac + done + + echo + + echo 'install process finished.' +} + +update_lualibs() { + install_lualibs +} + +update_luascripts() { + echo -n 'removing old luascripts...' + rm -r $fs_basepath/$fs_game/luascripts/wolfadmin/ echo 'done.' - echo -n 'copying luamods...' - cp -r luamods/* $fs_basepath/$fs_game/luamods + install_luascripts +} + +update_configs() { + install_configs +} + +update_db_sqlite() { + echo -n 'updating database...' + sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file < database/upgrade/$prev_version/sqlite.sql echo 'done.' +} - echo -n 'copying configs...' - cp -n config/* $fs_homepath/$fs_homedir/$fs_game +update_db_mysql() { + echo -n 'updating database...' + mysql -h $db_hostname -D $db_database -u $db_username -p$db_password < database/upgrade/$prev_version/mysql.sql echo 'done.' +} - if [ -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 ]; then - rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 - echo 'removed old pk3' - install_pk3 - else +update_pk3() { + if [ ! -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 ]; then while true; do read -p 'install pk3? (y/n) ' yn case $yn in - [Yy]* ) install_pk3; break;; - [Nn]* ) echo 'pk3 not installed'; break;; + [Yy]* ) break;; + [Nn]* ) echo 'pk3 not updated'; return;; # break;; * ) echo 'please answer yes or no.';; esac done + else + rm $fs_homepath/$fs_homedir/$fs_game/wolfadmin*.pk3 + echo 'removed old pk3' fi - if [ ! -x "$(command -v sqlite3)" ]; then - echo 'sqlite3 executable does not exist, cannot update database' - elif [[ ! -e $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db ]]; then - echo 'wolfadmin.db does not exist, cannot update database' - else - echo -n 'updating database...' - sqlite3 $fs_homepath/$fs_homedir/$fs_game/wolfadmin.db < database/update/$prev_version/sqlite.sql - echo 'done.' + install_pk3 +} + +update() { + echo + + if [ ! -d $fs_basepath/$fs_game/luascripts/wolfadmin ]; then + echo 'WolfAdmin has not been installed' + exit fi + read_config + + read -p 'Have you backupped any changes/additions to WolfAdmin sources? (y/n) ' yn + + if [ $yn != 'y' ]; then + echo 'Please backup any modifications to WolfAdmin.' + exit + fi + + if [ $db_type == 'sqlite3' ]; then + table_check=$(sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file "SELECT 1 FROM player" 2>/dev/null) + + if [ $? -eq 1 ]; then + echo 'Database does not exist' + exit + fi + + prev_version=$(sqlite3 $fs_homepath/$fs_homedir/$fs_game/$db_file "SELECT value FROM config WHERE id='schema_version'" 2>/dev/null) + + if [ $? -eq 1 ]; then + echo 'Database version unknown' + exit + fi + + if [ ! -x database/upgrade/$prev_version/sqlite.sql ]; then + echo "Cannot update from version $prev_version to version $curr_version; no database scripts available." + exit + fi + elif [ $db_type == 'mysql' ]; then + table_check=$(mysql -h $db_hostname -D $db_database -u $db_username -p$db_password -e "SELECT 1 FROM player" 2>/dev/null) + + if [ $? -eq 1 ]; then + echo 'Database does not exist' + exit + fi + + prev_version=$(mysql -h $db_hostname -D $db_database -u $db_username -p$db_password -e "SELECT value FROM config WHERE id='schema_version'" 2>/dev/null) + + if [ $? -eq 1 ]; then + echo 'Database version unknown' + fi + + if [ ! -x database/upgrade/$prev_version/mysql.sql ]; then + echo "Cannot update from version $prev_version to version $curr_version; no database scripts available." + exit + fi + fi + + update_lualibs + update_luascripts + + if [ $db_type == 'sqlite3' ]; then + update_db_sqlite + elif [ $db_type == 'mysql' ]; then + update_db_mysql + fi + + update_pk3 + update_configs + echo echo 'update process finished.' } -echo "WolfAdmin $VERSION deployment script" +echo "WolfAdmin $curr_version deployment script" + +echo + +echo "This script is HIGHLY experimental. You cannot use this script for \ +WolfAdmin versions pre-1.1.0. Make sure you have backupped your database. I am \ +not responsible for any data loss." + +echo + +echo -n 'Checking package integrity...' +if [ ! -d 'lualibs' ]; then + echo + echo 'lualibs dir does not exist' + exit +elif [ ! -d 'luascripts' ]; then + echo + echo 'luascripts dir does not exist' + exit +elif [ ! -d 'config' ]; then + echo + echo 'config dir does not exist' + exit +elif [ ! -d 'database' ] || [ ! -d 'database/new' ] || \ + [ ! -e 'database/new/sqlite.sql' ] || [ ! -e 'database/new/mysql.sql' ] || \ + [ ! -d 'database/upgrade' ]; then + echo + echo 'database dir does not exist or is incomplete' + exit +elif [ ! -d 'pk3' ]; then + echo + echo 'pk3 dir does not exist' + exit +fi +echo 'OK' + +echo -n 'Checking dependencies...' +if [ ! -x "$(command -v sqlite3)" ]; then + echo + echo 'sqlite3 executable does not exist' +fi +if [ ! -x "$(command -v mysql)" ]; then + echo + echo 'mysql executable does not exist' +fi +echo 'OK' read -p 'fs_basepath (install directory): ' fs_basepath +fs_basepath=/home/timo/game/fsb -if [[ -z $fs_basepath ]]; then +if [ -z $fs_basepath ]; then echo 'fs_basepath cannot be empty' exit -elif [[ ! -d $fs_basepath ]]; then +elif [ ! -d $fs_basepath ]; then echo 'fs_basepath does not exist' exit fi read -p 'fs_homepath (user directory): ' fs_homepath +fs_homepath=/home/timo/game/fsh -if [[ -z $fs_homepath ]]; then +if [ -z $fs_homepath ]; then echo 'fs_homepath cannot be empty' exit -elif [[ ! -d $fs_homepath ]]; then +elif [ ! -d $fs_homepath ]; then echo 'fs_homepath does not exist' exit -elif [[ -d $fs_homepath/.etlegacy ]]; then +elif [ -d $fs_homepath/.etlegacy ]; then fs_homedir=.etlegacy -elif [[ -d $fs_homepath/.wolfet ]]; then +elif [ -d $fs_homepath/.wolfet ]; then fs_homedir=.wolfet else echo 'fs_homepath does not contain a .etlegacy or .wolfet directory' @@ -208,10 +382,17 @@ else fi read -p 'fs_game (e.g. legacy, nq): ' fs_game +fs_game=mod -if [[ -z $fs_game ]]; then +if [ -z $fs_game ]; then echo 'fs_game cannot be empty' exit +elif [ ! -d $fs_basepath/$fs_game ]; then + echo 'fs_basepath/fs_game does not exist' + exit +elif [ ! -d $fs_homepath/$fs_homedir/$fs_game ]; then + echo 'fs_basepath/fs_homedir/fs_game does not exist' + exit fi echo