Просмотр исходного кода

Merge remote-tracking branch 'refs/remotes/origin/master' into gmod-content-mounting

Conflicts:
	functions/fn_getopt
Daniel Gibbs 10 лет назад
Родитель
Сommit
7b58d5b804

+ 17 - 156
.travis.yml

@@ -1,164 +1,25 @@
 language: bash
+sudo: false
+env:
+- DISTRO=ubuntu-trusty
 
 before_script:
     - curl -L "https://shunit2.googlecode.com/files/shunit2-2.1.6.tgz" | tar zx
 
+addons:
+  apt:
+    sources:
+    - ubuntu-toolchain-r-test
+    packages:
+    - tmux
+    - mailutils
+    - postfix 
+    - lib32gcc1 
+    - libstdc++6 
+    - libstdc++6:i386 
+    - telnet 
+    - expect
 
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/7DaysToDie/serverfiles
-    - touch /home/travis/build/dgibbs64/linuxgsm/7DaysToDie/serverfiles/serverconfig.xml
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/CounterStrike/serverfiles/
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/CounterStrike/serverfiles/cstrike
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/CounterStrikeGlobalOffensive/serverfiles/
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/CounterStrikeGlobalOffensive/serverfiles/csgo
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/CounterStrikeGlobalOffensive/serverfiles/csgo/cfg
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/JustCause2/serverfiles/
-    - touch  /home/travis/build/dgibbs64/linuxgsm/JustCause2/serverfiles/default_config.lua
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/KillingFloor/serverfiles
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/KillingFloor/serverfiles/System
-    - touch /home/travis/build/dgibbs64/linuxgsm/KillingFloor/serverfiles/System/Default.ini
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/ProjectZomboid/Zomboid
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/ProjectZomboid/Zomboid/Server
-    - mkdir  /home/travis/build/dgibbs64/linuxgsm/ProjectZomboid/serverfiles
-    - mkdir  /home/travis/build/dgibbs64/linuxgsm/ProjectZomboid/serverfiles/projectzomboid
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/SeriousSam3BFE/serverfiles
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/SeriousSam3BFE/serverfiles/Content/
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/SeriousSam3BFE/serverfiles/Content/SeriousSam3
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/SeriousSam3BFE/serverfiles/Content/SeriousSam3/Config
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/SeriousSam3BFE/serverfiles/Bin
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/UnrealTournament2004/serverfiles
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/UnrealTournament2004/serverfiles/System
-    - touch /home/travis/build/dgibbs64/linuxgsm/UnrealTournament2004/serverfiles/System/ut2k4-server.ini
-
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/UnrealTournament99/serverfiles
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/UnrealTournament99/serverfiles/System
-    - touch /home/travis/build/dgibbs64/linuxgsm/UnrealTournament99/serverfiles/System/ut99-server.ini
-    - mkdir /home/travis/build/dgibbs64/linuxgsm/TeamSpeak3/serverfiles
 script:
 
-    - bash 7DaysToDie/sdtdserver auto-install
-    - bash 7DaysToDie/sdtdserver start
-    - bash 7DaysToDie/sdtdserver stop
-    - bash 7DaysToDie/sdtdserver restart
-    - bash 7DaysToDie/sdtdserver validate
-    - bash 7DaysToDie/sdtdserver monitor
-    - bash 7DaysToDie/sdtdserver email-test
-    - bash 7DaysToDie/sdtdserver details
-
-    - bash Arma3/arma3server auto-install
-    - bash Arma3/arma3server start
-    - bash Arma3/arma3server stop
-    - bash Arma3/arma3server restart
-    - bash Arma3/arma3server validate
-    - bash Arma3/arma3server monitor
-    - bash Arma3/arma3server email-test
-    - bash Arma3/arma3server details
-
-    - bash CounterStrike/csserver auto-install
-    - bash CounterStrike/csserver start
-    - bash CounterStrike/csserver stop
-    - bash CounterStrike/csserver restart
-    - bash CounterStrike/csserver validate
-    - bash CounterStrike/csserver monitor
-    - bash CounterStrike/csserver email-test
-    - bash CounterStrike/csserver details
-
-    - bash CounterStrikeGlobalOffensive/csgoserver auto-install
-    - bash CounterStrikeGlobalOffensive/csgoserver start
-    - bash CounterStrikeGlobalOffensive/csgoserver stop
-    - bash CounterStrikeGlobalOffensive/csgoserver restart
-    - bash CounterStrikeGlobalOffensive/csgoserver validate
-    - bash CounterStrikeGlobalOffensive/csgoserver monitor
-    - bash CounterStrikeGlobalOffensive/csgoserver email-test
-    - bash CounterStrikeGlobalOffensive/csgoserver details
-
-    - bash JustCause2/jc2server auto-install
-    - bash JustCause2/jc2server start
-    - bash JustCause2/jc2server stop
-    - bash JustCause2/jc2server restart
-    - bash JustCause2/jc2server validate
-    - bash JustCause2/jc2server monitor
-    - bash JustCause2/jc2server email-test
-    - bash JustCause2/jc2server details
-
-    - bash KillingFloor/kfserver auto-install
-    - bash KillingFloor/kfserver start
-    - bash KillingFloor/kfserver stop
-    - bash KillingFloor/kfserver restart
-    - bash KillingFloor/kfserver validate
-    - bash KillingFloor/kfserver monitor
-    - bash KillingFloor/kfserver email-test
-    - bash KillingFloor/kfserver details
-
-    - bash NaturalSelection2/ns2server auto-install
-    - bash NaturalSelection2/ns2server start
-    - bash NaturalSelection2/ns2server stop
-    - bash NaturalSelection2/ns2server restart
-    - bash NaturalSelection2/ns2server validate
-    - bash NaturalSelection2/ns2server monitor
-    - bash NaturalSelection2/ns2server email-test
-    - bash NaturalSelection2/ns2server details
-
-    - bash ProjectZomboid/pzserver auto-install
-    - bash ProjectZomboid/pzserver start
-    - bash ProjectZomboid/pzserver stop
-    - bash ProjectZomboid/pzserver restart
-    - bash ProjectZomboid/pzserver validate
-    - bash ProjectZomboid/pzserver monitor
-    - bash ProjectZomboid/pzserver email-test
-    - bash ProjectZomboid/pzserver details
-
-    - bash SeriousSam3BFE/ss3sserver auto-install
-    - bash SeriousSam3BFE/ss3sserver start
-    - bash SeriousSam3BFE/ss3sserver stop
-    - bash SeriousSam3BFE/ss3sserver restart
-    - bash SeriousSam3BFE/ss3sserver validate
-    - bash SeriousSam3BFE/ss3sserver monitor
-    - bash SeriousSam3BFE/ss3sserver email-test
-    - bash SeriousSam3BFE/ss3sserver details
-
-    - bash StarBound/sbserver auto-install
-    - bash StarBound/sbserver start
-    - bash StarBound/sbserver stop
-    - bash StarBound/sbserver restart
-    - bash StarBound/sbserver validate
-    - bash StarBound/sbserver monitor
-    - bash StarBound/sbserver email-test
-    - bash StarBound/sbserver details
-
-    - bash Terraria/terrariaserver auto-install
-    - bash Terraria/terrariaserver start
-    - bash Terraria/terrariaserver stop
-    - bash Terraria/terrariaserver restart
-    - bash Terraria/terrariaserver validate
-    - bash Terraria/terrariaserver monitor
-    - bash Terraria/terrariaserver email-test
-    - bash Terraria/terrariaserver details
-
-    - bash UnrealTournament2004/ut2k4server start
-    - bash UnrealTournament2004/ut2k4server stop
-    - bash UnrealTournament2004/ut2k4server restart
-    - bash UnrealTournament2004/ut2k4server monitor
-    - bash UnrealTournament2004/ut2k4server email-test
-    - bash UnrealTournament2004/ut2k4server details
-
-    - bash UnrealTournament99/ut99server start
-    - bash UnrealTournament99/ut99server stop
-    - bash UnrealTournament99/ut99server restart
-    - bash UnrealTournament99/ut99server monitor
-    - bash UnrealTournament99/ut99server email-test
-    - bash UnrealTournament99/ut99server details
-
-    - bash TeamSpeak3/ts3server start
-    - bash TeamSpeak3/ts3server stop
-    - bash TeamSpeak3/ts3server restart
-    - bash TeamSpeak3/ts3server update
-    - bash TeamSpeak3/ts3server monitor
-    - bash TeamSpeak3/ts3server email-test
-    - bash TeamSpeak3/ts3server details
+    - bash tests/test.sh

+ 0 - 1
Arma3/arma3server

@@ -1,4 +1,3 @@
-
 #!/bin/bash
 # ARMA 3
 # Server Management Script

+ 119 - 0
PiratesVikingandKnightsII/cfg/lgsm-default.cfg

