#!/bin/sh -e # # values used on both the modserver and individual servers # ------------------------------------------------------------ ################### GLOBAL VARS ############################## export DAYZ_GAME_ID=221100 export DAYZ_SERVER_ID=223350 export STEAM_USER="yzaddayz" # blank debug to unset it by default export DEBUG= export REMOTE_DAYZ_TRUENAS_SHARE='\\dayz-truenas.local.wvr.sh\dayz' export REMOTE_DIR="/mnt/dayz" export REMOTE_SERVER_LOCKFILE="$REMOTE_DIR/lockfile" export REMOTE_MAPS="$REMOTE_DIR/stock/maps" export REMOTE_MODS="$REMOTE_DIR/mods" export REMOTE_STOCK_SERVER="$REMOTE_DIR/stock/DayZServer" export REMOTE_STOCK_GAME="$REMOTE_DIR/stock/DayZ" export CHERNARUS_MAP_NAME=dayzOffline.chernarusplus export NAMALSK_MAP_NAME=regular.namalsk export TAKISTAN_MAP_NAME=Offline.TakistanPlus # NAMALSK_SURVIVAL is what the terrain/map comes with export NAMALSK_SURVIVAL_MOD_ID=2289461232 export NAMALSK_ISLAND_MOD_ID=2289456201 export TAKISTAN_MOD_ID=2563233742 ################### GLOBAL VARS ############################## ################### GLOBAL ALIASES ########################### unalias rsync 2>/dev/null ||: alias do_sync='rsync -avhu --progress --delete --partial --links' ################### GLOBAL ALIASES ########################### ################### GLOBAL FUNCTIONS ######################### msg() { printf '>>>>>[MESSAGE]: %s\n' "$*" } errmsg() { >&2 printf '>>>>>>[ERROR]: %s\n' "$*" } die() { errmsg "$*" exit 1 } debug() { if [ "$DEBUG" ] ; then >&2 printf '>>>>>>DEBUG: %s\n' "$*" fi } isempty() { for arg in "$@" ; do # exit in error if file if [ -f "$arg" ] ; then exit 1 elif [ -L "$arg" ] ; then # if is a symlink, check what it points to # note: this only checks one-link level deep if [ -d "$(readlink "$arg")" ] ; then exit 0 else exit 1 fi elif [ -d "$arg" ] ; then : else # is not a directory or a link to a directory exit 1 fi # there should be a way to make this be builtins only # using printf and glob expansions, look into later if /bin/rmdir "$arg" 2>/dev/null ; then /bin/mkdir -p "$arg" exit 0 else exit 1 fi done } mount_dayz_network_drive() { if ! is_network_drive_mounted ; then if [ ! -d /mnt/dayz ] ; then sudo mkdir -p /mnt/dayz fi if [ -e /proc/version ] ; then read -r ver < /proc/version case $ver in # WSL *icrosoft*) msg "Detected WSL, mounting via drvfs" sudo mount -t drvfs -o user=samba \ "$REMOTE_DAYZ_TRUENAS_SHARE" /mnt/dayz ;; *) msg "Detected Linux, mounting via cifs" # shellcheck disable=2046 sudo mount -t cifs "$REMOTE_DAYZ_TRUENAS_SHARE" /mnt/dayz \ -o rw \ -o credentials=/root/sambacreds.txt \ -o iocharset=utf8 \ -o vers=3.0 \ -o uid=$(id -u) \ -o gid=$(id -g) esac unset ver else errmsg 'could not find /proc/version' exit 1 fi fi if ! is_network_drive_mounted ; then errmsg 'Could not mount network drive' exit 1 fi } is_network_drive_mounted() { if [ ! -f "$REMOTE_DIR/canary" ] ; then return 1 fi # test write touch /mnt/dayz/canary.test if [ $? -eq 0 ] ; then rm /mnt/dayz/canary.test else errmsg "Mounted network drive but we do not have write access." exit 1 fi } # ===================================================================================== islocked_remote_server() { if [ -e "$REMOTE_SERVER_LOCKFILE" ] ; then # msg "Server is not currently locked!" return 0 else return 1 fi } lock_remote_server() { msg "Locking remote server." if ! echo 'locked' | tee "$REMOTE_SERVER_LOCKFILE" ; then die "Could not create: $REMOTE_SERVER_LOCKFILE" fi } unlock_remote_server() { msg "Unlocking remote server." rm -f "$REMOTE_SERVER_LOCKFILE" || die "Could not remove: $REMOTE_SERVER_LOCKFILE" } wait_until_remote_server_unlocked() { # wait until dayz-modserver lockfile is released on the NAS if islocked_remote_server ; then msg "Remote file server is currently locked" msg "Sleeping until is no longer locked..." while islocked_remote_server ; do echo "Sleeping..." sleep 10 done msg "Server unlocked! Continuing..." fi } # =====================================================================================