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
|
#!/usr/bin/python
#
# Autor: DeaD_EyE
# E-Mail: gbs.deadeye@gmail.com
# URL: http://sourceserver.info
# Version: 0.1.0
#
# Lizenz: http://creativecommons.org/licenses/by-sa/3.0/
#-------------------------------------------------------
# Beschreibung:
#
# Es findet eine Ueberpruefung der Version des Servers
# ueber die Web-SteamAPI statt.
# Sobald der server veraltet ist, wird er aktualisiert.
#
# Anstelle der steam.sh fuer Updates, wird steamcmd
# direkt aufgerufen
#
# Dieses Script hat den Vorteil, dass es den Server im
# Installationsverzeichnis updatet. Es ist somit fuer Teklab
# und andere WIs geeignet, die eine Singleserverinstallation nutzen.
#
# Um das Script zu integrieren wird es als steam.sh im Serververzeichnis
# gespeichert. Folgende Daten muessen dem Script uebergeben werden:
#
# steamdir: Das Verzeichnis in dem sich die steamcmd befindet z.B. steam/linux32 (relativ zum Serververzeichnis)
# steambin: Name der steamcmd. Sofern Valve nicht alles ueber den Haufen wirft -> steamcmd
# login: Login des Steamaccounts
# password: Passwort des Steamaccounts
#
# Um die Informationen dem Script zu uebergeben, kann eine Configdatei verwendet werden
# Nicht jeder Kunde muss den Login des Hosters kennen, auch wenn auf diesem Account
# keine Spiele registriert sind
use_cfgfile = True
configfile = '/home/irgendwo/updater'
# Das Script erweitert auch Userverzeichnisse,
# Angaben wie ~ oder ~user sind moeglich
# Die Configdatei muss so aufgebaut sein (ohne Raute):
#[steamcmd]
#steamdir=steamcmd
#steambin=steamcmd
#login=DeinAccount
#password=DeinPasswort
##############################################################
# Die Variablen werden ueberschrieben, wenn use_cfgfile = True
# Wenn die Variablen direkt im Script verwendet werden sollen,
# dann muss use_cfgfile = False sein
##############################################################
steamdir = "steamcmd"
steambin = "steamcmd"
login = "DeaD_EyE"
password = "sourceserver.info"
###############################################################
#Code
###############################################################
import re, subprocess, shlex, os, urllib, json, ConfigParser, shutil
#get serverbasedirectory
installdir = os.getcwd()
#function for reading the config values from the txt file
def readcfg(cfgfile):
config = ConfigParser.ConfigParser()
config.readfp(open(cfgfile))
return config.get('steamcmd', 'steamdir'), config.get('steamcmd', 'steambin'), config.get('steamcmd', 'login'), config.get('steamcmd', 'password')
#if use_cfgfile is True, all values are taken from the txt file
if use_cfgfile:
steamdir, steambin, login, password = readcfg(os.path.expanduser(configfile))
### Create path for steamdir:
steamdir = installdir + os.path.sep + steamdir
class steaminf:
def __init__(self, steamfile):
self.steamfile = open(steamfile)
self.steaminfo = self.steamfile.read()
self.steaminfo = self.steaminfo.replace('\r','')
self.steamfile.close()
self.status = [ ]
def getVersion(self):
self.version = re.findall(r'PatchVersion=(.+)',self.steaminfo)
return self.version[0]
def getProductName(self):
self.productname = re.findall(r'ProductName=(.+)',self.steaminfo)
return self.productname[0]
def getAppId(self):
self.appid = re.findall(r'appID=(.+)',self.steaminfo)
return self.appid[0]
def checkVersion(self):
self.requrl = 'http://api.steampowered.com/ISteamApps/UpToDateCheck/v0001/?appid=%s&version=%s&format=json' % (self.getAppId(), self.getVersion())
try:
self.response = urllib.urlopen(self.requrl)
except:
pass
self.response = json.load(self.response)
self.status.append(self.response['response']['up_to_date'])
if self.response['response'].has_key('required_version'):
self.status.append( self.response['response']['required_version'] )
return self.status
class steamcmd:
def __init__(self,steamdir,steambin,login,password,installdir,appid,validate=False):
self.steamdir = steamdir
self.steambin = steambin
self.login = login
self.password = password
self.installdir = installdir
self.arch = 'linux32'
if appid == 730:
self.appid = 740
else:
self.appid = appid
self.validate = validate
def cmdargs(self):
if self.validate:
self.cmd = "%s%s +login %s %s +force_install_dir %s +app_update %d validate +quit" % (self.arch, os.path.sep + self.steambin, self.login, self.password, self.installdir, self.appid)
else:
self.cmd = "%s%s +login %s %s +force_install_dir %s +app_update %d +quit" % (self.arch, os.path.sep + self.steambin, self.login, self.password, self.installdir, self.appid)
return shlex.split(self.cmd)
def update(self):
os.putenv('LD_LIBRARY_PATH', self.arch)
os.chdir(self.steamdir)
self.p = subprocess.Popen(self.cmdargs(), shell=False, stderr=None)
self.p.wait()
os.chdir(self.installdir)
server = steaminf('csgo/steam.inf')
if server.checkVersion()[0] is not True:
print('Der Server ist nicht aktuell')
print('Installierte Version: %s') % server.version[0]
print('Aktuelle Version: %s') % server.status[1]
print('Starte das Updatetool...')
print('Aktualisiere Server: %s') % installdir
cmd = steamcmd(steamdir, steambin, login, password, installdir, int(server.getAppId()), validate=True)
cmd.update()
#removing Update-Directory
print('TMP-Update-Verzeichnis wird geloescht')
for dir in os.listdir('.'):
if re.match(r'[a-z0-9]{40}',dir):
shutil.rmtree(dir)
else:
print('Der Server ist aktuell')
print('Installierte Version: %s') % server.version[0]
|