@@ -0,0 +1,119 @@
+// ****************************************************************************
+//                                                                            *
+//     Pirates, Vikings, and Knights II                                       *
+//     Version 150815                                                         *
+//                                                                            *
+// ****************************************************************************
+
+// ............................. Basic Settings ............................. //
+
+// Hostname for server.
+hostname "<hostname>"
+
+// RCON - remote console password.
+rcon_password "<rconpassword>"
+
+// Server password - for private servers.
+sv_password ""
+
+// Contact email for server sysop.
+sv_contact "email@example.com"
+
+// LAN Mode - If set the server will not show on the internet.
+// Default: sv_lan 0
+sv_lan 0
+
+// ............................... Map Cycles ............................... //
+// You can create your own custom mapcycle. 
+mapcyclefile "mapcycle.txt"
+
+// ....................... Time Limits/Round Settings ....................... //
+
+// Time spend on a single map (in minutes) before switching to a new one automatically.
+// Default: mp_timelimit 0
+mp_timelimit 20
+
+// Wait for the end of round before changing map.
+// Default: mp_timelimit_waitroundend 0
+mp_timelimit_waitroundend 1
+
+// Round duration in minutes.
+// Default: mp_roundtime 3
+mp_roundtime 3
+
+// Round limit in number of rounds.
+// Default: mp_roundlimit 0
+
+// Win limit in number of rounds.
+// Default: mp_winlimit 0
+mp_winlimit 0
+
+// ........................ Server Specific Commands ........................ //
+
+// Server tags - Tags show up on the in-game server browser. This helps 
+// users filter servers.
+// 		vanilla - he server runs the default settings.
+// 		custom - the server runs custom gameplay settings or mods.
+// example: sv_tags "custom, fastdl"
+sv_tags ""
+
+// Friendly fire - Allows team members to injure other members of their team.
+// Default: mp_friendlyfire 0
+mp_friendlyfire 0
+
+// ............................. Communication ............................. //
+
+// Enable communication over voice via microphone.
+// Default: sv_voiceenable 1
+sv_voiceenable 1
+
+// Players can hear all other players, no team restrictions.
+// Default: sv_alltalk 0
+sv_alltalk 0
+
+// ............................. Fast Download .............................. //
+// info: Allows custom maps to be downloaded to the client.
+
+// Allows clients to download custom maps and textures etc. from the server at 20 kbps.
+// Default: sv_allowdownload 1
+sv_allowdownload 1
+
+// Allows clients to download custom maps, textures etc. from a web server with no transfer limit.
+// Example:
+// 		server location: maps/custommap.bsp
+// 		web server location: http://example.com/custom/maps/custommap.bsp
+//		sv_downloadurl "http://example.com/custom"
+// Default: sv_downloadurl ""
+sv_downloadurl ""
+
+// ................................ Ban List ............................... //
+
+// personal banlist based on user IDs.
+exec banned_user.cfg
+
+// personal banlist based on user IPs.	
+exec banned_ip.cfg
+
+writeid
+writeip
+
+// ............................. Server Logging ............................. //
+
+//Enables logging to file, console, and udp < on | off >.
+log on
+
+// Log server bans in the server logs.
+// Default: sv_logbans 1
+sv_logbans 1
+
+// Echo log information to the console.
+// Default: sv_logecho 1
+sv_logecho 1
+
+// Log server information in the log file.
+// Default: sv_logfile 1
+sv_logfile 1
+
+// Log server information to only one file.
+// Default: sv_log_onefile 0
+sv_log_onefile 0

+ 98 - 0
PiratesVikingandKnightsII/pvkiiserver

@@ -0,0 +1,98 @@
+#!/bin/bash
+# No More Room in Hell
+# Server Management Script
+# Author: Daniel Gibbs
+# Website: http://gameservermanagers.com
+version="051115"
+
+#### Variables ####
+
+# Notification Email
+# (on|off)
+emailnotification="off"
+email="email@example.com"
+
+# Steam login
+steamuser="anonymous"
+steampass=""
+
+# Start Variables
+defaultmap="bt_island"
+maxplayers="24"
+port="27015"
+sourcetvport="27020"
+clientport="27005"
+ip="0.0.0.0"
+updateonstart="off"
+
+# https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server
+fn_parms(){
+parms="-game pvkii -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}"
+}
+
+#### Advanced Variables ####
+
+# Steam
+appid="17575"
+
+# Server Details
+servicename="pvkii-server"
+gamename="Pirates, Vikings, and Knights II"
+engine="source"
+
+# Directories
+rootdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+selfname="$(basename $0)"
+lockselfname=".${servicename}.lock"
+filesdir="${rootdir}/serverfiles"
+systemdir="${filesdir}/pvkii"
+executabledir="${filesdir}"
+executable="./srcds_run"
+servercfg="${servicename}.cfg"
+servercfgdir="${systemdir}/cfg"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+servercfgdefault="${servercfgdir}/lgsm-default.cfg"
+backupdir="${rootdir}/backups"
+
+# Logging
+logdays="7"
+gamelogdir="${systemdir}/logs"
+scriptlogdir="${rootdir}/log/script"
+consolelogdir="${rootdir}/log/console"
+
+scriptlog="${scriptlogdir}/${servicename}-script.log"
+consolelog="${consolelogdir}/${servicename}-console.log"
+emaillog="${scriptlogdir}/${servicename}-email.log"
+
+scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log"
+consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log"
+
+##### Script #####
+# Do not edit
+
+fn_runfunction(){
+# Functions are downloaded and run with this function
+if [ ! -f "${rootdir}/functions/${functionfile}" ]; then
+	cd "${rootdir}"
+	if [ ! -d "functions" ]; then
+		mkdir functions
+	fi
+	cd functions
+	echo -e "    loading ${functionfile}...\c"
+	wget -N /dev/null https://raw.githubusercontent.com/dgibbs64/linuxgsm/master/functions/${functionfile} 2>&1 | grep -F HTTP | cut -c45-
+	chmod +x "${functionfile}"
+	cd "${rootdir}"
+fi
+source "${rootdir}/functions/${functionfile}"
+}
+
+fn_functions(){
+# Functions are defined in fn_functions.
+functionfile="${FUNCNAME}"
+fn_runfunction
+}
+
+fn_functions
+
+getopt=$1
+fn_getopt

+ 2 - 2
functions/fn_backup

@@ -2,7 +2,7 @@
 # LGSM fn_backup function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 210115
+# Version: 311015
 
 # Description: Creates a .tar.gz file in the backup directory.
 
@@ -22,7 +22,7 @@ while true; do
 	read -p "Continue? [y/N]" yn
 	case $yn in
 	[Yy]* ) break;;
-	[Nn]* ) echo Exiting; return 1;;
+	[Nn]* ) echo Exiting; return;;
 	* ) echo "Please answer yes or no.";;
 esac
 done

+ 2 - 2
functions/fn_check_ip

@@ -2,7 +2,7 @@
 # LGSM fn_check_ip function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 120715
+# Version: 311015
 
 # Description: Automatically identifies the server interface IP.
 # If multiple interfaces are detected the user will need to manualy set using ip="0.0.0.0".
@@ -24,7 +24,7 @@ if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then
 		echo -en ""
 		echo -en "http://gameservermanagers.com/network-interfaces"
 		echo -en ""
-		exit
+		exit 1
 	else
 		ip=${getip}
 	fi

+ 2 - 2
functions/fn_check_root

@@ -2,9 +2,9 @@
 # LGSM fn_check_root function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 210115
+# Version: 311015
 
 if [ $(whoami) = "root" ]; then
 	fn_printfailnl "Do NOT run this script as root!"
-	exit
+	exit 1
 fi

+ 16 - 14
functions/fn_check_steamuser

@@ -4,18 +4,20 @@
 # Website: http://gameservermanagers.com
 # Version: 040715
 
-if [ -z "${steamuser}" ]||[ "${steamuser}" == "username" ]; then
-		fn_printwarnnl "Steam login not set. Using anonymous login."
-		if [ -d ${scriptlogdir} ]; then
-			fn_scriptlog "Steam login not set. Using anonymous login."
-		fi
-		if [ "${steamuser}" == "username" ]; then
-			echo "	* Change steamuser=\"username\" to a valid steam login."
-			if [ -d ${scriptlogdir} ]; then
-				fn_scriptlog "Change steamuser=\"username\" to a valid steam login."
-			fi
-		fi
-		steamuser="anonymous"
-		steampass=""
-		sleep 2
+if [ "${steamuser}" == "username" ]; then
+	fn_printfailnl "Steam login not set. Update steamuser."	
+	echo "	* Change steamuser=\"username\" to a valid steam login."
+	if [ -d ${scriptlogdir} ]; then
+		fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login."
+		exit 1
+	fi
+fi
+if [ -z "${steamuser}" ]; then
+	fn_printwarnnl "Steam login not set. Using anonymous login."
+	if [ -d ${scriptlogdir} ]; then
+		fn_scriptlog "Steam login not set. Using anonymous login."
+	fi
+	steamuser="anonymous"
+	steampass=""
+	sleep 2
 fi

+ 2 - 2
functions/fn_check_systemdir

@@ -2,9 +2,9 @@
 # LGSM fn_check_systemdir function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 210115
+# Version: 311015
 
 if [ ! -e "${systemdir}" ]; then
 	fn_printfailnl "Cannot access ${systemdir}: No such directory"
-	exit
+	exit 1
 fi

+ 2 - 2
functions/fn_check_tmux

@@ -2,7 +2,7 @@
 # LGSM fn_check_tmux function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 291015
