From 0f6910902f7cd39837d93616ca6f9c7a8e7a8650 Mon Sep 17 00:00:00 2001 From: "David E. Eisenstat" Date: Wed, 1 Nov 2006 22:39:53 +0000 Subject: [PATCH] TICKETS!!! --- api.py | 17 +++++++++++++++-- sm.py | 17 +++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/api.py b/api.py index 567d10b..6484f48 100644 --- a/api.py +++ b/api.py @@ -21,12 +21,14 @@ import xmlrpclib import accounts import database import logger +import ticket import tools API_SERVER_PORT = 812 UNIX_ADDR = '/tmp/sliver_mgr.api' +deliver_ticket = None # set in sm.py:start() api_method_dict = {} nargs_dict = {} @@ -44,6 +46,17 @@ def Help(): """Help(): get help""" return ''.join([method.__doc__ + '\n' for method in api_method_dict.itervalues()]) +@export_to_api(1) +def Ticket(tkt): + """Ticket(tkt): deliver a ticket""" + succeeded = False + if type(tkt) == str: + data = ticket.verify(tkt) + if data != None: + deliver_ticket(data) + succeeded = True + if not succeeded: raise xmlrpclib.Fault(102, 'Invalid argument: the sole argument must be a valid ticket as returned from GetTicket().') + @export_to_api(1) def Create(rec): """Create(sliver_name): create a non-PLC-instantiated sliver""" @@ -116,13 +129,13 @@ class APIRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): ucred = self.request.getsockopt(socket.SOL_SOCKET, SO_PEERCRED, sizeof_struct_ucred) xid = struct.unpack('3i', ucred)[2] caller_name = pwd.getpwuid(xid)[0] - if expected_nargs >= 1: + if method_name not in ('Help', 'Ticket'): target_name = args[0] target_rec = database.db.get(target_name) if not (target_rec and target_rec['type'].startswith('sliver.')): raise xmlrpclib.Fault(102, 'Invalid argument: the first argument must be a sliver name.') if not (caller_name in (args[0], 'root') or (caller_name, method_name) in target_rec['delegations']): raise xmlrpclib.Fault(108, 'Permission denied.') result = method(target_rec, *args[1:]) - else: result = method() + else: result = method(*args) if result == None: result = 1 return result diff --git a/sm.py b/sm.py index 79403ca..a289ea8 100644 --- a/sm.py +++ b/sm.py @@ -13,6 +13,7 @@ import accounts import api import database import delegate +import logger import sliver_vs @@ -22,9 +23,18 @@ start_requested = False # set to True in order to request that all slivers be s @database.synchronized -def GetSlivers_callback(data): +def GetSlivers_callback(data, fullupdate=True): """This function has two purposes. One, convert GetSlivers() data into a more convenient format. Two, even if no updates are coming in, use the GetSlivers() heartbeat as a cue to scan for expired slivers.""" + + node_id = None + try: + f = open('/etc/planetlab/node_id') + try: node_id = int(f.read()) + finally: f.close() + except: logger.log_exc() + for d in data: + if d['node_id'] != node_id: continue for sliver in d['slivers']: rec = sliver.copy() rec.setdefault('timestamp', d['timestamp']) @@ -49,7 +59,7 @@ def GetSlivers_callback(data): except (KeyError, ValueError): amt = default_amt rspec[resname] = amt database.db.deliver_record(rec) - database.db.set_min_timestamp(d['timestamp']) + if fullupdate: database.db.set_min_timestamp(d['timestamp']) database.db.sync() # handle requested startup @@ -61,6 +71,8 @@ def GetSlivers_callback(data): accounts.get(name).start(delay=cumulative_delay) cumulative_delay += 3 +def deliver_ticket(data): return GetSlivers_callback(data, fullupdate=False) + def start(options): accounts.register_class(sliver_vs.Sliver_VS) @@ -68,4 +80,5 @@ def start(options): global start_requested start_requested = options.startup database.start() + api.deliver_ticket = deliver_ticket api.start() -- 2.43.0