wolfadmin/deploy.sh
2020-04-14 21:03:02 +02:00

408 lines
12 KiB
Bash

#!/usr/bin/env bash
# WolfAdmin module for Wolfenstein: Enemy Territory servers.
# Copyright (C) 2015-2020 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
# the Free Software Foundation, either version 3 of the License, or
# at your option any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
curr_version="1.2.0"
read_config() {
db_type=$(grep -oP '(?<=type = ")(sqlite3|mysql)(?=")' $fs_homepath/$fs_homedir/$fs_game/wolfadmin.toml)
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 -u lualibs/ $fs_basepath/$fs_game/
echo 'done.'
}
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/
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
echo 'done.'
}
install_db_sqlite() {
echo "$fs_homepath/$fs_homedir/$fs_game/$db_file"
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...';
pushd pk3
zip -r -q ../wolfadmin-$curr_version.pk3 .
popd
echo 'done.'
echo -n 'copying pk3...';
cp wolfadmin-$curr_version.pk3 $fs_basepath/$fs_game
echo 'done.'
}
install() {
echo
if [ -d $fs_basepath/$fs_game/luascripts/wolfadmin ]; then
echo 'WolfAdmin has already been installed'
exit
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 [ $db_type != 'sqlite3' ] && [ $db_type != 'mysql' ]; then
echo 'unknown db_type'
exit
fi
if [ $db_type == 'sqlite3' ]; then
read -p 'db_file (wolfadmin.db): ' db_file
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.'
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.'
}
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.'
}
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]* ) 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
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 $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
echo 'fs_basepath cannot be empty'
exit
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
echo 'fs_homepath cannot be empty'
exit
elif [ ! -d $fs_homepath ]; then
echo 'fs_homepath does not exist'
exit
elif [ -d $fs_homepath/.etlegacy ]; then
fs_homedir=.etlegacy
elif [ -d $fs_homepath/.wolfet ]; then
fs_homedir=.wolfet
else
echo 'fs_homepath does not contain a .etlegacy or .wolfet directory'
exit
fi
read -p 'fs_game (e.g. legacy, nq): ' fs_game
fs_game=mod
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
while true; do
read -p 'install or update? (i/u) ' mode
case $mode in
[Ii]* ) install; break;;
[Uu]* ) update; break;;
esac
done