Added Arma 3 image files
These files originate from https://github.com/parkervcp/images/tree/game/arma3 which is currently hosted at quay.io/parkervcp/pterodactyl-images:game_arma3 However, the entire image has been mainly rewritten in this update, which includes the following changes: - Code styling / nomenclature has been normalized across the entire file. - A robust RunSteamCMD function has been added to run SteamCMD with advanced error handling and reporting. Works for both the server and mods, and is configurable with the STEAMCMD_ATTEMPTS environment variable to specify how many times it should retry a download after a recoverable error (like large Workshop mod downloads timing out). - Added support for a MOD_FILE environment variable, to specify an exported Arma 3 modlist HTML file for import into the server (for downloads and runtime). These mods are combined with any mods listed in MODIFICATIONS. - A more robust and automatic way of downloading/updating mods is now included with the UPDATE_SERVER function. All mods to be used during runtime are checked for updates by comparing local file's creation dates against the mod's Workshop page last update. This allows for fast and reliable mod updates compared to the old manual system, and allows users to comfortably leave the update server function on all the time if they'd like. - Added a RemoveDuplicates function to prevent a user from accidentally loading a mod twice. - Checks for missing, trailing semicolons in manual mod lists due to human error. - Mod update information echos are less cryptic and now use the mod's human-readable name, as well as printing the date they last updated. - Made the server binary check error messages less cryptic and provided solution recommendations. - Added a CLEAR_CACHE env. var. function to delete headless client profiles on startup to help with potential issues they cause. - Un-hardcoded the basic.cfg URL and replaced with env. var. - Added HC_HIDE env. var. to prevent headless client console spam. - Added VALIDATE_SERVER env. var. to manually validate, because the new automatic update function skips validation to speed it up. - Added CDLC env. var. for easy download of Creator DLCs incase the user doesn't know how to use SteamCMD beta branches.
This commit is contained in:
29
games/arma3/Dockerfile
Normal file
29
games/arma3/Dockerfile
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
LABEL author="David Wolfe (Red-Thirten)" maintainer="rehlmgaming@gmail.com"
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
ENV USER_NAME container
|
||||||
|
ENV NSS_WRAPPER_PASSWD /tmp/passwd
|
||||||
|
ENV NSS_WRAPPER_GROUP /tmp/group
|
||||||
|
|
||||||
|
# Install Dependencies
|
||||||
|
RUN dpkg --add-architecture i386 \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get upgrade -y \
|
||||||
|
&& apt-get install -y libgcc-10-dev libstdc++-10-dev libtinfo5 lib64z1 libcurl3-gnutls \
|
||||||
|
&& apt-get install -y libnss-wrapper gettext-base tar curl gcc g++ libc6 libtbb2 lib32z1 lib32gcc1 lib32stdc++6 libsdl2-2.0-0 libsdl2-2.0-0:i386 libtbb2:i386 lib32stdc++6 libtinfo5:i386 libncurses5:i386 libcurl3-gnutls:i386 \
|
||||||
|
&& useradd -m -d /home/container -s /bin/bash container \
|
||||||
|
&& touch ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \
|
||||||
|
&& chgrp 0 ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \
|
||||||
|
&& chmod g+rw ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP}
|
||||||
|
|
||||||
|
ADD passwd.template /passwd.template
|
||||||
|
|
||||||
|
USER container
|
||||||
|
ENV HOME /home/container
|
||||||
|
WORKDIR /home/container
|
||||||
|
|
||||||
|
COPY ./libnss_wrapper.so /libnss_wrapper.so
|
||||||
|
COPY ./libnss_wrapper_x64.so /libnss_wrapper_x64.so
|
||||||
|
COPY ./entrypoint.sh /entrypoint.sh
|
||||||
|
CMD ["/bin/bash", "/entrypoint.sh"]
|
21
games/arma3/LICENSE.txt
Normal file
21
games/arma3/LICENSE.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017-2021 Pterodactyl Software
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
321
games/arma3/entrypoint.sh
Normal file
321
games/arma3/entrypoint.sh
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
## File: Pterodactyl Arma 3 Image - entrypoint.sh
|
||||||
|
## Author: David Wolfe (Red-Thirten)
|
||||||
|
## Date: 2021/07/11
|
||||||
|
## License: MIT License
|
||||||
|
|
||||||
|
## === CONSTANTS ===
|
||||||
|
STEAMCMD_DIR="./steamcmd" # SteamCMD's directory containing steamcmd.sh
|
||||||
|
STEAMCMD_LOG="${STEAMCMD_DIR}/steamcmd.log" # Log file for SteamCMD
|
||||||
|
GAME_ID=107410 # SteamCMD ID for the Arma 3 GAME (not server). Only used for Workshop mod downloads.
|
||||||
|
EGG_URL='https://github.com/parkervcp/eggs/tree/master/game_eggs/steamcmd_servers/arma/arma3' # URL for Pterodactyl Egg & Info (only used as info to legacy users)
|
||||||
|
|
||||||
|
# Color Codes
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
## === ENVIRONMENT VARS ===
|
||||||
|
# STARTUP, STARTUP_PARAMS, STEAM_USER, STEAM_PASS, SERVER_BINARY, MOD_FILE, MODIFICATIONS, SERVERMODS, UPDATE_SERVER, CLEAR_CACHE, VALIDATE_SERVER, MODS_LOWERCASE, STEAMCMD_EXTRA_FLAGS, CDLC, STEAMCMD_APPID, HC_NUM, SERVER_PASSWORD, HC_HIDE, STEAMCMD_ATTEMPTS, BASIC_URL, DISABLE_MOD_UPDATES
|
||||||
|
|
||||||
|
## === GLOBAL VARS ===
|
||||||
|
# validateServer, extraFlags, updateAttempt, modifiedStartup, allMods, CLIENT_MODS
|
||||||
|
|
||||||
|
## === DEFINE FUNCTIONS ===
|
||||||
|
#
|
||||||
|
# Runs SteamCMD with specified variables and performs error handling.
|
||||||
|
function RunSteamCMD { #[Input: int server=0 mod=1; int id]
|
||||||
|
# Clear previous SteamCMD log
|
||||||
|
if [[ -f "${STEAMCMD_LOG}" ]]; then
|
||||||
|
rm -f "${STEAMCMD_LOG:?}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
updateAttempt=0
|
||||||
|
while (( $updateAttempt < $STEAMCMD_ATTEMPTS )); do # Loop for specified number of attempts
|
||||||
|
# Increment attempt counter
|
||||||
|
updateAttempt=$((updateAttempt+1))
|
||||||
|
|
||||||
|
if (( $updateAttempt > 1 )); then # Notify if not first attempt
|
||||||
|
echo -e "\t${YELLOW}Re-Attempting download/update in 3 seconds...${NC} (Attempt ${CYAN}${updateAttempt}${NC} of ${CYAN}${STEAMCMD_ATTEMPTS}${NC})\n"
|
||||||
|
sleep 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if updating server or mod
|
||||||
|
if [[ $1 == 0 ]]; then # Server
|
||||||
|
${STEAMCMD_DIR}/steamcmd.sh "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +force_install_dir /home/container +app_update $2 $extraFlags $validateServer +quit | tee -a "${STEAMCMD_LOG}"
|
||||||
|
else # Mod
|
||||||
|
${STEAMCMD_DIR}/steamcmd.sh "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +workshop_download_item $GAME_ID $2 +quit | tee -a "${STEAMCMD_LOG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Error checking for SteamCMD
|
||||||
|
steamcmdExitCode=${PIPESTATUS[0]}
|
||||||
|
if [[ -n $(grep -i "error\|failed" "${STEAMCMD_LOG}" | grep -iv "setlocal\|SDL") ]]; then # Catch errors (ignore setlocale and SDL warnings)
|
||||||
|
# Soft errors
|
||||||
|
if [[ -n $(grep -i "Timeout downloading item" "${STEAMCMD_LOG}") ]]; then # Mod download timeout
|
||||||
|
echo -e "\n${YELLOW}[UPDATE]: ${NC}Timeout downloading Steam Workshop mod: \"${CYAN}${modName}${NC}\" (${CYAN}${2}${NC})"
|
||||||
|
echo -e "\t(This is expected for particularly large mods)"
|
||||||
|
elif [[ -n $(grep -i "0x402\|0x6\|0x602" "${STEAMCMD_LOG}") ]]; then # Connection issue with Steam
|
||||||
|
echo -e "\n${YELLOW}[UPDATE]: ${NC}Connection issue with Steam servers."
|
||||||
|
echo -e "\t(Steam servers may currently be down, or a connection cannot be made reliably)"
|
||||||
|
# Hard errors
|
||||||
|
elif [[ -n $(grep -i "Password check for AppId" "${STEAMCMD_LOG}") ]]; then # Incorrect beta branch password
|
||||||
|
echo -e "\n${RED}[UPDATE]: ${YELLOW}Incorrect password given for beta branch. ${CYAN}Skipping download...${NC}"
|
||||||
|
echo -e "\t(Check your \"[ADVANCED] EXTRA FLAGS FOR STEAMCMD\" startup parameter)"
|
||||||
|
break
|
||||||
|
# Fatal errors
|
||||||
|
elif [[ -n $(grep -i "Invalid Password\|two-factor\|No subscription" "${STEAMCMD_LOG}") ]]; then # Wrong username/password, Steam Guard is turned on, or host is using anonymous account
|
||||||
|
echo -e "\n${RED}[UPDATE]: Cannot login to Steam - Improperly configured account and/or credentials"
|
||||||
|
echo -e "\t${YELLOW}Please contact your administrator/host and give them the following message:${NC}"
|
||||||
|
echo -e "\t${CYAN}Your Egg, or your client's server, is not configured with valid Steam credentials.${NC}"
|
||||||
|
echo -e "\t${CYAN}Either the username/password is wrong, or Steam Guard is not properly configured\n\taccording to this egg's documentation/README.${NC}\n"
|
||||||
|
exit 1
|
||||||
|
elif [[ -n $(grep -i "Download item" "${STEAMCMD_LOG}") ]]; then # Steam account does not own base game for mod downloads, or unknown
|
||||||
|
echo -e "\n${RED}[UPDATE]: Cannot download mod - Download failed"
|
||||||
|
echo -e "\t${YELLOW}While unknown, this error is likely due to your host's Steam account not owning the base game.${NC}"
|
||||||
|
echo -e "\t${YELLOW}(Please contact your administrator/host if this issue persists)${NC}\n"
|
||||||
|
exit 1
|
||||||
|
elif [[ -n $(grep -i "0x202\|0x212" "${STEAMCMD_LOG}") ]]; then # Not enough disk space
|
||||||
|
echo -e "\n${RED}[UPDATE]: Unable to complete download - Not enough storage"
|
||||||
|
echo -e "\t${YELLOW}You have run out of your allotted disk space.${NC}"
|
||||||
|
echo -e "\t${YELLOW}Please contact your administrator/host for potential storage upgrades.${NC}\n"
|
||||||
|
exit 1
|
||||||
|
elif [[ -n $(grep -i "0x606" "${STEAMCMD_LOG}") ]]; then # Disk write failure
|
||||||
|
echo -e "\n${RED}[UPDATE]: Unable to complete download - Disk write failure"
|
||||||
|
echo -e "\t${YELLOW}This is normally caused by directory permissions issues,\n\tbut could be a more serious hardware issue.${NC}"
|
||||||
|
echo -e "\t${YELLOW}(Please contact your administrator/host if this issue persists)${NC}\n"
|
||||||
|
exit 1
|
||||||
|
else # Unknown caught error
|
||||||
|
echo -e "\n${RED}[UPDATE]: ${YELLOW}An unknown error has occurred with SteamCMD. ${CYAN}Skipping download...${NC}"
|
||||||
|
echo -e "\t(Please contact your administrator/host if this issue persists)"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
elif [[ $steamcmdExitCode != 0 ]]; then # Unknown fatal error
|
||||||
|
echo -e "\n${RED}[UPDATE]: SteamCMD has crashed for an unknown reason!${NC} (Exit code: ${CYAN}${steamcmdExitCode}${NC})"
|
||||||
|
echo -e "\t${YELLOW}(Please contact your administrator/host for support)${NC}\n"
|
||||||
|
exit $steamcmdExitCode
|
||||||
|
else # Success!
|
||||||
|
if [[ $1 == 0 ]]; then # Server
|
||||||
|
echo -e "\n${GREEN}[UPDATE]: Game server is up to date!${NC}"
|
||||||
|
else # Mod
|
||||||
|
echo -e "\n${GREEN}[UPDATE]: Mod download/update successful!${NC}"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if (( $updateAttempt == $STEAMCMD_ATTEMPTS )); then # Notify if failed last attempt
|
||||||
|
if [[ $1 == 0 ]]; then # Server
|
||||||
|
echo -e "\t${RED}Final attempt made! ${YELLOW}Unable to complete game server update. ${CYAN}Skipping...${NC}"
|
||||||
|
echo -e "\t(Please try again at a later time)"
|
||||||
|
sleep 3
|
||||||
|
else # Mod
|
||||||
|
echo -e "\t${RED}Final attempt made! ${YELLOW}Unable to complete mod download/update. ${CYAN}Skipping...${NC}"
|
||||||
|
echo -e "\t(You may try again later, or manually upload this mod to your server via SFTP)"
|
||||||
|
sleep 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Takes a directory (string) as input, and recursively makes all files & folders lowercase.
|
||||||
|
function ModsLowercase {
|
||||||
|
echo -e "\n${GREEN}[STARTUP]:${NC} Making mod ${CYAN}$1${NC} files/folders lowercase..."
|
||||||
|
for SRC in `find ./$1 -depth`
|
||||||
|
do
|
||||||
|
DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
|
||||||
|
if [ "${SRC}" != "${DST}" ]
|
||||||
|
then
|
||||||
|
[ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Removes duplicate items from a semicolon delimited string
|
||||||
|
function RemoveDuplicates { #[Input: str - Output: printf of new str]
|
||||||
|
echo $1 | sed -e 's/;/\n/g' | sort -u | xargs printf '%s;'
|
||||||
|
}
|
||||||
|
|
||||||
|
# === ENTRYPOINT START ===
|
||||||
|
cd /home/container
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# Check for old eggs
|
||||||
|
if [[ -z ${VALIDATE_SERVER} ]]; then # VALIDATE_SERVER was not in the previous version
|
||||||
|
echo -e "\n${RED}[STARTUP_ERR]: Please contact your administrator/host for support, and give them the following message:${NC}\n"
|
||||||
|
echo -e "\t${CYAN}Your Arma 3 Egg is outdated and no longer supported.${NC}"
|
||||||
|
echo -e "\t${CYAN}Please download the latest version at the following link, and install it in your panel:${NC}"
|
||||||
|
echo -e "\t${CYAN}${EGG_URL}${NC}\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect and parse all specified mods
|
||||||
|
if [[ -n ${MODIFICATIONS} ]] && [[ ${MODIFICATIONS} != *\; ]]; then # Add manually specified mods to the client-side mods list, while checking for trailing semicolon
|
||||||
|
CLIENT_MODS="${MODIFICATIONS};"
|
||||||
|
else
|
||||||
|
CLIENT_MODS=${MODIFICATIONS}
|
||||||
|
fi
|
||||||
|
if [[ -f ${MOD_FILE} ]] && [[ -n "$(cat ${MOD_FILE} | grep 'Created by Arma 3 Launcher')" ]]; then # If the mod list file exists and is valid, parse and add mods to the client-side mods list
|
||||||
|
CLIENT_MODS+=$(cat ${MOD_FILE} | grep 'id=' | cut -d'=' -f3 | cut -d'"' -f1 | xargs printf '@%s;')
|
||||||
|
elif [[ -n "${MOD_FILE}" ]]; then # If MOD_FILE is not null, warn user file is missing or invalid
|
||||||
|
echo -e "\n${YELLOW}[STARTUP_WARN]: Arma 3 Modlist file \"${CYAN}${MOD_FILE}${YELLOW}\" could not be found, or is invalid!${NC}"
|
||||||
|
echo -e "\tEnsure your uploaded modlist's file name matches your Startup Parameter."
|
||||||
|
echo -e "\tOnly files exported from an Arma 3 Launcher are permitted."
|
||||||
|
if [[ -n "${CLIENT_MODS}" ]]; then
|
||||||
|
echo -e "\t${CYAN}Reverting to the manual mod list...${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ -n ${SERVERMODS} ]] && [[ ${SERVERMODS} != *\; ]]; then # Add server mods to the master mods list, while checking for trailing semicolon
|
||||||
|
allMods="${SERVERMODS};"
|
||||||
|
else
|
||||||
|
allMods=${SERVERMODS}
|
||||||
|
fi
|
||||||
|
allMods+=$CLIENT_MODS # Add all client-side mods to the master mod list
|
||||||
|
CLIENT_MODS=$(RemoveDuplicates ${CLIENT_MODS}) # Remove duplicate mods from CLIENT_MODS, if present
|
||||||
|
allMods=$(RemoveDuplicates ${allMods}) # Remove duplicate mods from allMods, if present
|
||||||
|
allMods=$(echo $allMods | sed -e 's/;/ /g') # Convert from string to array
|
||||||
|
|
||||||
|
# Update everything (server and mods), if specified
|
||||||
|
if [[ ${UPDATE_SERVER} == 1 ]]; then
|
||||||
|
echo -e "\n${GREEN}[STARTUP]: ${CYAN}Starting checks for all updates...${NC}"
|
||||||
|
echo -e "(It is okay to ignore any \"SDL\" errors during this process)\n"
|
||||||
|
|
||||||
|
## Update game server
|
||||||
|
echo -e "${GREEN}[UPDATE]:${NC} Checking for game server updates with App ID: ${CYAN}${STEAMCMD_APPID}${NC}..."
|
||||||
|
|
||||||
|
if [[ ${VALIDATE_SERVER} == 1 ]]; then # Validate will be added as a parameter if specified
|
||||||
|
echo -e "\t${CYAN}File validation enabled.${NC} (This may take extra time to complete)"
|
||||||
|
validateServer="validate"
|
||||||
|
else
|
||||||
|
validateServer=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Determine what extra flags should be set
|
||||||
|
if [[ -n ${STEAMCMD_EXTRA_FLAGS} ]]; then
|
||||||
|
echo -e "\t(${YELLOW}Advanced${NC}) Extra SteamCMD flags specified: ${CYAN}${STEAMCMD_EXTRA_FLAGS}${NC}\n"
|
||||||
|
extraFlags=${STEAMCMD_EXTRA_FLAGS}
|
||||||
|
elif [[ ${CDLC} == 1 ]]; then
|
||||||
|
echo -e "\t${CYAN}Download/Update Creator DLC server files enabled.${NC}\n"
|
||||||
|
extraFlags="-beta creatordlc"
|
||||||
|
else
|
||||||
|
echo -e ""
|
||||||
|
extraFlags=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
RunSteamCMD 0 ${STEAMCMD_APPID}
|
||||||
|
|
||||||
|
## Update mods
|
||||||
|
if [[ -n $allMods ]] && [[ ${DISABLE_MOD_UPDATES} != 1 ]]; then
|
||||||
|
echo -e "\n${GREEN}[UPDATE]:${NC} Checking all ${CYAN}Steam Workshop mods${NC} for updates..."
|
||||||
|
for modID in $(echo $allMods | sed -e 's/@//g')
|
||||||
|
do
|
||||||
|
if [[ $modID =~ ^[0-9]+$ ]]; then # Only check mods that are in ID-form
|
||||||
|
# Get mod's latest update in epoch time from its Steam Workshop changelog page
|
||||||
|
latestUpdate=$(curl -sL https://steamcommunity.com/sharedfiles/filedetails/changelog/$modID | grep '<p id=' | head -1 | cut -d'"' -f2)
|
||||||
|
# If the update time is valid and newer than the local directory's creation date, or the mod hasn't been downloaded yet, download the mod
|
||||||
|
if [[ ! -d @$modID ]] || [[ ( -n $latestUpdate ) && ( $latestUpdate =~ ^[0-9]+$ ) && ( $latestUpdate > $(find @$modID | head -1 | xargs stat -c%Z) ) ]]; then
|
||||||
|
# Get the mod's name from the Workshop page as well
|
||||||
|
modName=$(curl -sL https://steamcommunity.com/sharedfiles/filedetails/changelog/$modID | grep 'workshopItemTitle' | cut -d'>' -f2 | cut -d'<' -f1)
|
||||||
|
if [[ -z $modName ]]; then # Set default name if unavailable
|
||||||
|
modName="[NAME UNAVAILABLE]"
|
||||||
|
fi
|
||||||
|
if [[ ! -d @$modID ]]; then
|
||||||
|
echo -e "${GREEN}[UPDATE]:${NC} Downloading new Mod: \"${CYAN}${modName}${NC}\" (${CYAN}${modID}${NC})"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}[UPDATE]:${NC} Mod update found for: \"${CYAN}${modName}${NC}\" (${CYAN}${modID}${NC})"
|
||||||
|
fi
|
||||||
|
if [[ -n $latestUpdate ]] && [[ $latestUpdate =~ ^[0-9]+$ ]]; then # Notify last update date, if valid
|
||||||
|
echo -e "\tMod was last updated: ${CYAN}$(date -d @${latestUpdate})${NC}"
|
||||||
|
fi
|
||||||
|
echo -e "\tAttempting mod update/download via SteamCMD...\n"
|
||||||
|
RunSteamCMD 1 $modID
|
||||||
|
# Move the downloaded mod to the root directory, and replace existing mod if needed
|
||||||
|
mkdir -p ./@$modID
|
||||||
|
rm -rf ./@$modID/*
|
||||||
|
mv -f ./Steam/steamapps/workshop/content/$GAME_ID/$modID/* ./@$modID
|
||||||
|
rm -d ./Steam/steamapps/workshop/content/$GAME_ID/$modID
|
||||||
|
# Make the mods contents all lowercase
|
||||||
|
ModsLowercase @$modID
|
||||||
|
# Move any .bikey's to the keys directory
|
||||||
|
echo -e "${GREEN}[UPDATE]:${NC} Moving any mod .bikey files to the ~/keys/ folder...\n"
|
||||||
|
find ./@$modID -name "*.bikey" -type f -exec cp {} ./keys \;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo -e "${GREEN}[UPDATE]:${NC} Steam Workshop mod update check ${GREEN}complete${NC}!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if specified server binary exists.
|
||||||
|
if [[ ! -f ./${SERVER_BINARY} ]]; then
|
||||||
|
echo -e "\n${RED}[STARTUP_ERR]: Specified Arma 3 server binary could not be found in the root directory!${NC}"
|
||||||
|
echo -e "${YELLOW}Please do the following to resolve this issue:${NC}"
|
||||||
|
echo -e "\t${CYAN}- Double check your \"Server Binary\" Startup Variable is correct.${NC}"
|
||||||
|
echo -e "\t${CYAN}- Ensure your server has properly installed/updated without errors (reinstalling/updating again may help).${NC}"
|
||||||
|
echo -e "\t${CYAN}- Use the File Manager to check that your specified server binary file is not missing from the root directory.${NC}\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make mods lowercase, if specified
|
||||||
|
if [[ ${MODS_LOWERCASE} == "1" ]]; then
|
||||||
|
for modDir in $allMods
|
||||||
|
do
|
||||||
|
ModsLowercase $modDir
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clear HC cache, if specified
|
||||||
|
if [[ ${CLEAR_CACHE} == "1" ]]; then
|
||||||
|
echo -e "\n${GREEN}[STARTUP]: ${CYAN}Clearing Headless Client profiles cache...${NC}"
|
||||||
|
for profileDir in ./serverprofile/home/*
|
||||||
|
do
|
||||||
|
[ "$profileDir" = "./serverprofile/home/Player" ] && continue
|
||||||
|
rm -rf $profileDir
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if basic.cfg exists, and download if not (Arma really doesn't like it missing for some reason)
|
||||||
|
if [[ ! -f ./basic.cfg ]]; then
|
||||||
|
echo -e "\n${YELLOW}[STARTUP_WARN]: Basic Network Configuration file \"${CYAN}basic.cfg${YELLOW}\" is missing!${NC}"
|
||||||
|
echo -e "\t${YELLOW}Downloading default file for use instead...${NC}"
|
||||||
|
curl -sSL ${BASIC_URL} -o ./basic.cfg
|
||||||
|
fi
|
||||||
|
|
||||||
|
# $NSS_WRAPPER_PASSWD and $NSS_WRAPPER_GROUP have been set by the Dockerfile
|
||||||
|
export USER_ID=$(id -u)
|
||||||
|
export GROUP_ID=$(id -g)
|
||||||
|
envsubst < /passwd.template > ${NSS_WRAPPER_PASSWD}
|
||||||
|
|
||||||
|
if [[ ${SERVER_BINARY} == *"x64"* ]]; then # Check which libnss_wrapper architecture to run, based off the server binary name
|
||||||
|
export LD_PRELOAD=/libnss_wrapper_x64.so
|
||||||
|
else
|
||||||
|
export LD_PRELOAD=/libnss_wrapper.so
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Replace Startup Variables
|
||||||
|
modifiedStartup=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')`
|
||||||
|
|
||||||
|
# Start Headless Clients if applicable
|
||||||
|
if [[ ${HC_NUM} > 0 ]]; then
|
||||||
|
echo -e "\n${GREEN}[STARTUP]:${NC} Starting ${CYAN}${HC_NUM}${NC} Headless Client(s)."
|
||||||
|
for i in $(seq ${HC_NUM})
|
||||||
|
do
|
||||||
|
if [[ ${HC_HIDE} == "1" ]];
|
||||||
|
then
|
||||||
|
./${SERVER_BINARY} -client -connect=127.0.0.1 -port=${SERVER_PORT} -password="${SERVER_PASSWORD}" -profiles=./serverprofile -bepath=./battleye -mod="${CLIENT_MODS}" ${STARTUP_PARAMS} > /dev/null 2>&1 &
|
||||||
|
else
|
||||||
|
./${SERVER_BINARY} -client -connect=127.0.0.1 -port=${SERVER_PORT} -password="${SERVER_PASSWORD}" -profiles=./serverprofile -bepath=./battleye -mod="${CLIENT_MODS}" ${STARTUP_PARAMS} &
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}[STARTUP]:${CYAN} Headless Client $i${NC} launched."
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start the Server
|
||||||
|
echo -e "\n${GREEN}[STARTUP]:${NC} Starting server with the following startup command:"
|
||||||
|
echo -e "${CYAN}${modifiedStartup}${NC}\n"
|
||||||
|
${modifiedStartup}
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "\n${RED}PTDL_CONTAINER_ERR: There was an error while attempting to run the start command.${NC}\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
BIN
games/arma3/libnss_wrapper.so
Normal file
BIN
games/arma3/libnss_wrapper.so
Normal file
Binary file not shown.
BIN
games/arma3/libnss_wrapper_x64.so
Normal file
BIN
games/arma3/libnss_wrapper_x64.so
Normal file
Binary file not shown.
26
games/arma3/passwd.template
Normal file
26
games/arma3/passwd.template
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
root:x:0:0:root:/root:/bin/bash
|
||||||
|
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
|
||||||
|
bin:x:2:2:bin:/bin:/usr/sbin/nologin
|
||||||
|
sys:x:3:3:sys:/dev:/usr/sbin/nologin
|
||||||
|
sync:x:4:65534:sync:/bin:/bin/sync
|
||||||
|
games:x:5:60:games:/usr/games:/usr/sbin/nologin
|
||||||
|
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
|
||||||
|
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
|
||||||
|
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
|
||||||
|
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
|
||||||
|
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
|
||||||
|
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
|
||||||
|
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
|
||||||
|
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
|
||||||
|
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
|
||||||
|
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
|
||||||
|
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
|
||||||
|
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
|
||||||
|
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
|
||||||
|
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
|
||||||
|
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
|
||||||
|
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
|
||||||
|
syslog:x:104:108::/home/syslog:/bin/false
|
||||||
|
messagebus:x:106:109::/var/run/dbus:/bin/false
|
||||||
|
bind:x:108:112::/var/cache/bind:/bin/false
|
||||||
|
${USER_NAME}:x:${USER_ID}:${GROUP_ID}:${USER_NAME}:${HOME}:/bin/bash
|
Reference in New Issue
Block a user