lgsm local mirror
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

216 lines
7.3 KiB

#!/bin/bash
# LinuxGSM update_minecraft.sh function
# Author: Daniel Gibbs
# Website: https://linuxgsm.com
# Description: Handles updating of Minecraft servers.
functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
fn_update_minecraft_dl(){
if [ "${branch}" == "release" ]; then
latestmcreleaselink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release as $latest | .versions[] | select(.id == $latest) | .url')
else
latestmcreleaselink=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].url')
fi
latestmcbuildurl=$(curl -s "${latestmcreleaselink}" | jq -r '.downloads.server.url')
fn_fetch_file "${latestmcbuildurl}" "" "" "" "${tmpdir}" "minecraft_server.${remotebuild}.jar" "" "norun" "noforce" "nomd5"
echo -e "copying to ${serverfiles}...\c"
cp "${tmpdir}/minecraft_server.${remotebuild}.jar" "${serverfiles}/minecraft_server.jar"
local exitcode=$?
if [ "${exitcode}" == "0" ]; then
fn_print_ok_eol_nl
fn_script_log_pass "Copying to ${serverfiles}"
chmod u+x "${serverfiles}/minecraft_server.jar"
fn_clear_tmp
else
fn_print_fail_eol_nl
fn_script_log_fatal "Copying to ${serverfiles}"
core_exit.sh
fi
}
fn_update_minecraft_localbuild(){
# Gets local build info.
fn_print_dots "Checking local build: ${remotelocation}"
# Uses log file to gather info.
# Gives time for log file to generate.
if [ ! -f "${serverfiles}/logs/latest.log" ]; then
fn_print_error "Checking local build: ${remotelocation}"
fn_print_error_nl "Checking local build: ${remotelocation}: no log files containing version info"
fn_print_info_nl "Checking local build: ${remotelocation}: forcing server restart"
fn_script_log_error "No log files containing version info"
fn_script_log_info "Forcing server restart"
exitbypass=1
command_stop.sh
exitbypass=1
command_start.sh
totalseconds=0
# Check again, allow time to generate logs.
while [ ! -f "${serverfiles}/logs/latest.log" ]; do
sleep 1
fn_print_info "Checking local build: ${remotelocation}: waiting for log file: ${totalseconds}"
if [ -v "${loopignore}" ]; then
loopignore=1
fn_script_log_info "Waiting for log file to generate"
fi
if [ "${totalseconds}" -gt "120" ]; then
localbuild="0"
fn_print_error "Checking local build: ${remotelocation}: waiting for log file: missing log file"
fn_script_log_error "Missing log file"
fn_script_log_error "Set localbuild to 0"
fi
totalseconds=$((totalseconds + 1))
done
fi
if [ -z "${localbuild}" ]; then
localbuild=$(grep version "${serverfiles}/logs/latest.log" | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}(-pre[0-9]+)?|([0-9]+w[0-9]+[a-z])')
fi
if [ -z "${localbuild}" ]; then
# Gives time for var to generate.
totalseconds=0
for seconds in {1..120}; do
fn_print_info "Checking local build: ${remotelocation}: waiting for local build: ${totalseconds}"
if [ -z "${loopignore}" ]; then
loopignore=1
fn_script_log_info "Waiting for local build to generate"
fi
localbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | grep -Eo '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}(-pre[0-9]+)?|([0-9]+w[0-9]+[a-z])')
if [ "${localbuild}" ]||[ "${seconds}" == "120" ]; then
break
fi
sleep 1
totalseconds=$((totalseconds + 1))
done
fi
if [ -z "${localbuild}" ]; then
localbuild="0"
fn_print_error "Checking local build: ${remotelocation}: waiting for local build: missing local build info"
fn_script_log_error "Missing local build info"
fn_script_log_error "Set localbuild to 0"
else
fn_print_ok "Checking local build: ${remotelocation}"
fn_script_log_pass "Checking local build"
fi
}
fn_update_minecraft_remotebuild(){
# Gets remote build info.
if [ "${branch}" == "release" ]; then
remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.latest.release')
else
remotebuild=$(curl -s "https://launchermeta.${remotelocation}/mc/game/version_manifest.json" | jq -r '.versions[0].id')
fi
if [ "${installer}" != "1" ]; then
fn_print_dots "Checking remote build: ${remotelocation}"
# Checks if remotebuild variable has been set.
if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then
fn_print_fail "Checking remote build: ${remotelocation}"
fn_script_log_fatal "Checking remote build"
core_exit.sh
else
fn_print_ok "Checking remote build: ${remotelocation}"
fn_script_log_pass "Checking remote build"
fi
else
# Checks if remotebuild variable has been set.
if [ -z "${remotebuild}" ]||[ "${remotebuild}" == "null" ]; then
fn_print_failure "Unable to get remote build"
fn_script_log_fatal "Unable to get remote build"
core_exit.sh
fi
fi
}
fn_update_minecraft_compare(){
# Removes dots so if statement can compare version numbers.
fn_print_dots "Checking for update: ${remotelocation}"
if [ "${localbuild}" != "${remotebuild}" ]||[ "${forceupdate}" == "1" ]; then
fn_print_ok_nl "Checking for update: ${remotelocation}"
echo -en "\n"
echo -e "Update available"
echo -e "* Local build: ${red}${localbuild}${default}"
echo -e "* Remote build: ${green}${remotebuild}${default}"
if [ -n "${branch}" ]; then
echo -e "* Branch: ${branch}"
fi
fn_script_log_info "Update available"
fn_script_log_info "Local build: ${localbuild}"
fn_script_log_info "Remote build: ${remotebuild}"
fn_script_log_info "${localbuild} > ${remotebuild}"
unset updateonstart
check_status.sh
# If server stopped.
if [ "${status}" == "0" ]; then
exitbypass=1
fn_update_minecraft_dl
exitbypass=1
command_start.sh
exitbypass=1
command_stop.sh
# If server started.
else
fn_stop_warning
exitbypass=1
command_stop.sh
exitbypass=1
fn_update_minecraft_dl
exitbypass=1
command_start.sh
fi
date +%s > "${lockdir}/lastupdate.lock"
alert="update"
alert.sh
else
fn_print_ok_nl "Checking for update: ${remotelocation}"
echo -en "\n"
echo -e "No update available"
echo -e "* Local build: ${green}${localbuild}${default}"
echo -e "* Remote build: ${green}${remotebuild}${default}"
if [ -n "${branch}" ]; then
echo -e "* Branch: ${branch}"
fi
fn_script_log_info "No update available"
fn_script_log_info "Local build: ${localbuild}"
fn_script_log_info "Remote build: ${remotebuild}"
if [ -n "${branch}" ]; then
fn_script_log_info "Branch: ${branch}"
fi
fi
}
fn_stop_warning(){
fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update"
fn_script_log_warn "Updating server: SteamCMD: ${selfname} will be stopped during update"
totalseconds=3
for seconds in {3..1}; do
fn_print_warn "Updating server: SteamCMD: ${selfname} will be stopped during update: ${totalseconds}"
totalseconds=$((totalseconds - 1))
sleep 1
if [ "${seconds}" == "0" ]; then
break
fi
done
fn_print_warn_nl "Updating server: SteamCMD: ${selfname} will be stopped during update"
}
# The location where the builds are checked and downloaded.
remotelocation="mojang.com"
if [ "${installer}" == "1" ]; then
fn_update_minecraft_remotebuild
fn_update_minecraft_dl
else
fn_print_dots "Checking for update: ${remotelocation}"
fn_script_log_info "Checking for update: ${remotelocation}"
fn_update_minecraft_localbuild
fn_update_minecraft_remotebuild
fn_update_minecraft_compare
fi