def __init__(self, manager): self.host = manager.config['server']['host'] self.port = manager.config['server']['port'] self.verbose = manager.config['server']['verbose'] self.download_manager = manager.download_manager() self.auth_handler = manager.auth_handler() # This server is backed by a LocalBundleClient that processes client commands self.client = manager.client('local', is_cli=False) # This server is backed by a file server that processes file commands. self.file_server = FileServer() # args might be a large object; summarize it (e.g., take prefixes of lists) def compress_args(args): if isinstance(args, basestring): if len(args) > 100: args = args[:100] + '...' if isinstance(args, list): if len(args) > 4: args = args[:4] + ['...'] if isinstance(args, tuple): return tuple(map(compress_args, args)) elif isinstance(args, list): return map(compress_args, args) elif isinstance(args, dict): return dict((compress_args(k), compress_args(v)) for k, v in args.items()) return args SimpleXMLRPCServer.__init__( self, (self.host, self.port), allow_none=True, requestHandler=AuthenticatedXMLRPCRequestHandler, logRequests=(self.verbose >= 1)) def wrap(target, command): def function_to_register(*args, **kwargs): # Process args for logging if command == 'login': log_args = args[:2] # Don't log password else: log_args = compress_args(args) if self.verbose >= 1: print "bundle_rpc_server: %s %s" % (command, log_args) try: start_time = time.time() # Dynamically bind method and call it result = getattr(target, command)(*args, **kwargs) # Log this activity. if not isinstance(target, FileServer): self.client.model.update_events_log( start_time=start_time, user_id=self.client._current_user_id(), user_name=self.client._current_user_name(), command=command, args=log_args) return result except Exception, e: if not (isinstance(e, UsageError) or isinstance(e, PermissionError)): # This is really bad and shouldn't happen. # If it does, someone should get paged. print '=== INTERNAL ERROR:', e traceback.print_exc() raise e return function_to_register