+# Version: 311015
 
 # Checks if tmux is installed as too many users do not RTFM or know how to use Google.
 
@@ -16,5 +16,5 @@ else
 	# Suitable passive agressive message
 	echo "	* Please see the the following link."
 	echo "	* http://gameservermanagers.com/tmux-not-found"
-	exit
+	exit 127
 fi

+ 2 - 2
functions/fn_compress_unreal2maps

@@ -2,7 +2,7 @@
 # LGSM fn_compress_unreal2maps function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 210115
+# Version: 311015
 
 fn_check_root
 clear
@@ -20,7 +20,7 @@ while true; do
 	read -p "Start compression [y/N]" yn
 	case $yn in
 	[Yy]* ) break;;
-	[Nn]* ) echo Exiting; return 1;;
+	[Nn]* ) echo Exiting; return;;
 	* ) echo "Please answer yes or no.";;
 	esac
 done

+ 2 - 2
functions/fn_compress_ut99maps

@@ -2,7 +2,7 @@
 # LGSM fn_compress_ut99maps function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 210115
+# Version: 311015
 
 fn_check_root
 clear
@@ -20,7 +20,7 @@ while true; do
 	read -p "Start compression [y/N]" yn
 	case $yn in
 	[Yy]* ) break;;
-	[Nn]* ) echo Exiting; return 1;;
+	[Nn]* ) echo Exiting; return;;
 	* ) echo "Please answer yes or no.";;
 	esac
 done

+ 2 - 2
functions/fn_console

@@ -2,7 +2,7 @@
 # LGSM fn_console function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 260515
+# Version: 311015
 
 # Description: Gives access to the server tmux console.
 
@@ -20,7 +20,7 @@ while true; do
 	read -e -i "y" -p "Continue? [y/N]" yn
 	case $yn in
 	[Yy]* ) break;;
-	[Nn]* ) echo Exiting; return 1;;
+	[Nn]* ) echo Exiting; return;;
 	* ) echo "Please answer yes or no.";;
 esac
 done

+ 3 - 3
functions/fn_debug

@@ -2,7 +2,7 @@
 # LGSM fn_debug function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 160415
+# Version: 051115
 
 # Description: Runs the server without tmux. Runs direct from the terminal.
 
@@ -34,10 +34,10 @@ echo -e "Press CTRL+c to drop out of debug mode."
 fn_printwarningnl "If ${servicename} is already running it will be stopped."
 echo ""
 while true; do
-	read -p "Continue? [y/N]" yn
+	read -e -i "y" -p "Continue? [Y/n]" yn
 	case $yn in
 	[Yy]* ) break;;
-	[Nn]* ) echo Exiting; return 1;;
+	[Nn]* ) echo Exiting; return;;
 	* ) echo "Please answer yes or no.";;
 esac
 done

+ 41 - 77
functions/fn_details

@@ -2,7 +2,7 @@
 # LGSM fn_details function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 281015
+# Version: 301015
 
 # Description: Displays server infomation.
 
@@ -20,9 +20,7 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	echo -e "\e[34mHostname:\t\e[0m$HOSTNAME"
 	echo -e "\e[34mtmux:\t\e[0m${tmuxv}"
 	echo -e "\e[34mGLIBC:\t\e[0m${glibcv}"
-} >> .fn_details_distro
-column -s $'\t' -t .fn_details_distro
-rm -f .fn_details_distro
+} | column -s $'\t' -t 
 }
 
 fn_details_performance(){
@@ -32,17 +30,13 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 {
 	echo -e "\e[34mUptime:\t\e[0m${days}d, ${hours}h, ${minutes}m"
 	echo -e "\e[34mAvg Load:\t\e[0m${load}"
-} >> .fn_details_performance
-column -s $'\t' -t .fn_details_performance
-rm -f .fn_details_performance
+} | column -s $'\t' -t 
 echo -e ""
 {
 	echo -e "\e[34mMem:\t\e[34mtotal\t used\t free\e[0m"
 	echo -e "\e[34mPhysical:\t\e[0m${physmemtotal}\t${physmemused}\t${physmemfree}\e[0m"
 	echo -e "\e[34mSwap:\t\e[0m${swaptotal}\t${swapused}\t${swapfree}\e[0m"
-} >> .fn_details_performance
-column -s $'\t' -t .fn_details_performance
-rm -f .fn_details_performance
+} | column -s $'\t' -t 
 }
 
 fn_details_disk(){
@@ -58,9 +52,7 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	if [ -d "${backupdir}" ]; then
 		echo -e "\e[34mBackups:\t\e[0m${backupdirdu}"
 	fi
-} >> .fn_details_disk
-column -s $'\t' -t .fn_details_disk
-rm -f .fn_details_disk
+} | column -s $'\t' -t 
 }
 
 fn_details_gameserver(){
@@ -132,9 +124,7 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	if [ -n "${dbplugin}" ]; then
 		echo -e "\e[34mdbplugin:\t\e[0m${dbplugin}"
 	fi
-} >> .fn_details_gameserver
-column -s $'\t' -t .fn_details_gameserver
-rm -f .fn_details_gameserver
+} | column -s $'\t' -t 
 echo -e ""
 
 ## script details
@@ -154,7 +144,7 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 
 	# GLIBC required
 	if [ -n "${glibcrequired}" ]; then
-		if [ "$(ldd --version | sed -n '1 p' | tr -cd [:digit:] | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd [:digit:] | tail -c 3)" ]; then
+		if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then
 			if [ "${glibcfix}" == "yes" ]; then
 				echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)"
 			else
@@ -187,9 +177,7 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	if [ -n "${networkcfgfullpath}" ]; then
 		echo -e "\e[34mNetwork config file:\t\e[0m${networkcfgfullpath}"
 	fi
-} >> .fn_details_script
-column -s $'\t' -t .fn_details_script
-rm -f .fn_details_script
+} | column -s $'\t' -t 
 }
 
 fn_details_backup(){
@@ -205,9 +193,7 @@ else
 		echo -e "\e[34m    date:\t\e[0m${lastbackupdate}"
 		echo -e "\e[34m    file:\t\e[0m${lastbackup}"
 		echo -e "\e[34m    size:\t\e[0m${lastbackupsize}"
-	} >> .fn_details_backup
-	column -s $'\t' -t .fn_details_backup
-	rm -f .fn_details_backup
+	} | column -s $'\t' -t 
 fi
 }
 
@@ -260,9 +246,8 @@ echo -e ""
 {
 	echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL"
 	echo -e "> Game\tINBOUND\t${port}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t 
+
 fn_details_statusbottom
 }
 
@@ -288,9 +273,8 @@ echo -e ""
 {
 	echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL"
 	echo -e "> Game\tINBOUND\t${port}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t 
+
 fn_details_statusbottom
 }
 
@@ -316,9 +300,8 @@ echo -e ""
 {
 	echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL"
 	echo -e "> Game\tINBOUND\t${port}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t 
+
 fn_details_statusbottom
 }
 
@@ -353,9 +336,8 @@ fi
 	echo -e "> Game\tINBOUND\t${port}\tudp"
 	echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp"
 	echo -e "> Steam: Master traffic\tINBOUND\t${masterport}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t 
+
 fn_details_statusbottom
 }
 
@@ -384,9 +366,8 @@ echo -e ""
 	echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL"
 	echo -e "> Game/RCON\tINBOUND\t${port}\ttcp"
 	echo -e "> Query\tINBOUND\t${queryport}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t 
+
 fn_details_statusbottom
 }
 
@@ -417,9 +398,8 @@ echo -e ""
 	        echo -e "> SourceTV\tINBOUND\t${sourcetvport}\tudp"
 	fi
 	echo -e "< Client\tOUTBOUND\t${clientport}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -449,9 +429,7 @@ echo -e ""
 	echo -e "> Game/RCON\tINBOUND\t${port}\tudp"
 	echo -e "> Query\tINBOUND\t${queryport}\tudp"
 	echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
 echo -e ""
 echo -e "\e[92m${servername} WebAdmin\e[0m"
 printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
@@ -459,9 +437,8 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}/index.html"
 	echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}"
 	echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -490,9 +467,8 @@ echo -e ""
 	echo -e "> Game\tINBOUND\t${port}\ttcp"
 	echo -e "> Query\tINBOUND\t${queryport}\ttcp"
 	echo -e "> Rcon\tINBOUND\t${rconport}\ttcp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 
 }
@@ -520,9 +496,8 @@ echo -e ""
 	echo -e "> Voice\tINBOUND\t${port}\tudp"
 	echo -e "> ServerQuery\tINBOUND\t${queryport}\ttcp"
 	echo -e "> File transfer\tINBOUND\t${fileport}\ttcp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -549,9 +524,8 @@ echo -e ""
 {
 	echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL"
 	echo -e "> Game\tINBOUND\t${port}\ttcp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -580,9 +554,8 @@ echo -e ""
 	echo -e "> Game\tINBOUND\t${port}\ttcp"
 	echo -e "> Query\tINBOUND\t${queryport}\ttcp"
 	echo -e "> Rcon\tINBOUND\t${rconport}\ttcp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -613,9 +586,7 @@ echo -e ""
 	echo -e "> Query\tINBOUND\t${queryport}\tudp"
 	echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp"
 	echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
 echo -e ""
 echo -e "\e[92m${servername} WebAdmin\e[0m"
 printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
@@ -623,9 +594,7 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}"
 	echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}"
 	echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
 echo -e ""
 echo -e "\e[92m${servername} Telnet\e[0m"
 printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
