12 from geniserver import *
14 from trustedroot import *
17 from geniticket import *
19 from gacksexcep import *
20 from gackscalendar import *
23 # GacksServer is a GeniServer that serves component interface requests.
26 class GacksServer(GeniServer):
29 # Create a new GacksServer object.
31 # @param ip the ip address to listen on
32 # @param port the port to listen on
33 # @param key_file private key filename of registry
34 # @param cert_file certificate filename containing public key (could be a GID file)
36 def __init__(self, ip, port, key_file, cert_file):
37 GeniServer.__init__(self, ip, port, key_file, cert_file)
40 # Register the server RPCs for Gacks
42 def register_functions(self):
43 GeniServer.register_functions(self)
44 self.server.register_function(self.get_handle)
46 def get_handle(self, rspec):
47 handles = rspec_to_handles(rspec)
48 return handles_to_strings(handles)
50 def set_allocator(self, callerGID_str, handle_strs, allocatorGID_str, which, where, reqsig)
51 callerGID = GID(callerGID_str)
52 allocatorGID = GID(allocatorGID_str)
54 # TODO: verify callerGID ssl key
56 callerGID.verify_chain(self.trusted_cert_list)
57 allocatorGID.verify_chain(self.trusted_cert_list)
59 handles = strings_to_handles(handle_strs)
60 for handle in handles:
61 # find the existing records that overlap the handle
62 existing_recs = self.calendar.query_handles([handle])
65 raise GacksResourceNotFound(hand.as_string())
67 # TODO: Merge existing_recs
69 for item in existing_recs:
70 if not item.contains_allocator(callerGID->get_name()):
71 raise CallerNotAllocator(item.as_string())
72 if not item.is_superset(handle):
73 raise RequestSpansReservations(handle.as_string() + " on " + item.as_string())
77 for item in existing_recs:
78 if item.is_proper_supserset(handle):
79 parts = item.clone().split_subset(handle.unitStart, handle.unitStop, handle.timeStart, handle.timeStop)
80 results.extend(parts[0])
81 leftovers.extend(parts[1:])
85 for item in existing_recs:
86 calendar.remove_record(item)
88 for item in leftovers:
89 calendar.insert_record(item)
92 item.set_allocator(callerGID->get_name(), allocatorGID->get_name(), which, where)
93 calendar.insert_record(item)
95 def set_consumer(self, callerGID_str, handle_strs, cred_str, reqsig):
96 callerGID = GID(string = callerGID_str)
97 cred = Credential(string = cred_str)
99 # TODO: verify callerGID ssl key
101 callerGID.verify_chain(self.trusted_cert_list)
102 cred.verify_chain(self.trusted_cert_list)
104 handles = strings_to_handles(handle_strs)
105 for handle in handles:
106 existing_recs = self.calendar.query_handles([handle])
108 if not existing_recs:
109 raise GacksResourceNotFound(hand.as_string())
111 for rec in existing_recs:
112 rec.set_consumer(cred.objectGID.get_name())
113 calendar.update_record(rec)
115 if __name__ == "__main__":
118 key_file = "gacksserver.key"
119 cert_file = "gacksserver.cert"
121 # if no key is specified, then make one up
122 if (not os.path.exists(key_file)) or (not os.path.exists(cert_file)):
123 key = Keypair(create=True)
124 key.save_to_file(key_file)
126 cert = Certificate(subject="component")
127 cert.set_issuer(key=key, subject="component")
130 cert.save_to_file(cert_file)
132 TrustedRoots = TrustedRootList()
134 s = ComponentManager("", 12346, key_file, cert_file)
135 s.trusted_cert_list = TrustedRoots.get_list()