Ich weiß nicht, ob es schon Script gibt, die eine autoupdatefunktion für Singleserverinstallationen implementieren.
Eine Einzelinstallation eines CS:GO-Server ist noch recht einfach zu verwalten.
Um -autoupdate bei CS:GO nutzen zu können, muss folgendes dem Startbefehl hinzugefügt werden:
|
Quellcode
|
1
|
-autoupdate -steam_dir /home/csgo/serverfiles_csgo/ -steamcmd_script /home/csgo/serverfiles_csgo/login
|
Der Pfad von -steam_dir zeigt auf das Installationsverzeichnis des neuen Updaters steamcmd von Valve. Dies erfordert zusätzlich die Nutzung eines Scripts für die steamcmd, welches durch -steamcmd_script festgelegt wird.
Der Inhalt der login sieht folgendermaßen aus:
|
Quellcode
|
1
2
3
4
|
login user pass
force_install_dir /home/csgo/servers/war1
app_update 740 validate
quit
|
Das funktioniert auch soweit. Provider werden sicherlich zur Zeit vor einem Problem stehen, dass sie ihre Server mithilfe eines Images updaten. Willkommen in der Steinzeit.
Mein erster Einfall war es im Script für "force_install_dir" einfach einen Punkt anzugeben. Ich hoffe, dass jedem geläufig ist, dass der Punkt ein Verweis auf das aktuelle Verzeichnis ist.
Leider sieht das Tool steamcmd das etwas anders:
|
Quellcode
|
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
|
Updating server using Steam.
----------------------------
./steam.sh: Zeile 53: ulimit: open files: Kann die Grenze nicht ändern: Die Operation ist nicht erlaubt
Installing breakpad exception handler for appid(steam)/version(1345857048)
[ 0%] Checking for available updates...
[ 0%] Download complete.
[----] Verifying installation...
unlinked 0 orphaned pipes
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam3...OK.
Loading Steam2...OK.
login xxx xxx
Logging in user 'xxx' to Steam Public...Success.
force_install_dir .
Please set the game install path to something other than the Steam install folder
app_update 740 validate
Initial App state (0x2) update required
App state (0x10102) reconfiguring, progress: -nan (0 / 0)
Error! App '740' state is 0x1 after update job.
quit
unlinked 0 orphaned pipes
CAsyncIOManager: 0 threads terminating. 0 reads, 0 writes, 0 deferrals.
CAsyncIOManager: 632 single object sleeps, 23 multi object sleeps
CAsyncIOManager: 0 single object alertable sleeps, 1 multi object alertable sleeps
----------------------------
|
Es sind gleich mehrere negative Sachen, die mir hier auffallen. Unter anderem wird der Login mit Passwort angezeigt. Wenn die steamcmd ausgeführt wird, wird das Verzeichnis zur steamcmd-Installation gewechselt. Aus diesem Grund kommt es zu dieser Fehlermeldung: "Please set the game install path to something other than the Steam install folder"
Ziemlich blöd, wenn 100 CS:GO Server nicht mehr aktuell sind und kein Admin um diese Uhrzeit erreichbar ist. Dann heißt es warten. Auch das erstellen individueller Scripts für jeden Kunden stelle ich mir ineffizient vor.
Bis Valve ein Update herausbringt, muss man wohl eine andere Lösung finden. Der einfachste Weg ist es eine steam.sh im Serververzeichnis zu erstellen, welche dann über das Image mit ausgeliefert wird.
Hier mal ein Beispiel, wie die Datei aussehen könnte:
|
Quellcode
|
1
2
3
4
5
6
7
|
steamsh=/home/csgo/serverfiles_csgo/steam.sh
loginfile=/home/csgo/serverfiles_csgo/login
#code
login="`cat $loginfile`"
installdir=`pwd`
STEAMEXE=steamcmd $steamsh +$login +force_install_dir $installdir +app_update 740 +quit
|
Es werden lediglich zwei Variablen im oberen Teil des Scriptes gesetzt. Die Variable 'steamsh' zeigt auf eine globale Installation von steamcmd, die jeder User auf dem Host nutzen kann (Zugriffsberechtigungen beachten). Zusätzlich wird der Login vor dem Kunden durch die Variable 'loginfile'
versteckt nur als Pfad zu einer Datei angezeigt. Die Datei beinhaltet nur die Loginzeile für steamcmd:
|
Quellcode
|
1
|
login user passwd
|
Da die erstellte steam.sh durch die srcds_run ausgeführt wird, kann man diesen Umstand nutzen und durch den Befehl 'pwd' das aktuelle Verzeichnis des gestarteten Servers ermitteln und für 'force_install_dir' übernehmen, welches dann an die steamcmd übergeben wird.
Damit Die Autoupdate-Funktion funktioniert muss noch folgendes zum Startbefehl hinzugefügt werden:
|
Quellcode
|
1
|
-autoupdate -steam_dir . -steamcmd_script .
|
Am Ende sieht der Serverstart dann so aus:
|
Quellcode
|
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
|
./srcds_run: 397: pushd: not found
./srcds_run: 397: popd: not found
WARNING: No map specified! Defaulting to de_dust
Server will auto-restart if there is a crash.
Updating server using Steam.
----------------------------
/home/csgo/serverfiles_csgo/steam.sh: Zeile 53: ulimit: open files: Kann die Grenze nicht ändern: Die Operation ist nicht erlaubt
Installing breakpad exception handler for appid(steam)/version(1345857048)
[ 0%] Checking for available updates...
[ 0%] Download complete.
[----] Verifying installation...
unlinked 0 orphaned pipes
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam3...OK.
Loading Steam2...OK.
Logging in user 'xxx' to Steam Public...Success.
Success! App '740' already up to date.
unlinked 0 orphaned pipes
CAsyncIOManager: 0 threads terminating. 0 reads, 0 writes, 0 deferrals.
CAsyncIOManager: 344 single object sleeps, 19 multi object sleeps
CAsyncIOManager: 0 single object alertable sleeps, 1 multi object alertable sleeps
----------------------------
LD_LIBRARY_PATH=/home/csgo/servers/war1/bin:/home/csgo/servers/war1:/home/csgo/servers/war1/bin:
#ConVarRef developer doesn't point to an existing ConVar
#Using breakpad minidump system
Using breakpad crash handler
#PERF WARNING: Failed to open model substitution file, cannot swap models out based on gpu_level!
#
#Console initialized.
#Hashing all VPK files for pure server operation.
|
Für faule Menschen hier noch eine Kurzanleitung:
- Auf dem Host in irgendeinem Pfad das Tool steamcmd entpacken und einmal starten.
- Berechtigungen setzen. chmod 777 für alle Dateien und Verzeichnisse von steamcmd setzen. Das Tool setzt sich eh über alle Regeln hinweg. Soweit ich weiß, werden die Schreibberechtigungen für den Cache benötigt. Bin mir da aber nicht ganz sicher.
- Die Datei für den Login erstellen. Kann sich im Verzeichnis befinden wo auch die steam.sh vom Tool steamcmd ist:
|
Quellcode
|
1
|
login user passwd
|
Bitte auch dort Lesbar für alle machen (chmod 644).
- Die Datei steam.sh im Serververzeichnis erstellen:
|
Quellcode
|
1
2
3
4
5
6
7
|
steamsh=/home/csgo/serverfiles_csgo/steam.sh
loginfile=/home/csgo/serverfiles_csgo/login
#code
login="`cat $loginfile`"
installdir=`pwd`
STEAMEXE=steamcmd $steamsh +$login +force_install_dir $installdir +app_update 740 +quit
|
- Pfadangaben der Variablen 'steamsh' und 'loginfile' anpassen.
- Berechtigungen der steam.sh setzen: chmod 755
- Das zum Startbefehl hinzufügen: -autoupdate -steam_dir . -steamcmd_script .
- Server neustarten und gucken ob es funktioniert.
- Die anderen Server abwechselnd neustarten und weiter die Ausgabe der Konsole beobachten
Anmerkung:
Unter anderem werden hier einigen Leuten die großzügigen Berechtigungen aufgefallen sein. Das ganze lässt sich auch über Gruppen regeln. Wie immer sollten alle ausführbare Dateien vor Veränderung durch den Kunden geschützt sein. Die schließt die Installation des Tools steamcmd mit ein. Bei Protected-Mode-Servern ist penibel darauf zu achten, dass die steam.sh nicht verändert werden kann. Dies würde man z.B. dadurch erreichen, wenn man den Besitzer der Datei ändert und nur die Rechte 555 bzw 550 vergibt.
EDIT:
Ich entwickle zur Zeit noch ein anderes Tool, das vorher checkt ob der Server aktuell ist und nur Updates durchführt, wenn es erforderlich ist. Ich weiß noch nicht ob ich es veröffentlichen werde. Eigentlich sollte das ein Teil für ein Tool werden, dass sich per Kommandozeile steuern lässt und zugleich das hldsupdatetool und steamcmd bedienen kann.