# $Id$ import base64 import xml.sax import glob class rpki_updown_msg(object): def toXML(self): return ('\ \n\ \n' \ % (self.sender, self.recipient, self.msg_ref, self.type) ) + self.innerToXML() + '\n' def innerToXML(self): return "" class rpki_updown_cert(object): def __init__(self): self.req_resource_set_as = None self.req_resource_set_ipv4 = None self.req_resource_set_ipv6 = None def toXML(self): xml = ('\ \n' % self.status) return xml + base64.b64encode(self.cert) + '\n' class rpki_updown_class(object): def __init__(self): self.certs = [] def toXML(self): xml = ('\ \n' \ % (self.class_name, self.cert_url, self.cert_ski, self.resource_set_as, self.resource_set_ipv4, self.resource_set_ipv6, self.suggested_sia_head)) for cert in self.certs: xml += cert.toXML() return xml + '' + base64.b64encode(self.issuer) + '\n\n' class rpki_updown_list(rpki_updown_msg): pass class rpki_updown_list_response(rpki_updown_msg): def __init__(self): self.resource_classes = [] def innerToXML(self): for c in self.resource_classes: xml += c.toXML() return xml class rpki_updown_issue(rpki_updown_msg): def __init__(self): self.req_as = None self_req_ipv4 = None self.req_ipv6 = None def innerToXML(self): xml = (' \n' class rpki_updown_issue_response(rpki_updown_msg): def innerToXML(self): self.resource_class.toXML() class rpki_updown_revoke(rpki_updown_msg): def innerToXML(self): return (' \n' % (self.class_name, self.ski)) class rpki_updown_revoke_response(rpki_updown_revoke): pass class rpki_updown_error_response(rpki_updown_msg): def innerToXML(self): return '%d\n' % self.status def startElement(self, name, attrs): print "startElement(" + name + ")" def endElement(self, name, text): print "endElement(" + name + ")" if name == 'status': self.status = text elif name == 'last_message_processed': self.last_message_processed = text elif name == 'description': self.description = text class rpki_updown_sax_handler(xml.sax.handler.ContentHandler): def __init__(self): self.text = '' self.obj = None def startElementNS(self, name, qname, attrs): print "startElementNS()" return self.startElement(name[1], attrs) def endElementNS(self, name, qname): print "endElementNS()" return self.endElement(name[1]) def startElement(self, name, attrs): print "startElement(" + name + ")" if name == 'message': assert int(attrs.getValue('version')) == 1 print self.obj if self.obj == None: assert name == 'message' self.obj = { 'list' : rpki_updown_list(), 'list_response' : rpki_updown_list_response(), 'issue' : rpki_updown_issue(), 'issue_response' : rpki_updown_issue_response(), 'revoke' : rpki_updown_revoke(), 'revoke_response' : rpki_updown_revoke_response(), 'error_response' : rpki_updown_error_response() }[attrs.getValue('type')] assert self.obj != None self.obj.sender = attrs.getValue('sender') self.obj.recipient = attrs.getValue('recipient') self.obj.msg_ref = attrs.getValue('msg_ref') else: assert self.obj != None self.obj.startElement(name, attrs) def characters(self, content): self.text += content def endElement(self, name): assert self.obj != None if name != 'message': self.obj.endElement(name, self.text) def main(): for f in glob.glob("up-down-protocol-samples/*.xml"): parser = xml.sax.make_parser() handler = rpki_updown_sax_handler() parser.setContentHandler(handler) parser.parse(f) print handler.obj print "=====\n" main()