X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethod.py;h=ed039742964c8bad4fb3df57ee7353b27c49e365;hb=31b1d0a03ac448fdeb578dabf8f278bad3966516;hp=d7297a16e0a5a825d94f86b1bb99a34440c428d5;hpb=4022a4c61236500c9a17c9ccb60d6107a576b8d7;p=plcapi.git diff --git a/PLC/Method.py b/PLC/Method.py index d7297a1..ed03974 100644 --- a/PLC/Method.py +++ b/PLC/Method.py @@ -4,7 +4,8 @@ # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # -# $Id: Method.py,v 1.28 2007/08/20 19:11:08 tmack Exp $ +# $Id$ +# $URL$ # import xmlrpclib @@ -24,7 +25,8 @@ from PLC.Events import Event, Events from PLC.Nodes import Node, Nodes from PLC.Persons import Person, Persons -class Method: +# we inherit object because we use new-style classes for legacy methods +class Method (object): """ Base class for all PLCAPI functions. At a minimum, all PLCAPI functions must define: @@ -80,19 +82,22 @@ class Method: try: start = time.time() - (min_args, max_args, defaults) = self.args() + + # legacy code cannot be type-checked, due to the way Method.args() works + if not hasattr(self,"skip_typecheck"): + (min_args, max_args, defaults) = self.args() - # Check that the right number of arguments were passed in - if len(args) < len(min_args) or len(args) > len(max_args): - raise PLCInvalidArgumentCount(len(args), len(min_args), len(max_args)) + # Check that the right number of arguments were passed in + if len(args) < len(min_args) or len(args) > len(max_args): + raise PLCInvalidArgumentCount(len(args), len(min_args), len(max_args)) - for name, value, expected in zip(max_args, args, self.accepts): - self.type_check(name, value, expected, args) + for name, value, expected in zip(max_args, args, self.accepts): + self.type_check(name, value, expected, args) result = self.call(*args, **kwds) runtime = time.time() - start - - if self.api.config.PLC_API_DEBUG: #or hasattr(self, 'message'): + + if self.api.config.PLC_API_DEBUG or hasattr(self, 'message'): self.log(None, runtime, *args) return result @@ -108,8 +113,11 @@ class Method: # Prepend caller and method name to expected faults fault.faultString = caller + ": " + self.name + ": " + fault.faultString runtime = time.time() - start - self.log(fault, runtime, *args) - raise fault + + if self.api.config.PLC_API_DEBUG: + self.log(fault, runtime, *args) + + raise fault def log(self, fault, runtime, *args): """ @@ -119,6 +127,11 @@ class Method: # Do not log system or Get calls #if self.name.startswith('system') or self.name.startswith('Get'): # return False + # Do not log ReportRunlevel + if self.name.startswith('system'): + return False + if self.name.startswith('ReportRunlevel'): + return False # Create a new event event = Event(self.api) @@ -128,22 +141,28 @@ class Method: event['runtime'] = runtime # Redact passwords and sessions - if args and isinstance(args[0], dict): - # what type of auth this is - if args[0].has_key('AuthMethod'): - auth_methods = ['session', 'password', 'capability', 'gpg', 'hmac','anonymous'] - auth_method = args[0]['AuthMethod'] - if auth_method in auth_methods: - event['auth_type'] = auth_method - for password in 'AuthString', 'session': - if args[0].has_key(password): - auth = args[0].copy() - auth[password] = "Removed by API" - args = (auth,) + args[1:] + newargs = args + if args: + newargs = [] + for arg in args: + if not isinstance(arg, dict): + newargs.append(arg) + continue + # what type of auth this is + if arg.has_key('AuthMethod'): + auth_methods = ['session', 'password', 'capability', 'gpg', 'hmac','anonymous'] + auth_method = arg['AuthMethod'] + if auth_method in auth_methods: + event['auth_type'] = auth_method + for password in 'AuthString', 'session', 'password': + if arg.has_key(password): + arg = arg.copy() + arg[password] = "Removed by API" + newargs.append(arg) # Log call representation # XXX Truncate to avoid DoS - event['call'] = self.name + pprint.saferepr(args) + event['call'] = self.name + pprint.saferepr(newargs) event['call_name'] = self.name # Both users and nodes can call some methods @@ -250,7 +269,7 @@ class Method: That represents the minimum and maximum sets of arguments that this function accepts and the defaults for the optional arguments. """ - + # Inspect call. Remove self from the argument list. max_args = self.call.func_code.co_varnames[1:self.call.func_code.co_argcount] defaults = self.call.func_defaults