dayzdockerserver/files/dayzserver
Daniel Ceregatti e7ba76acf7 Added Steam login step, which is done interactively.
Factor out all the unused stuff from dayzserver. Rework the logic.
Started support for workshop items.
Updated docs.
2022-03-26 03:16:04 -07:00

192 lines
6.5 KiB
Bash
Executable file

#!/usr/bin/env bash
appid=1042420
dayz_id=221100
if [ "${ansi}" != "off" ]; then
# echo colors
default="\e[0m"
red="\e[31m"
green="\e[32m"
yellow="\e[33m"
lightyellow="\e[93m"
blue="\e[34m"
lightblue="\e[94m"
magenta="\e[35m"
cyan="\e[36m"
# carriage return & erase to end of line
creeol="\r\033[K"
fi
fn_loadconfig_dayz(){
source /files/default.cfg
# Handle adding the server cfg file
if [ ! -f ${HOME}/serverfiles/serverDZ.cfg ]
then
cp /files/serverDZ.cfg "${HOME}/serverfiles/serverDZ.cfg"
fi
}
fn_create_beconfig(){
# Set a random RCON password, unless one's set in the environment
if [ -d "${HOME}/serverfiles/battleye" ] && [ ! -f "${HOME}/serverfiles/battleye/beserver_x64.cfg" ]
then
echo -n "Creating Battle Eye RCON file "
cp /files/beserver_x64.cfg "${HOME}/serverfiles/battleye/beserver_x64.cfg"
if grep RCON_PASSWORD /files/beserver_x64.cfg
then
RCON_PASSWORD=$(< /dev/urandom tr -dc 'A-Za-z0-9' | head -c10)
echo -e "using random RCON password ${yellow}${RCON_PASSWORD}"
sed -i "${HOME}/serverfiles/battleye/beserver_x64.cfg" -e "s/RCON_PASSWORD/${RCON_PASSWORD}/"
else
echo "using the RCON_PASSWORD already set in files/beserver_x64.cfg."
fi
fi
}
fn_start_dayz(){
fn_loadconfig_dayz
fn_workshop_mods
printf "[ ${green}DayZ${default} ] Starting server...\n"
cd ${HOME}/serverfiles
./DayZServer $dayzparameter "$workshop" || (
echo
echo -e "${yellow}========================================== error.log =========================================="
find /home/user -name error.log -exec cat {} \; -exec rm -f {} \;
echo
echo -e "${yellow}========================================== script*.log ========================================"
find /home/user -name "script*.log" -exec cat {} \; -exec rm -f {} \;
echo
echo -e "${yellow}========================================== *.RPT =============================================="
find /home/user -name "*.RPT" -exec cat {} \; -exec rm -f {} \;
echo
echo -e "${yellow}========================================== End crash log ======================================"
)
}
fn_steamlogin_dayz(){
source /files/steamlogin
}
fn_install_steamcmd(){
if [ ! -f "${HOME}/steamcmd/steamcmd.sh" ]; then
mkdir ${HOME}/steamcmd &> /dev/null
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxf - -C steamcmd
printf "[ ${yellow}STEAM${default} ] Steamcmd installed\n"
else
printf "[ ${lightblue}STEAM${default} ] Steamcmd already installed\n"
fi
}
fn_install_dayz(){
if [ ! -f "${HOME}/serverfiles/DayZServer" ]; then
mkdir ${HOME}/serverfiles &> /dev/null
mkdir ${HOME}/serverprofile &> /dev/null
printf "[ ${yellow}DayZ${default} ] Downloading DayZ Server-Files!\n"
fn_steamlogin_dayz
fn_runvalidate_dayz
else
printf "[ ${lightblue}DayZ${default} ] The Server is already installed.\n"
fi
}
fn_runupdate_dayz(){
fn_loadconfig_dayz
${HOME}/steamcmd/steamcmd.sh +force_install_dir ${HOME}/serverfiles +login "${steamlogin}" +app_update "${appid}" +quit
}
fn_update_dayz(){
fn_steamlogin_dayz
fn_loadconfig_dayz
appmanifestfile=${HOME}/serverfiles/steamapps/appmanifest_"${appid}".acf
printf "[ ... ] Checking for update: SteamCMD"
# 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
if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then
rm -f "${HOME}/Steam/appcache/appinfo.vdf"
sleep 1
fi
# check for new build
availablebuild=$(${HOME}/steamcmd/steamcmd.sh +login "${steamlogin}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | sed -n '/branch/,$p' | grep -m 1 buildid | tr -cd '[:digit:]')
if [ -z "${availablebuild}" ]; then
printf "\r[ ${red}FAIL${default} ] Checking for update: SteamCMD\n"
printf "\r[ ${red}FAIL${default} ] Checking for update: SteamCMD: Not returning version info\n"
exit
else
printf "\r[ ${green}OK${default} ] Checking for update: SteamCMD"
fi
# compare builds
if [ "${currentbuild}" != "${availablebuild}" ]; then
printf "\r[ ${green}OK${default} ] Checking for update: SteamCMD: Update available\n"
printf "Update available:\n"
printf "\tCurrent build: ${red}${currentbuild}${default}\n"
printf "\tAvailable build: ${green}${availablebuild}${default}\n"
printf "\thttps://steamdb.info/app/${appid}/\n"
printf "\nApplying update"
# run update
fn_runupdate_dayz
fn_workshop_mods
else
printf "\r[ ${green}OK${default} ] Checking for update: SteamCMD: No update available\n"
printf "\nNo update available:\n"
printf "\tCurrent version: ${green}${currentbuild}${default}\n"
printf "\tAvailable version: ${green}${availablebuild}${default}\n"
printf "\thttps://steamdb.info/app/${appid}/\n\n"
fi
}
fn_runvalidate_dayz(){
fn_loadconfig_dayz
${HOME}/steamcmd/steamcmd.sh +force_install_dir ${HOME}/serverfiles +login "${steamlogin}" +app_update "${appid}" validate +quit
}
fn_workshop_mods(){
fn_steamlogin_dayz
fn_loadconfig_dayz
declare -a workshopID
workshopfolder="${HOME}/serverfiles/steamapps/workshop/content/221100"
workshoplist=""
if [ ! -f /files/workshop.cfg ]
then
echo "No workshop mods..."
return
else
echo "Syncing workshop mods..."
fi
mapfile -t -s 1 workshopID < /files/workshop.cfg
# gather mods
for i in "${workshopID[@]}"
do
if [[ $i =~ ^[0-9] ]] && [ $(expr length $i) -gt 7 ]; then
workshoplist+=" +workshop_download_item "${dayz_id}" "$i""
fi
done
# download mods
${HOME}/steamcmd/steamcmd.sh +force_install_dir ${HOME}/serverfiles +login "${steamlogin}" ${workshoplist} +quit
# link mods
for i in "${workshopID[@]}"
do
if [[ $i =~ ^[0-9] ]] && [ $(expr length $i) -gt 7 ] && [ -d "${workshopfolder}/$i" ]; then
modname=$(cut -d '"' -f 2 <<< $(grep name ${workshopfolder}/$i/meta.cpp))
if [ ! -d "${HOME}/serverfiles/@${modname}" ]; then
ln -s ${workshopfolder}/$i "${HOME}/serverfiles/@${modname}" &> /dev/null
fi
find "${workshopfolder}/$i" -depth -exec rename -f 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
fi
done
if ls ${HOME}/serverfiles/@* 1> /dev/null 2>&1; then
printf "\n[ ${green}DayZ${default} ] Copy Key Files from Mods...\n"
cp -vu ${HOME}/serverfiles/@*/keys/* "${HOME}/serverfiles/keys/" > /dev/null 2>&1
fi
}
# Make sure we don't start collecting core files
ulimit -c 0
if [[ ${1} = "start" ]]
then
fn_install_dayz
fn_create_beconfig
fn_start_dayz
fi