aboutsummaryrefslogtreecommitdiff
path: root/rpkid/testbed.py
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2009-04-20 23:24:25 +0000
committerRob Austein <sra@hactrn.net>2009-04-20 23:24:25 +0000
commit024e74a42cbb21b431f0f7e1a70aaefbeefe0b0d (patch)
tree7e7b0ca4ce58af282370500e6f8f7a4b6e4b2de6 /rpkid/testbed.py
parent83d9fb93cad19a9d4d21a6a3b624a33332b90ed4 (diff)
Checkpoint
svn path=/rpkid/irdbd.py; revision=2350
Diffstat (limited to 'rpkid/testbed.py')
-rw-r--r--rpkid/testbed.py298
1 files changed, 149 insertions, 149 deletions
diff --git a/rpkid/testbed.py b/rpkid/testbed.py
index 16cf2b7c..2b3957c7 100644
--- a/rpkid/testbed.py
+++ b/rpkid/testbed.py
@@ -19,7 +19,21 @@ things that don't belong in yaml_script.
$Id$
-Copyright (C) 2007--2008 American Registry for Internet Numbers ("ARIN")
+Copyright (C) 2009 Internet Systems Consortium ("ISC")
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+Portions copyright (C) 2007--2008 American Registry for Internet Numbers ("ARIN")
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -36,7 +50,7 @@ PERFORMANCE OF THIS SOFTWARE.
import os, yaml, MySQLdb, subprocess, signal, time, re, getopt, sys, lxml, traceback
import rpki.resource_set, rpki.sundial, rpki.x509, rpki.https
-import rpki.log, rpki.left_right, rpki.config, rpki.publication
+import rpki.log, rpki.left_right, rpki.config, rpki.publication, rpki.async
os.environ["TZ"] = "UTC"
time.tzset()
@@ -126,24 +140,6 @@ pub_sql_file = cfg.get("pub_sql_file", "pubd.sql")
startup_delay = int(cfg.get("startup_delay", "10"))
-class async_iterator(object):
- """Experimental iteration construct for event-driven code. This
- belongs in the library eventually, but it's easier to debug the
- initial version here.
- """
-
- def __init__(self, iterable, handler_cb, done_cb):
- self.handler_cb = handler_cb
- self.done_cb = done_cb
- self.iterator = iter(iterable)
-
- def __call__(self):
- try:
- self.handler_cb(self.iterator.next())
- except StopIteration:
- if self.done_cb is not None:
- self.done_cb()
-
class main(object):
"""Main program, implemented as a class to handle asynchronous I/O
in underlying libraries.
@@ -229,12 +225,14 @@ class main(object):
time.sleep(startup_delay)
assert not hasattr(self, "iterator")
- self.iterator = async_iterator(self.db.engines, self.create_rpki_objects, self.created_rpki_objects)
+ self.iterator = rpki.async.iterator(self.db.engines, self.create_rpki_objects, self.created_rpki_objects)
self.iterator()
# At this point we have gone into (pseudo) event-driven code.
# See comments above about cleanup of this try/finally code
+ rpki.log.info("All done")
+
# Clean up
finally:
@@ -253,8 +251,7 @@ class main(object):
def create_rpki_objects(self, a):
"""Create objects in RPKI engines"""
- a.create_rpki_objects()
- self.iterator()
+ a.create_rpki_objects(self.iterator)
def created_rpki_objects(self):
del self.iterator
@@ -273,14 +270,11 @@ class main(object):
# Run cron in all RPKI instances
assert not hasattr(self, "iterator")
- self.iterator = async_iterator(self.db.engines, self.run_cron, self.run_yaml)
+ self.iterator = rpki.async.iterator(self.db.engines, self.run_cron, self.run_yaml)
self.iterator()
def run_cron(self, a):
- a.run_cron(self.run_cron_cb)
-
- def run_cron_cb(self, *ignored):
- self.iterator()
+ a.run_cron(self.iterator)
def run_yaml(self):
del self.iterator
@@ -294,11 +288,8 @@ class main(object):
# If we've run out of deltas to apply, we're done
if not yaml_script:
-
rpki.log.info("No more deltas to apply, done")
-
else:
-
rpki.log.info("Applying deltas")
self.db.apply_delta(yaml_script.pop(0), self.apply_delta_done)
@@ -404,7 +395,7 @@ class allocation_db(list):
else:
self.cb = cb
assert not hasattr(self, "iterator")
- self.iterator = async_iterator(delta, self.apply_one_delta, self.apply_delta_done)
+ self.iterator = rpki.async.iterator(delta, self.apply_one_delta, self.apply_delta_done)
self.iterator()
def apply_one_delta(self, d):
@@ -478,7 +469,7 @@ class allocation(object):
rpki.log.info("Applying delta: %s" % yaml)
self.apply_delta_caller_cb = cb
assert not hasattr(self, "iterator")
- self.iterator = async_iterator(yaml.items(), self.apply_one_delta, self.apply_delta_done)
+ self.iterator = rpki.async.iterator(yaml.items(), self.apply_one_delta, self.apply_delta_done)
self.iterator()
def apply_one_delta(self, kv):
@@ -734,7 +725,7 @@ class allocation(object):
raise RuntimeError, msg
return rpki.x509.X509(Auto_file = certfile)
- def create_rpki_objects(self):
+ def create_rpki_objects(self, cb):
"""Create RPKI engine objects for this engine.
Parent and child objects are tricky:
@@ -750,128 +741,137 @@ class allocation(object):
Root node of the engine tree is special, it too has a parent but
that one is the magic self-signed micro engine.
- """
- self_ca = rpki.x509.X509(Auto_file = self.name + "-SELF-1.cer")
- rpki.log.info("Creating rpkid self object for %s" % self.name)
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(action = "create", crl_interval = self.crl_interval, regen_margin = self.regen_margin, bpki_cert = self_ca),
- cb = self.create_rpki_objects_1)
-
- def create_rpki_objects_1(self, val):
- self.self_id = val.self_id
-
- rpki.log.info("Creating rpkid BSC object for %s" % self.name)
- self.call_rpkid(rpki.left_right.bsc_elt.make_pdu(action = "create", self_id = self.self_id, generate_keypair = True),
- cb = self.create_rpki_objects_2)
-
- def create_rpki_objects_2(self, val):
- self.bsc_id = val.bsc_id
-
- rpki.log.info("Issuing BSC EE cert for %s" % self.name)
- cmd = (prog_openssl, "x509", "-req", "-sha256", "-extfile", self.name + "-RPKI.conf", "-extensions", "req_x509_ext", "-days", "30",
- "-CA", self.name + "-SELF-1.cer", "-CAkey", self.name + "-SELF-1.key", "-CAcreateserial", "-text")
- signer = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
- signed = signer.communicate(input = val.pkcs10_request.get_PEM())
- if not signed[0]:
- rpki.log.error(signed[1])
- raise RuntimeError, "Couldn't issue BSC EE certificate"
- bsc_ee = rpki.x509.X509(PEM = signed[0])
- bsc_crl = rpki.x509.CRL(PEM_file = self.name + "-SELF-1.crl")
-
- rpki.log.info("Installing BSC EE cert for %s" % self.name)
- self.call_rpkid(rpki.left_right.bsc_elt.make_pdu(action = "set", self_id = self.self_id, bsc_id = self.bsc_id, signing_cert = bsc_ee, signing_cert_crl = bsc_crl),
- cb = self.create_rpki_objects_3)
-
- def create_rpki_objects_3(self, val):
-
- rpki.log.info("Creating pubd client object for %s" % self.name)
- client_cert = self.cross_certify(pubd_name + "-TA", reverse = True)
- call_pubd(rpki.publication.client_elt.make_pdu(action = "create", base_uri = self.sia_base, bpki_cert = client_cert),
- cb = self.create_rpki_objects_4)
-
- def create_rpki_objects_4(self, val):
- client_id = val.client_id
-
- rpki.log.info("Creating rpkid repository object for %s" % self.name)
- repository_cert = self.cross_certify(pubd_name + "-TA")
- self.call_rpkid(rpki.left_right.repository_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id,
- bpki_cms_cert = repository_cert, bpki_https_cert = repository_cert,
- peer_contact_uri = "https://localhost:%d/client/%d" % (pubd_port, client_id)),
- cb = self.create_rpki_objects_5)
-
- def create_rpki_objects_5(self, val):
- self.repository_id = val.repository_id
-
- rpki.log.info("Creating rpkid parent object for %s" % self.name)
- if self.is_root():
- rootd_cert = self.cross_certify(rootd_name + "-TA")
- self.call_rpkid(rpki.left_right.parent_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id,
- repository_id = self.repository_id, sia_base = self.sia_base,
- bpki_cms_cert = rootd_cert, bpki_https_cert = rootd_cert, sender_name = self.name, recipient_name = "Walrus",
- peer_contact_uri = "https://localhost:%s/" % rootd_port),
- cb = self.create_rpki_objects_6)
- else:
- parent_cms_cert = self.cross_certify(self.parent.name + "-SELF-1")
- parent_https_cert = self.cross_certify(self.parent.name + "-TA")
- self.call_rpkid(rpki.left_right.parent_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id,
- repository_id = self.repository_id, sia_base = self.sia_base,
- bpki_cms_cert = parent_cms_cert, bpki_https_cert = parent_https_cert,
- sender_name = self.name, recipient_name = self.parent.name,
- peer_contact_uri = "https://localhost:%s/up-down/%s" % (self.parent.rpki_port, self.child_id)),
- cb = self.create_rpki_objects_6)
-
- def create_rpki_objects_6(self, val):
- self.parent_id = val.parent_id
-
- rpki.log.info("Creating rpkid child objects for %s" % self.name)
- self.sql_db = MySQLdb.connect(user = "irdb", db = self.irdb_db_name, passwd = irdb_db_pass)
- self.sql_cur = self.sql_db.cursor()
- assert not hasattr(self, "iterator")
- self.iterator = async_iterator(self.kids, self.create_rpki_objects_7, self.create_rpki_objects_8)
- self.iterator()
+ The rest of this is straightforward, just nasty because of all the
+ protocol callbacks.
+ """
- def create_rpki_objects_7(self, kid):
- self.kid = kid
- if kid.is_leaf():
- bpki_cert = self.cross_certify(kid.name + "-TA")
- else:
- bpki_cert = self.cross_certify(kid.name + "-SELF-1")
- rpki.log.info("Creating rpkid child object for %s as child of %s" % (kid.name, self.name))
- self.call_rpkid(rpki.left_right.child_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id, bpki_cert = bpki_cert),
- cb = self.create_rpki_objects_7_cb)
-
- def create_rpki_objects_7_cb(self, val):
- self.kid.child_id = val.child_id
- self.sql_cur.execute("UPDATE registrant SET rpki_self_id = %s, rpki_child_id = %s WHERE IRBE_mapped_id = %s", (self.self_id, self.kid.child_id, self.kid.name))
- self.iterator()
+ def start():
+ self_ca = rpki.x509.X509(Auto_file = self.name + "-SELF-1.cer")
+
+ rpki.log.info("Creating rpkid self object for %s" % self.name)
+ self.call_rpkid(rpki.left_right.self_elt.make_pdu(action = "create", crl_interval = self.crl_interval, regen_margin = self.regen_margin, bpki_cert = self_ca),
+ cb = got_self_id)
+
+ def got_self_id(val):
+ self.self_id = val.self_id
+
+ rpki.log.info("Creating rpkid BSC object for %s" % self.name)
+ self.call_rpkid(rpki.left_right.bsc_elt.make_pdu(action = "create", self_id = self.self_id, generate_keypair = True),
+ cb = got_bsc_id)
+
+ def got_bsc_id(val):
+ self.bsc_id = val.bsc_id
+
+ rpki.log.info("Issuing BSC EE cert for %s" % self.name)
+ cmd = (prog_openssl, "x509", "-req", "-sha256", "-extfile", self.name + "-RPKI.conf", "-extensions", "req_x509_ext", "-days", "30",
+ "-CA", self.name + "-SELF-1.cer", "-CAkey", self.name + "-SELF-1.key", "-CAcreateserial", "-text")
+ signer = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
+ signed = signer.communicate(input = val.pkcs10_request.get_PEM())
+ if not signed[0]:
+ rpki.log.error(signed[1])
+ raise RuntimeError, "Couldn't issue BSC EE certificate"
+ bsc_ee = rpki.x509.X509(PEM = signed[0])
+ bsc_crl = rpki.x509.CRL(PEM_file = self.name + "-SELF-1.crl")
+
+ rpki.log.info("Installing BSC EE cert for %s" % self.name)
+ self.call_rpkid(rpki.left_right.bsc_elt.make_pdu(action = "set", self_id = self.self_id, bsc_id = self.bsc_id, signing_cert = bsc_ee, signing_cert_crl = bsc_crl),
+ cb = bsc_ee_set)
+
+ def bsc_ee_set(val):
+
+ rpki.log.info("Creating pubd client object for %s" % self.name)
+ client_cert = self.cross_certify(pubd_name + "-TA", reverse = True)
+ call_pubd(rpki.publication.client_elt.make_pdu(action = "create", base_uri = self.sia_base, bpki_cert = client_cert),
+ cb = got_client_id)
+
+ def got_client_id(val):
+ client_id = val.client_id
+
+ rpki.log.info("Creating rpkid repository object for %s" % self.name)
+ repository_cert = self.cross_certify(pubd_name + "-TA")
+ self.call_rpkid(rpki.left_right.repository_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id,
+ bpki_cms_cert = repository_cert, bpki_https_cert = repository_cert,
+ peer_contact_uri = "https://localhost:%d/client/%d" % (pubd_port, client_id)),
+ cb = got_repository_id)
+
+ def got_repository_id(val):
+ self.repository_id = val.repository_id
+
+ rpki.log.info("Creating rpkid parent object for %s" % self.name)
+ if self.is_root():
+ rootd_cert = self.cross_certify(rootd_name + "-TA")
+ self.call_rpkid(rpki.left_right.parent_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id,
+ repository_id = self.repository_id, sia_base = self.sia_base,
+ bpki_cms_cert = rootd_cert, bpki_https_cert = rootd_cert, sender_name = self.name, recipient_name = "Walrus",
+ peer_contact_uri = "https://localhost:%s/" % rootd_port),
+ cb = got_parent_id)
+ else:
+ parent_cms_cert = self.cross_certify(self.parent.name + "-SELF-1")
+ parent_https_cert = self.cross_certify(self.parent.name + "-TA")
+ self.call_rpkid(rpki.left_right.parent_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id,
+ repository_id = self.repository_id, sia_base = self.sia_base,
+ bpki_cms_cert = parent_cms_cert, bpki_https_cert = parent_https_cert,
+ sender_name = self.name, recipient_name = self.parent.name,
+ peer_contact_uri = "https://localhost:%s/up-down/%s" % (self.parent.rpki_port, self.child_id)),
+ cb = got_parent_id)
+
+ def got_parent_id(val):
+ self.parent_id = val.parent_id
+
+ rpki.log.info("Creating rpkid child objects for %s" % self.name)
+ self.sql_db = MySQLdb.connect(user = "irdb", db = self.irdb_db_name, passwd = irdb_db_pass)
+ self.sql_cur = self.sql_db.cursor()
+ assert not hasattr(self, "iterator")
+ self.iterator = rpki.async.iterator(self.kids, do_one_kid, kids_done)
+ self.iterator()
- def create_rpki_objects_8(self):
- self.sql_db.close()
- del self.iterator
- del self.sql_cur
- del self.sql_db
- if hasattr(self, "kid"):
- del self.kid
+ def do_one_kid(kid):
+ self.kid = kid
+ if kid.is_leaf():
+ bpki_cert = self.cross_certify(kid.name + "-TA")
+ else:
+ bpki_cert = self.cross_certify(kid.name + "-SELF-1")
+ rpki.log.info("Creating rpkid child object for %s as child of %s" % (kid.name, self.name))
+
+ def do_one_kid_cb(val):
+ self.kid.child_id = val.child_id
+ self.sql_cur.execute("UPDATE registrant SET rpki_self_id = %s, rpki_child_id = %s WHERE IRBE_mapped_id = %s", (self.self_id, self.kid.child_id, self.kid.name))
+ self.iterator()
+
+ self.call_rpkid(rpki.left_right.child_elt.make_pdu(action = "create", self_id = self.self_id, bsc_id = self.bsc_id, bpki_cert = bpki_cert),
+ cb = do_one_kid_cb)
+
+ def kids_done():
+ self.sql_db.close()
+ del self.iterator
+ del self.sql_cur
+ del self.sql_db
+ if hasattr(self, "kid"):
+ del self.kid
+
+ rpki.log.info("Creating rpkid route_origin objects for %s" % self.name)
+ assert not hasattr(self, "iterator")
+ self.iterator = rpki.async.iterator(self.route_origins, do_one_ro, cleanup)
+ self.iterator()
- rpki.log.info("Creating rpkid route_origin objects for %s" % self.name)
- assert not hasattr(self, "iterator")
- self.iterator = async_iterator(self.route_origins, self.create_rpki_objects_9, self.create_rpki_objects_10)
- self.iterator()
+ def do_one_ro(ro):
+ self.ro = ro
+ self.call_rpkid(rpki.left_right.route_origin_elt.make_pdu(action = "create", self_id = self.self_id,
+ as_number = ro.asn, ipv4 = ro.v4, ipv6 = ro.v6),
+ cb = do_one_ro_cb)
- def create_rpki_objects_9(self, ro):
- self.ro = ro
- self.call_rpkid(rpki.left_right.route_origin_elt.make_pdu(action = "create", self_id = self.self_id,
- as_number = ro.asn, ipv4 = ro.v4, ipv6 = ro.v6),
- cb = self.create_rpki_objects_9_cb)
+ def do_one_ro_cb(val):
+ self.ro.route_origin_id = val.route_origin_id
+ self.iterator()
- def create_rpki_objects_9_cb(self, val):
- self.ro.route_origin_id = val.route_origin_id
- self.iterator()
+ def cleanup():
+ if hasattr(self, "ro"):
+ del self.ro
+ del self.iterator
+ cb()
- def create_rpki_objects_10(self):
- if hasattr(self, "ro"):
- del self.ro
- del self.iterator
+ start()
def setup_yaml_leaf(self):
"""Generate certificates and write YAML scripts for leaf nodes.