Helló mindenkinek!
Lenne itt egy VPS szeró Hldswatch-os újraindítással, de amikor újraindítja a Hldswatch akkor nem indítja vele a logot(screenlog.0)!
Van erre valakinek ötlete hogy miként lehetne a Hldswatch kódjába beleírni hogy a logot is indítsa miután kifagy a szerver?
Válaszokat köszönöm!
hldswatch.py
Kód:
#!/usr/bin/python
"""
HLDSWatch (v2.0)
HLDS monitoring and restarter script
This script is released under the GPL (http://www.gnu.org/licenses/gpl.html)
Copyright 2012 blitzbite
Contact: http://steamcommunity.com/id/blitzbite
"""
import ConfigParser
import os.path, re, socket
from os import geteuid, devnull
from subprocess import call
from sys import argv, exit, version_info
from time import strftime, sleep
# --- User preferences ---
# Delay (in sec) for status checks
check_interval = 300
# File logging
# To change log file location, enter the full path of desired location
# in log_filename eg /var/www/hldswatch.log
log_to_file = 1
log_filename = "hldswatch.log"
# --- End of user preferences ---
# Query constants
HEADER = "\xFF\xFF\xFF\xFF"
A2A_PING = "\x69\x00"
A2S_INFO = "TSource Engine Query\x00"
QUERY_TIMEOUT = 3
QUERY_RETRY = 3
QUERY_RETRY_WAIT = 5
class HLDSWatch(object):
def __init__(self, conf):
if os.path.isfile(conf):
self.c = ConfigParser.SafeConfigParser()
self.c.readfp(open(conf))
else:
exit("Error: Config file given does not exist!")
# Hold all server settings
self.serverconfig = {}
# Remember script's working dir
self.cwdir = os.getcwd()
# validate and cache all server settings
self.validate_config()
"""Message logging"""
def printlog(self, msg):
cur_time = strftime("%m-%d %H:%M:%S")
log_msg = "%s -> %s" % (cur_time, msg)
print "%s" % log_msg
if log_to_file and log_filename:
with open(log_filename, 'a') as f:
f.write(log_msg + '\n')
f.close()
"""Parse and validate options in config file"""
def validate_config(self):
for sec in self.c.sections():
if not re.match("^([0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]+$", sec):
exit('Error: "[%s]" is invalid section name. All section names must be in [<ip>:<port>] form' % sec)
else:
# engine value
val_engine = self.c.get(sec, "engine")
if val_engine == "goldsource":
val_engine = "goldsrc"
if not val_engine:
exit("Error: [%s] 'engine' type is left out" % sec)
elif not re.match("^(?:goldsrc|source)$", val_engine):
exit("Error: [%s] 'engine' is unknown and not supported" % sec)
# autorestart value
val_autorestart = self.c.get(sec, "autorestart")
if not val_autorestart:
exit("Error: [%s] 'autorestart' is left out" % sec)
elif re.match("^[Yy1]", val_autorestart[0]):
val_autorestart = True
# screen value
val_screen = self.c.get(sec, "screen")
if not val_screen:
exit("Error: [%s] 'screen' is required and cannot be left out when autorestart is enabled" % sec)
elif not re.match("^[A-Za-z0-9_]+$", val_screen):
exit("Error: [%s] 'screen' must contain only alphanumeric and underscore character" % sec)
# startdir value
val_startdir = self.c.get(sec, "startdir")
if not val_startdir:
exit("Error: [%s] 'startdir' is required and cannot be left out when autorestart is enabled" % sec)
elif not os.path.isdir(val_startdir):
exit("Error: [%s] 'startdir' path doesn't exist" % sec)
else:
if val_engine == "goldsrc" and not os.path.isfile(val_startdir + '/hlds_run'):
exit("Error: [%s] Can't find hlds_run in 'startdir'" % sec)
elif val_engine == "source" and not os.path.isfile(val_startdir + '/srcds_run'):
exit("Error: [%s] Can't find srcds_run in 'startdir'" % sec)
else:
val_autorestart = False
val_screen, val_startdir = None, None
# command value
val_command = self.c.get(sec, "command")
if not val_command:
if val_autorestart:
exit("Error: [%s] 'command' is required and cannot be left out when autorestart is enabled" % sec)
else:
val_command = None
# Cache all server specific configs
self.serverconfig[sec] = {'engine' : val_engine,
'autorestart' : val_autorestart,
'screen' : val_screen,
'command' : val_command,
'startdir' : val_startdir}
"""Server status check"""
def is_up(self, ip, port, engine):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(float(QUERY_TIMEOUT))
if engine == "goldsrc":
packet = HEADER + A2A_PING
else:
packet = HEADER + A2S_INFO
retry, status = 0, 0
reply = None
while retry < QUERY_RETRY:
try:
# Send ping to server
s.sendto(packet, (ip, int(port)))
reply = s.recv(4096)
if len(reply) > 4:
if engine == "goldsrc":
if reply[4] == "j":
status = 1
break
else:
if reply[4] == "I":
status = 1
break
except socket.timeout:
pass
retry += 1
sleep (QUERY_RETRY_WAIT)
s.close()
return status == 1
"""Restart server"""
def relaunch(self, addr):
# Get all settings that we need to restart
screenname = self.serverconfig[addr]['screen']
startcmd = self.serverconfig[addr]['command']
path = self.serverconfig[addr]['startdir']
# Screen command params
screencmd = "-dmS %s " % screenname
# CD into server dir
try:
os.chdir(path)
except OSError:
self.printlog("* Unable to cd into server dir '%s'" % path)
return
with open(os.devnull, "w") as blackhole:
# In case server process is unresponsive or hung and doesn't quit itself after crashed
call("screen -S %s -X quit" % screenname, stdout=blackhole, stderr=blackhole, shell=True)
# Restart server process
call("screen " + screencmd + startcmd, stdout=blackhole, stderr=blackhole, shell=True)
# Go back to where we were
os.chdir(self.cwdir)
"""Monitor servers"""
def watch(self):
# Here we go
self.printlog("HLDSWatch started")
self.printlog("Monitoring %i servers" % len(self.serverconfig))
try:
# Loop forever
while True:
for addr in self.serverconfig:
ip, port = addr.split(':')
if not self.is_up(ip, port, self.serverconfig[addr]['engine']):
self.printlog("%s is down" % addr)
# if autorestart enabled, restart the server
if self.serverconfig[addr]['autorestart'] == True:
# Try restart
self.relaunch(addr)
# Give some time for server to start up
sleep (5)
# Did it come back up?
if self.is_up(ip, port, self.serverconfig[addr]['engine']):
self.printlog("* Server restarted fine")
else:
self.printlog("* Attempt to restart failed")
elif self.serverconfig[addr]['command']:
# Execute user's custom command
with open(devnull, "w") as blackhole:
call(self.serverconfig[addr]['command'], stdout=blackhole, stderr=blackhole, shell=True)
sleep(check_interval)
except KeyboardInterrupt:
self.printlog("HLDSWatch terminated")
if __name__ == '__main__':
# Idiot check..never run hlds/srcds as root!
# We need at least python 2.6 to run this script
if version_info[:2] < (2,6):
exit('Error: Your python version is too old! This script requires at least python 2.6.x or newer')
# Must give a config file
if len(argv) != 2:
exit("Usage: ./hldswatch.py <configfile>")
else:
hlds = HLDSWatch(argv[1])
hlds.watch()
# vim: tabstop=4:softtabstop=4:shiftwidth=4:expandtab
Hozzá tartozó konfig fájl (servers.conf)
Kód:
# Restart server on crash or when no response is received
# If autorestart is enabled; screen, command and startdir options are required to fill
# screen : name for screen session
# command : your server start command
# startdir : server dir path that contains hlds/srcds executable
# Same as above
[1.1.1.1:27015]
engine=goldsrc
autorestart=y
screen=cs
command=./hlds_run -console -game cstrike +ip 1.1.1.1 +port 27015 +maxplayers 28 +map de_dust2 +exec server.cfg +sys_ticrate 1000 +fps_max 800 -pingboost 3 > /dev/null >&1
startdir=/home/steamcmd/cs
Megoldva oly módon h az indító sorba beleírtam a -debug -ot és akkor elindul magától