diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 96732eed7..e6555a40e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,13 +23,13 @@ Any general support issues on GitHub will be migrated to [LinuxGSM-Support](http ## User Story -As a \[user description], I want \[desired action] so that \[desired outcome]. +As a [user description], I want [desired action] so that [desired outcome]. ## Basic info -* Distro \[Ubuntu 18.04] -* Game \[Garry's Mod] -* Feature \[Monitor] +* Distro: [Ubuntu 18.04] +* Game: [Garry's Mod] +* Command: [Monitor] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index b322bb31f..0f2ccde58 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -23,15 +23,13 @@ Any general support issues on GitHub will be migrated to [LinuxGSM-Support](http ## User Story -As a \[user description], I want \[desired action] so that \[desired outcome]. +As a [user description], I want [desired action] so that [desired outcome]. ## Basic info -As a \[user description], I want \[desired action] so that \[desired outcome] - -* Distro \[Ubuntu 18.04] -* Game \[Garry's Mod] -* Feature \[Monitor] +* Distro: [Ubuntu 18.04] +* Game: [Garry's Mod] +* Command: [Monitor] ## Further Information diff --git a/.github/ISSUE_TEMPLATE/new-server-request.md b/.github/ISSUE_TEMPLATE/new-server-request.md index 141233eeb..d27b3b497 100644 --- a/.github/ISSUE_TEMPLATE/new-server-request.md +++ b/.github/ISSUE_TEMPLATE/new-server-request.md @@ -6,7 +6,7 @@ about: Suggest a new game server to be added ## What game server would you like adding? -\[game server] +[game server] ## Can you link to any tutorials or guides? @@ -19,7 +19,7 @@ Provide any useful documentation or resources that might help. If yes Use SteamDB to get the appid. (https://steamdb.info). -\[appid] +[appid] ## Is the server supported on Linux? diff --git a/.github/lock.yml b/.github/lock.yml index 2501c129a..dd136ecdc 100644 --- a/.github/lock.yml +++ b/.github/lock.yml @@ -1,9 +1,13 @@ -# Configuration for lock-threads - https://github.com/dessant/lock-threads +# Configuration for Lock Threads - https://github.com/dessant/lock-threads # Number of days of inactivity before a closed issue or pull request is locked daysUntilLock: 365 -# Issues and pull requests with these labels will not be locked. Set to `[]` to disable +# Skip issues and pull requests created before a given timestamp. Timestamp must +# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable +skipCreatedBefore: false + +# Issues and pull requests with these labels will be ignored. Set to `[]` to disable exemptLabels: [] # Label to add before locking, such as `outdated`. Set to `false` to disable @@ -15,6 +19,9 @@ lockComment: > any recent activity after it was closed. Please open a new issue for related bugs. +# Assign `resolved` as the reason for locking. Set to `false` to disable +setLockReason: false + # Limit to only `issues` or `pulls` # only: issues @@ -25,4 +32,7 @@ lockComment: > # lockLabel: outdated # pulls: -# daysUntilLock: 30 \ No newline at end of file +# daysUntilLock: 30 + +# Repository to extend settings from +# _extends: repo \ No newline at end of file diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 09c1339ca..8e4d37045 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -6,15 +6,18 @@ Fixes #\[issue] ## Type of change -* [ ] Bug fix (non breaking change which fixes an issue) -* [ ] New feature (non breaking change which adds functionality) -* [ ] Refactor (non breaking change restructures existing code) +* [ ] Bug fix (change which fixes an issue) +* [ ] New feature (change which adds functionality) +* [ ] New Server (new server added) +* [ ] Refactor (restructures existing code) * [ ] This change requires a documentation update ## Checklist * [ ] My code follows the style guidelines of this project * [ ] This pull request links to an issue -* [ ] I have performed a self review of my own code +* [ ] This pull request uses the `develop` branch as its base +* [ ] I have performed a self-review of my own code +* [ ] I have squashed commits * [ ] I have commented my code, particularly in hard to understand areas -* [ ] I have made corresponding changes to the documentation +* [ ] I have made corresponding changes to the documentation if required diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg new file mode 100644 index 000000000..f42987541 --- /dev/null +++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg @@ -0,0 +1,130 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="8v8_vienna" +maxplayers="32" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="-game iosoccer -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Updating | https://docs.linuxgsm.com/commands/update +updateonstart="off" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +## SteamCMD Settings +# Server appid +appid="673990" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="IOSoccer" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/iosoccer" +executabledir="${serverfiles}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg new file mode 100644 index 000000000..a863c5425 --- /dev/null +++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg @@ -0,0 +1,116 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://docs.linuxgsm.com/configuration/start-parameters +ip="0.0.0.0" +port="27960" +defaultmap="mp_beach" + +## Server Start Command | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) + +# More info | https://docs.linuxgsm.com/alerts#more-info +postalert="off" +postdays="7" +posttarget="https://hastebin.com" + +# Discord Alerts | https://docs.linuxgsm.com/alerts/discord +discordalert="off" +discordwebhook="webhook" + +# Email Alerts | https://docs.linuxgsm.com/alerts/email +emailalert="off" +email="email@example.com" +emailfrom="" + +# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt +iftttalert="off" +ifttttoken="accesstoken" +iftttevent="linuxgsm_alert" + +# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun +mailgunalert="off" +mailguntoken="accesstoken" +mailgundomain="example.com" +mailgunemailfrom="alert@example.com" +mailgunemail="email@myemail.com" + +# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover +pushoveralert="off" +pushovertoken="accesstoken" + +# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram +# You can add a custom cURL string eg proxy (useful in Russia) or else in "curlcustomstring". +# like a "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help", if you not need +# any custom string in curl - simple ignore this parameter. +telegramalert="off" +telegramtoken="accesstoken" +telegramchatid="" +curlcustomstring="" + +## Backup | https://docs.linuxgsm.com/commands/backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://docs.linuxgsm.com/features/logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# ANSI Colors +ansi="on" + +## LinuxGSM Server Details +# Do not edit +gamename="Return to Castle Wolfenstein" +engine="ioquake3" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${serverfiles}/main" +executabledir="${serverfiles}" +executable="./iowolfded.x86_64" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${serverfiles}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +alertlog="${lgsmlogdir}/${servicename}-alert.log" +postdetailslog="${lgsmlogdir}/${servicename}-postdetails.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index fd3fccbb8..47c20e4b2 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -37,6 +37,7 @@ hldm,hldmserver,Half-Life: Deathmatch hw,hwserver,Hurtworld ins,insserver,Insurgency inss,inssserver,Insurgency: Sandstorm +ios,iosserver,IOSoccer jc2,jc2server,Just Cause 2 jc3,jc3server,Just Cause 3 kf,kfserver,Killing Floor @@ -61,6 +62,7 @@ ql,qlserver,Quake Live qw,qwserver,Quake World ro,roserver,Red Orchestra: Ostfront 41-45 ricochet,ricochetserver,Ricochet +rtcw,rtcwserver,Return to Castle Wolfenstein rust,rustserver,Rust rw,rwserver, Rising World samp,sampserver,San Andreas Multiplayer diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh index 12382706f..2ace8935f 100644 --- a/lgsm/functions/alert_discord.sh +++ b/lgsm/functions/alert_discord.sh @@ -16,7 +16,7 @@ escaped_alertbody="$(echo -n "${alertbody}" | jq -sRr "@json")" json=$(cat < /dev/null 2>&1 + if [ "${autoinstall}" == "1" ]; then + sudo -n true > /dev/null 2>&1 + else + sudo -v > /dev/null 2>&1 + fi if [ $? -eq 0 ]; then fn_print_info_nl "Automatically adding Mono repository." fn_script_log_info "Automatically adding Mono repository." @@ -101,7 +105,11 @@ fn_install_universe_repo(){ fn_print_warning_nl "Ubuntu 18.04.1 contains a bug which means the sources.list file does not populate with the Ubuntu universe repository." fn_print_information_nl "Attempting to add Universe Repo" sleep 0.5 - sudo -v > /dev/null 2>&1 + if [ "${autoinstall}" == "1" ]; then + sudo -n true > /dev/null 2>&1 + else + sudo -v > /dev/null 2>&1 + fi if [ $? -eq 0 ]; then echo -en ".\r" sleep 1 @@ -228,7 +236,11 @@ fn_found_missing_deps(){ fn_print_warning_nl "jq is not available in the ${distroname} repository" echo " * https://docs.linuxgsm.com/requirements/jq" fi - sudo -v > /dev/null 2>&1 + if [ "${autoinstall}" == "1" ]; then + sudo -n true > /dev/null 2>&1 + else + sudo -v > /dev/null 2>&1 + fi if [ $? -eq 0 ]; then fn_print_information_nl "Automatically installing missing dependencies." fn_script_log_info "Automatically installing missing dependencies." diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 82ea36d35..7185f070b 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -181,7 +181,7 @@ fn_sys_perm_fix_manually_msg(){ # Attempt to fix /sys related permission errors if sudo is available, exits otherwise fn_sys_perm_errors_fix(){ - sudo -v > /dev/null 2>&1 + sudo -n true > /dev/null 2>&1 if [ $? -eq 0 ]; then fn_print_dots "Automatically fixing /sys permissions" sleep 0.5 diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index f51b405ff..4cf281851 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -32,14 +32,3 @@ if [ -f "${servercfgdir}/valve.rc" ] && grep -E '^\s*exec\s*(default|joystick)\. sed -i 's/^\s*exec\s*joystick.cfg/\/\/exec joystick.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 fn_fix_msg_end fi - -# Fixes: workshop map issue. -# http://forums.steampowered.com/forums/showthread.php?t=3170366. -if [ -f "${systemdir}/subscribed_collection_ids.txt" ]||[ -f "${systemdir}/subscribed_file_ids.txt" ]||[ -f "${systemdir}/ugc_collection_cache.txt" ]; then - fixname="workshop map" - fn_fix_msg_start - rm -f "${systemdir}/subscribed_collection_ids.txt" - rm -f "${systemdir}/subscribed_file_ids.txt" - rm -f "${systemdir}/ugc_collection_cache.txt" - fn_fix_msg_end -fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index aea11c5b6..5c07f44ad 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -318,7 +318,7 @@ fn_info_config_inss(){ rconenabled=${rconenabled:-"NOT SET"} rconpassword=${rconpassword:-"NOT SET"} rconport=${rconport:-"0"} - fi + fi } fn_info_config_minecraft(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -589,6 +589,26 @@ fn_info_config_risingworld(){ fi } +fn_info_config_rtcw(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + fn_info_config_seriousengine35(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -1198,6 +1218,9 @@ elif [ "${shortname}" == "pz" ]; then # ARMA 3 elif [ "${shortname}" == "arma3" ]; then fn_info_config_realvirtuality +# Return to Castle Wolfenstein +elif [ "${shortname}" == "rtcw" ]; then + fn_info_config_rtcw # Rising World elif [ "${shortname}" == "rw" ]; then fn_info_config_risingworld diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index d9b6bcef6..60795d56c 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -89,8 +89,10 @@ days=$(( uptime/60/60/24 )) ## Average server load load=$(uptime|awk -F 'load average: ' '{ print $2 }') -## Memory information - +## CPU information +cpumodel=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') +cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) +cpufreuency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') ## Memory information # Available RAM and swap. @@ -232,4 +234,4 @@ if [ ! "$(command -v jq 2>/dev/null)" ]; then fi fi fi -fi \ No newline at end of file +fi diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 412688973..c22e850ec 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -77,7 +77,7 @@ elif [ "${shortname}" == "kf2" ]; then glibcfix="no" elif [ "${shortname}" == "tu" ]; then glibcrequired="2.15" - glibcfix="no" + glibcfix="no" elif [ "${gamename}" == "Mumble" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" @@ -102,6 +102,9 @@ elif [ "${gamename}" == "Quake 3: Arena" ]; then elif [ "${gamename}" == "Quake Live" ]; then glibcrequired="2.15" glibcfix="no" +elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then + glibcrequired="2.1" + glibcfix="no" elif [ "${shortname}" == "rw" ]; then glibcrequired="2.14" glibcfix="no" @@ -112,11 +115,11 @@ elif [ "${gamename}" == "Squad" ]; then glibcrequired="2.17" glibcfix="no" elif [ "${gamename}" == "Sven Co-op" ]; then - glibcrequired="2.18" + glibcrequired="2.24" glibcfix="no" elif [ "${shortname}" == "sbots" ]; then glibcrequired="2.17" - glibcfix="no" + glibcfix="no" elif [ "${gamename}" == "Team Fortress 2" ]; then glibcrequired="2.15" glibcfix="yes" @@ -206,7 +209,7 @@ elif [ "${engine}" == "source" ]; then glibcfix="no" elif [ "${engine}" == "goldsource" ]; then glibcrequired="2.3.4" - glibcfix="no" + glibcfix="no" else glibcrequired="UNKNOWN" glibcfix="no" diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh index db73b5a85..f9371cf65 100644 --- a/lgsm/functions/info_messages.sh +++ b/lgsm/functions/info_messages.sh @@ -74,6 +74,12 @@ fn_info_message_performance(){ echo -e "${blue}Avg Load:\t${default}${load}" } | column -s $'\t' -t echo -e "" + { + echo -e "${blue}CPU Model:\t${default}${cpumodel}" + echo -e "${blue}CPU Cores:\t${default}${cpucores}" + echo -e "${blue}CPU Frequency:\t${default}${cpufreuency}" + } | column -s $'\t' -t + echo -e "" { echo -e "${blue}Mem:\t${blue}total\tused\tfree\tcached\tavailable${default}" echo -e "${blue}Physical:\t${default}${physmemtotal}\t${physmemused}\t${physmemfree}\t${physmemcached}\t${physmemavailable}${default}" @@ -489,7 +495,7 @@ fn_info_message_ports(){ fi done # engines/games that require editing the parms - local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "Rust" "spark" "source" "starbound" "unreal4" "realvirtuality") + local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "ioquake3" "Rust" "spark" "source" "starbound" "unreal4" "realvirtuality") for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]||[ "${shortname}" == "${port_edit}" ]; then @@ -858,6 +864,15 @@ fn_info_message_risingworld(){ } | column -s $'\t' -t } +fn_info_message_rtcw(){ + echo -e "netstat -atunp | grep iowolfded" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_info_message_rust(){ echo -e "netstat -atunp | grep Rust" echo -e "" @@ -1209,7 +1224,7 @@ fn_info_message_select_engine(){ elif [ "${gamename}" == "Stationeers" ]; then fn_info_message_stationeers elif [ "${shortname}" == "sbots" ]; then - fn_info_message_sbots + fn_info_message_sbots elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_info_message_teamspeak3 elif [ "${gamename}" == "Tower Unite" ]; then @@ -1218,6 +1233,8 @@ fn_info_message_select_engine(){ fn_info_message_mta elif [ "${gamename}" == "Mumble" ]; then fn_info_message_mumble + elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then + fn_info_message_rtcw elif [ "${gamename}" == "Rust" ]; then fn_info_message_rust elif [ "${gamename}" == "Wurm Unlimited" ]; then diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 133365fd8..48285fed4 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -77,6 +77,7 @@ fn_info_parms_projectzomboid(){ fn_info_parms_quakeworld(){ port=${port:-"0"} + queryport=${port} } fn_info_parms_quake2(){ @@ -92,6 +93,11 @@ fn_info_parms_risingworld(){ } +fn_info_parms_rtcw(){ + port=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} +} + fn_info_parms_rust(){ servername=${servername:-"NOT SET"} port=${port:-"0"} @@ -188,6 +194,8 @@ elif [ "${shortname}" == "qw" ]; then fn_info_parms_quakeworld elif [ "${shortname}" == "q2" ]||[ "${shortname}" == "q3" ]; then fn_info_parms_quake2 +elif [ "${shortname}" == "rtcw" ]; then + fn_info_parms_rtcw # Rust elif [ "${shortname}" == "rust" ]; then fn_info_parms_rust diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 37bf42ba3..7659690ca 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -55,7 +55,7 @@ fn_default_config_remote(){ # Copys local default config to server config location fn_default_config_local(){ - echo "copying ${servercfgdefault} config file." + echo "copying ${servercfgdefault} config file." cp -nv "${servercfgfullpathdefault}" "${servercfgfullpath}" sleep 0.5 } @@ -373,6 +373,12 @@ elif [ "${gamename}" == "Insurgency" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "IOSoccer" ]; then + gamedirname="IOSoccer" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Just Cause 2" ]; then gamedirname="JustCause2" array_configs+=( config.lua ) @@ -487,6 +493,12 @@ elif [ "${gamename}" == "Ricochet" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Return to Castle Wolfenstein" ]; then + gamedirname="ReturnToCastleWolfenstein" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Rust" ]; then gamedirname="Rust" fn_check_cfgdir diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index e3930843b..7392a19a3 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -9,46 +9,46 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" fn_install_server_files(){ - if [ "${gamename}" == "Battlefield: 1942" ]; then - remote_fileurl="http://files.linuxgsm.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" - elif [ "${gamename}" == "BrainBread" ]; then + if [ "${shortname}" == "bf1942" ]; then + remote_fileurl="https://files.linuxgsm.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" + elif [ "${shortname}" == "bb" ]; then remote_fileurl="https://files.linuxgsm.com/BrainBread/brainbread-v1.2-linuxserver.tar.bz2"; local_filedir="${tmpdir}"; local_filename="brainbread-v1.2-linuxserver.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="5c729a7e9eecfa81b71a6a1f7267f0fd" - elif [ "${gamename}" == "Call of Duty" ]; then - remote_fileurl="http://files.linuxgsm.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod-lnxded-1.5-large.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" - elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then - remote_fileurl="http://files.linuxgsm.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="coduo-lnxded-1.51b-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" - elif [ "${gamename}" == "Call of Duty 2" ]; then - remote_fileurl="http://files.linuxgsm.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod2-lnxded-1.3-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" - elif [ "${gamename}" == "Call of Duty 4" ]; then - remote_fileurl="http://files.linuxgsm.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" - elif [ "${gamename}" == "Call of Duty: World at War" ]; then - remote_fileurl="http://files.linuxgsm.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="codwaw-lnxded-1.7-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" + elif [ "${shortname}" == "cod" ]; then + remote_fileurl="https://files.linuxgsm.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod-lnxded-1.5-large.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" + elif [ "${shortname}" == "coduo" ]; then + remote_fileurl="https://files.linuxgsm.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="coduo-lnxded-1.51b-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" + elif [ "${shortname}" == "cod2" ]; then + remote_fileurl="https://files.linuxgsm.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod2-lnxded-1.3-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" + elif [ "${shortname}" == "cod4" ]; then + remote_fileurl="https://files.linuxgsm.com/CallOfDuty4/cod4x18_1772_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_1772_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="de29f29d79f9cc24574b838daa501e46" + elif [ "${shortname}" == "codwaw" ]; then + remote_fileurl="https://files.linuxgsm.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="codwaw-lnxded-1.7-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" elif [ "${shortname}" == "etl" ]; then - remote_fileurl="http://files.linuxgsm.com/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" - elif [ "${gamename}" == "GoldenEye: Source" ]; then - remote_fileurl="http://files.linuxgsm.com/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" - elif [ "${gamename}" == "Natural Selection" ]; then - remote_fileurl="http://files.linuxgsm.com/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" - elif [ "${gamename}" == "Quake 2" ]; then - remote_fileurl="http://files.linuxgsm.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" - elif [ "${gamename}" == "Quake 3: Arena" ]; then - remote_fileurl="http://files.linuxgsm.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="quake3-1.32c-x86-full-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" - elif [ "${gamename}" == "QuakeWorld" ]; then - remote_fileurl="http://files.linuxgsm.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.083116.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" - elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - remote_fileurl="http://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" - elif [ "${gamename}" == "Unreal Tournament 99" ]; then - remote_fileurl="http://files.linuxgsm.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" - elif [ "${gamename}" == "Unreal Tournament" ]; then + remote_fileurl="https://files.linuxgsm.com/WolfensteinEnemyTerritory/etlegacy-v2.75-i386-et-260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="etlegacy-v2.75-i386-et-260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="92d7d4c26e0a295daed78cef623eeabb" + elif [ "${shortname}" == "ges" ]; then + remote_fileurl="https://files.linuxgsm.com/GoldenEyeSource/GoldenEye_Source_v5.0.6_full_server.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.6_full_server.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="c45c16293096706e8b5e2cd64a6f2931" + elif [ "${shortname}" == "ns" ]; then + remote_fileurl="https://files.linuxgsm.com/NaturalSelection/ns_dedicated_server_v32.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ns_dedicated_server_v32.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="499cf63324b76925ada6baf5f2eacd67" + elif [ "${shortname}" == "q2" ]; then + remote_fileurl="https://files.linuxgsm.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" + elif [ "${shortname}" == "q3" ]; then + remote_fileurl="https://files.linuxgsm.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="quake3-1.32c-x86-full-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" + elif [ "${shortname}" == "qw" ]; then + remote_fileurl="https://files.linuxgsm.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.083116.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" + elif [ "${shortname}" == "ut2k4" ]; then + remote_fileurl="https://files.linuxgsm.com/UnrealTournament2004/ut2004-server-3369-2-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3369-2-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" + elif [ "${shortname}" == "ut99" ]; then + remote_fileurl="https://files.linuxgsm.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" + elif [ "${shortname}" == "ut" ]; then remote_fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Client-XAN-3395761-Linux.zip"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3395761-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" - elif [ "${gamename}" == "Unreal Tournament 3" ]; then - remote_fileurl="http://files.linuxgsm.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" - elif [ "${gamename}" == "Vampire Slayer" ]; then + elif [ "${shortname}" == "ut3" ]; then + remote_fileurl="https://files.linuxgsm.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" + elif [ "${shortname}" == "vs" ]; then remote_fileurl="https://files.linuxgsm.com/VampireSlayer/vs_l-6.0_full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="vs_l-6.0_full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="38a79e44b98578bbdc5b15818493a066" - elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - remote_fileurl="http://files.linuxgsm.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" - elif [ "${gamename}" == "San Andreas Multiplayer" ]; then - remote_fileurl="http://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" + elif [ "${shortname}" == "wet" ]; then + remote_fileurl="https://files.linuxgsm.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" + elif [ "${shortname}" == "samp" ]; then + remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"; local_filedir="${tmpdir}"; local_filename="samp037svr_R2-1.tar.gz"; chmodx="nochmodx" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" @@ -124,7 +124,7 @@ fn_install_server_files_steamcmd(){ } echo "" -echo "Installing ${gamename} Server" +echo "Installing ${shortname} Server" echo "=================================" sleep 0.5 @@ -132,20 +132,20 @@ if [ -n "${appid}" ]; then fn_install_server_files_steamcmd fi -if [ "${gamename}" == "TeamSpeak 3" ]; then +if [ "${shortname}" == "ts3" ]; then update_ts3.sh -elif [ "${gamename}" == "Minecraft" ]; then +elif [ "${shortname}" == "mc" ]; then install_minecraft_eula.sh update_minecraft.sh -elif [ "${gamename}" == "Mumble" ]; then +elif [ "${shortname}" == "mumble" ]; then update_mumble.sh -elif [ "${gamename}" == "Multi Theft Auto" ]; then +elif [ "${shortname}" == "mta" ]; then update_mta.sh -elif [ "${gamename}" == "Factorio" ]; then +elif [ "${shortname}" == "fctr" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]||[ "${gamename}" == "Base Defense" ]||[ "${gamename}" == "BrainBread" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "vs" ]; then - if [ "${gamename}" == "Unreal Tournament" ]; then +elif [ -z "${appid}" ]||[ "${shortname}" == "ges" ]||[ "${shortname}" == "bd" ]||[ "${shortname}" == "bb" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "vs" ]; then + if [ "${shortname}" == "Unreal Tournament" ]; then install_unreal_tournament_eula.sh fi fn_install_server_files diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh index 8fa8d1b45..affef935c 100644 --- a/lgsm/functions/query_gamedig.sh +++ b/lgsm/functions/query_gamedig.sh @@ -30,6 +30,14 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi done + local engine_query_array=( quake ) + for engine_query in "${engine_query_array[@]}" + do + if [ "${engine_query}" == "${engine}" ]; then + gamedigengine="protocol-quake1" + fi + done + local engine_query_array=( idtech2 iw2.0 ) for engine_query in "${engine_query_array[@]}" do @@ -38,7 +46,7 @@ if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; fi done - local engine_query_array=( idtech3 quake iw3.0 ) + local engine_query_array=( idtech3 iw3.0 ) for engine_query in "${engine_query_array[@]}" do if [ "${engine_query}" == "${engine}" ]; then diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py index 3f8ec590b..e5dd40463 100644 --- a/lgsm/functions/query_gsquery.py +++ b/lgsm/functions/query_gsquery.py @@ -18,8 +18,8 @@ class gsquery: self.default_buffer_length = 1024 # sourcequery=[ 'avalanche3.0','madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d', 'unreal4', 'wurm' ] - idtech3query=['idtech3','quake','iw3.0'] - idtech2query=['idtech2','iw2.0'] + idtech3query=['idtech3','iw3.0'] + idtech2query=['idtech2','quake','iw2.0'] minecraftquery=['minecraft','lwjgl2'] if self.option.engine in sourcequery: self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' diff --git a/linuxgsm.sh b/linuxgsm.sh index e7e603f42..31b1ccd37 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190106" +version="190217" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"