@@ -633,9 +602,8 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	echo -e "\e[34mTelnet enabled:\t\e[0m${telnetenabled}"
 	echo -e "\e[34mTelnet address:\t\e[0m${ip} ${telnetport}"
 	echo -e "\e[34mTelnet password:\t\e[0m${telnetpass}"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -683,9 +651,7 @@ echo -e ""
 		fi
 	fi
 	echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
 echo -e ""
 echo -e "\e[92m${servername} WebAdmin\e[0m"
 printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
@@ -694,9 +660,8 @@ printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 	echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}"
 	echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}"
 	echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}"
-} >> .fn_details_webadmin
-column -s $'\t' -t .fn_details_webadmin
-rm -f .fn_details_webadmin
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 
@@ -725,9 +690,8 @@ echo -e ""
 	echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE"
 	echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}"
 	echo -e "> Query\tINBOUND\t${queryport}\tudp"
-} >> .fn_details_ports
-column -s $'\t' -t .fn_details_ports
-rm -f .fn_details_ports
+} | column -s $'\t' -t
+
 fn_details_statusbottom
 }
 

+ 32 - 32
functions/fn_details_config

@@ -8,7 +8,7 @@
 
 ## Examples of filtering to get info from config files
 # sed 's/foo//g' - remove foo
-# tr -cd [:digit:] leave only digits
+# tr -cd '[:digit:]' leave only digits
 # tr -d '=\"; ' remove selected charectors =\";
 # grep -v "foo" filter out lines that contain foo
 
@@ -52,7 +52,7 @@ if [ "${engine}" == "avalanche" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "MaxPlayers" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		slots=$(grep "MaxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -62,7 +62,7 @@ if [ "${engine}" == "avalanche" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "BindPort" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		port=$(grep "BindPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -95,7 +95,7 @@ elif [ "${engine}" == "dontstarve" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd "[:digit:]")
+		slots=$(grep "max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -115,7 +115,7 @@ elif [ "${engine}" == "dontstarve" ]; then
 
 	# tickrate
 	if [ -f "${servercfgfullpath}" ]; then
-		tickrate=$(grep "tick_rate" "${servercfgfullpath}" | grep -v "#" | tr -cd "[:digit:]")
+		tickrate=$(grep "tick_rate" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
 		if [ ! -n "${tickrate}" ]; then
 			tickrate="NOT SET"
 		fi
@@ -125,7 +125,7 @@ elif [ "${engine}" == "dontstarve" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd "[:digit:]")
+		port=$(grep "server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -148,7 +148,7 @@ elif [ "${engine}" == "projectzomboid" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | grep -v "#" | tr -cd "[:digit:]")
+		slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -158,7 +158,7 @@ elif [ "${engine}" == "projectzomboid" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "DefaultPort=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		port=$(grep "DefaultPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -201,7 +201,7 @@ elif [ "${engine}" == "realvirtuality" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd "[:digit:]")
+		slots=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -211,7 +211,7 @@ elif [ "${engine}" == "realvirtuality" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "serverport=" "${servercfgfullpath}" | grep -v // | tr -d '\r' | tr -cd "[:digit:]")
+		port=$(grep "serverport=" "${servercfgfullpath}" | grep -v // | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -219,7 +219,7 @@ elif [ "${engine}" == "realvirtuality" ]; then
 
 	# query port
 	if [ -f "${servercfgfullpath}" ]; then
-		queryport=$(grep "steamqueryport=" "${servercfgfullpath}" | grep -v // | tr -d '\r' | tr -cd "[:digit:]")
+		queryport=$(grep "steamqueryport=" "${servercfgfullpath}" | grep -v // | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${queryport}" ]; then
 		queryport="0"
@@ -227,7 +227,7 @@ elif [ "${engine}" == "realvirtuality" ]; then
 
 	# master port
 	if [ -f "${servercfgfullpath}" ]; then
-		masterport=$(grep "steamport=" "${servercfgfullpath}" | grep -v // | tr -d '\r' | tr -cd "[:digit:]")
+		masterport=$(grep "steamport=" "${servercfgfullpath}" | grep -v // | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${masterport}" ]; then
 		masterport="0"
@@ -259,7 +259,7 @@ elif [ "${engine}" == "seriousengine35" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd "[:digit:]")
+		slots=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -279,7 +279,7 @@ elif [ "${engine}" == "seriousengine35" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "prj_uwPort" "${servercfgfullpath}" | tr -d '\r' | tr -cd "[:digit:]")
+		port=$(grep "prj_uwPort" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -309,7 +309,7 @@ elif [ "${engine}" == "source" ] || [ "${engine}" == "goldsource" ]; then
 
 	# server password
 	if [ -f "${servercfgfullpath}" ]; then
-		serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed 's/sv_password//g' | sed 's/"//g')
+		serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed 's/sv_password //g' | sed 's/"//g')
 		if [ ! -n "${serverpassword}" ]; then
 			serverpassword="NOT SET"
 		fi
@@ -364,7 +364,7 @@ elif [ "${gamename}" == "Teamspeak 3" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="9987"
@@ -372,7 +372,7 @@ elif [ "${gamename}" == "Teamspeak 3" ]; then
 
 	# query port
 	if [ -f "${servercfgfullpath}" ]; then
-		queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${queryport}" ]; then
 		queryport="10011"
@@ -380,7 +380,7 @@ elif [ "${gamename}" == "Teamspeak 3" ]; then
 
 	# file port
 	if [ -f "${servercfgfullpath}" ]; then
-		fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${fileport}" ]; then
 		fileport="30033"
@@ -422,7 +422,7 @@ elif [ "${engine}" == "teeworlds" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="8303"
@@ -430,7 +430,7 @@ elif [ "${engine}" == "teeworlds" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		slots=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="12"
 		fi
@@ -444,7 +444,7 @@ elif [ "${engine}" == "terraria" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "port=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		port=$(grep "port=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -484,7 +484,7 @@ elif [ "${engine}" == "unity3d" ]; then
 
 	# webadmin port
 	if [ -f "${servercfgfullpath}" ]; then
-		webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${webadminport}" ]; then
 		webadminport="0"
@@ -522,7 +522,7 @@ elif [ "${engine}" == "unity3d" ]; then
 
 	# telnet port
 	if [ -f "${servercfgfullpath}" ]; then
-		telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${telnetport}" ]; then
 		telnetport="0"
@@ -540,7 +540,7 @@ elif [ "${engine}" == "unity3d" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		slots=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -570,7 +570,7 @@ elif [ "${engine}" == "unity3d" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -620,7 +620,7 @@ elif [ "${engine}" == "unreal" ] || [ "${engine}" == "unreal2" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "Port=" "${servercfgfullpath}" | grep -v "Master" | grep -v "LAN" | grep -v "Proxy" | grep -v "Listen" | tr -d '\r' | tr -cd "[:digit:]")
+		port=$(grep "Port=" "${servercfgfullpath}" | grep -v "Master" | grep -v "LAN" | grep -v "Proxy" | grep -v "Listen" | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -636,7 +636,7 @@ elif [ "${engine}" == "unreal" ] || [ "${engine}" == "unreal2" ]; then
 
 	# gamespy query port
 	if [ -f "${servercfgfullpath}" ]; then
-		gsqueryport=$(grep "OldQueryPortNumber=" "${servercfgfullpath}" | tr -d '\r' | tr -cd "[:digit:]")
+		gsqueryport=$(grep "OldQueryPortNumber=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${gsqueryport}" ]; then
 		gsqueryport="0"
@@ -662,7 +662,7 @@ elif [ "${engine}" == "unreal" ] || [ "${engine}" == "unreal2" ]; then
 
 	# webadmin port
 	if [ -f "${servercfgfullpath}" ]; then
-		webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd "[:digit:]")
+		webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${webadminport}" ]; then
 		webadminport="0"
@@ -750,7 +750,7 @@ elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then
 
 	# slots
 	if [ -f "${servercfgfullpath}" ]; then
-		slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 		if [ ! -n "${slots}" ]; then
 			slots="NOT SET"
 		fi
@@ -760,7 +760,7 @@ elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then
 
 	# port
 	if [ -f "${servercfgfullpath}" ]; then
-		port=$(grep "Port=" "${servercfgfullpath}" | grep -v  "RCONPort=" | grep -v  "QueryPort=" | tr -cd "[:digit:]")
+		port=$(grep "Port=" "${servercfgfullpath}" | grep -v  "RCONPort=" | grep -v  "QueryPort=" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${port}" ]; then
 		port="0"
@@ -768,7 +768,7 @@ elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then
 
 	# rcon port
 	if [ -f "${servercfgfullpath}" ]; then
-		rconport=$(grep "RCONPort=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+		rconport=$(grep "RCONPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${rconport}" ]; then
 		rconport="0"
@@ -776,7 +776,7 @@ elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then
 
 	# query port
 	if [ -f "${servercfgfullpath}" ]; then
-			queryport=$(grep "QueryPort=" "${servercfgfullpath}" | tr -cd "[:digit:]")
+			queryport=$(grep "QueryPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
 	fi
 	if [ ! -n "${queryport}" ]; then
 		queryport="0"

+ 2 - 2
functions/fn_details_distro

@@ -2,7 +2,7 @@
 # LGSM fn_details_distro function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 270515
+# Version: 301015
 
 # Description: Variables providing useful info on the Operating System such as disk and performace info.
 # Used for fn_details, fn_debug and fn_email.
@@ -29,7 +29,7 @@ glibcv=$(ldd --version |grep ldd|awk '{print $NF}')
 # e.g: tmux 1.6
 if [ -z "$(command -v tmux)" ]; then
 	tmuxv="\e[0;31mNOT INSTALLED!\e[0m"
-elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd [:digit:])" -lt "16" ]; then
+elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ]; then
 	tmuxv="$(tmux -V) (>= 1.6 required for console log)"
 else
 	tmuxv=$(tmux -V)

+ 251 - 135
functions/fn_getopt

@@ -2,281 +2,397 @@
 # LGSM fn_getopt function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 301015
+# Version: 011115
 
 # Description: getopt arguments.
 
 fn_getopt_generic(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update)
+	u|update)
 		fn_update_check;;
-	force-update)
+	fu|force-update|update-restart)
 		forceupdate=1;
 		fn_update_check;;
-	update-restart)
-		forceupdate=1;
-		fn_update_check;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	validate)
+	v|validate)
 		fn_validate;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	details)
+	d|details)
 		fn_details;;
-	backup)
+	b|backup)
 		fn_backup;;
-	console)
+	c|console)
 		fn_console;;
-	debug)
+	d|debug)
 		fn_debug;;
-	install)
+	i|install)
 		fn_install;;
-	auto-install)
+	ai|auto-install)
 		fn_autoinstall;;
