#!/usr/bin/env python # $Id$ """ Package up state of an old (pre-rpkidb, pre-pubdb, pre-Django 1.8) RPKI CA installation as a Python pickle database, for later re-loading into a more recent version of the code using a companion script. """ import os import sys import cPickle import argparse import subprocess import rpki.config import rpki.version import rpki.autoconf from rpki.mysql_import import MySQLdb, _mysql_exceptions parser = argparse.ArgumentParser(description = __doc__) parser.add_argument("-c", "--config", help = "specify alternate location for rpki.conf") parser.add_argument("-p", "--protocol", choices = (0, 1, 2), type = int, default = 2, help = "pickling protocol to use") parser.add_argument("output", help = "output file") args = parser.parse_args() cfg = rpki.config.parser(args.config) databases = {} for section in ("rpkid", "irdbd", "pubd"): db = MySQLdb.connect(db = cfg.get(section = section, option = "sql-database"), user = cfg.get(section = section, option = "sql-username"), passwd = cfg.get(section = section, option = "sql-password")) tables = {} cur = db.cursor() cur.execute("SHOW TABLES") table_names = tuple(row[0] for row in cur.fetchall()) cur.close() cur = db.cursor(MySQLdb.cursors.DictCursor) for name in table_names: cur.execute("SELECT * FROM " + name) tables[name] = cur.fetchall() cur.close() db.close() databases[section] = tables filenames = [cfg.filename] raw_config = dict((section, {}) for section in cfg.cfg.sections()) cooked_config = dict((section, {}) for section in cfg.cfg.sections()) for section in cfg.cfg.sections(): for option in cfg.cfg.options(section): raw_config [section][option] = cfg.cfg.get(section = section, option = option) cooked_config[section][option] = cfg.get(section = section, option = option) if os.path.isfile( cooked_config[section][option]): filenames.append(cooked_config[section][option]) # Sigh, even here we need special hacks for rootd, which handles filenames a bit differently. rootd_dir = cfg.get(section = "rootd", option = "rpki-root-dir", default = "") for option in ("rpki-root-crl", "rpki-root-manifest", "rpki-subject-cert"): fn = os.path.join(rootd_dir, cfg.get(section = "rootd", option = option, default = "")) if os.path.isfile(fn): filenames.append(fn) for i, fn in enumerate(filenames): filenames[i] = os.path.abspath(fn) files = {} for filename in filenames: with open(filename, "rb") as f: files[filename] = f.read() world = dict( VERSION = rpki.version.VERSION, RPKI_CONF = filenames[0], db = databases, file = files, raw = raw_config, cfg = cooked_config) xz = subprocess.Popen( ("xz", "-C", "sha256"), stdin = subprocess.PIPE, stdout = os.open(args.output, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0600)) cPickle.dump(world, xz.stdin, args.protocol) xz.stdin.flush() xz.stdin.close() if xz.wait() != 0: sys.exit("XZ pickling failed with code {}".format(xz.returncode)) a id='n1' href='#n1'>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
<?xml version="1.0" encoding="US-ASCII"?>
<!--Automatically generated, do not edit.-->
<msg xmlns="http://www.hactrn.net/uris/rpki/left-right-spec/" version="1">
  <parent action="get" type="reply" self_id="42" parent_id="666" peer_contact_uri="https://re.bar.example/bandicoot/" sia_base="rsync://repo.foo.example/wombat/" bsc_id="17" repository_id="120">
    <cms_ta>
		MIIDGzCCAgOgAwIBAgIJAKi+/+wUhQlxMA0GCSqGSIb3DQEBBQUAMCQxIjAgBgNV
		BAMTGVRlc3QgQ2VydGlmaWNhdGUgQm9iIFJvb3QwHhcNMDcwODAxMTk1MzEwWhcN
		MDcwODMxMTk1MzEwWjAkMSIwIAYDVQQDExlUZXN0IENlcnRpZmljYXRlIEJvYiBS
		b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArKYUtJaM5PH5917S
		G2ACc7iBYdQO2HYyu8Gb6i9Q2Gxc3cWEX7RTBvgOL79pWf3GIdnoupzMnoZVtY3G
		Ux2G/0WkmLui2TCeDhcfXdQ4rcp8J3V/6ESj+yuEPPOG8UN17mUKKgujrch6ZvgC
		DO9AyOK/uXu+ABQXTPsn2pVe2EVh3V004ShLi8GKgVdqb/rW/6GTg0Xb/zLT6WWM
		uT++6sXTlztJdQYkRamJvKfQDU1naC8mAkGf79Tba0xyBGAUII0GfREY6t4/+NAP
		2Yyb3xNlBqcJoTov0JfNKHZcCZePr79j7LK/hkZxxip+Na9xDpE+oQRV+DRukCRJ
		diqg+wIDAQABo1AwTjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBTDEsXJe6pjAQD4
		ULlB7+GMDBlimTAfBgNVHSMEGDAWgBTDEsXJe6pjAQD4ULlB7+GMDBlimTANBgkq
		hkiG9w0BAQUFAAOCAQEAWWkNcW6S1tKKqtzJsdfhjJiAAPQmOXJskv0ta/8f6Acg
		cum1YieNdtT0n96P7CUHOWP8QBb91JzeewR7b6WJLwb1Offs3wNq3kk75pJe89r4
		XY39EZHhMW+Dv0PhIKu2CgD4LeyH1FVTQkF/QObGEmkn+s+HTsuzd1l2VLwcP1Sm
		sqep6LAlFj62qqaIJzNeQ9NVkBqtkygnYlBOkaBTHfQTux3jYNpEo8JJB5e/WFdH
		YyMNrG2xMOtIC7T4+IOHgT8PgrNhaeDg9ctewj0X8Qi9nI9nXeinicLX8vj6hdEq
		3ORv7RZMJNYqv1HQ3wUE2B7fCPFv7EUwzaCds1kgRQ==
	    </cms_ta>
    <https_ta>
		MIIDGzCCAgOgAwIBAgIJAKi+/+wUhQlxMA0GCSqGSIb3DQEBBQUAMCQxIjAgBgNV
		BAMTGVRlc3QgQ2VydGlmaWNhdGUgQm9iIFJvb3QwHhcNMDcwODAxMTk1MzEwWhcN
		MDcwODMxMTk1MzEwWjAkMSIwIAYDVQQDExlUZXN0IENlcnRpZmljYXRlIEJvYiBS
		b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArKYUtJaM5PH5917S
		G2ACc7iBYdQO2HYyu8Gb6i9Q2Gxc3cWEX7RTBvgOL79pWf3GIdnoupzMnoZVtY3G
		Ux2G/0WkmLui2TCeDhcfXdQ4rcp8J3V/6ESj+yuEPPOG8UN17mUKKgujrch6ZvgC
		DO9AyOK/uXu+ABQXTPsn2pVe2EVh3V004ShLi8GKgVdqb/rW/6GTg0Xb/zLT6WWM
		uT++6sXTlztJdQYkRamJvKfQDU1naC8mAkGf79Tba0xyBGAUII0GfREY6t4/+NAP
		2Yyb3xNlBqcJoTov0JfNKHZcCZePr79j7LK/hkZxxip+Na9xDpE+oQRV+DRukCRJ
		diqg+wIDAQABo1AwTjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBTDEsXJe6pjAQD4
		ULlB7+GMDBlimTAfBgNVHSMEGDAWgBTDEsXJe6pjAQD4ULlB7+GMDBlimTANBgkq
		hkiG9w0BAQUFAAOCAQEAWWkNcW6S1tKKqtzJsdfhjJiAAPQmOXJskv0ta/8f6Acg
		cum1YieNdtT0n96P7CUHOWP8QBb91JzeewR7b6WJLwb1Offs3wNq3kk75pJe89r4
		XY39EZHhMW+Dv0PhIKu2CgD4LeyH1FVTQkF/QObGEmkn+s+HTsuzd1l2VLwcP1Sm
		sqep6LAlFj62qqaIJzNeQ9NVkBqtkygnYlBOkaBTHfQTux3jYNpEo8JJB5e/WFdH
		YyMNrG2xMOtIC7T4+IOHgT8PgrNhaeDg9ctewj0X8Qi9nI9nXeinicLX8vj6hdEq
		3ORv7RZMJNYqv1HQ3wUE2B7fCPFv7EUwzaCds1kgRQ==
	    </https_ta>
  </parent>
</msg>