#!/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 STORAGE="$MAIN/STORAGE" export MOD_CACHE="$CACHE/mods" export RESTART_INTERVAL=$(( 15 * 60 + 30 )) #$((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="$SERVER_HOME/serverDZ.cfg" export SERVER_STORAGE="$STORAGE/$SERVER_NAME" # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Helper functions # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* alias do_sync='rsync -vrltDhu --delete --partial --progress' alias do_secure_sync='rsync -cvrltDhu --delete --partial --progress' 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 for storage_folder in "$SERVER_STORAGE" "$SERVER_STORAGE/Profilesfolder" "$SERVER_STORAGE/storage_1" ; do if [ ! -d "$storage_folder" ] ; then die "FOLDER '$storage_folder' DOES NOT EXIST" fi done } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # Environment Setup # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* init() { mkdir -p "$SERVER_HOME" "$MOD_CACHE/$MAP_FOLDER_NAME" } 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 dayzsettings.xml serverDZ.cfg whitelist.txt ; 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" if [ ! -f "$SERVER_HOME/DZSALModServer.exe" ] ; then msg "Copying DZSA executable" do_secure_sync "$DAYZ_FILES/software/DZSALModServer.exe" "$SERVER_HOME/DZSALModServer.exe" fi } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # 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" } # -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # 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" mod_string=$(load_mods) >&2 printf 'MOD_STRING: %s\n' "$mod_string" echo '====================================' printf '%s - Server started.\n' "$(date)" echo '====================================' cmd.exe /C start "DayZ Server" /min "DZSALModServer.exe" \ -config="$SERVER_CONFIG_FILE" \ -port="$SERVER_PORT" \ -profiles=Profilesfolder \ -mod="$mod_string" \ -cpuCount="$SERVER_CPU" \ -dologs -adminlog \ -netlog -freezecheck msg "Sleeping for: $RESTART_INTERVAL" sleep "$RESTART_INTERVAL" count=0 while [ "$count" -lt "$RESTART_INTERVAL" ] ; do sleep 60 count=$((count + 60)) msg "TIME LEFT BEFORE RESTART: $(( (RESTART_INTERVAL - count) / 60 )) minutes" done echo "===========================" msg "Time up" msg "Killing server" cmd.exe /C taskkill /im DayZServer_x64.exe /F msg "Sleeping 10 seconds to settle" sleep 10 msg "SERVER IS RESTARTING" } while : ; do main "$@" done