From eb949bf0cb2b2190bc171334765bc75fb113ef10 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 30 Jun 2016 21:39:48 +0100 Subject: [PATCH] Update function being improved. --- lgsm/functions/command_update.sh | 16 +++ lgsm/functions/core_getopt.sh | 4 +- lgsm/functions/update_check.sh | 1 + lgsm/functions/update_steamcmd.sh | 208 ++++++++++++++++++++++++++++++ lgsm/functions/update_ts3.sh | 148 +++++++++++++++++++++ 5 files changed, 376 insertions(+), 1 deletion(-) create mode 100644 lgsm/functions/update_steamcmd.sh create mode 100644 lgsm/functions/update_ts3.sh diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index e69de29bb..965fb934e 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LGSM commanf_update.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +lgsm_version="210516" + +# Description:Hangles updating of servers. + +check.sh + +fn_print_dots "Checking for update" +if [ "${gamename}" == "Teamspeak 3" ]; then + update_ts3.sh +elif [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then + update_steamcmd.sh +fi \ No newline at end of file diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index eb0bd3c58..42dccd373 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -6,6 +6,8 @@ lgsm_version="210516" # Description: getopt arguments. +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + fn_getopt_generic(){ case "$getopt" in st|start) @@ -18,7 +20,7 @@ case "$getopt" in update_check.sh;; fu|force-update|update-restart) forceupdate=1; - update_check.sh;; + command_update.sh;; uf|update-functions) command_update_functions.sh;; v|validate) diff --git a/lgsm/functions/update_check.sh b/lgsm/functions/update_check.sh index 716889b43..49af21652 100644 --- a/lgsm/functions/update_check.sh +++ b/lgsm/functions/update_check.sh @@ -330,6 +330,7 @@ elif [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then # Goldsource servers bypass checks as fn_steamcmdcheck does not work for appid 90 servers. # forceupdate bypasses checks if [ "${status}" != "0" ]; then + exitbypass=1 command_stop.sh update_dl.sh command_start.sh diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh new file mode 100644 index 000000000..08bf9cd32 --- /dev/null +++ b/lgsm/functions/update_steamcmd.sh @@ -0,0 +1,208 @@ +#!/bin/bash +# LGSM commanf_update.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +lgsm_version="210516" + +# Description:Handles updating using steamCMD. + +fn_steamcmd_dl(){ + cd "${rootdir}" + cd "steamcmd" + + # Detects if unbuffer command is available. + if [ $(command -v stdbuf) ]; then + unbuffer="stdbuf -i0 -o0 -e0" + fi + + if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit | tee -a "${scriptlog}" + else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit | tee -a "${scriptlog}" + fi + + fix.sh +} + +fn_appmanifest_info(){ + appmanifestfile=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf") + appmanifestfilewc=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf"|wc -l) +} + +fn_appmanifest_check(){ + fn_appmanifest_info + # Multiple or no matching appmanifest files may sometimes be present. + # This error is corrected if required. + if [ "${appmanifestfilewc}" -ge "2" ]; then + sleep 1 + fn_print_warn "Multiple appmanifest_${appid}.acf files found" + fn_script_log_warn "Multiple appmanifest_${appid}.acf files found" + sleep 2 + fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" + sleep 1 + for appfile in ${appmanifestfile}; do + rm "${appfile}" + done + sleep 1 + appmanifestfilewc1="${appmanifestfilewc}" + fn_appmanifest_info + if [ "${appmanifestfilewc}" -ge "2" ]; then + fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + sleep 1 + echo " * Check user permissions" + for appfile in ${appmanifestfile}; do + echo " ${appfile}" + done + core_exit.sh + else + fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + sleep 1 + fn_print_warn_nl "Forcing update to correct issue" + fn_script_log_warn "Forcing update to correct issue" + sleep 1 + update_dl.sh + update_check.sh + fi + elif [ "${appmanifestfilewc}" -eq "0" ]; then + if [ "${forceupdate}" == "1" ]; then + fn_print_fail "Still no appmanifest_${appid}.acf found: Unable to update" + fn_script_log "Warning! Still no appmanifest_${appid}.acf found: Unable to update" + exit 1 + fi + forceupdate=1 + fn_print_warn "No appmanifest_${appid}.acf found" + fn_script_log "Warning! No appmanifest_${appid}.acf found" + sleep 2 + fn_print_info_nl "Forcing update to correct issue" + fn_script_log "Forcing update to correct issue" + sleep 1 + update_dl.sh + update_check.sh + fi +} + +fn_logupdaterequest(){ + # Checks for server update requests from server logs. + fn_print_dots "Checking for update: Server logs" + fn_script_log "Checking for update: Server logs" + sleep 1 + requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") + if [ "${requestrestart}" -ge "1" ]; then + fn_print_ok_nl "Checking for update: Server logs: Update requested" + sleep 1 + echo "" + echo -ne "Applying update.\r" + sleep 1 + echo -ne "Applying update..\r" + sleep 1 + echo -ne "Applying update...\r" + sleep 1 + echo -ne "\n" + + unset updateonstart + check_status.sh + if [ "${status}" != "0" ]; then + command_stop.sh + update_dl.sh + command_start.sh + else + update_dl.sh + fi + alert="update" + alert.sh + else + fn_print_ok "Checking for update: Server logs: No update requested" + sleep 1 + fi +} + +fn_steamcmdcheck(){ + fn_appmanifest_check + # Checks for server update from SteamCMD + fn_print_dots "Checking for update: SteamCMD" + fn_script_log_info "Checking for update: SteamCMD" + sleep 1 + + # Gets currentbuild + currentbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + + # Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD + cd "${rootdir}/steamcmd" + if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then + rm -f "${HOME}/Steam/appcache/appinfo.vdf" + fi + + # Set branch for updateinfo + IFS=' ' read -a branchsplits <<< "${branch}" + if [ "${#branchsplits[@]}" -gt 1 ]; then + branchname="${branchsplits[1]}" + else + branchname="public" + fi + + # Gets availablebuild info + availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"${branchname}\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: SteamCMD" + sleep 1 + fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" + fn_script_log_fatal "Checking for update: SteamCMD: Not returning version info" + core_exit.sh + else + fn_print_ok "Checking for update: SteamCMD" + fn_script_log_pass "Checking for update: SteamCMD" + sleep 1 + fi + + if [ "${currentbuild}" != "${availablebuild}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: \e[0;31m${currentbuild}\e[0;39m" + echo -e " Available build: \e[0;32m${availablebuild}\e[0;39m" + echo -e "" + echo -e " https://steamdb.info/app/${appid}/" + sleep 1 + echo "" + echo -en "Applying update.\r" + sleep 1 + echo -en "Applying update..\r" + sleep 1 + echo -en "Applying update...\r" + sleep 1 + echo -en "\n" + fn_script_log_info "Update available" + fn_script_log_info "Current build: ${currentbuild}" + fn_script_log_info "Available build: ${availablebuild}" + fn_script_log_info "${currentbuild} > ${availablebuild}" + + unset updateonstart + check_status.sh + if [ "${status}" != "0" ]; then + exitbypass=1 + command_stop.sh + fn_steamcmd_dl + exitbypass=1 + command_start.sh + else + fn_steamcmd_dl + fi + alert="update" + alert.sh + else + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" + echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" + echo -e " https://steamdb.info/app/${appid}/" + echo -e "" + fn_print_ok_nl "No update available" + fn_script_log_info "Current build: ${currentbuild}" + fn_script_log_info "Available build: ${availablebuild}" + fi +} + + +fn_steamcmdcheck \ No newline at end of file diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh new file mode 100644 index 000000000..6d609e53d --- /dev/null +++ b/lgsm/functions/update_ts3.sh @@ -0,0 +1,148 @@ +#!/bin/bash +# LGSM commanf_update.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +lgsm_version="210516" + +# Description:Handles updating of teamspeak 3 servers. + +fn_update_ts3_dl(){ + fn_fetch_file "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" "${lgsmdir}/tmp" "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" + fn_dl_extract "${lgsmdir}/tmp" "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" "${filesdir}" +} + + +fn_update_ts3_check(){ + # Checks for server update from teamspeak.com using a mirror dl.4players.de. + fn_print_dots "Checking for update: teamspeak.com" + fn_script_log_info "Checking for update: teamspeak.com" + sleep 1 + + # Gets currentbuild info + # Checks currentbuild info is available, if fails a server restart will be forced to generate logs. + if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then + fn_print_fail "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail_nl "Checking for update: teamspeak.com: No logs with server version found" + fn_script_log_warn "Checking for update: teamspeak.com: No logs with server version found" + sleep 2 + fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" + fn_script_log_warn "Checking for update: teamspeak.com: Forcing server restart" + sleep 2 + exitbypass=1 + command_stop.sh + exitbypass=1 + command_start.sh + sleep 1 + # Check again and exit on failure. + if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then + fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" + fn_script_log_fatal "Checking for update: teamspeak.com: Still No logs with server version found" + core_exit.sh + 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}') + + # Gets the teamspeak server architecture. + info_distro.sh + if [ "${arch}" == "x86_64" ]; then + ts3arch="amd64" + elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then + ts3arch="x86" + else + echo "" + fn_print_failure "unknown or unsupported architecture: ${arch}" + fn_script_log_fatal "unknown or unsupported architecture: ${arch}" + core_exit.sh + fi + + # Gets availablebuild info. + + # Grabs all version numbers but not in correct order. + wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp + + # Sort version numbers + cat .ts3_version_numbers_unsorted.tmp | sort -r --version-sort -o .ts3_version_numbers_sorted.tmp + + # Finds directory with most recent server version. + while read ts3_version_number; do + wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" + if [ $? -eq 0 ]; then + availablebuild="${ts3_version_number}" + # Break while-loop, if the latest release could be found. + break + fi + done < .ts3_version_numbers_sorted.tmp + + # Tidy up + rm -f ".ts3_version_numbers_unsorted.tmp" + rm -f ".ts3_version_numbers_sorted.tmp" + + # Checks availablebuild info is available + if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail "Checking for update: teamspeak.com: Not returning version info" + fn_script_log_fatal "Failure! Checking for update: teamspeak.com: Not returning version info" + core_exit.sh + else + fn_print_ok "Checking for update: teamspeak.com" + fn_script_log_pass "Checking for update: teamspeak.com" + sleep 1 + fi + + # Removes dots so if can compare version numbers + currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') + availablebuilddigit=$(echo "${availablebuild}"|tr -cd '[:digit:]') + + if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: \e[0;31m${currentbuild} ${architecture}\e[0;39m" + echo -e " Available build: \e[0;32m${availablebuild} ${architecture}\e[0;39m" + echo -e "" + sleep 1 + echo "" + echo -en "Applying update.\r" + sleep 1 + echo -en "Applying update..\r" + sleep 1 + echo -en "Applying update...\r" + sleep 1 + echo -en "\n" + fn_script_log "Update available" + fn_script_log "Current build: ${currentbuild}" + fn_script_log "Available build: ${availablebuild}" + fn_script_log "${currentbuild} > ${availablebuild}" + + unset updateonstart + + check_status.sh + if [ "${status}" == "0" ]; then + fn_update_ts3_dl + exitbypass=1 + command_start.sh + exitbypass=1 + command_stop.sh + else + exitbypass=1 + command_stop.sh + fn_update_ts3_dl + exitbypass=1 + command_start.sh + fi + alert="update" + alert.sh + else + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" + echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" + echo -e "" + fn_print_ok_nl "No update available" + fn_script_log_info "Current build: ${currentbuild}" + fn_script_log_info "Available build: ${availablebuild}" + fi +}