-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathrun.sh
executable file
·213 lines (183 loc) · 7.88 KB
/
run.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#!/usr/bin/env bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
REPODIR="$(dirname "$SCRIPTDIR")"
ARKSERVER=${ARKSERVER_SHARED:-"/ark/server"}
# always fail script if a cmd fails
set -eo pipefail
echo "###########################################################################"
echo "# Ark Server - " `date`
echo "###########################################################################"
echo "Ensuring correct permissions..."
sudo find /ark -not -user steam -o -not -group steam -exec chown -v steam:steam {} \;
sudo find /home/steam -not -user steam -o -not -group steam -exec chown -v steam:steam {} \;
if [ -n "$ARKSERVER_SHARED" ]; then
# directory is created when something is mounted to 'Saved'
[ -d "$ARKSERVER_SHARED/ShooterGame" ] && sudo chown steam:steam $ARKSERVER_SHARED/ShooterGame
echo "Shared server files in $ARKSERVER_SHARED..."
if [ -z "$(mount | grep "on $ARKSERVER_SHARED/ShooterGame/Saved ")" ]; then
echo "===> ABORT !"
echo "You seem to be using a shared server directory: '$ARKSERVER_SHARED'"
echo "But you have NOT mounted your game instance saved directory to '$ARKSERVER_SHARED/ShooterGame/Saved'"
exit 1
fi
# Shared server files does not support staging directory
export am_arkStagingDir=
fi
if [ "$ARKCLUSTER" = "true" ]; then
# directory is created when something is mounted to 'clusters'
[ -d "$ARKSERVER/ShooterGame/Saved" ] && sudo chown steam:steam $ARKSERVER/ShooterGame/Saved
echo "Shared clusters files in $ARKSERVER/ShooterGame/Saved/clusters..."
if [ -z "$(mount | grep "on $ARKSERVER/ShooterGame/Saved/clusters ")" ]; then
echo "===> ABORT !"
echo "You seem to using ARKCLUSTER=true"
echo "But you have NOT mounted your shared clusters directory to '$ARKSERVER/ShooterGame/Saved/clusters'"
exit 1
fi
fi
# Remove arkmanager tracking files if they exist
# They can cause issues with starting the server multiple times
# due to the restart command not completing when the container exits
echo "Cleaning up any leftover arkmanager files..."
[ -f $ARKSERVER/ShooterGame/Saved/.ark-warn-main.lock ] && rm -rf $ARKSERVER/ShooterGame/Saved/.ark-warn-main.lock
[ -f $ARKSERVER/ShooterGame/Saved/.ark-update.lock ] && rm -rf $ARKSERVER/ShooterGame/Saved/.ark-update.lock
[ -f $ARKSERVER/ShooterGame/Saved/.ark-update.time ] && rm -rf $ARKSERVER/ShooterGame/Saved/.ark-update.time
[ -f $ARKSERVER/ShooterGame/Saved/.arkmanager-main.pid ] && rm -rf $ARKSERVER/ShooterGame/Saved/.arkmanager-main.pid
[ -f $ARKSERVER/ShooterGame/Saved/.arkserver-main.pid ] && rm -rf $ARKSERVER/ShooterGame/Saved/.arkserver-main.pid
[ -f $ARKSERVER/ShooterGame/Saved/.autorestart ] && rm -rf $ARKSERVER/ShooterGame/Saved/.autorestart
[ -f $ARKSERVER/ShooterGame/Saved/.autorestart-main ] && rm -rf $ARKSERVER/ShooterGame/Saved/.autorestart-main
# Create directories if they don't exist
[ ! -d /ark/config ] && mkdir /ark/config
[ ! -d /ark/log ] && mkdir /ark/log
[ ! -d /ark/backup ] && mkdir /ark/backup
[ ! -d /ark/staging ] && mkdir /ark/staging
if [ ! -d $ARKSERVER/ShooterGame/Binaries ]; then
echo "No game files found. Preparing for install..."
mkdir -p $ARKSERVER/ShooterGame
mkdir -p $ARKSERVER/ShooterGame/Saved/Config/LinuxServer
mkdir -p $ARKSERVER/ShooterGame/Saved/$am_ark_AltSaveDirectoryName
mkdir -p $ARKSERVER/ShooterGame/Content/Mods
mkdir -p $ARKSERVER/ShooterGame/Binaries/Linux/
fi
echo "Creating arkmanager.cfg from environment variables..."
echo -e "# Ark Server Tools - arkmanager config\n# Generated from container environment variables\n\n" > /ark/config/arkmanager.cfg
if [ -f /ark/config/arkmanager_base.cfg ]; then
cat /ark/config/arkmanager_base.cfg >> /ark/config/arkmanager.cfg
fi
echo -e "\n\narkserverroot=\"$ARKSERVER\"\n" >> /ark/config/arkmanager.cfg
printenv | sed -n -r 's/am_(.*)=(.*)/\1=\"\2\"/ip' >> /ark/config/arkmanager.cfg
if [ ! -f /ark/config/crontab ]; then
echo "Creating crontab..."
cat << EOF >> /ark/config/crontab
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# Examples for Ark:
# 0 * * * * arkmanager update # update every hour
# */15 * * * * arkmanager backup # backup every 15min
# 0 0 * * * arkmanager backup # backup every day at midnight
*/30 * * * * arkmanager update --update-mods --warn --saveworld
10 */8 * * * arkmanager saveworld && arkmanager backup
15 10 * * * arkmanager restart --warn --saveworld
EOF
fi
# If there is uncommented line in the file
CRONNUMBER=`grep -v "^#" /ark/config/crontab | wc -l`
if [ $CRONNUMBER -gt 0 ]; then
echo "Starting cron service..."
sudo service cron start
echo "Loading crontab..."
# We load the crontab file if it exist.
crontab /ark/config/crontab
else
echo "No crontab set."
fi
# Create symlinks for configs
[ -f /ark/config/AllowedCheaterSteamIDs.txt ] && ln -sf /ark/config/AllowedCheaterSteamIDs.txt $ARKSERVER/ShooterGame/Saved/AllowedCheaterSteamIDs.txt
[ -f /ark/config/Engine.ini ] && ln -sf /ark/config/Engine.ini $ARKSERVER/ShooterGame/Saved/Config/LinuxServer/Engine.ini
[ -f /ark/config/Game.ini ] && ln -sf /ark/config/Game.ini $ARKSERVER/ShooterGame/Saved/Config/LinuxServer/Game.ini
[ -f /ark/config/GameUserSettings.ini ] && ln -sf /ark/config/GameUserSettings.ini $ARKSERVER/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini
if [ "$VALIDATE_SAVE_EXISTS" = "true" -a ! -z "$am_serverMap" ]; then
savepath="$ARKSERVER/ShooterGame/Saved/$am_ark_AltSaveDirectoryName"
savefile="$am_serverMap.ark"
echo "Validating that a save file exists for $am_serverMap"
echo "Checking $savepath"
if [! -f "$savepath/$savefile" ]; then
echo "$savefile not found!"
echo "Attempting to notify via Discord..."
arkmanager notify "Critical error: unable to find $savefile in $savepath!"
# wait on failure so we don't spam docker logs
sleep 5m
exit 1
else
echo "$savefile found."
fi
else
echo "Save file validation is not enabled."
fi
if [ "$BACKUP_ONSTART" = "true" ]; then
echo "Backing up on start..."
arkmanager backup
else
echo "Backup on start is not enabled."
fi
function stop {
arkmanager broadcast "Server is shutting down"
arkmanager notify "Server is shutting down"
arkmanager stop
exit 0
}
# Stop server in case of signal INT, QUIT or TERM
# enable job control to catch signals
set -m
trap stop INT QUIT TERM
# log from RCON to stdout
if [ $LOG_RCONCHAT -gt 0 ]; then
bash -c ./log.sh &
fi
if [ "$LIST_MOUNTS" = "true" ]; then
echo "LIST Mounts:"
echo "ARKSERVER_SHARED=$ARKSERVER_SHARED ARKCLUSTER=$ARKCLUSTER"
for d in /ark $ARKSERVER_SHARED $ARKSERVER/ShooterGame/Saved/ $ARKSERVER/ShooterGame/Saved/SavedArks; do
echo "--> $d"
ls -la $d
done
if [ "$ARKCLUSTER" = "true" ]; then
echo "--> $ARKSERVER/ShooterGame/Saved/clusters"
ls -la $ARKSERVER/ShooterGame/Saved/clusters
fi
mount | grep "on /ark"
exit 0
fi
if [ "$am_arkAutoUpdateOnStart" != "true" ]; then
echo -n "Waiting for ARK server to be updated: "
while (! arkmanager checkupdate); do
echo -n "."
sleep 10
done
echo
if [ -n "$am_ark_GameModIds" ]; then
echo -n "Waiting for mods to be updated: "
# requires arkmanager >= v1.6.62
while (arkmanager checkmodupdate --skip-workshop-dir); do
echo -n "."
sleep 10
done
echo
fi
fi
# fix for broken steamcmd app_info_print: execute install/update manually, checking for updates fails.
# https://github.com/ValveSoftware/steam-for-linux/issues/9683#issuecomment-1826928761
if [ ! -f "$ARKSERVER/steamapps/appmanifest_376030.acf" ]; then
arkmanager install
elif [ "$am_arkAutoUpdateOnStart" = "true" ]; then
arkmanager update --force --no-autostart
fi
# run in subshell, so it does not trap signals
(arkmanager start --no-background --verbose) &
arkmanpid=$!
wait $arkmanpid