mirror of
https://ceregatti.org/git/daniel/dayzdockerserver.git
synced 2025-05-06 14:21:18 +00:00
Continue refactoring file locations in the two containers.
Also refactor variables so they're consistent. Set container names in PS1. Update docs.
This commit is contained in:
parent
206c838f9d
commit
64f162001d
7 changed files with 119 additions and 204 deletions
|
@ -31,7 +31,9 @@ dz install
|
||||||
cd /serverfiles
|
cd /serverfiles
|
||||||
mv DayZServer DayZServer.release
|
mv DayZServer DayZServer.release
|
||||||
wget https://cdn.discordapp.com/attachments/491622000935305217/1105089599983853698/DayZServer
|
wget https://cdn.discordapp.com/attachments/491622000935305217/1105089599983853698/DayZServer
|
||||||
chmod 755 DayZServer
|
chmod 755 DayZServer
|
||||||
|
exit
|
||||||
|
docker compose exec server bash
|
||||||
dz start # Will start a vanilla Chernarus map
|
dz start # Will start a vanilla Chernarus map
|
||||||
```
|
```
|
||||||
## Configure and Build
|
## Configure and Build
|
||||||
|
|
|
@ -36,7 +36,7 @@ services:
|
||||||
- homedir_server:/home/user
|
- homedir_server:/home/user
|
||||||
- serverfiles:/serverfiles:ro
|
- serverfiles:/serverfiles:ro
|
||||||
- mods:/serverfiles/steamapps/workshop/content:ro
|
- mods:/serverfiles/steamapps/workshop/content:ro
|
||||||
- mpmissions:/serverfiles/mpmissions
|
- mpmissions:/serverfiles/mpmissions:ro
|
||||||
- profiles:/profiles
|
- profiles:/profiles
|
||||||
- ./files:/files
|
- ./files:/files
|
||||||
- ./server/bin/dz:/usr/local/bin/dz
|
- ./server/bin/dz:/usr/local/bin/dz
|
||||||
|
|
100
files/dz-common
100
files/dz-common
|
@ -31,15 +31,10 @@ release_server_appid=223350
|
||||||
# DayZ release client SteamID. This is for mods, as only the release client has them.
|
# DayZ release client SteamID. This is for mods, as only the release client has them.
|
||||||
release_client_appid=221100
|
release_client_appid=221100
|
||||||
|
|
||||||
# Main container base directories
|
# Common container base directories
|
||||||
CFG_SRC_FILES="/files"
|
FILES="/files"
|
||||||
SERVER_FILES="/serverfiles"
|
SERVER_FILES="/serverfiles"
|
||||||
|
|
||||||
# Server configuration file
|
|
||||||
SERVER_CFG_FILE="serverDZ.cfg"
|
|
||||||
SERVER_CFG_DST="${SERVER_FILES}/${SERVER_CFG_FILE}"
|
|
||||||
SERVER_CFG_SRC="${CFG_SRC_FILES}/${SERVER_CFG_FILE}"
|
|
||||||
|
|
||||||
# Used to check if dayZ is installed
|
# Used to check if dayZ is installed
|
||||||
SERVER_INSTALL_FILE="${SERVER_FILES}/DayZServer"
|
SERVER_INSTALL_FILE="${SERVER_FILES}/DayZServer"
|
||||||
|
|
||||||
|
@ -47,16 +42,8 @@ SERVER_INSTALL_FILE="${SERVER_FILES}/DayZServer"
|
||||||
STEAM_LOGIN="${HOME}/steamlogin"
|
STEAM_LOGIN="${HOME}/steamlogin"
|
||||||
STEAMCMD=steamcmd
|
STEAMCMD=steamcmd
|
||||||
|
|
||||||
# Workshop. This file will store metadata about what mods are installed.
|
# Workshop files (mods)
|
||||||
WORKSHOP_CFG="${HOME}/workshop.cfg"
|
WORKSHOP_DIR="${SERVER_FILES}/steamapps/workshop/content/${release_client_appid}"
|
||||||
if [ ! -f "${WORKSHOP_CFG}" ]
|
|
||||||
then
|
|
||||||
touch "${WORKSHOP_CFG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# An array to store Workshop items. Each element contains the mod's ID, name, and state (active or not).
|
|
||||||
declare -a workshopID
|
|
||||||
workshopfolder="${SERVER_FILES}/steamapps/workshop/content/${release_client_appid}"
|
|
||||||
|
|
||||||
# Other stuff
|
# Other stuff
|
||||||
YES="${green}yes${default}"
|
YES="${green}yes${default}"
|
||||||
|
@ -64,22 +51,6 @@ NO="${red}no${default}"
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
|
|
||||||
checkInstall(){
|
|
||||||
# See if this mod id exists in files/mods, and offer to install other server side files if an install.sh is found
|
|
||||||
if [ -f /files/mods/${1}/${2}.sh ]
|
|
||||||
then
|
|
||||||
echo "An ${2}.sh was found for mod id ${1}. Running..."
|
|
||||||
/files/mods/${1}/${2}.sh
|
|
||||||
fi
|
|
||||||
# A generic map install script. Presumes a git repo as the source
|
|
||||||
if [ -f /files/mods/${1}/install.env ]
|
|
||||||
then
|
|
||||||
echo "An ${2}.env was found for mod id ${1}. Performing ${2}..."
|
|
||||||
source /files/mods/${1}/install.env
|
|
||||||
/files/mods/install.sh ${1} ${2}
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convenience function
|
# Convenience function
|
||||||
prompt_yn(){
|
prompt_yn(){
|
||||||
echo -n "${1} (y|N) " >&2
|
echo -n "${1} (y|N) " >&2
|
||||||
|
@ -94,31 +65,37 @@ prompt_yn(){
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_install(){
|
check_mod_install(){
|
||||||
if [ ! -f "${SERVER_INSTALL_FILE}" ]
|
# See if this mod id exists in files/mods, and offer to install other server side files if an install.sh is found
|
||||||
|
if [ -f ${FILES}/mods/${1}/${2}.sh ]
|
||||||
then
|
then
|
||||||
echo
|
echo "An ${2}.sh was found for mod id ${1}. Running..."
|
||||||
echo -e "The DayZ server files are not installed. Run '${green}docker-compose run --rm main dayzserver install${default}'"
|
${FILES}/mods/${1}/${2}.sh
|
||||||
echo
|
fi
|
||||||
exit 1
|
# A generic map install script. Presumes a git repo as the source
|
||||||
|
if [ -f ${FILES}/mods/${1}/install.env ]
|
||||||
|
then
|
||||||
|
echo "An ${2}.env was found for mod id ${1}. Performing ${2}..."
|
||||||
|
source ${FILES}/mods/${1}/install.env
|
||||||
|
${FILES}/mods/install.sh ${1} ${2}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
get_mod_id_by_index(){
|
get_mod_id_by_index(){
|
||||||
# If we were passed a valid mod id, just return it
|
# If we were passed a valid mod id, just return it
|
||||||
if [[ -d "${workshopdir}/${1}" ]]
|
if [[ -d "${WORKSHOP_DIR}/${1}" ]]
|
||||||
then
|
then
|
||||||
echo ${1}
|
echo -n ${1}
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
X=1
|
X=1
|
||||||
# Loop over mod list
|
# Loop over mods
|
||||||
for i in "${workshopID[@]}"
|
for dir in $(ls -tr ${WORKSHOP_DIR})
|
||||||
do
|
do
|
||||||
ID=$(echo ${i} | cut -d: -f1)
|
ID=${dir}
|
||||||
if [[ ${X} = ${1} ]]
|
if [[ ${X} = ${1} ]]
|
||||||
then
|
then
|
||||||
echo ${ID}
|
echo -n ${ID}
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
X=$((X+1))
|
X=$((X+1))
|
||||||
|
@ -127,18 +104,31 @@ get_mod_id_by_index(){
|
||||||
|
|
||||||
# Get mod name by ID or index
|
# Get mod name by ID or index
|
||||||
get_mod_name(){
|
get_mod_name(){
|
||||||
# Check for an ID
|
ID=$(get_mod_id_by_index ${1})
|
||||||
if [ -d "${workshopfolder}/${1}" ]
|
if ! [ -d "${WORKSHOP_DIR}/${ID}" ]
|
||||||
then
|
|
||||||
ID=${1}
|
|
||||||
else
|
|
||||||
ID=$(get_mod_id_by_index ${1})
|
|
||||||
fi
|
|
||||||
if ! [ -d "${workshopfolder}/${ID}" ]
|
|
||||||
then
|
then
|
||||||
echo "Mod ID ${1} doesn't exist" >&2
|
echo "Mod ID ${1} doesn't exist" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
NAME=$(grep name ${workshopfolder}/${ID}/meta.cpp | cut -d '"' -f2 | sed -r 's/\s+//g')
|
NAME=$(grep name ${WORKSHOP_DIR}/${ID}/meta.cpp | cut -d '"' -f2 | sed -r 's/\s+//g')
|
||||||
echo ${NAME}
|
echo -n ${NAME}
|
||||||
|
}
|
||||||
|
|
||||||
|
# List mods
|
||||||
|
list(){
|
||||||
|
workshoplist=""
|
||||||
|
X=1
|
||||||
|
C="${green}"
|
||||||
|
spaces=" "
|
||||||
|
echo -e "\n ID Name URL Size"
|
||||||
|
echo "------------------------------------------------------------------------------------------------------------------------"
|
||||||
|
for dir in $(ls -tr ${WORKSHOP_DIR})
|
||||||
|
do
|
||||||
|
ID=${dir}
|
||||||
|
NAME=$(grep name "${WORKSHOP_DIR}/${dir}/meta.cpp" | cut -d '"' -f2 | sed -r 's/\s+//g')
|
||||||
|
SIZE=$(du -sh "${WORKSHOP_DIR}/${dir}" | awk '{print $1}')
|
||||||
|
workshoplist+=" +workshop_download_item "${release_client_appid}" "${ID}
|
||||||
|
printf "${C}%.3d %s %.23s %s https://steamcommunity.com/sharedfiles/filedetails/?id=%s %s${default}\n" ${X} ${ID} "${NAME}" "${spaces:${#NAME}+1}" ${ID} ${SIZE}
|
||||||
|
X=$((X+1))
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ set -eE
|
||||||
|
|
||||||
ID=${1}
|
ID=${1}
|
||||||
MODE=${2}
|
MODE=${2}
|
||||||
TYPES_FILE="${workshopfolder}/${ID}/extras/types.xml"
|
TYPES_FILE="${WORKSHOP_DIR}/${ID}/extras/types.xml"
|
||||||
|
|
||||||
if [[ ${3} != "" ]]
|
if [[ ${3} != "" ]]
|
||||||
then
|
then
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Set PS1 so we know we're in the container
|
# Set PS1 so we know we're in the container
|
||||||
if ! [ -f .bashrc ]
|
cat > .bashrc <<EOF
|
||||||
then
|
|
||||||
echo "Creating .bashrc..."
|
|
||||||
cat > .bashrc <<EOF
|
|
||||||
alias ls='ls --color'
|
alias ls='ls --color'
|
||||||
export PS1="${debian_chroot:+($debian_chroot)}\u@dz-server:\w\$ "
|
export PS1="${debian_chroot:+($debian_chroot)}\u@dz-server:\w\$ "
|
||||||
EOF
|
EOF
|
||||||
fi
|
|
||||||
|
|
||||||
# Uncomment the line below to run things manually in the container, then run:
|
# Uncomment the line below to run things manually in the container, then run:
|
||||||
# docker compose exec main bash
|
# docker compose exec main bash
|
||||||
|
|
106
server/bin/dz
106
server/bin/dz
|
@ -10,7 +10,7 @@ mkdir -p ${SERVER_PROFILE}/battleye
|
||||||
# Server configuration file
|
# Server configuration file
|
||||||
SERVER_CFG_FILE="serverDZ.cfg"
|
SERVER_CFG_FILE="serverDZ.cfg"
|
||||||
SERVER_CFG_DST="${SERVER_PROFILE}/${SERVER_CFG_FILE}"
|
SERVER_CFG_DST="${SERVER_PROFILE}/${SERVER_CFG_FILE}"
|
||||||
SERVER_CFG_SRC="${CFG_SRC_FILES}/${SERVER_CFG_FILE}"
|
SERVER_CFG_SRC="${FILES}/${SERVER_CFG_FILE}"
|
||||||
|
|
||||||
# Command line parameters except mod, as that is handled separately.
|
# Command line parameters except mod, as that is handled separately.
|
||||||
parameters="-config=${SERVER_CFG_DST} -port=${port} -freezecheck -BEpath=${SERVER_PROFILE}/battleye -profiles=${SERVER_PROFILE} -nologs"
|
parameters="-config=${SERVER_CFG_DST} -port=${port} -freezecheck -BEpath=${SERVER_PROFILE}/battleye -profiles=${SERVER_PROFILE} -nologs"
|
||||||
|
@ -19,7 +19,7 @@ parameters="-config=${SERVER_CFG_DST} -port=${port} -freezecheck -BEpath=${SERVE
|
||||||
SERVER_INSTALL_FILE="${SERVER_FILES}/DayZServer"
|
SERVER_INSTALL_FILE="${SERVER_FILES}/DayZServer"
|
||||||
|
|
||||||
# Workshop. This file will store metadata about what mods are in use in this server instance
|
# Workshop. This file will store metadata about what mods are in use in this server instance
|
||||||
WORKSHOP_CFG="${HOME}/workshop.cfg"
|
WORKSHOP_CFG="${SERVER_PROFILE}/workshop.cfg"
|
||||||
if [ ! -f "${WORKSHOP_CFG}" ]
|
if [ ! -f "${WORKSHOP_CFG}" ]
|
||||||
then
|
then
|
||||||
touch "${WORKSHOP_CFG}"
|
touch "${WORKSHOP_CFG}"
|
||||||
|
@ -29,7 +29,7 @@ INSTALLED_MODS="${SERVER_FILES}/workshop.cfg"
|
||||||
|
|
||||||
# An array to store Workshop items. Each element contains the mod's ID, name, and state (active or not).
|
# An array to store Workshop items. Each element contains the mod's ID, name, and state (active or not).
|
||||||
declare -a workshopID
|
declare -a workshopID
|
||||||
workshopfolder="${SERVER_FILES}/steamapps/workshop/content/${release_client_appid}"
|
WORKSHOP_DIR="${SERVER_FILES}/steamapps/workshop/content/${release_client_appid}"
|
||||||
|
|
||||||
# Backups
|
# Backups
|
||||||
BACKUP_DIR="${HOME}/backup"
|
BACKUP_DIR="${HOME}/backup"
|
||||||
|
@ -63,6 +63,62 @@ ${default}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadconfig(){
|
||||||
|
if [ ! -f "${SERVER_INSTALL_FILE}" ]
|
||||||
|
then
|
||||||
|
echo
|
||||||
|
echo -e "The DayZ server files are not installed. Run '${green}docker-compose run --rm main dayzserver install${default}'"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Handle the initial server configuration file
|
||||||
|
if [ ! -f ${SERVER_CFG_DST} ]
|
||||||
|
then
|
||||||
|
echo "Creating initial server configuration file"
|
||||||
|
cp "${SERVER_CFG_SRC}" "${SERVER_CFG_DST}"
|
||||||
|
fi
|
||||||
|
# battleye config and rconpassword setup
|
||||||
|
# The server creates a new file from this file, which it then uses.
|
||||||
|
# Let's make sure to delete it first
|
||||||
|
BE_SERVER_FILE="${SERVER_PROFILE}/battleye/beserver_x64.cfg"
|
||||||
|
ALT_BE_SERVER_FILE=$(find ${SERVER_PROFILE}/battleye -name "beserver_x64_active*")
|
||||||
|
if [ ! -f "${BE_SERVER_FILE}" ] && [ ! -f "${ALT_BE_SERVER_FILE}" ]
|
||||||
|
then
|
||||||
|
passwd=$(openssl rand -base64 8 | tr -dc 'A-Za-z0-9')
|
||||||
|
if [ "${passwd}" == "" ]
|
||||||
|
then
|
||||||
|
passwd=$(< /dev/urandom tr -dc 'A-Za-z0-9' | head -c10)
|
||||||
|
fi
|
||||||
|
if [ "${passwd}" == "" ]
|
||||||
|
then
|
||||||
|
printf "[ ${red}FAIL${default} ] Could not generate a passwort for RCON!\nOpen the Battleye config with 'dayzserver rcon'."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
cat > "${BE_SERVER_FILE}" <<EOF
|
||||||
|
RConPassword ${passwd}
|
||||||
|
RestrictRCon 0
|
||||||
|
RConPort ${rcon_port}
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
printf "[ ${cyan}INFO${default} ] New RCON password: ${yellow}${passwd}${default}\n"
|
||||||
|
else
|
||||||
|
if [ -f "${BE_SERVER_FILE}" ]
|
||||||
|
then
|
||||||
|
FILE="${BE_SERVER_FILE}"
|
||||||
|
elif [ -f "${ALT_BE_SERVER_FILE}" ]
|
||||||
|
then
|
||||||
|
FILE="${ALT_BE_SERVER_FILE}"
|
||||||
|
fi
|
||||||
|
passwd=$(grep RConPassword ${FILE} | awk '{print $2}')
|
||||||
|
# printf "[ ${cyan}INFO${default} ] Using existing RCON password: ${yellow}${passwd}${default}\n"
|
||||||
|
fi
|
||||||
|
cp /usr/local/py3rcon/configexample.json ~/py3rcon.config.json
|
||||||
|
jq --arg port 2303 --arg rcon_password b0fNIBVfkM \
|
||||||
|
'.logfile="py3rcon.log" | .loglevel=0 | .server.port=$port | .server.rcon_password=$rcon_password | del(.repeatMessage)' \
|
||||||
|
/usr/local/py3rcon/configexample.json \
|
||||||
|
> ~/py3rcon.config.json
|
||||||
|
}
|
||||||
|
|
||||||
# Manage the mod symlink
|
# Manage the mod symlink
|
||||||
symlink(){
|
symlink(){
|
||||||
W=${1}
|
W=${1}
|
||||||
|
@ -70,7 +126,7 @@ symlink(){
|
||||||
NAME=${3}
|
NAME=${3}
|
||||||
if [ ! -L "${SERVER_FILES}/@${NAME}" ] && [[ ${W} = 1 ]]
|
if [ ! -L "${SERVER_FILES}/@${NAME}" ] && [[ ${W} = 1 ]]
|
||||||
then
|
then
|
||||||
ln -sv ${workshopfolder}/${ID} "${SERVER_FILES}/@${NAME}"
|
ln -sv ${WORKSHOP_DIR}/${ID} "${SERVER_FILES}/@${NAME}"
|
||||||
elif [[ "${W}" = "0" ]]
|
elif [[ "${W}" = "0" ]]
|
||||||
then
|
then
|
||||||
rm -vf "${SERVER_FILES}/@${NAME}"
|
rm -vf "${SERVER_FILES}/@${NAME}"
|
||||||
|
@ -202,18 +258,18 @@ get_mod_id_by_index(){
|
||||||
# Get mod name by ID or index
|
# Get mod name by ID or index
|
||||||
get_mod_name(){
|
get_mod_name(){
|
||||||
# Check for an ID
|
# Check for an ID
|
||||||
if [ -d "${workshopfolder}/${1}" ]
|
if [ -d "${WORKSHOP_DIR}/${1}" ]
|
||||||
then
|
then
|
||||||
ID=${1}
|
ID=${1}
|
||||||
else
|
else
|
||||||
ID=$(get_mod_id_by_index ${1})
|
ID=$(get_mod_id_by_index ${1})
|
||||||
fi
|
fi
|
||||||
if ! [ -d "${workshopfolder}/${ID}" ]
|
if ! [ -d "${WORKSHOP_DIR}/${ID}" ]
|
||||||
then
|
then
|
||||||
echo "Mod ID ${1} doesn't exist" >&2
|
echo "Mod ID ${1} doesn't exist" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
NAME=$(grep name ${workshopfolder}/${ID}/meta.cpp | cut -d '"' -f2 | sed -r 's/\s+//g')
|
NAME=$(grep name ${WORKSHOP_DIR}/${ID}/meta.cpp | cut -d '"' -f2 | sed -r 's/\s+//g')
|
||||||
echo ${NAME}
|
echo ${NAME}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,35 +298,6 @@ activate(){
|
||||||
list
|
list
|
||||||
}
|
}
|
||||||
|
|
||||||
# List available mods
|
|
||||||
list(){
|
|
||||||
get_installed_mods
|
|
||||||
|
|
||||||
if [[ "${workshopID[@]}" = "" ]]
|
|
||||||
then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
X=1
|
|
||||||
spaces=" "
|
|
||||||
echo -e "\n ID Name Active URL Size"
|
|
||||||
echo "------------------------------------------------------------------------------------------------------------------------"
|
|
||||||
for i in "${workshopID[@]}"
|
|
||||||
do
|
|
||||||
ID=$(echo ${i} | cut -d: -f1)
|
|
||||||
NAME=$(echo ${i} | cut -d: -f2)
|
|
||||||
ACTIVE=$(echo ${i} | cut -d: -f3)
|
|
||||||
SIZE=$(du -sh ${SERVER_FILES}/steamapps/workshop/content/221100/${ID} | awk '{print $1}')
|
|
||||||
if [[ ${ACTIVE} = "1" ]]
|
|
||||||
then
|
|
||||||
C="${green}"
|
|
||||||
else
|
|
||||||
C="${red}"
|
|
||||||
fi
|
|
||||||
printf "${C}%.3d %s %.23s %s %s https://steamcommunity.com/sharedfiles/filedetails/?id=%s %s${default}\n" ${X} ${ID} "${NAME}" "${spaces:${#NAME}+1}" ${ACTIVE} ${ID} ${SIZE}
|
|
||||||
X=$((X+1))
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Assemble the mod command line
|
# Assemble the mod command line
|
||||||
mod_cmd(){
|
mod_cmd(){
|
||||||
mod_command_line=""
|
mod_command_line=""
|
||||||
|
@ -301,15 +328,15 @@ checkXML(){
|
||||||
if echo ${!xml} | grep -q http
|
if echo ${!xml} | grep -q http
|
||||||
then
|
then
|
||||||
echo "${NAME} file is remote, downloading..."
|
echo "${NAME} file is remote, downloading..."
|
||||||
curl -o ${workshopfolder}/${1}/${NAME}.xml ${!xml}
|
curl -o ${WORKSHOP_DIR}/${1}/${NAME}.xml ${!xml}
|
||||||
else
|
else
|
||||||
echo "${NAME} file is in the mod, copying..."
|
echo "${NAME} file is in the mod, copying..."
|
||||||
cp -vf ${!xml} ${workshopfolder}/${1}/${NAME}.xml
|
cp -vf ${!xml} ${WORKSHOP_DIR}/${1}/${NAME}.xml
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
# else
|
# else
|
||||||
# See if this mod has a types.xml in the "standard" locations
|
# See if this mod has a types.xml in the "standard" locations
|
||||||
# for path in "${workshopfolder}/${1}/extras" "${workshopfolder}/${1}"
|
# for path in "${WORKSHOP_DIR}/${1}/extras" "${WORKSHOP_DIR}/${1}"
|
||||||
# do
|
# do
|
||||||
# if [ -f "${path}/types.xml" ]
|
# if [ -f "${path}/types.xml" ]
|
||||||
# then
|
# then
|
||||||
|
@ -368,7 +395,6 @@ status(){
|
||||||
fi
|
fi
|
||||||
# Number of mods plus the list denoting on or off
|
# Number of mods plus the list denoting on or off
|
||||||
echo -ne "
|
echo -ne "
|
||||||
Logged in to Steam: ${LOGGED_IN} ${ANONYMOUS}
|
|
||||||
Server files installed: ${INSTALLED}"
|
Server files installed: ${INSTALLED}"
|
||||||
if [[ "${INSTALLED}" = "${NO}" ]]
|
if [[ "${INSTALLED}" = "${NO}" ]]
|
||||||
then
|
then
|
||||||
|
|
103
web/bin/dz
103
web/bin/dz
|
@ -2,16 +2,8 @@
|
||||||
|
|
||||||
source /files/dz-common
|
source /files/dz-common
|
||||||
|
|
||||||
# Workshop. This file will store metadata about what mods are installed.
|
|
||||||
WORKSHOP_CFG="${SERVER_FILES}/workshop.cfg"
|
|
||||||
if [ ! -f "${WORKSHOP_CFG}" ]
|
|
||||||
then
|
|
||||||
touch "${WORKSHOP_CFG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# An array to store Workshop items. Each element contains the mod's ID, name, and state (active or not).
|
# An array to store Workshop items. Each element contains the mod's ID, name, and state (active or not).
|
||||||
declare -a workshopID
|
WORKSHOP_DIR="${SERVER_FILES}/steamapps/workshop/content/${release_client_appid}"
|
||||||
workshopfolder="${SERVER_FILES}/steamapps/workshop/content/${release_client_appid}"
|
|
||||||
|
|
||||||
workshoplist=""
|
workshoplist=""
|
||||||
|
|
||||||
|
@ -38,63 +30,8 @@ ${default}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ensures all is installed and ready before allowing operations that depends on things being ready.
|
|
||||||
# Installs the initial server config file from its template.
|
|
||||||
# Handles the importing of changes to that template.
|
|
||||||
# Installs the initial Battleye RCON config.
|
|
||||||
loadconfig(){
|
|
||||||
# check_install
|
|
||||||
# Handle the initial server configuration file
|
|
||||||
if [ ! -f ${SERVER_CFG_DST} ]
|
|
||||||
then
|
|
||||||
echo "Creating initial server configuration file"
|
|
||||||
cp "${SERVER_CFG_SRC}" "${SERVER_CFG_DST}"
|
|
||||||
fi
|
|
||||||
# battleye config and rconpassword setup
|
|
||||||
# The server creates a new file from this file, which it then uses.
|
|
||||||
# Let's make sure to delete it first
|
|
||||||
BE_SERVER_FILE="${SERVER_FILES}/battleye/beserver_x64.cfg"
|
|
||||||
ALT_BE_SERVER_FILE=$(find ${SERVER_FILES}/battleye -name "beserver_x64_active*")
|
|
||||||
if [ ! -f "${BE_SERVER_FILE}" ] && [ ! -f "${ALT_BE_SERVER_FILE}" ]
|
|
||||||
then
|
|
||||||
passwd=$(openssl rand -base64 8 | tr -dc 'A-Za-z0-9')
|
|
||||||
if [ "${passwd}" == "" ]
|
|
||||||
then
|
|
||||||
passwd=$(< /dev/urandom tr -dc 'A-Za-z0-9' | head -c10)
|
|
||||||
fi
|
|
||||||
if [ "${passwd}" == "" ]
|
|
||||||
then
|
|
||||||
printf "[ ${red}FAIL${default} ] Could not generate a passwort for RCON!\nOpen the Battleye config with 'dayzserver rcon'."
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
cat > "${BE_SERVER_FILE}" <<EOF
|
|
||||||
RConPassword ${passwd}
|
|
||||||
RestrictRCon 0
|
|
||||||
RConPort ${rcon_port}
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
printf "[ ${cyan}INFO${default} ] New RCON password: ${yellow}${passwd}${default}\n"
|
|
||||||
else
|
|
||||||
if [ -f "${BE_SERVER_FILE}" ]
|
|
||||||
then
|
|
||||||
FILE="${BE_SERVER_FILE}"
|
|
||||||
elif [ -f "${ALT_BE_SERVER_FILE}" ]
|
|
||||||
then
|
|
||||||
FILE="${ALT_BE_SERVER_FILE}"
|
|
||||||
fi
|
|
||||||
passwd=$(grep RConPassword ${FILE} | awk '{print $2}')
|
|
||||||
# printf "[ ${cyan}INFO${default} ] Using existing RCON password: ${yellow}${passwd}${default}\n"
|
|
||||||
fi
|
|
||||||
cp /usr/local/py3rcon/configexample.json ~/py3rcon.config.json
|
|
||||||
jq --arg port 2303 --arg rcon_password b0fNIBVfkM \
|
|
||||||
'.logfile="py3rcon.log" | .loglevel=0 | .server.port=$port | .server.rcon_password=$rcon_password | del(.repeatMessage)' \
|
|
||||||
/usr/local/py3rcon/configexample.json \
|
|
||||||
> ~/py3rcon.config.json
|
|
||||||
}
|
|
||||||
|
|
||||||
# Handle the Steam login information.
|
# Handle the Steam login information.
|
||||||
login(){
|
login(){
|
||||||
loadconfig
|
|
||||||
if [ -f "${STEAM_LOGIN}" ]
|
if [ -f "${STEAM_LOGIN}" ]
|
||||||
then
|
then
|
||||||
if prompt_yn "The steam login is already set. Reset it?"
|
if prompt_yn "The steam login is already set. Reset it?"
|
||||||
|
@ -122,7 +59,6 @@ login(){
|
||||||
|
|
||||||
# "Perform" the Steam login. This just sources the file with the Steam login name.
|
# "Perform" the Steam login. This just sources the file with the Steam login name.
|
||||||
dologin(){
|
dologin(){
|
||||||
loadconfig
|
|
||||||
if [ -f "${STEAM_LOGIN}" ]
|
if [ -f "${STEAM_LOGIN}" ]
|
||||||
then
|
then
|
||||||
source "${STEAM_LOGIN}"
|
source "${STEAM_LOGIN}"
|
||||||
|
@ -134,7 +70,6 @@ dologin(){
|
||||||
|
|
||||||
# Perform the installation of the server files.
|
# Perform the installation of the server files.
|
||||||
install(){
|
install(){
|
||||||
loadconfig
|
|
||||||
if [ ! -f "${SERVER_INSTALL_FILE}" ] || [[ ${1} = "force" ]]
|
if [ ! -f "${SERVER_INSTALL_FILE}" ] || [[ ${1} = "force" ]]
|
||||||
then
|
then
|
||||||
printf "[ ${yellow}DayZ${default} ] Downloading DayZ Server-Files!\n"
|
printf "[ ${yellow}DayZ${default} ] Downloading DayZ Server-Files!\n"
|
||||||
|
@ -198,45 +133,11 @@ modupdate(){
|
||||||
${STEAMCMD} +force_install_dir ${SERVER_FILES} +login "${steamlogin}" ${workshoplist} +quit
|
${STEAMCMD} +force_install_dir ${SERVER_FILES} +login "${steamlogin}" ${workshoplist} +quit
|
||||||
# Updated files come in with mixed cases. Fix that.
|
# Updated files come in with mixed cases. Fix that.
|
||||||
echo -ne "\nFixing file names..."
|
echo -ne "\nFixing file names..."
|
||||||
find "${workshopfolder}" -depth -exec rename -f 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
|
find "${WORKSHOP_DIR}" -depth -exec rename -f 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
|
||||||
echo "done"
|
echo "done"
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
# List mods
|
|
||||||
list(){
|
|
||||||
mapfile -t workshopID < "${WORKSHOP_CFG}"
|
|
||||||
workshoplist=""
|
|
||||||
for i in "${workshopID[@]}"
|
|
||||||
do
|
|
||||||
ID=$(echo ${i} | cut -d: -f1)
|
|
||||||
workshoplist+=" +workshop_download_item "${release_client_appid}" "${ID}
|
|
||||||
done
|
|
||||||
if [[ "${workshopID[@]}" = "" ]]
|
|
||||||
then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
X=1
|
|
||||||
spaces=" "
|
|
||||||
echo -e "\n ID Name URL Size"
|
|
||||||
echo "------------------------------------------------------------------------------------------------------------------------"
|
|
||||||
for i in "${workshopID[@]}"
|
|
||||||
do
|
|
||||||
ID=$(echo ${i} | cut -d: -f1)
|
|
||||||
NAME=$(echo ${i} | cut -d: -f2)
|
|
||||||
# ACTIVE=$(echo ${i} | cut -d: -f3)
|
|
||||||
SIZE=$(du -sh ${SERVER_FILES}/steamapps/workshop/content/221100/${ID} | awk '{print $1}')
|
|
||||||
# if [[ ${ACTIVE} = "1" ]]
|
|
||||||
# then
|
|
||||||
C="${green}"
|
|
||||||
# else
|
|
||||||
# C="${red}"
|
|
||||||
# fi
|
|
||||||
printf "${C}%.3d %s %.23s %s https://steamcommunity.com/sharedfiles/filedetails/?id=%s %s${default}\n" ${X} ${ID} "${NAME}" "${spaces:${#NAME}+1}" ${ID} ${SIZE}
|
|
||||||
X=$((X+1))
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Display the status of everything
|
# Display the status of everything
|
||||||
status(){
|
status(){
|
||||||
INSTALLED="${NO}"
|
INSTALLED="${NO}"
|
||||||
|
|
Loading…
Add table
Reference in a new issue