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
|