diff --git a/warden3/warden_server/warden_server.py b/warden3/warden_server/warden_server.py index 21adb83ad7a5ac9cf329e5b44354667d5bb927e1..736a437e24485a84620184c7b6c09fcb1ef21108 100755 --- a/warden3/warden_server/warden_server.py +++ b/warden3/warden_server/warden_server.py @@ -159,6 +159,7 @@ def StreamLogger(stream=sys.stderr, level=logging.INFO): fhand.setFormatter(fform) logger = get_clean_root_logger(level) logger.addHandler(fhand) + return logger @@ -192,6 +193,7 @@ def FileLogger(req, filename, level=logging.INFO): logger.addFilter(ffilt) logger.addHandler(fhand) logging.info("Initialized FileLogger(req=%s, filename=\"%s\", level=\"%d\")" % (type(req).__name__, filename, level)) + return logger @@ -261,11 +263,12 @@ class Request(Object): -class ObjectReq(Object): +class ObjectBase(Object): - def __init__(self, req): + def __init__(self, req, log): Object.__init__(self) self.req = req + self.log = log def __str__(self): @@ -273,10 +276,10 @@ class ObjectReq(Object): -class PlainAuthenticator(ObjectReq): +class PlainAuthenticator(ObjectBase): - def __init__(self, req, db): - ObjectReq.__init__(self, req) + def __init__(self, req, log, db): + ObjectBase.__init__(self, req, log) self.db = db @@ -292,17 +295,17 @@ class PlainAuthenticator(ObjectReq): client = self.db.get_client_by_name(hostnames, name, secret) if not client: - logging.getLogger(__name__).info("authenticate: client not found by name: \"%s\", secret: %s, hostnames: %s" % ( + self.log.info("authenticate: client not found by name: \"%s\", secret: %s, hostnames: %s" % ( name, secret, str(hostnames))) return None # Clients with 'secret' set must get authenticated by it. # No secret turns secret auth off for this particular client. if client.secret is not None and secret is None: - logging.getLogger(__name__).info("authenticate: missing secret argument") + self.log.info("authenticate: missing secret argument") return None - logging.getLogger(__name__).info("authenticate: %s" % str(client)) + self.log.info("authenticate: %s" % str(client)) # These args are not for handler args.pop("client", None) @@ -315,19 +318,19 @@ class PlainAuthenticator(ObjectReq): def authorize(self, env, client, path, method): if method.debug: if not client.debug: - logging.getLogger(__name__).info("authorize: failed, client does not have debug enabled") + self.log.info("authorize: failed, client does not have debug enabled") return None return client if method.read: if not client.read: - logging.getLogger(__name__).info("authorize: failed, client does not have read enabled") + self.log.info("authorize: failed, client does not have read enabled") return None return client if method.write: if not (client.write or client.test): - logging.getLogger(__name__).info("authorize: failed, client is not allowed to write or test") + self.log.info("authorize: failed, client is not allowed to write or test") return None return client @@ -387,10 +390,10 @@ class X509NameAuthenticator(PlainAuthenticator): class X509MixMatchAuthenticator(PlainAuthenticator): - def __init__(self, req, db): - PlainAuthenticator.__init__(self, req, db) - self.hostname_auth = X509Authenticator(req, db) - self.name_auth = X509Authenticator(req, db) + def __init__(self, req, log, db): + PlainAuthenticator.__init__(self, req, log, db) + self.hostname_auth = X509Authenticator(req, log, db) + self.name_auth = X509Authenticator(req, log, db) def authenticate(self, env, args): @@ -420,10 +423,10 @@ class X509MixMatchAuthenticator(PlainAuthenticator): return auth.authenticate(self, env, args) -class NoValidator(ObjectReq): +class NoValidator(ObjectBase): - def __init__(self, req): - ObjectReq.__init__(self, req) + def __init__(self, req, log): + ObjectBase.__init__(self, req, log) def __str__(self): @@ -436,8 +439,8 @@ class NoValidator(ObjectReq): class JSONSchemaValidator(NoValidator): - def __init__(self, req, filename=None): - NoValidator.__init__(self, req) + def __init__(self, req, log, filename=None): + NoValidator.__init__(self, req, log) self.path = filename or path.join(path.dirname(__file__), "idea.schema") with open(self.path) as f: self.schema = json.load(f) @@ -469,11 +472,11 @@ class JSONSchemaValidator(NoValidator): -class MySQL(ObjectReq): +class MySQL(ObjectBase): - def __init__(self, req, host, user, password, dbname, port, retry_count, + def __init__(self, req, log, host, user, password, dbname, port, retry_count, retry_pause, event_size_limit, catmap_filename, tagmap_filename): - ObjectReq.__init__(self, req) + ObjectBase.__init__(self, req, log) self.host = host self.user = user self.password = password @@ -528,7 +531,7 @@ class MySQL(ObjectReq): try: if crs is None: crs = self.con.cursor() - logging.getLogger(__name__).debug("execute: %s %s" % (args, kwargs)) + self.log.debug("execute: %s %s" % (args, kwargs)) crs.execute(*args, **kwargs) if commit: self.con.commit() @@ -536,7 +539,7 @@ class MySQL(ObjectReq): except my.OperationalError: if not countdown: raise - logging.getLogger(__name__).info("execute: Database down, trying to reconnect (%d attempts left)..." % countdown) + self.log.info("execute: Database down, trying to reconnect (%d attempts left)..." % countdown) if countdown<self.retry_count: sleep(self.retry_pause) # no need to melt down server on longer outage self.close() @@ -568,7 +571,7 @@ class MySQL(ObjectReq): rows = self.query("".join(query), params, commit=True).fetchall() if len(rows)>1: - logging.getLogger(__name__).warn("get_client_by_name: query returned more than one result (cert_names = %s, name = %s, secret = %s): %s" % (cert_names, name, secret, ", ".join([str(Client(**row)) for row in rows]))) + self.log.warn("get_client_by_name: query returned more than one result (cert_names = %s, name = %s, secret = %s): %s" % (cert_names, name, secret, ", ".join([str(Client(**row)) for row in rows]))) return None return Client(**rows[0]) if rows else None @@ -738,7 +741,7 @@ class MySQL(ObjectReq): def insertLastReceivedId(self, client, id): - logging.getLogger(__name__).debug("insertLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname)) + self.log.debug("insertLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname)) try: self.query("INSERT INTO last_events(client_id, event_id, timestamp) VALUES(%s, %s, NOW())", (client.id, id)) self.con.commit() @@ -759,10 +762,10 @@ class MySQL(ObjectReq): row = res[0] except IndexError: id = None - logging.getLogger(__name__).debug("getLastReceivedId: probably first access, unable to get id for client %i(%s)" % (client.id, client.hostname)) + self.log.debug("getLastReceivedId: probably first access, unable to get id for client %i(%s)" % (client.id, client.hostname)) else: id = row["id"] - logging.getLogger(__name__).debug("getLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname)) + self.log.debug("getLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname)) return id @@ -830,10 +833,10 @@ def expose(read=1, write=0, debug=0): return expose_deco -class Server(ObjectReq): +class Server(ObjectBase): - def __init__(self, req, auth, handler): - ObjectReq.__init__(self, req) + def __init__(self, req, log, auth, handler): + ObjectBase.__init__(self, req, log) self.auth = auth self.handler = handler @@ -849,7 +852,7 @@ class Server(ObjectReq): for a in intargs: del args[a] if intargs: - logging.getLogger(__name__).info("sanitize_args: Called with internal args: %s" % ", ".join(intargs)) + self.log.info("sanitize_args: Called with internal args: %s" % ", ".join(intargs)) # silently remove surplus arguments - potential forward # compatibility (unknown args will get ignored) @@ -857,7 +860,7 @@ class Server(ObjectReq): for a in badargs: del args[a] if badargs: - logging.getLogger(__name__).info("sanitize_args: Called with superfluous args: %s" % ", ".join(badargs)) + self.log.info("sanitize_args: Called with superfluous args: %s" % ", ".join(badargs)) return args @@ -952,13 +955,13 @@ def json_wrapper(method): return meth_deco -class WardenHandler(ObjectReq): +class WardenHandler(ObjectBase): - def __init__(self, req, validator, db, auth, + def __init__(self, req, log, validator, db, auth, send_events_limit=500, get_events_limit=1000, description=None): - ObjectReq.__init__(self, req) + ObjectBase.__init__(self, req, log) self.auth = auth self.db = db self.validator = validator @@ -1027,7 +1030,7 @@ class WardenHandler(ObjectReq): try: id = self.db.getLastReceivedId(self.req.client) except Exception, e: - logging.getLogger(__name__).info("cannot getLastReceivedId - " + type(e).__name__ + ": " + str(e)) + self.log.info("cannot getLastReceivedId - " + type(e).__name__ + ": " + str(e)) if id is None: # First access, remember the guy and get him last id @@ -1055,7 +1058,7 @@ class WardenHandler(ObjectReq): self.db.insertLastReceivedId(self.req.client, res['lastid']) - logging.getLogger(__name__).info("sending %d events, lastid is %i" % (len(res["events"]), res["lastid"])) + self.log.info("sending %d events, lastid is %i" % (len(res["events"]), res["lastid"])) return res @@ -1135,7 +1138,7 @@ class WardenHandler(ObjectReq): else: saved = len(events_tosend) - logging.getLogger(__name__).info("Saved %i events" % saved) + self.log.info("Saved %i events" % saved) if errs: raise self.req.error(errors=errs) @@ -1243,25 +1246,31 @@ def build_server(conf): }, "PlainAuthenticator": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "db": {"type": obj, "default": "db"} }, "X509Authenticator": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "db": {"type": obj, "default": "db"} }, "X509NameAuthenticator": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "db": {"type": obj, "default": "db"} }, "NoValidator": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, }, "JSONSchemaValidator": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "filename": {"type": filepath, "default": path.join(path.dirname(__file__), "idea.schema")} }, "MySQL": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "host": {"type": str, "default": "localhost"}, "user": {"type": str, "default": "warden"}, "password": {"type": str, "default": ""}, @@ -1275,6 +1284,7 @@ def build_server(conf): }, "WardenHandler": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "validator": {"type": obj, "default": "validator"}, "db": {"type": obj, "default": "DB"}, "auth": {"type": obj, "default": "auth"}, @@ -1284,6 +1294,7 @@ def build_server(conf): }, "Server": { "req": {"type": obj, "default": "req"}, + "log": {"type": obj, "default": "log"}, "auth": {"type": obj, "default": "auth"}, "handler": {"type": obj, "default": "handler"} }