-	depsdetect)
-		fn_deps_detect;;		
+	dd|depsdetect)
+		fn_deps_detect;;
 	*)
-	echo "Usage: $0 {start|stop|restart|update|force-update|update-functions|validate|monitor|email-test|details|backup|console|debug|install|auto-install}"
-	exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD."
+		echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."		
+		echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server."
+		echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal."
+		echo -e "\e[34minstall\t\e[0mInstall the server."
+		echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts."
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 
 fn_getopt_teamspeak3(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update)
+	u|update)
 		fn_update_check;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	details)
+	d|details)
 		fn_details;;
-	backup)
+	b|backup)
 		fn_backup;;
-	install)
+	i|install)
 		fn_install;;
-	auto-install)
+	ai|auto-install)
 		fn_autoinstall;;
-	depsdetect)
-		fn_deps_detect;;		
+	dd|depsdetect)
+		fn_deps_detect;;
 	*)
-		echo "Usage: $0 {start|stop|restart|update|update-functions|monitor|email-test|details|backup|install|auto-install}"
-		exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate\t\e[0mChecks and applies updates from teamspeak.com."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."
+		echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34minstall\t\e[0mInstall the server."
+		echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts."
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 
 fn_getopt_mumble(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	backup)
+	b|backup)
 		fn_backup;;
 	console)
 		fn_console;;
-	debug)
+	d|debug)
 		fn_debug;;
-	depsdetect)
-		fn_deps_detect;;		
+	dd|depsdetect)
+		fn_deps_detect;;
 	*)
-		echo "Usage: $0 {start|stop|restart|update-functions|monitor|email-test|backup|console|debug}"
-		exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server."		
+		echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal."
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 
 fn_getopt_gmodserver(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update)
-		fn_update_check;;
-	force-update)
-		forceupdate=1;
+	u|update)
 		fn_update_check;;
-	update-restart)
+	fu|force-update|update-restart)
 		forceupdate=1;
 		fn_update_check;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	validate)
+	v|validate)
 		fn_validate;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	details)
+	d|details)
 		fn_details;;
-	backup)
+	b|backup)
 		fn_backup;;
-	console)
+	c|console)
 		fn_console;;
-	debug)
+	d|debug)
 		fn_debug;;
-	install)
+	i|install)
 		fn_install;;
-	auto-install)
+	ai|auto-install)
 		fn_autoinstall;;
-	content)
+	dd|depsdetect)
+		fn_deps_detect;;
+	gc|gmod-content)
 		fn_content_gmod;;
-	depsdetect)
-		fn_deps_detect;;		
 	*)
-	echo "Usage: $0 {start|stop|restart|update|force-update|update-functions|validate|monitor|email-test|details|backup|console|debug|install|auto-install|content}"
-	exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD."
+		echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."
+		echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server."
+		echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal."
+		echo -e "\e[34minstall\t\e[0mInstall the server."
+		echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts."
+		echo -e "\e[34mgmod-content\t\e[0mDownload gmod add-on content."
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 
-
 fn_getopt_unreal(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	details)
+	d|details)
 		fn_details;;
-	backup)
+	b|backup)
 		fn_backup;;
-	console)
+	c|console)
 		fn_console;;
-	debug)
+	d|debug)
 		fn_debug;;
-	install)
+	i|install)
 		fn_install;;
-	map-compressor)
+	mc|map-compressor)
 		fn_compress_ut99maps;;
-	depsdetect)
+	dd|depsdetect)
 		fn_deps_detect;;		
 	*)
-	echo "Usage: $0 {start|stop|restart|update-functions|monitor|email-test|details|backup|console|debug|install|map-compressor}"
-	exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."
+		echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server."
+		echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal."
+		echo -e "\e[34minstall\t\e[0mInstall the server."
+		echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps."
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 
 
 fn_getopt_unreal2(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update)
+	u|update)
 		fn_update_check;;
-	force-update)
+	fu|force-update|update-restart)
 		forceupdate=1;
 		fn_update_check;;
-	update-restart)
-		forceupdate=1;
-		fn_update_check;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	validate)
+	v|validate)
 		fn_validate;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	details)
+	d|details)
 		fn_details;;
-	backup)
+	b|backup)
 		fn_backup;;
-	console)
+	c|console)
 		fn_console;;
-	debug)
+	d|debug)
 		fn_debug;;
-	install)
+	i|install)
 		fn_install;;
-	auto-install)
+	ai|auto-install)
 		fn_autoinstall;;
-	map-compressor)
+	dd|depsdetect)
+		fn_deps_detect;;
+	mc|map-compressor)
 		fn_compress_unreal2maps;;
-	depsdetect)
-		fn_deps_detect;;		
 	*)
-	echo "Usage: $0 {start|stop|restart|update|update-functions|validate|monitor|email-test|details|backup|console|debug|install|auto-install|map-compressor}"
-	exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD."
+		echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."		
+		echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server."
+		echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal."
+		echo -e "\e[34minstall\t\e[0mInstall the server."
+		echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts."
+		echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps."		
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 
 
 fn_getopt_ut2k4(){
 case "$getopt" in
-	start)
+	st|start)
 		fn_start;;
-	stop)
+	sp|stop)
 		fn_stop;;
-	restart)
+	r|restart)
 		fn_restart;;
-	update-functions)
+	uf|update-functions)
 		fn_update_functions;;
-	monitor)
+	m|monitor)
 		fn_monitor;;
-	email-test)
+	et|email-test)
 		fn_email_test;;
-	details)
+	d|details)
 		fn_details;;
-	backup)
+	b|backup)
 		fn_backup;;
-	console)
+	c|console)
 		fn_console;;
-	debug)
+	d|debug)
 		fn_debug;;
-	install)
+	i|install)
 		fn_install;;
-	map-compressor)
-		fn_compress_unreal2maps;;
-	depsdetect)
+	mc|map-compressor)
+		fn_compress_ut99maps;;
+	dd|depsdetect)
 		fn_deps_detect;;		
 	*)
-	echo "Usage: $0 {start|stop|restart|update-functions|monitor|email-test|details|backup|console|debug|install|map-compressor}"
-	exit 1;;
-esac
+	echo "Usage: $0 [option]"
+	echo "${gamename} - Linux Game Server Manager - Version ${version}"
+	echo "http://gameservermanagers.com/${selfname}"
+	echo -e ""
+	echo -e "\e[93mCommands\e[0m"
+	{
+		echo -e "\e[34mstart\t\e[0mStart the server."
+		echo -e "\e[34mstop\t\e[0mStop the server."
+		echo -e "\e[34mrestart\t\e[0mRestart the server."
+		echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded."
+		echo -e "\e[34mmonitor\t\e[0mChecks that the server is running."
+		echo -e "\e[34memail-test\t\e[0mSends test monitor email."
+		echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server."
+		echo -e "\e[34mbackup\t\e[0mCreate archive of the server."
+		echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server."
+		echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal."
+		echo -e "\e[34minstall\t\e[0mInstall the server."
+		echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps."
+	} | column -s $'\t' -t 
+	esac
 exit
 }
 

+ 6 - 1
functions/fn_install_config

