From c05d51fec327b9644186a175a2256f23a018f96d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 7 Oct 2018 22:18:16 +0100 Subject: [PATCH] Dependency checking can run as root (#2032) * Only dependency checks will run as root user when starting the installer e.g `./csgoserver install` * If running dep check as root LinuxGSM will remove any files in `lgsm` that belong to root * Master server check will not run if jq missing --- lgsm/functions/check.sh | 27 +++++--- lgsm/functions/check_deps.sh | 25 +++++--- lgsm/functions/check_permissions.sh | 10 +-- lgsm/functions/check_root.sh | 10 +-- lgsm/functions/command_install.sh | 68 ++++++++++---------- lgsm/functions/core_exit.sh | 6 ++ lgsm/functions/info_distro.sh | 16 ++--- linuxgsm.sh | 98 +++++++++++++++-------------- 8 files changed, 150 insertions(+), 110 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 5814a823d..fe63be7cf 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -10,11 +10,16 @@ local commandname="CHECK" # Every command that requires checks just references check.sh # check.sh selects which checks to run by using arrays -check_root.sh +if [ "${userinput}" != "install" ]&&[ "${userinput}" != "auto-install" ]&&[ "${userinput}" != "i" ]&&[ "${userinput}" != "ai" ]; then + check_root.sh +fi + check_tmuxception.sh -if [ "${function_selfname}" != "command_monitor.sh" ]; then - check_permissions.sh +if [ "$(whoami)" != "root" ]; then + if [ "${function_selfname}" != "command_monitor.sh" ]; then + check_permissions.sh + fi fi if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" != "command_update_functions.sh" ]&&[ "${function_selfname}" != "command_update_linuxgsm.sh" ]&&[ "${function_selfname}" != "command_details.sh" ]&&[ "${function_selfname}" != "command_postdetails.sh" ]; then @@ -29,13 +34,15 @@ do fi done -local allowed_commands_array=( command_debug.sh command_start.sh command_install.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_glibc.sh - fi -done +if [ "$(whoami)" != "root" ]; then + local allowed_commands_array=( command_debug.sh command_start.sh command_install.sh ) + for allowed_command in "${allowed_commands_array[@]}" + do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_glibc.sh + fi + done +fi local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_fastdl.sh command_mods_install.sh command_mods_remove.sh command_mods_update.sh command_monitor.sh command_postdetails.sh command_restart.sh command_start.sh command_stop.sh command_test_alert.sh command_ts3_server_pass.sh command_update.sh command_update_functions.sh command_validate.sh command_wipe.sh command_unreal2_maps.sh command_ut99maps.sh) for allowed_command in "${allowed_commands_array[@]}" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 5db883072..e50ed44d8 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -179,10 +179,9 @@ fn_deps_email(){ fn_found_missing_deps(){ if [ "${#array_deps_missing[@]}" != "0" ]; then - fn_print_dots "Checking dependencies" - sleep 0.5 - fn_print_error_nl "Checking dependencies: missing: ${red}${array_deps_missing[@]}${default}" - fn_script_log_error "Checking dependencies: missing: ${array_deps_missing[@]}" + + fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[@]}${default}" + fn_script_log_warn "Missing dependencies: ${array_deps_missing[@]}" sleep 0.5 if [ -n "${monostatus}" ]; then fn_install_mono_repo @@ -257,6 +256,9 @@ fn_found_missing_deps(){ if [ "${function_selfname}" == "command_install.sh" ]; then sleep 5 fi + else + fn_print_information_nl "Required dependencies already installed" + fn_script_log_info "Required dependencies already installed" fi } @@ -482,9 +484,18 @@ fn_deps_build_redhat(){ } if [ "${function_selfname}" == "command_install.sh" ]; then - echo "" - echo "Checking Dependencies" - echo "=================================" + if [ "$(whoami)" == "root" ]; then + echo "" + echo "Checking Dependencies as root" + echo "=================================" + fn_print_information_nl "Checking any missing dependencies for ${gamename} server only." + fn_print_information_nl "This will NOT install a ${gamename} server." + sleep 2 + else + echo "" + echo "Checking Dependencies" + echo "=================================" + fi fi # Filter checking in to Debian or Red Hat Based diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 7498925e1..0cc206b19 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -230,8 +230,10 @@ fn_sys_perm_error_process(){ # Run perm error detect & fix/alert functions on /sys directories ## Run checks -fn_check_ownership -fn_check_permissions -if [ "${function_selfname}" == "command_start.sh" ]; then - fn_sys_perm_error_process +if [ "$(whoami)" != "root" ]; then + fn_check_ownership + fn_check_permissions + if [ "${function_selfname}" == "command_start.sh" ]; then + fn_sys_perm_error_process + fi fi diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index a58782515..b5d20cf24 100644 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -8,9 +8,11 @@ local commandname="CHECK" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" if [ "$(whoami)" = "root" ]; then - fn_print_fail_nl "Do NOT run this script as root!" - if [ -d "${lgsmlogdir}" ]; then - fn_script_log_fatal "${selfname} attempted to run as root." + if [ "${function_selfname}" != "command_install.sh" ]; then + fn_print_fail_nl "Do NOT run this script as root!" + if [ -d "${lgsmlogdir}" ]; then + fn_script_log_fatal "${selfname} attempted to run as root." + fi + core_exit.sh fi - core_exit.sh fi diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 275055a5b..ba4059649 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -10,37 +10,41 @@ local commandaction="Install" local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")" check.sh -install_header.sh -install_server_dir.sh -install_logs.sh -check_deps.sh -installflag=1 -# Download and install -if [ "${gamename}" == "Unreal Tournament 2004" ]; then - install_server_files.sh - install_ut2k4_key.sh -elif [ -z "${appid}" ]; then - installer=1 - install_server_files.sh -elif [ -n "${appid}" ]; then - install_steamcmd.sh - install_server_files.sh -fi +if [ "$(whoami)" = "root" ]; then + check_deps.sh +else + install_header.sh + install_server_dir.sh + install_logs.sh + check_deps.sh + installflag=1 + # Download and install + if [ "${gamename}" == "Unreal Tournament 2004" ]; then + install_server_files.sh + install_ut2k4_key.sh + elif [ -z "${appid}" ]; then + installer=1 + install_server_files.sh + elif [ -n "${appid}" ]; then + install_steamcmd.sh + install_server_files.sh + fi -# Configuration -install_config.sh -if [ "${gamename}" == "BrainBread 2" ]||[ "${gamename}" == "Black Mesa: Deathmatch" ]||[ "${gamename}" == "Counter-Strike: Global Offensive" ]||[ "${gamename}" == "Empires Mod" ]||[ "${gamename}" == "Garry’s Mod" ]||[ "${gamename}" == "No more Room in Hell" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "Tower Unite" ]; then - install_gslt.sh -elif [ "${gamename}" == "Don't Starve Together" ]; then - install_dst_token.sh -elif [ "${gamename}" == "Squad" ]; then - install_squad_license.sh -elif [ "${gamename}" == "TeamSpeak 3" ]; then - install_ts3db.sh -elif [ "${gamename}" == "Multi Theft Auto" ]; then - command_install_resources_mta.sh -fi + # Configuration + install_config.sh + if [ "${gamename}" == "BrainBread 2" ]||[ "${gamename}" == "Black Mesa: Deathmatch" ]||[ "${gamename}" == "Counter-Strike: Global Offensive" ]||[ "${gamename}" == "Empires Mod" ]||[ "${gamename}" == "Garry’s Mod" ]||[ "${gamename}" == "No more Room in Hell" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "Tower Unite" ]; then + install_gslt.sh + elif [ "${gamename}" == "Don't Starve Together" ]; then + install_dst_token.sh + elif [ "${gamename}" == "Squad" ]; then + install_squad_license.sh + elif [ "${gamename}" == "TeamSpeak 3" ]; then + install_ts3db.sh + elif [ "${gamename}" == "Multi Theft Auto" ]; then + command_install_resources_mta.sh + fi -fix.sh -install_complete.sh -core_exit.sh + fix.sh + install_complete.sh + core_exit.sh +fi \ No newline at end of file diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh index bc6c2331d..91142aaa8 100644 --- a/lgsm/functions/core_exit.sh +++ b/lgsm/functions/core_exit.sh @@ -14,6 +14,12 @@ fn_exit_dev_debug(){ fi } +# If running dependency check as root will remove any files that belong to root user. +if [ "$(whoami)" == "root" ]; then + find "${lgsmdir}"/ -group root -prune -exec rm -rf {} + > /dev/null 2>&1 + find "${logdir}"/ -group root -prune -exec rm -rf {} + > /dev/null 2>&1 +fi + if [ -n "${exitbypass}" ]; then unset exitbypass elif [ -n "${exitcode}" ]&&[ "${exitcode}" != "0" ]; then diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 71e3aa33c..f67070146 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -174,13 +174,15 @@ if [ -z "${extip}" ]; then fi # Steam Master Server - checks if detected by master server -if [ "${ip}" ] && [ "${port}" ]; then - if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "ql" ]; then - masterserver=$(${curlpath} -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) - if [ "${steammaster}" == "1" ]; then - masterserver="true" - else - masterserver="false" +if [ ! "$(command -v jq 2>/dev/null)" ]; then + if [ "${ip}" ] && [ "${port}" ]; then + if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]||[ "${shortname}" == "jc2" ]||[ "${shortname}" == "ql" ]; then + masterserver=$(${curlpath} -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l) + if [ "${steammaster}" == "1" ]; then + masterserver="true" + else + masterserver="false" + fi fi fi fi \ No newline at end of file diff --git a/linuxgsm.sh b/linuxgsm.sh index 004f34677..178f00310 100755 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -20,7 +20,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="180908" +version="181007" shortname="core" gameservername="core" rootdir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" @@ -38,6 +38,7 @@ tmpdir="${lgsmdir}/tmp" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" +userinput="${1}" ## GitHub Branch Select # Allows for the use of different function files @@ -254,9 +255,14 @@ fn_install_file(){ exit } -# Prevent from running this script as root. +# Prevent LinuxGSM from running as root. Except if doing a dependency install. if [ "$(whoami)" == "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then + if [ "${userinput}" == "install" ]||[ "${userinput}" == "auto-install" ]||[ "${userinput}" == "i" ]||[ "${userinput}" == "ai" ]; then + if [ "${shortname}" == "core" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + fi + elif [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then echo "[ FAIL ] Do NOT run this script as root!" exit 1 else @@ -267,7 +273,6 @@ fi # LinuxGSM installer mode if [ "${shortname}" == "core" ]; then - userinput=$1 datadir="${tmpdir}/data" serverlist="${datadir}/serverlist.csv" @@ -310,29 +315,16 @@ if [ "${shortname}" == "core" ]; then # LinuxGSM Server Mode else core_functions.sh - - # Load LinuxGSM configs - # These are required to get all the default variables for the specific server. - # Load the default config. If missing download it. If changed reload it. - if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then - mkdir -p "${configdirdefault}/config-lgsm/${gameservername}" - fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nomd5" - fi - if [ ! -f "${configdirserver}/_default.cfg" ]; then - mkdir -p "${configdirserver}" - echo -ne " copying _default.cfg...\c" - cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - echo -e "FAIL" - exit 1 - else - echo -e "OK" + if [ "${shortname}" != "core-dep" ]; then + # Load LinuxGSM configs + # These are required to get all the default variables for the specific server. + # Load the default config. If missing download it. If changed reload it. + if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then + mkdir -p "${configdirdefault}/config-lgsm/${gameservername}" + fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nomd5" fi - else - function_file_diff=$(diff -q "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg") - if [ "${function_file_diff}" != "" ]; then - fn_print_warn_nl "_default.cfg has been altered. reloading config." + if [ ! -f "${configdirserver}/_default.cfg" ]; then + mkdir -p "${configdirserver}" echo -ne " copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? @@ -342,27 +334,41 @@ else else echo -e "OK" fi + else + function_file_diff=$(diff -q "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg") + if [ "${function_file_diff}" != "" ]; then + fn_print_warn_nl "_default.cfg has been altered. reloading config." + echo -ne " copying _default.cfg...\c" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "FAIL" + exit 1 + else + echo -e "OK" + fi + fi + fi + source "${configdirserver}/_default.cfg" + # Load the common.cfg config. If missing download it + if [ ! -f "${configdirserver}/common.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/common.cfg" + else + source "${configdirserver}/common.cfg" + fi + # Load the instance.cfg config. If missing download it + if [ ! -f "${configdirserver}/${servicename}.cfg" ]; then + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + source "${configdirserver}/${servicename}.cfg" + else + source "${configdirserver}/${servicename}.cfg" fi - fi - source "${configdirserver}/_default.cfg" - # Load the common.cfg config. If missing download it - if [ ! -f "${configdirserver}/common.cfg" ]; then - fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/common.cfg" - else - source "${configdirserver}/common.cfg" - fi - # Load the instance.cfg config. If missing download it - if [ ! -f "${configdirserver}/${servicename}.cfg" ]; then - fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" - source "${configdirserver}/${servicename}.cfg" - else - source "${configdirserver}/${servicename}.cfg" - fi - # Load the linuxgsm.sh in to tmpdir. If missing download it - if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + # Load the linuxgsm.sh in to tmpdir. If missing download it + if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" + fi fi # Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off fn_ansi_loader @@ -371,4 +377,4 @@ else getopt=$1 core_getopt.sh fi -fi +fi \ No newline at end of file