#!/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 . 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