@@ -2,7 +2,7 @@
 # LGSM fn_install_config function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 291015
+# Version: 051115
 
 fn_defaultconfig(){
 echo "creating ${servercfg} config file."
@@ -281,6 +281,11 @@ elif [ "${gamename}" == "Natural Selection 2" ]; then
 	echo -e "no configs required."
 	sleep 1
 	echo ""
+elif [ "${gamename}" == "Pirates, Vikings, and Knights II" ]; then
+	echo -e "downloading lgsm-default.cfg...\c"
+	wget -N /dev/null ${githuburl}/PiratesVikingandKnightsII/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq
+	sleep 1
+	fn_sourceconfig	
 elif [ "${gamename}" == "Red Orchestra: Ostfront 41-45" ]; then
 	fn_unreal2config
 elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then

+ 4 - 4
functions/fn_install_glibcfix

@@ -2,7 +2,7 @@
 # LGSM fn_install_glibcfix function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 050715
+# Version: 051115
 
 fn_glibcfixmsg(){
 echo ""
@@ -40,7 +40,7 @@ if [ -z $(command -v ldd) ]; then
 	sleep 1
 	echo ""
 	while true; do
-		read -p "Continue install? [y/N]" yn
+		read -e -i "y" -p "Continue install? [Y/n]" yn
 		case $yn in
 			[Yy]* ) break;;
 			[Nn]* ) echo Exiting; exit;;
@@ -48,7 +48,7 @@ if [ -z $(command -v ldd) ]; then
 		esac
 	done
 # if Glibc less than 1.15
-elif [ "$(ldd --version | sed -n '1 p' | tr -cd [:digit:] | tail -c 3)" -lt 215 ]; then
+elif [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt 215 ]; then
 	# Blade Symphony
 	if [ "${gamename}" == "Blade Symphony" ]; then
 		glibcversion="2.15"
@@ -110,7 +110,7 @@ elif [ "$(ldd --version | sed -n '1 p' | tr -cd [:digit:] | tail -c 3)" -lt 215
 		wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/NoMoreRoomInHell/dependencies/libm.so.6
 		cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6"
 	# if Glibc less than 1.13
-	elif [ "$(ldd --version | sed -n '1 p' | tr -cd [:digit:] | tail -c 3)" -lt 213 ]; then
+	elif [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt 213 ]; then
 		# ARMA 3
 		if [ "${gamename}" == "ARMA 3" ]; then
 			glibcversion="2.13"

+ 2 - 2
functions/fn_install_gsquery

@@ -2,7 +2,7 @@
 # LGSM fn_install_gsquery function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 070715
+# Version: 051115
 
 fn_dlgsquery(){
 cd "${rootdir}"
@@ -17,7 +17,7 @@ if [ "${engine}" == "avalanche" ]||[ "${engine}" == "goldsource" ]||[ "${engine}
 	echo "============================"
 	if [ -z ${autoinstall} ]; then
 		while true; do
-			read -p "Do you want to install GameServerQuery? [y/N]" yn
+			read -e -i "y" -p "Do you want to install GameServerQuery? [Y/n]" yn
 			case $yn in
 			[Yy]* ) fn_dlgsquery;break;;
 			[Nn]* ) echo ""; echo "Not installing GameServerQuery.";break;;

+ 2 - 2
functions/fn_install_retry

@@ -2,10 +2,10 @@
 # LGSM fn_install_retry function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 210115
+# Version: 051115
 
 while true; do
-	read -p "Retry install? [y/N]" yn
+	read -e -i "y" -p "Retry install? [Y/n]" yn
 	case $yn in
 	[Yy]* ) fn_install; exit;;
 	[Nn]* ) echo Exiting; exit;;

+ 2 - 2
functions/fn_install_serverfiles

@@ -2,7 +2,7 @@
 # LGSM fn_install_serverfiles function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 040715
+# Version: 051115
 
 fn_steaminstallcommand(){
 fn_check_steamuser
@@ -78,7 +78,7 @@ if [ -z "${autoinstall}" ]; then
 	echo ""
 	echo "================================="
 	while true; do
-	read -p "Was the install successful? [y/N]" yn
+	read -e -i "y" -p "Was the install successful? [Y/n]" yn
 		case $yn in
 			[Yy]* ) break;;
 			[Nn]* ) fn_install_retry;;

+ 6 - 6
functions/fn_install_ts3

@@ -2,7 +2,7 @@
 # LGSM fn_install_ts3 function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 270715
+# Version: 311015
 
 fn_details_distro
 # Gets the teamspeak server architecture
@@ -12,14 +12,14 @@ elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then
 	ts3arch="x86"
 else
 	fn_printfailure "${arch} is an unsupported architecture"
-	exit
+	exit 1
 fi
 
 # Grabs all version numbers not in correct order
 wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '<a href=\".*\/\">.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp
 
 # removes digits to allow sorting of numbers
-cat .ts3_version_numbers_unsorted.tmp |tr -cd "[:digit:][*\n]" > .ts3_version_numbers_digit.tmp
+cat .ts3_version_numbers_unsorted.tmp |tr -cd '[:digit:][*\n]' > .ts3_version_numbers_digit.tmp
 # Sorts numbers in to correct order
 # merges two files in to one with two columns sorts the numbers in to order then only outputs the second to the ts3_version_numbers.tmp
 paste .ts3_version_numbers_digit.tmp .ts3_version_numbers_unsorted.tmp |sort -rn|awk '{ print $2 }' > .ts3_version_numbers.tmp
@@ -45,7 +45,7 @@ if [ -z "${availablebuild}" ]; then
 	sleep 1
 	fn_printfail "Checking for update: teamspeak.com: Not returning version info"
 	sleep 2
-	exit
+	exit 1
 fi
 
 cd "${rootdir}"
@@ -63,7 +63,7 @@ else
 	sleep 1
 	cat ".${servicename}-tar-error.tmp"
 	rm ".${servicename}-tar-error.tmp"
-	exit
+	exit $?
 fi
 echo -e "copying to ${filesdir}...\c"
 cp -R "${rootdir}/teamspeak3-server_linux-${ts3arch}/"* "${filesdir}" 2> ".${servicename}-cp-error.tmp"
@@ -75,7 +75,7 @@ else
 	sleep 1
 	cat ".${servicename}-cp-error.tmp"
 	rm ".${servicename}-cp-error.tmp"
-	exit
+	exit $?
 fi
 rm -f teamspeak3-server_linux-${ts3arch}-${availablebuild}.tar.gz
 rm -rf "${rootdir}/teamspeak3-server_linux-${ts3arch}"

+ 4 - 4
functions/fn_monitor

@@ -2,7 +2,7 @@
 # LGSM fn_monitor function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 150815
+# Version: 311015
 
 # Description: Monitors server by checking for running proccesses
 # then passes to fn_monitor_query.
@@ -22,7 +22,7 @@ if [ ! -f "${rootdir}/${lockselfname}" ]; then
 	sleep 1
 	echo -en "\n"
 	echo "To enable monitor run ./${selfname} start"
-	exit
+	exit 1
 fi
 fn_printdots "Checking session: CHECKING"
 fn_scriptlog "Checking session: CHECKING"
@@ -67,7 +67,7 @@ if [ ! -f "${rootdir}/${lockselfname}" ]; then
 	sleep 1
 	echo -en "\n"
 	echo "To enable monitor run ./${selfname} start"
-	exit
+	exit 1
 fi
 
 updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l)
