diff options
Diffstat (limited to 'scripts/rpki/left_right.py')
-rw-r--r-- | scripts/rpki/left_right.py | 188 |
1 files changed, 65 insertions, 123 deletions
diff --git a/scripts/rpki/left_right.py b/scripts/rpki/left_right.py index 79bbaf93..39fb646b 100644 --- a/scripts/rpki/left_right.py +++ b/scripts/rpki/left_right.py @@ -2,7 +2,7 @@ """RPKI "left-right" protocol.""" -import getopt, base64, lxml.etree +import base64, lxml.etree import rpki.sax_utils, rpki.resource_set, rpki.x509, rpki.sql, rpki.exceptions, rpki.pkcs10 xmlns = "http://www.hactrn.net/uris/rpki/left-right-spec/" @@ -140,40 +140,6 @@ class data_elt(base_elt, rpki.sql.sql_persistant): raise rpki.exceptions.BadQuery, "Unexpected query: type %s, action %s" % (self.type, self.action) dispatch[self.action](db, cur, r_msg) - def client_getopt(self, argv): - """Parse options for this class.""" - opts, args = getopt.getopt(argv, "", [x + "=" for x in self.attributes + self.elements] + list(self.booleans)) - for o, a in opts: - o = o[2:] - handler = getattr(self, "client_query_" + o, None) - if handler is not None: - handler(a) - elif o in self.booleans: - setattr(self, o, True) - else: - assert o in self.attributes - setattr(self, o, a) - return args - - def client_query_action(self, arg): - """Special handler for --action option.""" - self.action = arg - self.type = "query" - - def client_query_peer_ta(self, arg): - """Special handler for --peer_ta option.""" - self.peer_ta = rpki.x509.X509(Auto_file=arg) - - def client_reply_decode(self): - pass - - def client_reply_show(self): - self.client_reply_decode() - print self.element_name - for i in self.attributes + self.elements: - if getattr(self, i) is not None: - print " %s: %s" % (i, getattr(self, i)) - class extension_preference_elt(base_elt): """Container for extension preferences.""" @@ -196,6 +162,70 @@ class extension_preference_elt(base_elt): elt.text = self.value return elt +class self_elt(data_elt): + """<self/> element.""" + + element_name = "self" + attributes = ("action", "type", "self_id") + elements = ("extension_preference",) + booleans = ("rekey", "reissue", "revoke", "run_now", "publish_world_now", "clear_extension_preferences") + + sql_template = rpki.sql.template("self", "self_id", "use_hsm") + + self_id = None + use_hsm = False + + def __init__(self): + self.prefs = [] + + def sql_fetch_hook(self, db, cur): + cur.execute("SELECT pref_name, pref_value FROM self_pref WHERE self_id = %s", self.self_id) + for name, value in cur.fetchall(): + e = extension_preference_elt() + e.name = name + e.value = value + self.prefs.append(e) + + def sql_insert_hook(self, db, cur): + if self.prefs: + cur.executemany("INSERT self_pref (self_id, pref_name, pref_value) VALUES (%s, %s, %s)", + ((e.name, e.value, self.self_id) for e in self.prefs)) + + def sql_delete_hook(self, db, cur): + cur.execute("DELETE FROM self_pref WHERE self_id = %s", self.self_id) + + def serve_pre_save_hook(self, q_pdu, r_pdu): + if self is not pdu: + if pdu.clear_extension_preferences: + self.prefs = [] + self.prefs.extend(pdu.prefs) + + def serve_post_save_hook(self, q_pdu, r_pdu): + if self.rekey or self.reissue or self.revoke or self.run_now or self.publish_world_now: + raise NotImplementedError + + def startElement(self, stack, name, attrs): + """Handle <self/> element.""" + if name == "extension_preference": + pref = extension_preference_elt() + self.prefs.append(pref) + stack.append(pref) + pref.startElement(stack, name, attrs) + else: + assert name == "self", "Unexpected name %s, stack %s" % (name, stack) + self.read_attrs(attrs) + + def endElement(self, stack, name, text): + """Handle <self/> element.""" + assert name == "self", "Unexpected name %s, stack %s" % (name, stack) + stack.pop() + + def toXML(self): + """Generate <self/> element.""" + elt = self.make_elt() + elt.extend([i.toXML() for i in self.prefs]) + return elt + class bsc_elt(data_elt): """<bsc/> (Business Signing Context) element.""" @@ -268,10 +298,6 @@ class bsc_elt(data_elt): self.make_b64elt(elt, "public_key") return elt - def client_query_signing_cert(self, arg): - """--signing_cert option.""" - self.signing_cert.append(rpki.x509.X509(Auto_file=arg)) - class parent_elt(data_elt): """<parent/> element.""" @@ -456,90 +482,6 @@ class route_origin_elt(data_elt): """Generate <route_origin/> element.""" return self.make_elt() - def client_query_as_number(self, arg): - """Handle autonomous sequence numbers.""" - self.as_number = long(arg) - - def client_query_ipv4(self, arg): - """Handle IPv4 addresses.""" - self.ipv4 = resource_set.resource_set_ipv4(arg) - - def client_query_ipv6(self, arg): - """Handle IPv6 addresses.""" - self.ipv6 = resource_set.resource_set_ipv6(arg) - -class self_elt(data_elt): - """<self/> element.""" - - element_name = "self" - attributes = ("action", "type", "self_id") - elements = ("extension_preference",) - booleans = ("rekey", "reissue", "revoke", "run_now", "publish_world_now", "clear_extension_preferences") - - sql_template = rpki.sql.template("self", "self_id", "use_hsm") - - self_id = None - use_hsm = False - - def __init__(self): - self.prefs = [] - - def sql_fetch_hook(self, db, cur): - cur.execute("SELECT pref_name, pref_value FROM self_pref WHERE self_id = %s", self.self_id) - for name, value in cur.fetchall(): - e = extension_preference_elt() - e.name = name - e.value = value - self.prefs.append(e) - - def sql_insert_hook(self, db, cur): - if self.prefs: - cur.executemany("INSERT self_pref (self_id, pref_name, pref_value) VALUES (%s, %s, %s)", - ((e.name, e.value, self.self_id) for e in self.prefs)) - - def sql_delete_hook(self, db, cur): - cur.execute("DELETE FROM self_pref WHERE self_id = %s", self.self_id) - - def serve_pre_save_hook(self, q_pdu, r_pdu): - if self is not pdu: - if pdu.clear_extension_preferences: - self.prefs = [] - self.prefs.extend(pdu.prefs) - - def serve_post_save_hook(self, q_pdu, r_pdu): - if self.rekey or self.reissue or self.revoke or self.run_now or self.publish_world_now: - raise NotImplementedError - - def startElement(self, stack, name, attrs): - """Handle <self/> element.""" - if name == "extension_preference": - pref = extension_preference_elt() - self.prefs.append(pref) - stack.append(pref) - pref.startElement(stack, name, attrs) - else: - assert name == "self", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def endElement(self, stack, name, text): - """Handle <self/> element.""" - assert name == "self", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <self/> element.""" - elt = self.make_elt() - elt.extend([i.toXML() for i in self.prefs]) - return elt - - def client_query_extension_preference(self, arg): - """--extension_preferences option.""" - k,v = arg.split("=", 1) - pref = rpki.left_right.extension_preference_elt() - pref.name = k - pref.value = v - self.prefs.append(pref) - class resource_class_elt(base_elt): """<resource_class/> element.""" |