-
Notifications
You must be signed in to change notification settings - Fork 0
/
userdata.sh
201 lines (152 loc) · 5.3 KB
/
userdata.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
#!/bin/bash
# Creates Minecraft service user account
sudo adduser --disabled-password --gecos 'User for running and managing Minecraft servers' minecraft
sudo echo "minecraft ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
sudo apt update # Updates apt repository
sudo apt install openjdk-17-jre-headless -y # Installs java
# Tests that Java was installed successfully and is executable
if ! [ -x "$(command -v java)" ]; then
logger "Java was not installed, exiting."
exit 1
else
logger "Java was installed successfully."
fi
# Change directories into newly created minecraft user's home directory
cd /home/minecraft
# Pulls in eula & server.properties
git clone https://github.com/jacob-howe/mc-server.git
# Tests that mc-server was cloned successfully
GIT_CLONE_CHECK=$(ls | wc -l)
if [ $GIT_CLONE_CHECK -gt 0 ]; then
logger "Minecraft server files were cloned successfully."
else
logger "Unable to clone Minecraft server files"
exit 1
fi
# Change directories into freshly pulled mc-server
cd mc-server/
# Downloads Minecraft Server 1.20.1
wget https://piston-data.mojang.com/v1/objects/84194a2f286ef7c14ed7ce0090dba59902951553/server.jar
# Gives ownership of newly pulled directory to Minecraft user
chown -R minecraft:minecraft .
chmod a+x *.sh
# Creates service for Minecraft Server
sudo echo '[Unit]
Description=A dedicated Minecraft server
Wants=network.target
After=local-fs.target network.target
[Service]
User=minecraft
Group=minecraft
UMask=0027
# EnvironmentFile=/etc/conf.d/minecraft
KillMode=none
SuccessExitStatus=0 1 255
ExecStart=/home/minecraft/start_minecraft.sh
# ExecStop=/usr/bin/mcrcon -H localhost -p ${RCON_PASSWD} stop
[Install]
WantedBy=multi-user.target' > /etc/systemd/system/minecraft.service
# Setting perms on minecraft.service
sudo chmod 644 /etc/systemd/system/minecraft.service
# Creates start up script for Minecraft Server Service
sudo echo '#!/bin/bash
cd /home/minecraft/mc-server
java -Xmx3072M -Xms512M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar server.jar nogu
java -Xms1024M -Xmx3072M -XX:ParallelGCThreads=1 -jar server.jar nogui
' > /home/minecraft/start_minecraft.sh
# Creates service for our Player Check
sudo echo '[Unit]
Description=Checks for online players
Wants=network.target
After=local-fs.target network.target minecraft.service
[Service]
User=minecraft
Group=minecraft
UMask=0027
KillMode=none
SuccessExitStatus=0 1 255
ExecStart=/home/minecraft/player_check.sh
[Install]
WantedBy=multi-user.target' > /etc/systemd/system/player_check.service
# Setting perms on player_check.service
sudo chmod 644 /etc/systemd/system/player_check.service
# Creates service for our Service Check
sudo echo '[Unit]
Description=Serves status of Minecraft over port 7777
Wants=network.target
After=local-fs.target network.target minecraft.service
[Service]
User=minecraft
Group=minecraft
UMask=0027
KillMode=none
SuccessExitStatus=0 1 255
ExecStart=/home/minecraft/service_check.sh
[Install]
WantedBy=multi-user.target' > /etc/systemd/system/service_check.service
# Setting perms on service_check.service
sudo chmod 644 /etc/systemd/system/service_check.service
sudo echo '#!/bin/bash
set -e
cd /home/minecraft
touch .online_users
touch .start_minecraft
sudo chown -R minecraft:minecraft .
while true; do
logger "Player check loop has begun, or started anew!"
logger "Calculating current number of online users via lsof on port 25565, sleeping for 5 seconds"
lsof -iTCP:25565 -sTCP:ESTABLISHED > .online_users &
sleep 5
logger "Setting current number of online users online by reading .online_users"
NUMLINES=$(wc -l < .online_users)
NUMUSERS=$(($NUMLINES - 1))
logger "Setting max timeout to be 120 seconds"
TIMEOUTMAX=$((SECONDS+120))
if [ $NUMUSERS -gt 0 ]
then
logger "There are $NUMUSERS online right now! Checking again in 30 seconds..."
sleep 30
else
logger "There are $NUMUSERS online right now, shutting down in 120 seconds unless someone comes online"
while [ $SECONDS -lt $TIMEOUTMAX ] && [ $NUMUSERS -lt 1 ] ;
do
logger "Checking to see if anyone has come online..."
lsof -iTCP:25565 -sTCP:ESTABLISHED > .online_users &
sleep 5
NUMUSERS=$(wc -l < .online_users)
if [ $NUMUSERS -gt 0 ]
then
logger "Someone came online. There are $NUMUSERS players online right now."
continue 2
fi
done
break
fi
done
logger "Stopping Minecraft..."
killall java
sleep 30
if pgrep -x java >/dev/null
then
logger "There was an issue while killing the java service"
else
logger "Minecraft server stopped successfully"
fi
logger "Shutting down Server in 1 minute..."
sudo shutdown' > /home/minecraft/player_check.sh
sudo echo '#!/bin/bash
set -e
cd /home/minecraft/mc-server
sudo chmod a+x service-check
bash -c "./service-check -svc minecraft.service -p 7777"
' > /home/minecraft/service_check.sh
# Enable all services so that they run on reboot
sudo systemctl enable minecraft
sudo systemctl enable player_check
sudo systemctl enable service_check
# Makes shell scripts executable in mc-server/
chmod a+x /home/minecraft/*.sh
# Start the services
sudo systemctl start minecraft
sudo systemctl start player_check
sudo systemctl start service_check