@@ -85,7 +85,7 @@ if [ "${updatecheck}" = "0" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "$
 		if [ "${engine}" == "avalanche" ]||[ "${engine}" == "goldsource" ]||[ "${engine}" == "realvirtuality" ]||[ "${engine}" == "source" ]||[ "${engine}" == "spark" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then
 			fn_monitor_query
 		fi
-		exit
+		exit $?
 	else
 		fn_printfail "Checking session: FAIL"
 		fn_scriptlog "Checking session: FAIL"

+ 7 - 7
functions/fn_monitor_query

@@ -2,7 +2,7 @@
 # LGSM fn_monitor_query function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 030715
+# Version: 311015
 
 # Description: uses gsquery.py to directly query the server.
 # Detects if the server has frozen.
@@ -10,15 +10,15 @@
 local modulename="Monitor"
 if [ -f "${rootdir}/gsquery.py" ]; then
 	if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then
-		gameport=$(grep Port= "${servercfgfullpath}"|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|tr -d '\r'|tr -cd [:digit:])
+		gameport=$(grep Port= "${servercfgfullpath}"|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|tr -d '\r'|tr -cd '[:digit:]')
 		port=$((${gameport} + 1))
 	elif [ "${engine}" == "spark" ]; then
 		port=$((${port} + 1))
 	elif [ "${engine}" == "realvirtuality" ]; then
-		queryport=$(grep -s steamqueryport= "${servercfgfullpath}"|grep -v //|tr -d '\r'|tr -cd [:digit:])
+		queryport=$(grep -s steamqueryport= "${servercfgfullpath}"|grep -v //|tr -d '\r'|tr -cd '[:digit:]')
 		port=${queryport}
 	elif [ "${engine}" == "unity3d" ]; then
-		gameport=$(grep ServerPort "${servercfgfullpath}"|tr -cd [:digit:])
+		gameport=$(grep ServerPort "${servercfgfullpath}"|tr -cd '[:digit:]')
 		port=$((${gameport} + 1))
 	fi
 	fn_printinfo "Detected gsquery.py"
@@ -56,7 +56,7 @@ if [ -f "${rootdir}/gsquery.py" ]; then
 			fn_email
 		fi
 		fn_restart
-		exit
+		exit 1
 	elif [ "${exitcode}" == "0" ]; then
 		fn_printok "Querying port: ${ip}:${port} : OK"
 		fn_scriptlog "Querying port: ${ip}:${port} : OK"
@@ -79,7 +79,7 @@ if [ -f "${rootdir}/gsquery.py" ]; then
 			echo "As user ${owner} or root run the following command."
 			whoami=$(whoami)
 			echo -en "\nchown ${whoami}:${whoami} ${rootdir}/gsquery.py\n\n"
-		exit
+		exit 1
 		fi
 	else
 		fn_printfail "Querying port: ${ip}:${port} : UNKNOWN ERROR"
@@ -87,7 +87,7 @@ if [ -f "${rootdir}/gsquery.py" ]; then
 		sleep 1
 		echo -en "\n"
 		${rootdir}/gsquery.py -a ${ip} -p ${port} -e ${engine}
-		exit
+		exit 1
 	fi
 else
 	fn_printfailnl "Could not find ${rootdir}/gsquery.py"

+ 3 - 3
functions/fn_start

@@ -2,7 +2,7 @@
 # LGSM fn_start function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 291015
+# Version: 301015
 
 # Description: Starts the server.
 
@@ -126,11 +126,11 @@ date > "${rootdir}/${lockselfname}"
 cd "${executabledir}"
 tmux new-session -d -s "${servicename}" "${executable} ${parms}" 2> "${scriptlogdir}/.${servicename}-tmux-error.tmp"
 # tmux pipe-pane not supported in tmux versions < 1.6
-if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd [:digit:])" -lt "16" ]; then
+if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ]; then
 	echo "Console logging disabled: Tmux => 1.6 required" >> "${consolelog}"
 	echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}"
 	echo "Currently installed: $(tmux -V)" >> "${consolelog}"
-elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd [:digit:])" -eq "18" ]; then
+elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ]; then
 	echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}"
 	echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}"
 	echo "Currently installed: $(tmux -V)" >> "${consolelog}"

+ 11 - 11
functions/fn_update_check

@@ -2,7 +2,7 @@
 # LGSM fn_update_check function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 281015
+# Version: 011115
 
 # Description: Checks if a server update is available.
 
@@ -40,7 +40,7 @@ if [ "${appmanifestfilewc}" -ge "2" ]; then
 		for appfile in ${appmanifestfile}; do
 			echo "	${appfile}"
 		done
-		exit
+		exit 1
 	else
 		sleep 1
 		fn_printok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files"
@@ -53,10 +53,10 @@ if [ "${appmanifestfilewc}" -ge "2" ]; then
 		fn_update_check
 	fi
 elif [ "${appmanifestfilewc}" -eq "0" ]; then
-	if [ "${forceupdate}" -eq "1" ]; then
+	if [ "${forceupdate}" == "1" ]; then
 		fn_printfail "Still no appmanifest_${appid}.acf found: Unable to update"
 		fn_scriptlog "Warning! Still no appmanifest_${appid}.acf found: Unable to update"
-		exit
+		exit 1
 	fi
 	forceupdate=1
 	fn_printwarn "No appmanifest_${appid}.acf found"
@@ -128,14 +128,14 @@ if [ -z "${availablebuild}" ]; then
 	sleep 1
 	fn_printfailnl "Checking for update: SteamCMD: Not returning version info"
 	fn_scriptlog "Failure! Checking for update: SteamCMD: Not returning version info"
-	exit
+	exit 1
 else
 	fn_printok "Checking for update: SteamCMD"
 	fn_scriptlog "Success! Checking for update: SteamCMD"
 	sleep 1
 fi
 
-if [ "${currentbuild}" -ne "${availablebuild}" ]; then
+if [ "${currentbuild}" != "${availablebuild}" ]; then
 	echo -e "\n"
 	echo -e "Update available:"
 	sleep 1
@@ -205,7 +205,7 @@ if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then
 	if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then
 		fn_printfailnl "Checking for update: teamspeak.com: Still No logs with server version found"
 		fn_scriptlog "Failure! Checking for update: teamspeak.com: Still No logs with server version found"
