#!/bin/sh -e # # shellcheck disable=2043 # # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # General Settings # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* export DAYZ_FILES=/mnt/dayz export STOCK_SERVER_DATA="$DAYZ_FILES/stock/DayZServer" export MAIN="/mnt/c/DAYZ" export SERVERS="$MAIN/servers" export CACHE="$MAIN/cache" export MOD_CACHE="$CACHE/mods" export RESTART_INTERVAL=$((60 * 60 * 4 + 3)) # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # SERVER SPECIFIC SETTINGS # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* export SERVER_NAME='ZyaD Chernarus' export SERVER_HOME="$SERVERS/$SERVER_NAME" export MAP_FOLDER_NAME='chernarus' export LOCAL_FOLDER_MAP_NAME='dayzOffline.chernarusplus' export SERVER_PORT=2302 export SERVER_CPU=8 export SERVER_CONFIG_FILE="serverDZ.cfg" # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Helper functions # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* if [ ! "$DEBUG" ] ; then alias do_sync='rsync -rltDhu --delete --partial' alias do_secure_sync='rsync -crltDhu --delete --partial' else alias do_sync='rsync -vrltDhu --delete --partial --progress' alias do_secure_sync='rsync -cvrltDhu --delete --partial --progress' fi msg() { >&2 printf '[*] %s ...\n' "$*" } die() { msg "$*" exit 1 } debug() { if [ "$DEBUG" ] ; then >&2 printf ' DEBUG: %s\n' "$*" fi } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Checks # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* check() { mkdir -p "$DAYZ_FILES" if ! mount | grep -i "$DAYZ_FILES" >/dev/null ; then msg "$DAYZ_FILES is not mounted!" echo "hint: mount -t drvfs //truenas.home.weaver/dayz $DAYZ_FILES" exit 1 fi } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Environment Setup # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* init() { mkdir -p "$SERVER_HOME" "$MOD_CACHE/$MAP_FOLDER_NAME" :>"$SERVER_HOME/.modstring" } setup_environment() { msg "Copying stock server data" # list of all stock folders for folder in addons battleye bliss docs dta keys ; do do_sync "$STOCK_SERVER_DATA/$folder"/ "$SERVER_HOME/$folder" || die "Failed to copy stock: $folder" done # list of all stock files for file in ban.txt dayz.gproj dayzsetting.xml serverDZ.cfg whitelist.txt \ DayZServer_x64.exe steam_api64.dll steamclient64.dll tier0_s64.dll vstdlib_s64.dll ; do do_sync "$STOCK_SERVER_DATA/$file" "$SERVER_HOME/$file" || die "Failed to copy stock: $file" done # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ # NOTE: TODO: Namalsk etc will need this changed!@@!@!@!@!@ # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ msg "Copying stock mpmissions data" do_sync --exclude="*storage_1*" "$STOCK_SERVER_DATA/mpmissions/dayzOffline.enoch"/ "$SERVER_HOME/mpmissions/dayzOffline.enoch" do_sync --exclude="*storage_1*" "$STOCK_SERVER_DATA/mpmissions/dayzOffline.chernarusplus"/ "$SERVER_HOME/mpmissions/dayzOffline.chernarusplus" # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ msg "Copying mod files" do_sync "$DAYZ_FILES/mods/$MAP_FOLDER_NAME"/ "$MOD_CACHE/$MAP_FOLDER_NAME" || die "Failed to copy mod files" msg "Copying DZSA executable" do_sync "$DAYZ_FILES/software/DZSALModServer.exe" "$SERVER_HOME/DZSALModServer.exe" } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Load Mods # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* load_mods() { if [ ! -f "$MOD_CACHE/$MAP_FOLDER_NAME/mods.txt" ] ; then die "mods.txt list missing" fi mkdir -p "$SERVER_HOME/mods" _modstring="" while read -r mod ; do case $mod in '@'*) msg "- Found mod: $mod" _modstring="$_modstring;mods/$mod" do_sync "$MOD_CACHE/$MAP_FOLDER_NAME/$mod"/ "$SERVER_HOME/mods/$mod" for addon_folder in addons Addons addon Addon ; do if [ -d "$SERVER_HOME/mods/$mod/$addon_folder" ] ; then for addon in "$SERVER_HOME/mods/$mod/$addon_folder"/* ; do if [ ! -f "$SERVER_HOME/addons/${addon##*/}" ] ; then do_sync "$addon" "$SERVER_HOME/addons/${addon##*/}" fi done fi done for key_folder in keys Keys key Key ; do if [ -d "$SERVER_HOME/mods/$mod/$key_folder" ] ; then for key in "$SERVER_HOME/mods/$mod/$key_folder"/* ; do if [ ! -f "$SERVER_HOME/keys/${key##*/}" ] ; then do_sync "$key" "$SERVER_HOME/keys/${key##*/}" fi done fi done esac done < "$MOD_CACHE/$MAP_FOLDER_NAME/mods.txt" # trim the initial leading ';' _modstring=${_modstring#;} printf '%s\n' "$_modstring" > .modstring } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Main # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* main() { init cd "$SERVER_HOME" || die "Could not cd to '$SERVER_HOME'" check || die "Failed check" msg "Setting up environment" setup_environment || die "Could not set up environment." msg "Loading mods" load_mods || die "Could not load mods" mod_string=$(cat .modstring) >&2 printf 'MOD_STRING: %s\n' "$mod_string" echo '====================================' printf '%s - Server started.\n' "$(date)" echo '====================================' # creating temp.bat here to avoid the arg max char limit of windows cmd.exe cat > temp.bat </dev/null ||: msg "Sleeping 10 seconds to settle" sleep 10 msg "SERVER IS RESTARTING" } while : ; do main "$@" done