diff --git a/Arma3/CONFIG_Vanilla.cfg b/Arma3/CONFIG_Vanilla.cfg index 1c8b88354..e41c648f5 100644 --- a/Arma3/CONFIG_Vanilla.cfg +++ b/Arma3/CONFIG_Vanilla.cfg @@ -2,27 +2,34 @@ // server.cfg // // comments are written with "//" in front of them. +// dont change any of the line numbers, the script *might* break -// STEAM - -steamport =8766; //default 8766, needs to be unique if multiple serves on same box -steamqueryport =27016; //default 27016, needs to be unique if multiple servers on same box +// PORTS +//default 2302, needs to be unique if multiple servers on same box +//ignore how the line is commented, it is still interprited by the main script +//serverport=2302 +//default 2304, needs to be unique if multiple servers on same box (master port) +steamport=2304; +//default 2303, needs to be unique if multiple servers on same box (query port) +steamqueryport=2303; // GLOBAL SETTINGS - -hostname = "arma3server"; // The name of the server that shall be displayed in the public server list -//password = "ServerAccessPassword"; // Password for joining, eg connecting to the server -passwordAdmin = "AdminPassword"; // Password to become server admin. When you're in Arma MP and connected to the server, type '#login xyz' -reportingIP = "arma3pc.master.gamespy.com"; // This is the default setting. Leave empty for private servers if you do not want your server listed publicly -logFile = "arma3server.log"; -verifySignatures = 2; -equalModRequired = 0; // kick if data/mods aren't equal -requiredSecureId = 2; // was used to define type of secureID +// The name of the server that shall be displayed in the public server list +hostname = "arma3server"; +// Password for joining, eg connecting to the server +//password = "ServerAccessPassword"; +// Password to become server admin. When you're in Arma MP and connected to the server, type '#login xyz' +passwordAdmin = "AdminPassword"; +logFile = "arma3server.log"; +verifySignatures = 2; +//kick if data/mods are not equal +equalModRequired = 0; +//was used to define type of secureID +requiredSecureId = 2; // WELCOME MESSAGE ("message of the day") // It can be several lines, separated by comma // Empty messages "" will not be displayed at all but are only for increasing the interval - motd[]={ "Welcome to My Arma 3 Server", "TS3 Server: teamspeak.somewhere.com", @@ -35,7 +42,6 @@ maxPlayers = 40; // Maximum amount of players. Civilians and watchers, behol kickDuplicate = 1; // Each ArmA version has its own ID. If kickDuplicate is set to 1, a player will be kicked //requiredBuild = 12345 // Require clients joining to have at least build 12345 of game, preventing obsolete clients to connect - // VOTING voteMissionPlayers = 1; // Tells the server how many people must connect so that it displays the mission selection screen. voteThreshold = 0.33; // 33% or more players need to vote for something, for example an admin or a new map, to become effective @@ -47,8 +53,7 @@ vonCodecQuality = 0; // supports range 1-30 //8kHz is 0-10 (narrowband), 16k persistent = 1; // If 1, missions still run on even after the last player disconnected. timeStampFormat = "short"; // Set the timestamp format used on each report line in server-side RPT file. Possible values are "none" (default),"short","full". BattlEye = 1; // Server to use BattlEye system -allowedLoadFileExtensions[] = {"txt","hpp"}; // only allow files with ".txt" and ".hpp" extension to be loaded via loadFile command (since Arma 3 1.19.124216) - +allowedLoadFileExtensions[] = {"hpp","txt"}; // only allow files with those extensions to be loaded via loadFile command (since Arma 3 build 1.19.124216) // SCRIPTING ISSUES onUserConnected = ""; // @@ -58,4 +63,4 @@ doubleIdDetected = ""; // // SIGNATURE VERIFICATION onUnsignedData = "kick (_this select 0)"; // unsigned data detected onHackedData = "kick (_this select 0)"; //"ban (_this select 0)"; // tampering of the signature detected -onDifferentData = ""; \ No newline at end of file +onDifferentData = ""; diff --git a/Arma3/arma3server b/Arma3/arma3server new file mode 100644 index 000000000..4d924d2b8 --- /dev/null +++ b/Arma3/arma3server @@ -0,0 +1,788 @@ +#!/bin/bash +# ARMA 3 +# Server Management Script +# Author: Daniel Gibbs +# Contributor: Scarsz +# Website: http://danielgibbs.co.uk +# Version: 060914 + +#### Variables #### + +# Notification Email +# (on|off) +emailnotification="off" +email="email@example.com" + +# Steam login +steamuser="username" +steampass="password" + +# Server IP +ip="0.0.0.0" + +#### Advanced Variables #### + +# Steam +appid="233780" + +# Server Details +servicename="arma3-server" +gamename="ARMA 3" +engine="Real Virtuality" + +# Directorys +rootdir="$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd )" +selfname="$0" +lockselfname=$(echo ".${servicename}.lock") +filesdir="${rootdir}/serverfiles" +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./arma3server" +servercfgdir="${systemdir}" +servercfg="${servicename}.cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" +defaultcfg="${servercfgdir}/server.cfg" +backupdir="backups" +steamclient="${rootdir}/steamcmd/linux32/steamclient.so" + +#Take line n from cfg, extract numbers from string +fn_ports(){ +serverport=$(sed -n -e '10 p' $servercfgfullpath | sed 's/[\/\; ]//g' | tr -cd [:digit:]) +queryport=$(sed -n -e '14 p' $servercfgfullpath | sed 's/[\/\; ]//g' | tr -cd [:digit:]) +masterport=$(sed -n -e '12 p' $servercfgfullpath | sed 's/[\/\; ]//g' | tr -cd [:digit:]) +} + +fn_parms(){ +parms="-netlog -port=${serverport} -ip=${ip} -config=${servercfg}" +} + +# 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 +# unless you know +# what you are doing + +fn_scriptlog(){ + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: '$1'" >> ${scriptlog} +} + +# [ FAIL ] +fn_printfail(){ + echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] $@" +} + +fn_printfailnl(){ + echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] $@" +} + +fn_printok(){ + echo -en "\r\033[K[\e[0;32m OK \e[0;39m] $@" +} + +# [ OK ] +fn_printoknl(){ + echo -e "\r\033[K[\e[0;32m OK \e[0;39m] $@" +} + +fn_printinfo(){ + echo -en "\r\033[K[\e[0;36m INFO \e[0;39m] $@" +} + +fn_printinfonl(){ + echo -e "\r\033[K[\e[0;36m INFO \e[0;39m] $@" +} + +# [ INFO ] +fn_printokinfonl(){ + echo -e "\r\033[K[\e[0;36m INFO \e[0;39m] $@" +} + +fn_printwarn(){ + echo -en "\r\033[K[\e[1;33m WARN \e[0;39m] $@" +} + +fn_printwarnnl(){ + echo -e "\r\033[K[\e[1;33m WARN \e[0;39m] $@" +} + +# [ .... ] +fn_printdots(){ + echo -en "\r\033[K[ .... ] $@" +} + +fn_rootcheck(){ +if [ `whoami` = "root" ]; then + fn_printfailnl "Script will not run as root!" + exit +fi +} + +fn_syscheck(){ +if [ ! -e "${systemdir}" ]; then + fn_printfailnl "Cannot access ${systemdir}: No such directory" + exit +fi +} + +fn_autoip(){ +# Identifies the server interface IP +# If multiple interfaces this will need to be set manually +getip=$(ip -o -4 addr|awk '{print $4 }'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0.1) +getipwc=$(ip -o -4 addr|awk '{print $4 }'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0.1|wc -l) +if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then + if [ "${getipwc}" -ge "2" ]; then + fn_printwarn "Multiple active network interfaces.\n\n" + echo -en "Manually specify the IP you want to use within the ${selfname} script.\n" + echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" + echo -en "${getip}\n" + exit + else + ip=${getip} + fi +fi +} + +fn_logmanager(){ +if [ ! -e "${consolelog}" ]; then + touch "${consolelog}" +fi +# log manager will active if finds logs older than ${logdays} +if [ `find "${scriptlogdir}"/* -mtime +${logdays}|wc -l` -ne "0" ]; then + fn_printdots "Starting log cleaner" + sleep 1 + fn_printok "Starting log cleaner" + sleep 1 + fn_scriptlog "Starting log cleaner" + sleep 1 + echo -en "\n" + fn_printinfo "Removing logs older than ${logdays} days" + sleep 1 + echo -en "\n" + fn_scriptlog "Removing logs older than ${logdays} days" + sleep 1 + find "${scriptlogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}" + find "${consolelogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}" + scriptcount=$(find "${scriptlogdir}"/* -mtime +${logdays}|wc -l) + consolecount=$(find "${consolelogdir}"/* -mtime +${logdays}|wc -l) + count=$((${scriptcount} + ${consolecount})) + find "${scriptlogdir}"/* -mtime +${logdays} -exec rm {} \; + find "${consolelogdir}"/* -mtime +${logdays} -exec rm {} \; + fn_printok "Log cleaner removed ${count} log files" + sleep 1 + echo -en "\n" + fn_scriptlog "Log cleaner removed ${count} log files" +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +fn_autoip +fn_ports +fn_parms +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +echo "Start parameters:" +echo ${parms} +echo "" +echo "Server ports:" +echo "Server: ${serverport}" +echo "Query: ${queryport}" +echo "Master: ${masterport}" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +fn_printdots "Starting debug mode ${servicename}: ${servername}" +sleep 1 +fn_printok "Starting debug mode ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Started debug mode ${servername}" +echo -en "\n" +cd "${executabledir}" +${executable} ${parms} +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1;; + * ) echo "Please answer yes or no.";; +esac +done +fn_printdots "Starting ${servicename} console" +sleep 1 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) +if [ ${tmuxwc} -eq 1 ]; then + fn_printoknl "Starting ${servicename} console" + sleep 1 + fn_scriptlog "Console accessed" + tmux attach-session -t ${servicename} +else + fn_printfailnl "Starting ${servicename} console: ${servername} not running" + sleep 1 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver; break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +} + +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) +if [ ${tmuxwc} -eq 1 ]; then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver; break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +fn_printdots "Starting backup ${servicename}: ${servername}" +sleep 1 +fn_printok "Starting backup ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Backup started" +echo -en "\n" +cd "${rootdir}" +mkdir -pv "${backupdir}" > /dev/null 2>&1 +tar -cvzf "${backupdir}/${backupname}.tar.gz" --exclude "${backupdir}" * +echo -en "\r\033[K${servicename} Backup complete" +fn_scriptlog "Backup complete" +} + +fn_distro(){ +arch=$(uname -m) +kernel=$(uname -r) +if [ -f /etc/lsb-release ]; then + os=$(lsb_release -s -d) +elif [ -f /etc/debian_version ]; then + os="Debian $(cat /etc/debian_version)" +elif [ -f /etc/redhat-release ]; then + os=$(cat /etc/redhat-release) +else + os="$(uname -s) $(uname -r)" +fi +} + +fn_uptime(){ +uptime=$( /dev/null 2>&1 +tail -25 "${scriptlog}" >> "${emaillog}" +if [ ! -z "${consolelog}" ]; then + echo -e "\n\nConsole log\n====================\n" >> "${emaillog}" + tail -25 "${consolelog}" >> "${emaillog}" +fi +if [ ! -z "${gamelogdir}" ]; then + echo -e "\n\nServer log\n====================\n" >> "${emaillog}" + tail "${gamelogdir}"/*|grep -v "==>"|sed '/^$/d'|tail -25 >> "${emaillog}" +fi +mail -s "${subject}" ${email} < "${emaillog}" +fn_printinfo "Sent email notification to ${email}" +sleep 1 +echo -en "\n" +fn_scriptlog "Sent email notification to ${email}" +} + +fn_emailtest(){ +fn_rootcheck +fn_syscheck +fn_scriptlog "Emailing test notification" +if [ "${emailnotification}" = "on" ]; then + subject="${servicename} Email Test Notification - Testing ${servername}" + failurereason="Testing ${servicename} email notification" + actiontaken="Sent test email...hello is this thing on?" + fn_emailnotification +else + fn_printfailnl "Email notification not enabled" + fn_scriptlog "Email notification not enabled" +fi +sleep 1 +echo -en "\n" +} + +fn_monitorserver(){ +fn_rootcheck +fn_syscheck +fn_autoip +if [ ! -f ${lockselfname} ]; then + fn_printinfo "Monitoring ${servicename}: No lock file found: Monitor disabled" + sleep 1 + echo -en "\n" + exit +fi +fn_printdots "Monitoring ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Monitoring ${servername}" +updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) +if [ "${updatecheck}" = "0" ]; then + fn_printdots "Monitoring ${servicename}: Checking session: CHECKING" + sleep 1 + fn_scriptlog "Checking session: CHECKING" + tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) + if [ ${tmuxwc} -eq 1 ]; then + fn_printok "Monitoring ${servicename}: Checking session: OK" + sleep 1 + echo -en "\n" + fn_scriptlog "Checking session: OK" + exit + else + fn_printfail "Monitoring ${servicename}: Checking session: FAIL" + fn_scriptlog "Checking session: FAIL" + sleep 1 + echo -en "\n" + if [ "${emailnotification}" = "on" ]; then + subject="${servicename} Monitor - Starting ${servername}" + failurereason="${servicename} process not running" + actiontaken="${servicename} has been restarted" + fn_emailnotification + fi + fn_scriptlog "Monitor is starting ${servername}" + fn_startserver + fi +else + fn_printinfonl "Monitoring ${servicename}: Detected SteamCMD is checking for updates" + sleep 1 + fn_scriptlog "Detected SteamCMD is checking for updates" + fn_printinfonl "Monitoring ${servicename}: When updates complete ${servicename} will start" + sleep 1 + fn_scriptlog "When updates complete ${servicename} will start" +fi +} + +fn_updateserver(){ +fn_rootcheck +fn_syscheck +fn_printdots "Updating ${servicename}: ${servername}" +sleep 1 +fn_printok "Updating ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Updating ${servername}" +cd "${rootdir}" +cd "steamcmd" +./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir "${filesdir}" +app_update ${appid} +quit|tee -a "${scriptlog}" +} + +fn_validateserver(){ +fn_rootcheck +fn_syscheck +fn_printwarn "Validating may overwrite some customised files." +sleep 1 +echo -en "\n" +echo -en "https://developer.valvesoftware.com/wiki/SteamCMD#Validate" +sleep 5 +echo -en "\n" +fn_printdots "Validating ${servicename}: ${servername}" +sleep 1 +fn_printok "Validating ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Validating ${servername}" +cd "${rootdir}" +cd "steamcmd" +./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir "${filesdir}" +app_update ${appid} validate +quit|tee -a "${scriptlog}" +} + +fn_restartserver(){ +fn_scriptlog "Restarting ${servername}" +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l) +fn_printdots "Stopping ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Stopping ${servername}" +if [ "${pid}" == "0" ]; then + fn_printfail "Stopping ${servicename}: ${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" +else + tmux kill-session -t ${servicename} + fn_printok "Stopping ${servicename}: ${servername}" + fn_scriptlog "Stopped ${servername}" +fi +# Remove lock file +rm -f ${lockselfname} +sleep 1 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +fn_autoip +fn_ports +fn_parms +fn_logmanager +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) +if [ ${tmuxwc} -eq 0 ]; then + mv "${scriptlog}" "${scriptlogdate}" + mv "${consolelog}" "${consolelogdate}" +fi +fn_printdots "Starting ${servicename}: ${servername}" +sleep 1 +fn_scriptlog "Starting ${servername}" +if [ ${tmuxwc} -eq 1 ]; then + fn_printinfo "Starting ${servicename}: ${servername} is already running" + sleep 1 + echo -en "\n" + fn_scriptlog "${servername} is already running" + exit +fi +# Create lock file +date > ${lockselfname} +cd "${executabledir}" +# Start server +tmux new-session -d -s ${servicename} "${executable} ${parms}" +tmux pipe-pane -o -t ${servicename} "exec cat >> '${consolelog}'" +sleep 1 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l) +if [ ${tmuxwc} -eq 0 ]; then + fn_printfail "Starting ${servicename}: Failed to start ${servername}" + fn_scriptlog "failed to start ${servername}" +else + fn_printok "Starting ${servicename}: ${servername}" + fn_scriptlog "Started ${servername}" +fi +sleep 1 +echo -en "\n" +} + +fn_details(){ +fn_autoip +fn_ports +servername=$(grep -s hostname "${servercfgfullpath}"|sed -e 's/\//g'| tr -d '=\"; ') +adminpass=$(grep -s passwordAdmin "${servercfgfullpath}"|sed -e 's/\//g'|tr -d '=\"; ') +pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l) +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "Server name: ${servername}" +echo "Server IP: ${ip}:${serverport}" +echo "Config file: ${servercfgfullpath}" +echo "" +echo "Admin Password: $adminpass" +echo "" +echo "${servername} Ports" +echo "============================" +echo "Ports the server is currently using." +echo "" +echo "PROTOCOL DESCRIPTION PORT" +echo "UDP Game port ${serverport}" +echo "UDP STEAM query port ${queryport}" +echo "UDP STEAM master traffic port ${masterport}" +echo "" +echo "You can change ports by editing the" +echo "parameters in $servercfgfullpath." +echo "" +if [ "${pid}" == "0" ]; then + echo -e "Status:\e[0;31m OFFLINE\e[0;39m" +else + echo -e "Status:\e[0;32m ONLINE\e[0;39m" +fi +echo "" +} + +# +## Installer +# + +fn_header(){ +clear +echo "=================================" +echo "${gamename}" +echo "Linux Game Server Manager" +echo "by Daniel Gibbs" +echo "with modifications by Scarsz" +echo "http://danielgibbs.co.uk" +echo "=================================" +echo "" +} + +fn_steamdl(){ +echo "Installing SteamCMD" +echo "=================================" +cd "${rootdir}" +mkdir -pv "steamcmd" +sleep 1 +cd "steamcmd" +if [ ! -f steamcmd.sh ]; then + wget http://media.steampowered.com/client/steamcmd_linux.tar.gz + tar --verbose -zxf steamcmd_linux.tar.gz + rm -v steamcmd_linux.tar.gz + chmod +x steamcmd.sh + sleep 1 +else + echo "" + echo "Steam already installed!" +fi +sleep 1 +echo "" +} + +fn_steaminstall(){ +echo "Installing ${gamename} Server" +echo "=================================" +sleep 1 +mkdir -pv "${filesdir}" +cd "${rootdir}/steamcmd" +STEAMEXE=steamcmd ./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir "${filesdir}" +app_update ${appid} validate +quit +echo "" +echo "=================================" +while true; do + read -p "Was the install successful? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) fn_retryinstall;; + * ) echo "Please answer yes or no.";; + esac +done +echo "" +} + +fn_steamfix(){ +echo "Applying steamclient.so fix" +echo "=================================" +sleep 1 +mkdir -pv "${HOME}/.steam" +mkdir -pv "${HOME}/.steam/sdk32" +cp -v "${steamclient}" "${HOME}/.steam/sdk32/steamclient.so" +sleep 1 +echo "" +} + +fn_arma3deps(){ +echo "Copying libstdc++.so.6" +echo "=================================" +sleep 1 +cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" +sleep 1 +echo "" +} + +fn_loginstall(){ +echo "Creating log directorys" +echo "=================================" +sleep 1 +mkdir -pv "${rootdir}/log" +mkdir -pv "${scriptlogdir}" +touch "${scriptlog}" +mkdir -pv "${consolelogdir}" +touch "${consolelog}" +if [ ! -h ${rootdir}/log/server ]; then + ln -sv "${gamelogdir}" "${rootdir}/log/server" +else + echo "Symbolic link ${gamelogdir} => ${rootdir}/log/server already exists!" +fi +sleep 1 +echo "" +} + +fn_arma3config(){ +echo "Downloading CONFIG_Vanilla.cfg" +echo "=================================" +sleep 1 +cd "${systemdir}" +wget -nv https://raw.githubusercontent.com/dgibbs64/linuxgameservers/master/Arma3/CONFIG_Vanilla.cfg +echo "Creating ${servicename}.cfg config file." +sleep 1 +cp -v CONFIG_Vanilla.cfg ${servercfgfullpath} +sleep 1 +echo "" +echo "" +} + +fn_retryinstall(){ +while true; do + read -p "Retry install? [y/N]" yn + case $yn in + [Yy]* ) fn_install;; + [Nn]* ) echo Exiting; exit;; + * ) echo "Please answer yes or no.";; + esac +done +} + +fn_install(){ +fn_rootcheck +fn_header +if [ -d "${filesdir}" ]; then + echo "${gamename} Server is already installed here:" + pwd + echo "" + while true; do + read -p "Continue [y/N]" yn + case $yn in + [Yy]* ) fn_header; break;; + [Nn]* ) echo Exiting; return 1;; + * ) echo "Please answer yes or no.";; + esac + done +fi +echo "Install Directory:" +pwd +echo "" +while true; do + read -p "Continue [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1;; + * ) echo "Please answer yes or no.";; + esac +done +fn_header +fn_steamdl +fn_steaminstall +fn_steamfix +fn_arma3deps +fn_loginstall +fn_arma3config +sleep 1 +echo "" +fn_header +sleep 1 +fn_details +sleep 1 +echo "=================================" +echo "Install Complete!" +echo "" +echo "You need to edit the default server configuration at:" +echo "$servercfgfullpath" +echo "" +echo "To start server type:" +echo "${selfname} start" +echo "" +} + +case "$1" in + start) + fn_startserver;; + stop) + fn_stopserver;; + restart) + fn_restartserver;; + update) + fn_updateserver;; + update-restart) + fn_stopserver + fn_updateserver + fn_startserver;; + validate) + fn_validateserver;; + validate-restart) + fn_stopserver + fn_validateserver + fn_startserver;; + monitor) + fn_monitorserver;; + email-test) + fn_emailtest;; + details) + fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; + *) + echo "Usage: $0 {start|stop|restart|update|update-restart|validate|validate-restart|monitor|email-test|details|backup|console|debug|install}" + exit 1;; +esac +exit