-		exit
+		exit 1
 	fi
 fi
 currentbuild=$(cat $(find ./* -name 'ts3server*_0.log' 2> /dev/null | sort | egrep -E -v '${rootdir}/.ts3version' | tail -1) | egrep -o 'TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}')
@@ -219,7 +219,7 @@ ts3arch=$(ls $(find ${filesdir}/ -name 'ts3server_*_*' 2> /dev/null | grep -v 't
 wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '<a href=\".*\/\">.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp
 
 # removes digits to allow sorting of numbers
-cat .ts3_version_numbers_unsorted.tmp |tr -cd "[:digit:][*\n]" > .ts3_version_numbers_digit.tmp
+cat .ts3_version_numbers_unsorted.tmp |tr -cd '[:digit:][*\n]' > .ts3_version_numbers_digit.tmp
 # Sorts numbers in to correct order
 # merges two files in to one with two columns sorts the numbers in to order then only outputs the second to the ts3_version_numbers.tmp
 paste .ts3_version_numbers_digit.tmp .ts3_version_numbers_unsorted.tmp |sort -rn|awk '{ print $2 }' > .ts3_version_numbers.tmp
@@ -245,7 +245,7 @@ if [ -z "${availablebuild}" ]; then
 	fn_printfail "Checking for update: teamspeak.com: Not returning version info"
 	fn_scriptlog "Failure! Checking for update: teamspeak.com: Not returning version info"
 	sleep 2
-	exit
+	exit 1
 else
 	fn_printok "Checking for update: teamspeak.com"
 	fn_scriptlog "Success! Checking for update: teamspeak.com"
@@ -253,8 +253,8 @@ else
 fi
 
 # Removes dots so if can compare version numbers
-currentbuilddigit=$(echo "${currentbuild}"|tr -cd "[:digit:]")
-availablebuilddigit=$(echo "${availablebuild}"|tr -cd "[:digit:]")
+currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]')
+availablebuilddigit=$(echo "${availablebuild}"|tr -cd '[:digit:]')
 if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then
 	echo -e "\n"
 	echo -e "Update available:"

+ 3 - 3
functions/fn_update_dl

@@ -2,7 +2,7 @@
 # LGSM fn_update_dl function
 # Author: Daniel Gibbs
 # Website: http://gameservermanagers.com
-# Version: 040715
+# Version: 311015
 
 # Description: Runs a server update.
 
@@ -66,7 +66,7 @@ else
 	cat "${scriptlogdir}/.${servicename}-tar-error.tmp" >> "${scriptlog}"
 	rm "${scriptlogdir}/.${servicename}-tar-error.tmp"
 	fn_scriptlog "Failure! Unable to update"
-	exit
+	exit ${status}
 fi
 echo -e "copying to ${filesdir}...\c"
 fn_scriptlog "Copying to ${filesdir}"
@@ -82,7 +82,7 @@ else
 	cat "${scriptlogdir}/.${servicename}-cp-error.tmp" >> "${scriptlog}"
 	rm "${scriptlogdir}/.${servicename}-cp-error.tmp"
 	fn_scriptlog "Failure! Unable to update"
-	exit
+	exit ${status}
 fi
 rm -f teamspeak3-server_linux-${ts3arch}-${availablebuild}.tar.gz
 rm -rf "${rootdir}/teamspeak3-server_linux-${ts3arch}"

+ 485 - 0
tests/test.sh

@@ -0,0 +1,485 @@
+#!/bin/bash
+# Just Cause 2
+# Server Management Script
+# Author: Daniel Gibbs
+# Website: http://gameservermanagers.com
+version="150715"
+
+#### Variables ####
+
+# Notification Email
+# (on|off)
+emailnotification="on"
+email="me@danielgibbs.co.uk"
+
+# Steam login
+steamuser="anonymous"
+steampass=""
+
+# Start Variables
+updateonstart="off"
+
+fn_parms(){
+parms=""
+}
+
+#### Advanced Variables ####
+
+# Steam
+appid="261140"
+
+# Server Details
+servicename="jc2-server"
+gamename="Just Cause 2"
+engine="avalanche"
+
+# Directories
+rootdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/jc2server"
+mkdir "${rootdir}"
+selfname="$(basename $0)"
+lockselfname=".${servicename}.lock"
+filesdir="${rootdir}/serverfiles"
+systemdir="${filesdir}"
+executabledir="${filesdir}"
+executable="./Jcmp-Server"
+servercfg="config.lua"
+servercfgdir="${filesdir}"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+servercfgdefault="${servercfgdir}/default_config.lua"
+backupdir="${rootdir}/backups"
+
+# Logging
+logdays="7"
+#gamelogdir="" # No server logs available
+scriptlogdir="${rootdir}/log/script"
+consolelogdir="${rootdir}/log/console"
+
+scriptlog="${scriptlogdir}/${servicename}-script.log"
+consolelog="${consolelogdir}/${servicename}-console.log"
+emaillog="${scriptlogdir}/${servicename}-email.log"
+
+scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log"
+consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log"
+
+##### Script #####
+# Do not edit
+
+fn_runfunction(){
+# Functions are downloaded and run with this function
+if [ ! -f "${rootdir}/functions/${functionfile}" ]; then
+	cd "${rootdir}"
+	if [ ! -d "functions" ]; then
+		mkdir functions
+	fi
+	cd functions
+	echo -e "    loading ${functionfile}...\c"
+	wget -N /dev/null https://raw.githubusercontent.com/dgibbs64/linuxgsm/master/functions/${functionfile} 2>&1 | grep -F HTTP | cut -c45-
+	chmod +x "${functionfile}"
+	cd "${rootdir}"
+fi
+source "${rootdir}/functions/${functionfile}"
+}
+
+fn_functions(){
+# Functions are defined in fn_functions.
+functionfile="${FUNCNAME}"
+fn_runfunction
+}
+
+fn_functions
+
+getopt=$1
+
+fn_currentstatus(){
+pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:")
+if [ "${pid}" == "0" ]; then
+	currentstatus="OFFLINE"
+else
+	currentstatus="ONLINE"
+fi
+}
+	
+fn_setstatus(){
+	fn_currentstatus
+	
+	echo""
+	echo "Required status: ${requiredstatus}"
+	counter=0
+    while [  "${requiredstatus}" != "${currentstatus}" ]; do
+    	counter=$((counter+1))
+    	fn_currentstatus
+	
+    	echo -ne "Current status:  ${currentstatus}\\r"
+		if [ "${requiredstatus}" == "ONLINE" ]; then
+			(fn_start > /dev/null 2>&1)
+		else
+			(fn_stop > /dev/null 2>&1)
+		fi
+    	if [ "${counter}" -gt "5" ]; then
+    		currentstatus="FAIL"
+    		echo "Current status:  ${currentstatus}"
+    		echo ""
+    		echo "Unable to start or stop server."
+    		exit
+    	fi
+    done
+    echo -ne "Current status:  ${currentstatus}\\r"
+    echo -e "\n"
+    echo "Test starting:"
+    echo ""
+    sleep 0.5
+}
+
+echo "================================="
+echo "TravisCI Tests"
+echo "Linux Game Server Manager"
+echo "by Daniel Gibbs"
+echo "http://gameservermanagers.com"
+echo "================================="
+echo ""
+sleep 1
+echo "================================="
+echo "Generic Server Tests"
+echo "Using: ${gamename}"
+echo "================================="
+echo ""
+sleep 1
+mkdir ${rootfdir}
+
+
+echo "1.0 - start - no files"
+echo "================================="
+echo "Description:"
+echo "Test script reaction to missing server files."
+requiredstatus="OFFLINE"
+fn_setstatus
+(fn_start)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+
+
+
+echo "2.0 - install"
+echo "================================="
+echo "Description:"
+echo "install ${gamename} server."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_autoinstall
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+
+
+
+echo "3.1 - start"
+echo "================================="
+echo "Description:"
+echo "start ${gamename} server."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_start
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "3.2 - start - online"
+echo "================================="
+echo "Description:"
+echo "start ${gamename} server while already running."
+requiredstatus="ONLINE"
+fn_setstatus
+(fn_start)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "3.3 - start - updateonstart"
+echo "================================="
+echo "Description:"
+echo "will update server on start."
+requiredstatus="ONLINE"
+fn_setstatus
+(
+	updateonstart="on"
+	fn_start
+)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "3.4 - stop"
+echo "================================="
+echo "Description:"
+echo "stop ${gamename} server."
+requiredstatus="ONLINE"
+fn_setstatus
+fn_stop
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "3.5 - stop - offline"
+echo "================================="
+echo "Description:"
+echo "stop ${gamename} server while already stopped."
+requiredstatus="OFFLINE"
+fn_setstatus
+(fn_stop)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "3.6 - restart"
+echo "================================="
+echo "Description:"
+echo "restart ${gamename}."
+requiredstatus="ONLINE"
+fn_setstatus
+fn_restart
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "3.7 - restart - offline"
+echo "================================="
+echo "Description:"
+echo "restart ${gamename} while already stopped."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_restart
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+
+
+
+echo "4.1 - update"
+echo "================================="
+echo "Description:"
+echo "check for updates."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_update_check
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.2 - update  - change buildid"
+echo "================================="
+echo "Description:"
+echo "change the buildid tricking SteamCMD to update."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_printinfonl "changed buildid to 0."
+sed -i 's/[0-9]\+/0/' ${filesdir}/steamapps/appmanifest_${appid}.acf
+fn_update_check
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.3 - update  - change buildid - online"
+echo "================================="
+echo "Description:"
+echo "change the buildid tricking SteamCMD to update server while already running."
+requiredstatus="ONLINE"
+fn_setstatus
+fn_printinfonl "changed buildid to 0."
+sed -i 's/[0-9]\+/0/' ${filesdir}/steamapps/appmanifest_${appid}.acf
+fn_update_check
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.4 - update  - remove appmanifest file"
+echo "================================="
+echo "Description:"
+echo "removing appmanifest file will cause script to repair."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_printinfonl "removed appmanifest_${appid}.acf."
+rm --verbose "${filesdir}/steamapps/appmanifest_${appid}.acf"
+fn_update_check
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.5 - force-update"
+echo "================================="
+echo "Description:"
+echo "force-update bypassing update check."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_update_check
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.6 - force-update - online"
+echo "================================="
+echo "Description:"
+echo "force-update bypassing update check server while already running."
+requiredstatus="ONLINE"
+fn_setstatus
+fn_update_check
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.7 - validate"
+echo "================================="
+echo "Description:"
+echo "validate server files."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_validate
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "4.8 - validate - online"
+echo "================================="
+echo "Description:"
+echo "validate server files while server while already running."
+requiredstatus="ONLINE"
+fn_setstatus
+fn_validate
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+
+
+
+echo "5.1 - monitor - online"
+echo "================================="
+echo "Description:"
+echo "run monitor server while already running."
+requiredstatus="ONLINE"
+fn_setstatus
+(fn_monitor)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "5.2 - monitor - offline - no lockfile"
+echo "================================="
+echo "Description:"
+echo "run monitor while server is offline with no lockfile."
+requiredstatus="OFFLINE"
+fn_setstatus
+(fn_monitor)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "5.3 - monitor - offline - with lockfile"
+echo "================================="
+echo "Description:"
+echo "run monitor while server is offline with no lockfile."
+requiredstatus="OFFLINE"
+fn_setstatus
+fn_printinfonl "creating lockfile."
+date > "${rootdir}/${lockselfname}"
+(fn_monitor)
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+echo "5.4 - monitor - gsquery.py failure"
+echo "================================="
+echo "Description:"
+echo "gsquery.py will fail to query port."
+requiredstatus="ONLINE"
+fn_setstatus
+sed -i 's/[0-9]\+/0/' "${servercfgfullpath}"
+(fn_monitor)
+echo ""
+fn_printinfonl "Reseting ${servercfg}."
+fn_install_config
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+
+
+
+echo "6.0 - details"
+echo "================================="
+echo "Description:"
+echo "gsquery.py will fail to query port."
+requiredstatus="ONLINE"
+fn_setstatus
+fn_details
+echo ""
+echo "Test complete!"
+sleep 1
+echo ""
+
+echo "================================="
+echo "Generic Server Tests - Complete!"
+echo "Using: ${gamename}"
+echo "================================="
+echo ""
+sleep 1
+fn_printinfo "Tidying up directories."
+sleep 1
+rm -rfv ${rootdir}
+echo "END"
+
+#!/bin/bash
+# Teamspeak 3
+# Server Management Script
+# Author: Daniel Gibbs
+# Website: http://gameservermanagers.com
+version="040715"
+
+#### Variables ####
+
+# Notification Email
+# (on|off)
+emailnotification="on"
+email="me@Danielgibbs.co.uk"
+
+# Start Variables
+updateonstart="off"
+
+# Server Details
+gamename="Teamspeak 3"
+servername="Teamspeak 3 Server"
+servicename="ts3-server"
+
+# Directories
+rootdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ts3server"
+selfname="$(basename $0)"
+lockselfname=".${servicename}.lock"
+filesdir="${rootdir}/serverfiles"
+systemdir="${filesdir}"
+executabledir="${filesdir}"
+executable="./ts3server_startscript.sh"
+servercfg="${servicename}.ini"
+servercfgdir="${filesdir}"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+backupdir="${rootdir}/backups"
+
+# Logging
+logdays="7"
+gamelogdir="${filesdir}/logs"
+scriptlogdir="${rootdir}/log/script"
+
+scriptlog="${scriptlogdir}/${servicename}-script.log"
+emaillog="${scriptlogdir}/${servicename}-email.log"
+
+scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log"
+
+
+echo "================================="
+echo "Generic Server Tests"
+echo "Using: ${gamename}"
+echo "================================="
+echo ""
+sleep 1