aboutsummaryrefslogtreecommitdiff
path: root/rpki/irdb
diff options
context:
space:
mode:
Diffstat (limited to 'rpki/irdb')
-rw-r--r--rpki/irdb/migrations/0001_initial.py595
-rw-r--r--rpki/irdb/migrations/__init__.py0
-rw-r--r--rpki/irdb/models.py123
-rw-r--r--rpki/irdb/zookeeper.py645
4 files changed, 948 insertions, 415 deletions
diff --git a/rpki/irdb/migrations/0001_initial.py b/rpki/irdb/migrations/0001_initial.py
new file mode 100644
index 00000000..bc0b9743
--- /dev/null
+++ b/rpki/irdb/migrations/0001_initial.py
@@ -0,0 +1,595 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding model 'ServerCA'
+ db.create_table(u'irdb_serverca', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('private_key', self.gf('rpki.fields.KeyField')(default=None, blank=True)),
+ ('latest_crl', self.gf('rpki.fields.CRLField')(default=None, blank=True)),
+ ('next_serial', self.gf('django.db.models.fields.BigIntegerField')(default=1)),
+ ('next_crl_number', self.gf('django.db.models.fields.BigIntegerField')(default=1)),
+ ('last_crl_update', self.gf('rpki.fields.SundialField')()),
+ ('next_crl_update', self.gf('rpki.fields.SundialField')()),
+ ))
+ db.send_create_signal(u'irdb', ['ServerCA'])
+
+ # Adding model 'ResourceHolderCA'
+ db.create_table(u'irdb_resourceholderca', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('private_key', self.gf('rpki.fields.KeyField')(default=None, blank=True)),
+ ('latest_crl', self.gf('rpki.fields.CRLField')(default=None, blank=True)),
+ ('next_serial', self.gf('django.db.models.fields.BigIntegerField')(default=1)),
+ ('next_crl_number', self.gf('django.db.models.fields.BigIntegerField')(default=1)),
+ ('last_crl_update', self.gf('rpki.fields.SundialField')()),
+ ('next_crl_update', self.gf('rpki.fields.SundialField')()),
+ ('handle', self.gf('rpki.irdb.models.HandleField')(unique=True, max_length=120)),
+ ))
+ db.send_create_signal(u'irdb', ['ResourceHolderCA'])
+
+ # Adding model 'HostedCA'
+ db.create_table(u'irdb_hostedca', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['irdb.ServerCA'])),
+ ('hosted', self.gf('django.db.models.fields.related.OneToOneField')(related_name='hosted_by', unique=True, to=orm['irdb.ResourceHolderCA'])),
+ ))
+ db.send_create_signal(u'irdb', ['HostedCA'])
+
+ # Adding unique constraint on 'HostedCA', fields ['issuer', 'hosted']
+ db.create_unique(u'irdb_hostedca', ['issuer_id', 'hosted_id'])
+
+ # Adding model 'ServerRevocation'
+ db.create_table(u'irdb_serverrevocation', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('serial', self.gf('django.db.models.fields.BigIntegerField')()),
+ ('revoked', self.gf('rpki.fields.SundialField')()),
+ ('expires', self.gf('rpki.fields.SundialField')()),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='revocations', to=orm['irdb.ServerCA'])),
+ ))
+ db.send_create_signal(u'irdb', ['ServerRevocation'])
+
+ # Adding unique constraint on 'ServerRevocation', fields ['issuer', 'serial']
+ db.create_unique(u'irdb_serverrevocation', ['issuer_id', 'serial'])
+
+ # Adding model 'ResourceHolderRevocation'
+ db.create_table(u'irdb_resourceholderrevocation', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('serial', self.gf('django.db.models.fields.BigIntegerField')()),
+ ('revoked', self.gf('rpki.fields.SundialField')()),
+ ('expires', self.gf('rpki.fields.SundialField')()),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='revocations', to=orm['irdb.ResourceHolderCA'])),
+ ))
+ db.send_create_signal(u'irdb', ['ResourceHolderRevocation'])
+
+ # Adding unique constraint on 'ResourceHolderRevocation', fields ['issuer', 'serial']
+ db.create_unique(u'irdb_resourceholderrevocation', ['issuer_id', 'serial'])
+
+ # Adding model 'ServerEE'
+ db.create_table(u'irdb_serveree', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('private_key', self.gf('rpki.fields.KeyField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ee_certificates', to=orm['irdb.ServerCA'])),
+ ('purpose', self.gf('rpki.fields.EnumField')()),
+ ))
+ db.send_create_signal(u'irdb', ['ServerEE'])
+
+ # Adding unique constraint on 'ServerEE', fields ['issuer', 'purpose']
+ db.create_unique(u'irdb_serveree', ['issuer_id', 'purpose'])
+
+ # Adding model 'Referral'
+ db.create_table(u'irdb_referral', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('private_key', self.gf('rpki.fields.KeyField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.OneToOneField')(related_name='referral_certificate', unique=True, to=orm['irdb.ResourceHolderCA'])),
+ ))
+ db.send_create_signal(u'irdb', ['Referral'])
+
+ # Adding model 'Turtle'
+ db.create_table(u'irdb_turtle', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('service_uri', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ))
+ db.send_create_signal(u'irdb', ['Turtle'])
+
+ # Adding model 'Rootd'
+ db.create_table(u'irdb_rootd', (
+ (u'turtle_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['irdb.Turtle'], unique=True, primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('private_key', self.gf('rpki.fields.KeyField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.OneToOneField')(related_name='rootd', unique=True, to=orm['irdb.ResourceHolderCA'])),
+ ))
+ db.send_create_signal(u'irdb', ['Rootd'])
+
+ # Adding model 'BSC'
+ db.create_table(u'irdb_bsc', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='bscs', to=orm['irdb.ResourceHolderCA'])),
+ ('handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('pkcs10', self.gf('rpki.fields.PKCS10Field')(default=None, blank=True)),
+ ))
+ db.send_create_signal(u'irdb', ['BSC'])
+
+ # Adding unique constraint on 'BSC', fields ['issuer', 'handle']
+ db.create_unique(u'irdb_bsc', ['issuer_id', 'handle'])
+
+ # Adding model 'Child'
+ db.create_table(u'irdb_child', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('ta', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('valid_until', self.gf('rpki.fields.SundialField')()),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='children', to=orm['irdb.ResourceHolderCA'])),
+ ('name', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+ ))
+ db.send_create_signal(u'irdb', ['Child'])
+
+ # Adding unique constraint on 'Child', fields ['issuer', 'handle']
+ db.create_unique(u'irdb_child', ['issuer_id', 'handle'])
+
+ # Adding model 'ChildASN'
+ db.create_table(u'irdb_childasn', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('start_as', self.gf('django.db.models.fields.BigIntegerField')()),
+ ('end_as', self.gf('django.db.models.fields.BigIntegerField')()),
+ ('child', self.gf('django.db.models.fields.related.ForeignKey')(related_name='asns', to=orm['irdb.Child'])),
+ ))
+ db.send_create_signal(u'irdb', ['ChildASN'])
+
+ # Adding unique constraint on 'ChildASN', fields ['child', 'start_as', 'end_as']
+ db.create_unique(u'irdb_childasn', ['child_id', 'start_as', 'end_as'])
+
+ # Adding model 'ChildNet'
+ db.create_table(u'irdb_childnet', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('start_ip', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('end_ip', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('version', self.gf('rpki.fields.EnumField')()),
+ ('child', self.gf('django.db.models.fields.related.ForeignKey')(related_name='address_ranges', to=orm['irdb.Child'])),
+ ))
+ db.send_create_signal(u'irdb', ['ChildNet'])
+
+ # Adding unique constraint on 'ChildNet', fields ['child', 'start_ip', 'end_ip', 'version']
+ db.create_unique(u'irdb_childnet', ['child_id', 'start_ip', 'end_ip', 'version'])
+
+ # Adding model 'Parent'
+ db.create_table(u'irdb_parent', (
+ (u'turtle_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['irdb.Turtle'], unique=True, primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('ta', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='parents', to=orm['irdb.ResourceHolderCA'])),
+ ('parent_handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('child_handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('repository_type', self.gf('rpki.fields.EnumField')()),
+ ('referrer', self.gf('rpki.irdb.models.HandleField')(max_length=120, null=True, blank=True)),
+ ('referral_authorization', self.gf('rpki.irdb.models.SignedReferralField')(default=None, null=True, blank=True)),
+ ))
+ db.send_create_signal(u'irdb', ['Parent'])
+
+ # Adding unique constraint on 'Parent', fields ['issuer', 'handle']
+ db.create_unique(u'irdb_parent', ['issuer_id', 'handle'])
+
+ # Adding model 'ROARequest'
+ db.create_table(u'irdb_roarequest', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='roa_requests', to=orm['irdb.ResourceHolderCA'])),
+ ('asn', self.gf('django.db.models.fields.BigIntegerField')()),
+ ))
+ db.send_create_signal(u'irdb', ['ROARequest'])
+
+ # Adding model 'ROARequestPrefix'
+ db.create_table(u'irdb_roarequestprefix', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('roa_request', self.gf('django.db.models.fields.related.ForeignKey')(related_name='prefixes', to=orm['irdb.ROARequest'])),
+ ('version', self.gf('rpki.fields.EnumField')()),
+ ('prefix', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('prefixlen', self.gf('django.db.models.fields.PositiveSmallIntegerField')()),
+ ('max_prefixlen', self.gf('django.db.models.fields.PositiveSmallIntegerField')()),
+ ))
+ db.send_create_signal(u'irdb', ['ROARequestPrefix'])
+
+ # Adding unique constraint on 'ROARequestPrefix', fields ['roa_request', 'version', 'prefix', 'prefixlen', 'max_prefixlen']
+ db.create_unique(u'irdb_roarequestprefix', ['roa_request_id', 'version', 'prefix', 'prefixlen', 'max_prefixlen'])
+
+ # Adding model 'GhostbusterRequest'
+ db.create_table(u'irdb_ghostbusterrequest', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ghostbuster_requests', to=orm['irdb.ResourceHolderCA'])),
+ ('parent', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ghostbuster_requests', null=True, to=orm['irdb.Parent'])),
+ ('vcard', self.gf('django.db.models.fields.TextField')()),
+ ))
+ db.send_create_signal(u'irdb', ['GhostbusterRequest'])
+
+ # Adding model 'EECertificateRequest'
+ db.create_table(u'irdb_eecertificaterequest', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('valid_until', self.gf('rpki.fields.SundialField')()),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ee_certificate_requests', to=orm['irdb.ResourceHolderCA'])),
+ ('pkcs10', self.gf('rpki.fields.PKCS10Field')(default=None, blank=True)),
+ ('gski', self.gf('django.db.models.fields.CharField')(max_length=27)),
+ ('cn', self.gf('django.db.models.fields.CharField')(max_length=64)),
+ ('sn', self.gf('django.db.models.fields.CharField')(max_length=64)),
+ ('eku', self.gf('django.db.models.fields.TextField')(null=True)),
+ ))
+ db.send_create_signal(u'irdb', ['EECertificateRequest'])
+
+ # Adding unique constraint on 'EECertificateRequest', fields ['issuer', 'gski']
+ db.create_unique(u'irdb_eecertificaterequest', ['issuer_id', 'gski'])
+
+ # Adding model 'EECertificateRequestASN'
+ db.create_table(u'irdb_eecertificaterequestasn', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('start_as', self.gf('django.db.models.fields.BigIntegerField')()),
+ ('end_as', self.gf('django.db.models.fields.BigIntegerField')()),
+ ('ee_certificate_request', self.gf('django.db.models.fields.related.ForeignKey')(related_name='asns', to=orm['irdb.EECertificateRequest'])),
+ ))
+ db.send_create_signal(u'irdb', ['EECertificateRequestASN'])
+
+ # Adding unique constraint on 'EECertificateRequestASN', fields ['ee_certificate_request', 'start_as', 'end_as']
+ db.create_unique(u'irdb_eecertificaterequestasn', ['ee_certificate_request_id', 'start_as', 'end_as'])
+
+ # Adding model 'EECertificateRequestNet'
+ db.create_table(u'irdb_eecertificaterequestnet', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('start_ip', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('end_ip', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('version', self.gf('rpki.fields.EnumField')()),
+ ('ee_certificate_request', self.gf('django.db.models.fields.related.ForeignKey')(related_name='address_ranges', to=orm['irdb.EECertificateRequest'])),
+ ))
+ db.send_create_signal(u'irdb', ['EECertificateRequestNet'])
+
+ # Adding unique constraint on 'EECertificateRequestNet', fields ['ee_certificate_request', 'start_ip', 'end_ip', 'version']
+ db.create_unique(u'irdb_eecertificaterequestnet', ['ee_certificate_request_id', 'start_ip', 'end_ip', 'version'])
+
+ # Adding model 'Repository'
+ db.create_table(u'irdb_repository', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('ta', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='repositories', to=orm['irdb.ResourceHolderCA'])),
+ ('client_handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('service_uri', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ('sia_base', self.gf('django.db.models.fields.TextField')()),
+ ('turtle', self.gf('django.db.models.fields.related.OneToOneField')(related_name='repository', unique=True, to=orm['irdb.Turtle'])),
+ ))
+ db.send_create_signal(u'irdb', ['Repository'])
+
+ # Adding unique constraint on 'Repository', fields ['issuer', 'handle']
+ db.create_unique(u'irdb_repository', ['issuer_id', 'handle'])
+
+ # Adding model 'Client'
+ db.create_table(u'irdb_client', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('certificate', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ('ta', self.gf('rpki.fields.CertificateField')(default=None, blank=True)),
+ ('issuer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='clients', to=orm['irdb.ServerCA'])),
+ ('sia_base', self.gf('django.db.models.fields.TextField')()),
+ ('parent_handle', self.gf('rpki.irdb.models.HandleField')(max_length=120)),
+ ))
+ db.send_create_signal(u'irdb', ['Client'])
+
+ # Adding unique constraint on 'Client', fields ['issuer', 'handle']
+ db.create_unique(u'irdb_client', ['issuer_id', 'handle'])
+
+
+ def backwards(self, orm):
+ # Removing unique constraint on 'Client', fields ['issuer', 'handle']
+ db.delete_unique(u'irdb_client', ['issuer_id', 'handle'])
+
+ # Removing unique constraint on 'Repository', fields ['issuer', 'handle']
+ db.delete_unique(u'irdb_repository', ['issuer_id', 'handle'])
+
+ # Removing unique constraint on 'EECertificateRequestNet', fields ['ee_certificate_request', 'start_ip', 'end_ip', 'version']
+ db.delete_unique(u'irdb_eecertificaterequestnet', ['ee_certificate_request_id', 'start_ip', 'end_ip', 'version'])
+
+ # Removing unique constraint on 'EECertificateRequestASN', fields ['ee_certificate_request', 'start_as', 'end_as']
+ db.delete_unique(u'irdb_eecertificaterequestasn', ['ee_certificate_request_id', 'start_as', 'end_as'])
+
+ # Removing unique constraint on 'EECertificateRequest', fields ['issuer', 'gski']
+ db.delete_unique(u'irdb_eecertificaterequest', ['issuer_id', 'gski'])
+
+ # Removing unique constraint on 'ROARequestPrefix', fields ['roa_request', 'version', 'prefix', 'prefixlen', 'max_prefixlen']
+ db.delete_unique(u'irdb_roarequestprefix', ['roa_request_id', 'version', 'prefix', 'prefixlen', 'max_prefixlen'])
+
+ # Removing unique constraint on 'Parent', fields ['issuer', 'handle']
+ db.delete_unique(u'irdb_parent', ['issuer_id', 'handle'])
+
+ # Removing unique constraint on 'ChildNet', fields ['child', 'start_ip', 'end_ip', 'version']
+ db.delete_unique(u'irdb_childnet', ['child_id', 'start_ip', 'end_ip', 'version'])
+
+ # Removing unique constraint on 'ChildASN', fields ['child', 'start_as', 'end_as']
+ db.delete_unique(u'irdb_childasn', ['child_id', 'start_as', 'end_as'])
+
+ # Removing unique constraint on 'Child', fields ['issuer', 'handle']
+ db.delete_unique(u'irdb_child', ['issuer_id', 'handle'])
+
+ # Removing unique constraint on 'BSC', fields ['issuer', 'handle']
+ db.delete_unique(u'irdb_bsc', ['issuer_id', 'handle'])
+
+ # Removing unique constraint on 'ServerEE', fields ['issuer', 'purpose']
+ db.delete_unique(u'irdb_serveree', ['issuer_id', 'purpose'])
+
+ # Removing unique constraint on 'ResourceHolderRevocation', fields ['issuer', 'serial']
+ db.delete_unique(u'irdb_resourceholderrevocation', ['issuer_id', 'serial'])
+
+ # Removing unique constraint on 'ServerRevocation', fields ['issuer', 'serial']
+ db.delete_unique(u'irdb_serverrevocation', ['issuer_id', 'serial'])
+
+ # Removing unique constraint on 'HostedCA', fields ['issuer', 'hosted']
+ db.delete_unique(u'irdb_hostedca', ['issuer_id', 'hosted_id'])
+
+ # Deleting model 'ServerCA'
+ db.delete_table(u'irdb_serverca')
+
+ # Deleting model 'ResourceHolderCA'
+ db.delete_table(u'irdb_resourceholderca')
+
+ # Deleting model 'HostedCA'
+ db.delete_table(u'irdb_hostedca')
+
+ # Deleting model 'ServerRevocation'
+ db.delete_table(u'irdb_serverrevocation')
+
+ # Deleting model 'ResourceHolderRevocation'
+ db.delete_table(u'irdb_resourceholderrevocation')
+
+ # Deleting model 'ServerEE'
+ db.delete_table(u'irdb_serveree')
+
+ # Deleting model 'Referral'
+ db.delete_table(u'irdb_referral')
+
+ # Deleting model 'Turtle'
+ db.delete_table(u'irdb_turtle')
+
+ # Deleting model 'Rootd'
+ db.delete_table(u'irdb_rootd')
+
+ # Deleting model 'BSC'
+ db.delete_table(u'irdb_bsc')
+
+ # Deleting model 'Child'
+ db.delete_table(u'irdb_child')
+
+ # Deleting model 'ChildASN'
+ db.delete_table(u'irdb_childasn')
+
+ # Deleting model 'ChildNet'
+ db.delete_table(u'irdb_childnet')
+
+ # Deleting model 'Parent'
+ db.delete_table(u'irdb_parent')
+
+ # Deleting model 'ROARequest'
+ db.delete_table(u'irdb_roarequest')
+
+ # Deleting model 'ROARequestPrefix'
+ db.delete_table(u'irdb_roarequestprefix')
+
+ # Deleting model 'GhostbusterRequest'
+ db.delete_table(u'irdb_ghostbusterrequest')
+
+ # Deleting model 'EECertificateRequest'
+ db.delete_table(u'irdb_eecertificaterequest')
+
+ # Deleting model 'EECertificateRequestASN'
+ db.delete_table(u'irdb_eecertificaterequestasn')
+
+ # Deleting model 'EECertificateRequestNet'
+ db.delete_table(u'irdb_eecertificaterequestnet')
+
+ # Deleting model 'Repository'
+ db.delete_table(u'irdb_repository')
+
+ # Deleting model 'Client'
+ db.delete_table(u'irdb_client')
+
+
+ models = {
+ u'irdb.bsc': {
+ 'Meta': {'unique_together': "(('issuer', 'handle'),)", 'object_name': 'BSC'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'bscs'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'pkcs10': ('rpki.fields.PKCS10Field', [], {'default': 'None', 'blank': 'True'})
+ },
+ u'irdb.child': {
+ 'Meta': {'unique_together': "(('issuer', 'handle'),)", 'object_name': 'Child'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'children'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'name': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'ta': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'valid_until': ('rpki.fields.SundialField', [], {})
+ },
+ u'irdb.childasn': {
+ 'Meta': {'unique_together': "(('child', 'start_as', 'end_as'),)", 'object_name': 'ChildASN'},
+ 'child': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'asns'", 'to': u"orm['irdb.Child']"}),
+ 'end_as': ('django.db.models.fields.BigIntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start_as': ('django.db.models.fields.BigIntegerField', [], {})
+ },
+ u'irdb.childnet': {
+ 'Meta': {'unique_together': "(('child', 'start_ip', 'end_ip', 'version'),)", 'object_name': 'ChildNet'},
+ 'child': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'address_ranges'", 'to': u"orm['irdb.Child']"}),
+ 'end_ip': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start_ip': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'version': ('rpki.fields.EnumField', [], {})
+ },
+ u'irdb.client': {
+ 'Meta': {'unique_together': "(('issuer', 'handle'),)", 'object_name': 'Client'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'clients'", 'to': u"orm['irdb.ServerCA']"}),
+ 'parent_handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ 'sia_base': ('django.db.models.fields.TextField', [], {}),
+ 'ta': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'})
+ },
+ u'irdb.eecertificaterequest': {
+ 'Meta': {'unique_together': "(('issuer', 'gski'),)", 'object_name': 'EECertificateRequest'},
+ 'cn': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'eku': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'gski': ('django.db.models.fields.CharField', [], {'max_length': '27'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ee_certificate_requests'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'pkcs10': ('rpki.fields.PKCS10Field', [], {'default': 'None', 'blank': 'True'}),
+ 'sn': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'valid_until': ('rpki.fields.SundialField', [], {})
+ },
+ u'irdb.eecertificaterequestasn': {
+ 'Meta': {'unique_together': "(('ee_certificate_request', 'start_as', 'end_as'),)", 'object_name': 'EECertificateRequestASN'},
+ 'ee_certificate_request': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'asns'", 'to': u"orm['irdb.EECertificateRequest']"}),
+ 'end_as': ('django.db.models.fields.BigIntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start_as': ('django.db.models.fields.BigIntegerField', [], {})
+ },
+ u'irdb.eecertificaterequestnet': {
+ 'Meta': {'unique_together': "(('ee_certificate_request', 'start_ip', 'end_ip', 'version'),)", 'object_name': 'EECertificateRequestNet'},
+ 'ee_certificate_request': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'address_ranges'", 'to': u"orm['irdb.EECertificateRequest']"}),
+ 'end_ip': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start_ip': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'version': ('rpki.fields.EnumField', [], {})
+ },
+ u'irdb.ghostbusterrequest': {
+ 'Meta': {'object_name': 'GhostbusterRequest'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ghostbuster_requests'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ghostbuster_requests'", 'null': 'True', 'to': u"orm['irdb.Parent']"}),
+ 'vcard': ('django.db.models.fields.TextField', [], {})
+ },
+ u'irdb.hostedca': {
+ 'Meta': {'unique_together': "(('issuer', 'hosted'),)", 'object_name': 'HostedCA'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'hosted': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'hosted_by'", 'unique': 'True', 'to': u"orm['irdb.ResourceHolderCA']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['irdb.ServerCA']"})
+ },
+ u'irdb.parent': {
+ 'Meta': {'unique_together': "(('issuer', 'handle'),)", 'object_name': 'Parent', '_ormbases': [u'irdb.Turtle']},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'child_handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ 'handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parents'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'parent_handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ 'referral_authorization': ('rpki.irdb.models.SignedReferralField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+ 'referrer': ('rpki.irdb.models.HandleField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'repository_type': ('rpki.fields.EnumField', [], {}),
+ 'ta': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ u'turtle_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['irdb.Turtle']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ u'irdb.referral': {
+ 'Meta': {'object_name': 'Referral'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'referral_certificate'", 'unique': 'True', 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'private_key': ('rpki.fields.KeyField', [], {'default': 'None', 'blank': 'True'})
+ },
+ u'irdb.repository': {
+ 'Meta': {'unique_together': "(('issuer', 'handle'),)", 'object_name': 'Repository'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'client_handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ 'handle': ('rpki.irdb.models.HandleField', [], {'max_length': '120'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'repositories'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'service_uri': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'sia_base': ('django.db.models.fields.TextField', [], {}),
+ 'ta': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'turtle': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'repository'", 'unique': 'True', 'to': u"orm['irdb.Turtle']"})
+ },
+ u'irdb.resourceholderca': {
+ 'Meta': {'object_name': 'ResourceHolderCA'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'handle': ('rpki.irdb.models.HandleField', [], {'unique': 'True', 'max_length': '120'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_crl_update': ('rpki.fields.SundialField', [], {}),
+ 'latest_crl': ('rpki.fields.CRLField', [], {'default': 'None', 'blank': 'True'}),
+ 'next_crl_number': ('django.db.models.fields.BigIntegerField', [], {'default': '1'}),
+ 'next_crl_update': ('rpki.fields.SundialField', [], {}),
+ 'next_serial': ('django.db.models.fields.BigIntegerField', [], {'default': '1'}),
+ 'private_key': ('rpki.fields.KeyField', [], {'default': 'None', 'blank': 'True'})
+ },
+ u'irdb.resourceholderrevocation': {
+ 'Meta': {'unique_together': "(('issuer', 'serial'),)", 'object_name': 'ResourceHolderRevocation'},
+ 'expires': ('rpki.fields.SundialField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revocations'", 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'revoked': ('rpki.fields.SundialField', [], {}),
+ 'serial': ('django.db.models.fields.BigIntegerField', [], {})
+ },
+ u'irdb.roarequest': {
+ 'Meta': {'object_name': 'ROARequest'},
+ 'asn': ('django.db.models.fields.BigIntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'roa_requests'", 'to': u"orm['irdb.ResourceHolderCA']"})
+ },
+ u'irdb.roarequestprefix': {
+ 'Meta': {'unique_together': "(('roa_request', 'version', 'prefix', 'prefixlen', 'max_prefixlen'),)", 'object_name': 'ROARequestPrefix'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'max_prefixlen': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
+ 'prefix': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'prefixlen': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
+ 'roa_request': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'prefixes'", 'to': u"orm['irdb.ROARequest']"}),
+ 'version': ('rpki.fields.EnumField', [], {})
+ },
+ u'irdb.rootd': {
+ 'Meta': {'object_name': 'Rootd', '_ormbases': [u'irdb.Turtle']},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ 'issuer': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'rootd'", 'unique': 'True', 'to': u"orm['irdb.ResourceHolderCA']"}),
+ 'private_key': ('rpki.fields.KeyField', [], {'default': 'None', 'blank': 'True'}),
+ u'turtle_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['irdb.Turtle']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ u'irdb.serverca': {
+ 'Meta': {'object_name': 'ServerCA'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_crl_update': ('rpki.fields.SundialField', [], {}),
+ 'latest_crl': ('rpki.fields.CRLField', [], {'default': 'None', 'blank': 'True'}),
+ 'next_crl_number': ('django.db.models.fields.BigIntegerField', [], {'default': '1'}),
+ 'next_crl_update': ('rpki.fields.SundialField', [], {}),
+ 'next_serial': ('django.db.models.fields.BigIntegerField', [], {'default': '1'}),
+ 'private_key': ('rpki.fields.KeyField', [], {'default': 'None', 'blank': 'True'})
+ },
+ u'irdb.serveree': {
+ 'Meta': {'unique_together': "(('issuer', 'purpose'),)", 'object_name': 'ServerEE'},
+ 'certificate': ('rpki.fields.CertificateField', [], {'default': 'None', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ee_certificates'", 'to': u"orm['irdb.ServerCA']"}),
+ 'private_key': ('rpki.fields.KeyField', [], {'default': 'None', 'blank': 'True'}),
+ 'purpose': ('rpki.fields.EnumField', [], {})
+ },
+ u'irdb.serverrevocation': {
+ 'Meta': {'unique_together': "(('issuer', 'serial'),)", 'object_name': 'ServerRevocation'},
+ 'expires': ('rpki.fields.SundialField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revocations'", 'to': u"orm['irdb.ServerCA']"}),
+ 'revoked': ('rpki.fields.SundialField', [], {}),
+ 'serial': ('django.db.models.fields.BigIntegerField', [], {})
+ },
+ u'irdb.turtle': {
+ 'Meta': {'object_name': 'Turtle'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'service_uri': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ }
+ }
+
+ complete_apps = ['irdb'] \ No newline at end of file
diff --git a/rpki/irdb/migrations/__init__.py b/rpki/irdb/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/rpki/irdb/migrations/__init__.py
diff --git a/rpki/irdb/models.py b/rpki/irdb/models.py
index 6fa48c59..f89cebd4 100644
--- a/rpki/irdb/models.py
+++ b/rpki/irdb/models.py
@@ -34,6 +34,8 @@ import socket
import rpki.POW
from south.modelsinspector import add_introspection_rules
+from rpki.fields import EnumField, SundialField, CertificateField, DERField, KeyField, CRLField, PKCS10Field
+
## @var ip_version_choices
# Choice argument for fields implementing IP version numbers.
@@ -61,11 +63,11 @@ ee_certificate_lifetime = rpki.sundial.timedelta(days = 60)
###
-# Field types
+# Field classes
class HandleField(django.db.models.CharField):
"""
- A handle field type.
+ A handle field class. Replace this with SlugField?
"""
description = 'A "handle" in one of the RPKI protocols'
@@ -74,103 +76,26 @@ class HandleField(django.db.models.CharField):
kwargs["max_length"] = 120
django.db.models.CharField.__init__(self, *args, **kwargs)
-class EnumField(django.db.models.PositiveSmallIntegerField):
- """
- An enumeration type that uses strings in Python and small integers
- in SQL.
- """
-
- description = "An enumeration type"
-
- __metaclass__ = django.db.models.SubfieldBase
-
- def __init__(self, *args, **kwargs):
- if isinstance(kwargs.get("choices"), (tuple, list)) and isinstance(kwargs["choices"][0], str):
- kwargs["choices"] = tuple(enumerate(kwargs["choices"], 1))
- django.db.models.PositiveSmallIntegerField.__init__(self, *args, **kwargs)
- self.enum_i2s = dict(self.flatchoices)
- self.enum_s2i = dict((v, k) for k, v in self.flatchoices)
-
- def to_python(self, value):
- return self.enum_i2s.get(value, value)
-
- def get_prep_value(self, value):
- return self.enum_s2i.get(value, value)
-
-class SundialField(django.db.models.DateTimeField):
- """
- A field type for our customized datetime objects.
- """
- __metaclass__ = django.db.models.SubfieldBase
-
- description = "A datetime type using our customized datetime objects"
-
- def to_python(self, value):
- if isinstance(value, rpki.sundial.pydatetime.datetime):
- return rpki.sundial.datetime.from_datetime(
- django.db.models.DateTimeField.to_python(self, value))
- else:
- return value
-
- def get_prep_value(self, value):
- if isinstance(value, rpki.sundial.datetime):
- return value.to_datetime()
- else:
- return value
-
-
-class DERField(django.db.models.Field):
- """
- Field types for DER objects.
- """
-
- __metaclass__ = django.db.models.SubfieldBase
- def __init__(self, *args, **kwargs):
- kwargs["serialize"] = False
- kwargs["blank"] = True
- kwargs["default"] = None
- django.db.models.Field.__init__(self, *args, **kwargs)
-
- def db_type(self, connection):
- if connection.settings_dict['ENGINE'] == "django.db.backends.posgresql":
- return "bytea"
- else:
- return "BLOB"
-
- def to_python(self, value):
- assert value is None or isinstance(value, (self.rpki_type, str))
- if isinstance(value, str):
- return self.rpki_type(DER = value)
- else:
- return value
+class SignedReferralField(DERField):
+ description = "CMS signed object containing XML"
+ rpki_type = rpki.x509.SignedReferral
- def get_prep_value(self, value):
- assert value is None or isinstance(value, (self.rpki_type, str))
- if isinstance(value, self.rpki_type):
- return value.get_DER()
- else:
- return value
+# Alias to keep old rpki.gui migrations happy. Would generating a new
+# schema migration for rpki.gui remove the need, or do we have to
+# preserve every old field class we've ever used forever? Dunno.
-class CertificateField(DERField):
- description = "X.509 certificate"
- rpki_type = rpki.x509.X509
+RSAKeyField = KeyField
-class RSAKeyField(DERField):
- description = "RSA keypair"
- rpki_type = rpki.x509.RSA
+# Introspection rules for Django South
-class CRLField(DERField):
- description = "Certificate Revocation List"
- rpki_type = rpki.x509.CRL
+field_classes = [HandleField, SignedReferralField]
-class PKCS10Field(DERField):
- description = "PKCS #10 certificate request"
- rpki_type = rpki.x509.PKCS10
+add_introspection_rules([(field_classes, [], {})],
+ [r"^rpki\.irdb\.models\." + cls.__name__
+ for cls in field_classes])
-class SignedReferralField(DERField):
- description = "CMS signed object containing XML"
- rpki_type = rpki.x509.SignedReferral
+del field_classes
# Custom managers
@@ -231,7 +156,7 @@ class ResourceHolderEEManager(CertificateManager):
class CA(django.db.models.Model):
certificate = CertificateField()
- private_key = RSAKeyField()
+ private_key = KeyField()
latest_crl = CRLField()
# Might want to bring these into line with what rpkid does. Current
@@ -391,7 +316,7 @@ class ResourceHolderRevocation(Revocation):
issuer = django.db.models.ForeignKey(ResourceHolderCA, related_name = "revocations")
class EECertificate(Certificate):
- private_key = RSAKeyField()
+ private_key = KeyField()
class Meta:
abstract = True
@@ -634,13 +559,3 @@ class Client(CrossCertification):
# This shouldn't be necessary
class Meta:
unique_together = ("issuer", "handle")
-
-# for Django South -- these are just simple subclasses
-add_introspection_rules([],
- (r'^rpki\.irdb\.models\.CertificateField',
- r'^rpki\.irdb\.models\.CRLField',
- r'^rpki\.irdb\.models\.EnumField',
- r'^rpki\.irdb\.models\.HandleField',
- r'^rpki\.irdb\.models\.RSAKeyField',
- r'^rpki\.irdb\.models\.SignedReferralField',
- r'^rpki\.irdb\.models\.SundialField'))
diff --git a/rpki/irdb/zookeeper.py b/rpki/irdb/zookeeper.py
index 1e163a4d..e14fc1df 100644
--- a/rpki/irdb/zookeeper.py
+++ b/rpki/irdb/zookeeper.py
@@ -28,13 +28,13 @@ import types
import rpki.config
import rpki.sundial
import rpki.oids
-import rpki.http
+import rpki.http_simple
import rpki.resource_set
import rpki.relaxng
import rpki.left_right
import rpki.x509
-import rpki.async
import rpki.irdb
+import rpki.publication_control
import django.db.transaction
from lxml.etree import (Element, SubElement, ElementTree,
@@ -148,7 +148,6 @@ class etree_wrapper(object):
"""
Wrapper for ETree objects so we can return them as function results
without requiring the caller to understand much about them.
-
"""
def __init__(self, e, msg = None, debug = False):
@@ -189,9 +188,9 @@ class etree_wrapper(object):
class Zookeeper(object):
## @var show_xml
- # Whether to show XML for debugging
+ # If not None, a file-like object to which to prettyprint XML, for debugging.
- show_xml = False
+ show_xml = None
def __init__(self, cfg = None, handle = None, logstream = None):
@@ -460,6 +459,26 @@ class Zookeeper(object):
ca.save()
+ @staticmethod
+ def _compose_left_right_query():
+ """
+ Compose top level element of a left-right query.
+ """
+
+ return Element(rpki.left_right.tag_msg, nsmap = rpki.left_right.nsmap,
+ type = "query", version = rpki.left_right.version)
+
+
+ @staticmethod
+ def _compose_publication_control_query():
+ """
+ Compose top level element of a publication-control query.
+ """
+
+ return Element(rpki.publication_control.tag_msg, nsmap = rpki.publication_control.nsmap,
+ type = "query", version = rpki.publication_control.version)
+
+
@django.db.transaction.commit_on_success
def synchronize_bpki(self):
"""
@@ -471,82 +490,68 @@ class Zookeeper(object):
"""
if self.run_rpkid:
- updates = []
-
- updates.extend(
- rpki.left_right.self_elt.make_pdu(
- action = "set",
- tag = "%s__self" % ca.handle,
- self_handle = ca.handle,
- bpki_cert = ca.certificate)
- for ca in rpki.irdb.ResourceHolderCA.objects.all())
-
- updates.extend(
- rpki.left_right.bsc_elt.make_pdu(
- action = "set",
- tag = "%s__bsc__%s" % (bsc.issuer.handle, bsc.handle),
- self_handle = bsc.issuer.handle,
- bsc_handle = bsc.handle,
- signing_cert = bsc.certificate,
- signing_cert_crl = bsc.issuer.latest_crl)
- for bsc in rpki.irdb.BSC.objects.all())
-
- updates.extend(
- rpki.left_right.repository_elt.make_pdu(
- action = "set",
- tag = "%s__repository__%s" % (repository.issuer.handle, repository.handle),
- self_handle = repository.issuer.handle,
- repository_handle = repository.handle,
- bpki_cert = repository.certificate)
- for repository in rpki.irdb.Repository.objects.all())
-
- updates.extend(
- rpki.left_right.parent_elt.make_pdu(
- action = "set",
- tag = "%s__parent__%s" % (parent.issuer.handle, parent.handle),
- self_handle = parent.issuer.handle,
- parent_handle = parent.handle,
- bpki_cms_cert = parent.certificate)
- for parent in rpki.irdb.Parent.objects.all())
-
- updates.extend(
- rpki.left_right.parent_elt.make_pdu(
- action = "set",
- tag = "%s__rootd" % rootd.issuer.handle,
- self_handle = rootd.issuer.handle,
- parent_handle = rootd.issuer.handle,
- bpki_cms_cert = rootd.certificate)
- for rootd in rpki.irdb.Rootd.objects.all())
-
- updates.extend(
- rpki.left_right.child_elt.make_pdu(
- action = "set",
- tag = "%s__child__%s" % (child.issuer.handle, child.handle),
- self_handle = child.issuer.handle,
- child_handle = child.handle,
- bpki_cert = child.certificate)
- for child in rpki.irdb.Child.objects.all())
-
- if updates:
- self.check_error_report(self.call_rpkid(updates))
+ q_msg = self._compose_left_right_query()
+
+ for ca in rpki.irdb.ResourceHolderCA.objects.all():
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_self,
+ action = "set",
+ tag = "%s__self" % ca.handle,
+ self_handle = ca.handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cert).text = ca.certificate.get_Base64()
+
+ for bsc in rpki.irdb.BSC.objects.all():
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_bsc,
+ action = "set",
+ tag = "%s__bsc__%s" % (bsc.issuer.handle, bsc.handle),
+ self_handle = bsc.issuer.handle,
+ bsc_handle = bsc.handle)
+ SubElement(q_pdu, rpki.left_right.tag_signing_cert).text = bsc.certificate.get_Base64()
+ SubElement(q_pdu, rpki.left_right.tag_signing_cert_crl).text = bsc.issuer.latest_crl.get_Base64()
+
+ for repository in rpki.irdb.Repository.objects.all():
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_repository,
+ action = "set",
+ tag = "%s__repository__%s" % (repository.issuer.handle, repository.handle),
+ self_handle = repository.issuer.handle,
+ repository_handle = repository.handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cert).text = repository.certificate.get_Base64()
+
+ for parent in rpki.irdb.Parent.objects.all():
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_parent,
+ action = "set",
+ tag = "%s__parent__%s" % (parent.issuer.handle, parent.handle),
+ self_handle = parent.issuer.handle,
+ parent_handle = parent.handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cms_cert).text = parent.certificate.get_Base64()
+
+ for rootd in rpki.irdb.Rootd.objects.all():
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_parent,
+ action = "set",
+ tag = "%s__rootd" % rootd.issuer.handle,
+ self_handle = rootd.issuer.handle,
+ parent_handle = rootd.issuer.handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cms_cert).text = rootd.certificate.get_Base64()
+
+ for child in rpki.irdb.Child.objects.all():
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_child,
+ action = "set",
+ tag = "%s__child__%s" % (child.issuer.handle, child.handle),
+ self_handle = child.issuer.handle,
+ child_handle = child.handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cert).text = child.certificate.get_Base64()
+
+ if len(q_msg) > 0:
+ self.call_rpkid(q_msg)
if self.run_pubd:
- updates = []
-
- updates.append(
- rpki.publication.config_elt.make_pdu(
- action = "set",
- bpki_crl = self.server_ca.latest_crl))
+ q_msg = self._compose_publication_control_query()
- updates.extend(
- rpki.publication.client_elt.make_pdu(
- action = "set",
- client_handle = client.handle,
- bpki_cert = client.certificate)
- for client in self.server_ca.clients.all())
+ for client in self.server_ca.clients.all():
+ q_pdu = SubElement(q_msg, rpki.publication_control.tag_client, action = "set", client_handle = client.handle)
+ SubElement(q_pdu, rpki.publication_control.tag_bpki_cert).text = client.certificate.get_Base64()
- if updates:
- self.check_error_report(self.call_pubd(updates))
+ if len(q_msg) > 0:
+ self.call_pubd(q_msg)
@django.db.transaction.commit_on_success
@@ -1037,14 +1042,9 @@ class Zookeeper(object):
vcard = []
- def call_rpkid(self, *pdus):
+ def call_rpkid(self, q_msg, suppress_error_check = False):
"""
Issue a call to rpkid, return result.
-
- Implementation is a little silly, constructs a wrapper object,
- invokes it once, then throws it away. Hard to do better without
- rewriting a bit of the HTTP code, as we want to be sure we're
- using the current BPKI certificate and key objects.
"""
url = "http://%s:%s/left-right" % (
@@ -1054,21 +1054,29 @@ class Zookeeper(object):
rpkid = self.server_ca.ee_certificates.get(purpose = "rpkid")
irbe = self.server_ca.ee_certificates.get(purpose = "irbe")
- if len(pdus) == 1 and isinstance(pdus[0], types.GeneratorType):
- pdus = tuple(pdus[0])
- elif len(pdus) == 1 and isinstance(pdus[0], (tuple, list)):
- pdus = pdus[0]
+ r_msg = rpki.http_simple.client(
+ proto_cms_msg = rpki.left_right.cms_msg_no_sax,
+ client_key = irbe.private_key,
+ client_cert = irbe.certificate,
+ server_ta = self.server_ca.certificate,
+ server_cert = rpkid.certificate,
+ url = url,
+ q_msg = q_msg,
+ debug = self.show_xml)
+
+ if not suppress_error_check:
+ self.check_error_report(r_msg)
- call_rpkid = rpki.async.sync_wrapper(rpki.http.caller(
- proto = rpki.left_right,
- client_key = irbe.private_key,
- client_cert = irbe.certificate,
- server_ta = self.server_ca.certificate,
- server_cert = rpkid.certificate,
- url = url,
- debug = self.show_xml))
+ return r_msg
- return call_rpkid(*pdus)
+
+ def _rpkid_self_control(self, *bools):
+ assert all(isinstance(b, str) for b in bools)
+ q_msg = self._compose_left_right_query()
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_self, action = "set", self_handle = self.handle)
+ for b in bools:
+ q_pdu.set(b, "yes")
+ return self.call_rpkid(q_msg)
def run_rpkid_now(self):
@@ -1080,8 +1088,7 @@ class Zookeeper(object):
to force the object to be immediately issued.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = self.handle, run_now = "yes"))
+ return self._rpkid_self_control("run_now")
def publish_world_now(self):
@@ -1089,8 +1096,7 @@ class Zookeeper(object):
Poke rpkid to (re)publish everything for the current handle.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = self.handle, publish_world_now = "yes"))
+ return self._rpkid_self_control("publish_world_now")
def reissue(self):
@@ -1098,8 +1104,8 @@ class Zookeeper(object):
Poke rpkid to reissue everything for the current handle.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = self.handle, reissue = "yes"))
+ return self._rpkid_self_control("reissue")
+
def rekey(self):
"""
@@ -1107,8 +1113,7 @@ class Zookeeper(object):
handle.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = self.handle, rekey = "yes"))
+ return self._rpkid_self_control("rekey")
def revoke(self):
@@ -1116,8 +1121,7 @@ class Zookeeper(object):
Poke rpkid to revoke old RPKI keys for the current handle.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = self.handle, revoke = "yes"))
+ return self._rpkid_self_control("revoke")
def revoke_forgotten(self):
@@ -1125,8 +1129,7 @@ class Zookeeper(object):
Poke rpkid to revoke old forgotten RPKI keys for the current handle.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = self.handle, revoke_forgotten = "yes"))
+ return self._rpkid_self_control("revoke_forgotten")
def clear_all_sql_cms_replay_protection(self):
@@ -1134,27 +1137,27 @@ class Zookeeper(object):
Tell rpkid and pubd to clear replay protection for all SQL-based
entities. This is a fairly blunt instrument, but as we don't
expect this to be necessary except in the case of gross
- misconfiguration, it should suffice
+ misconfiguration, it should suffice.
"""
- self.call_rpkid(rpki.left_right.self_elt.make_pdu(action = "set", self_handle = ca.handle,
- clear_replay_protection = "yes")
- for ca in rpki.irdb.ResourceHolderCA.objects.all())
+ if self.run_rpkid:
+ q_msg = self._compose_left_right_query()
+ for ca in rpki.irdb.ResourceHolderCA.objects.all():
+ SubElement(q_msg, rpki.left_right.tag_self, action = "set",
+ self_handle = ca.handle, clear_replay_protection = "yes")
+ self.call_rpkid(q_msg)
+
if self.run_pubd:
- self.call_pubd(rpki.publication.client_elt.make_pdu(action = "set",
- client_handle = client.handle,
- clear_replay_protection = "yes")
- for client in self.server_ca.clients.all())
+ q_msg = self._compose_publication_control_query()
+ for client in self.server_ca.clients.all():
+ SubElement(q_msg, rpki.publication_control.tag_client, action = "set",
+ client_handle = client.handle, clear_reply_protection = "yes")
+ self.call_pubd(q_msg)
- def call_pubd(self, *pdus):
+ def call_pubd(self, q_msg):
"""
Issue a call to pubd, return result.
-
- Implementation is a little silly, constructs a wrapper object,
- invokes it once, then throws it away. Hard to do better without
- rewriting a bit of the HTTP code, as we want to be sure we're
- using the current BPKI certificate and key objects.
"""
url = "http://%s:%s/control" % (
@@ -1164,39 +1167,38 @@ class Zookeeper(object):
pubd = self.server_ca.ee_certificates.get(purpose = "pubd")
irbe = self.server_ca.ee_certificates.get(purpose = "irbe")
- if len(pdus) == 1 and isinstance(pdus[0], types.GeneratorType):
- pdus = tuple(pdus[0])
- elif len(pdus) == 1 and isinstance(pdus[0], (tuple, list)):
- pdus = pdus[0]
-
- call_pubd = rpki.async.sync_wrapper(rpki.http.caller(
- proto = rpki.publication,
- client_key = irbe.private_key,
- client_cert = irbe.certificate,
- server_ta = self.server_ca.certificate,
- server_cert = pubd.certificate,
- url = url,
- debug = self.show_xml))
+ r_msg = rpki.http_simple.client(
+ proto_cms_msg = rpki.publication_control.cms_msg_no_sax,
+ client_key = irbe.private_key,
+ client_cert = irbe.certificate,
+ server_ta = self.server_ca.certificate,
+ server_cert = pubd.certificate,
+ url = url,
+ q_msg = q_msg,
+ debug = self.show_xml)
- return call_pubd(*pdus)
+ self.check_error_report(r_msg)
+ return r_msg
- def check_error_report(self, pdus):
+ def check_error_report(self, r_msg):
"""
Check a response from rpkid or pubd for error_report PDUs, log and
throw exceptions as needed.
"""
- if any(isinstance(pdu, (rpki.left_right.report_error_elt, rpki.publication.report_error_elt)) for pdu in pdus):
- for pdu in pdus:
- if isinstance(pdu, rpki.left_right.report_error_elt):
- self.log("rpkid reported failure: %s" % pdu.error_code)
- elif isinstance(pdu, rpki.publication.report_error_elt):
- self.log("pubd reported failure: %s" % pdu.error_code)
+ if any(r_pdu.tag in (rpki.left_right.tag_report_error,
+ rpki.publication_control.tag_report_error)
+ for r_pdu in r_msg):
+ for r_pdu in r_msg:
+ if r_pdu.tag == rpki.left_right.tag_report_error:
+ self.log("rpkid reported failure: %s" % pdu.get("error_code"))
+ elif r_pdu.tag == rpki.publication_control.tag_report_error:
+ self.log("pubd reported failure: %s" % pdu.get("error_code"))
else:
continue
- if pdu.error_text:
- self.log(pdu.error_text)
+ if r_pdu.text:
+ self.log(r_pdu.text)
raise CouldntTalkToDaemon
@@ -1288,20 +1290,35 @@ class Zookeeper(object):
# See what rpkid already has on file for this entity.
- rpkid_reply = self.call_rpkid(
- rpki.left_right.self_elt.make_pdu( action = "get", tag = "self", self_handle = ca.handle),
- rpki.left_right.bsc_elt.make_pdu( action = "list", tag = "bsc", self_handle = ca.handle),
- rpki.left_right.repository_elt.make_pdu(action = "list", tag = "repository", self_handle = ca.handle),
- rpki.left_right.parent_elt.make_pdu( action = "list", tag = "parent", self_handle = ca.handle),
- rpki.left_right.child_elt.make_pdu( action = "list", tag = "child", self_handle = ca.handle))
+ q_msg = self._compose_left_right_query()
+ SubElement(q_msg, rpki.left_right.tag_self, action = "get", self_handle = ca.handle)
+ SubElement(q_msg, rpki.left_right.tag_bsc, action = "list", self_handle = ca.handle)
+ SubElement(q_msg, rpki.left_right.tag_repository, action = "list", self_handle = ca.handle)
+ SubElement(q_msg, rpki.left_right.tag_parent, action = "list", self_handle = ca.handle)
+ SubElement(q_msg, rpki.left_right.tag_child, action = "list", self_handle = ca.handle)
- self_pdu = rpkid_reply[0]
- bsc_pdus = dict((x.bsc_handle, x) for x in rpkid_reply if isinstance(x, rpki.left_right.bsc_elt))
- repository_pdus = dict((x.repository_handle, x) for x in rpkid_reply if isinstance(x, rpki.left_right.repository_elt))
- parent_pdus = dict((x.parent_handle, x) for x in rpkid_reply if isinstance(x, rpki.left_right.parent_elt))
- child_pdus = dict((x.child_handle, x) for x in rpkid_reply if isinstance(x, rpki.left_right.child_elt))
+ r_msg = self.call_rpkid(q_msg, suppress_error_check = True)
- rpkid_query = []
+ if r_msg[0].tag == rpki.left_right.tag_self:
+ self.check_error_report(r_msg)
+ self_pdu = r_msg[0]
+ else:
+ self_pdu = None
+
+ bsc_pdus = dict((r_pdu.get("bsc_handle"), r_pdu)
+ for r_pdu in r_msg
+ if r_pdu.tag == rpki.left_right.tag_bsc)
+ repository_pdus = dict((r_pdu.get("repository_handle"), r_pdu)
+ for r_pdu in r_msg
+ if r_pdu.tag == rpki.left_right.tag_repository)
+ parent_pdus = dict((r_pdu.get("parent_handle"), r_pdu)
+ for r_pdu in r_msg
+ if r_pdu.tag == rpki.left_right.tag_parent)
+ child_pdus = dict((r_pdu.get("child_handle"), r_pdu)
+ for r_pdu in r_msg
+ if r_pdu.tag == rpki.left_right.tag_child)
+
+ q_msg = self._compose_left_right_query()
self_cert, created = rpki.irdb.HostedCA.objects.get_or_certify(
issuer = self.server_ca,
@@ -1309,73 +1326,67 @@ class Zookeeper(object):
# There should be exactly one <self/> object per hosted entity, by definition
- if (isinstance(self_pdu, rpki.left_right.report_error_elt) or
- self_pdu.crl_interval != self_crl_interval or
- self_pdu.regen_margin != self_regen_margin or
- self_pdu.bpki_cert != self_cert.certificate):
- rpkid_query.append(rpki.left_right.self_elt.make_pdu(
- action = "create" if isinstance(self_pdu, rpki.left_right.report_error_elt) else "set",
- tag = "self",
- self_handle = ca.handle,
- bpki_cert = ca.certificate,
- crl_interval = self_crl_interval,
- regen_margin = self_regen_margin))
+ if (self_pdu is None or
+ self_pdu.get("crl_interval") != str(self_crl_interval) or
+ self_pdu.get("regen_margin") != str(self_regen_margin) or
+ self_pdu.findtext(rpki.left_right.tag_bpki_cert, "").decode("base64") != self_cert.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_self,
+ action = "create" if self_pdu is None else "set",
+ tag = "self",
+ self_handle = ca.handle,
+ crl_interval = str(self_crl_interval),
+ regen_margin = str(self_regen_margin))
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cert).text = ca.certificate.get_Base64()
# In general we only need one <bsc/> per <self/>. BSC objects
# are a little unusual in that the keypair and PKCS #10
- # subelement is generated by rpkid, so complete setup requires
+ # subelement are generated by rpkid, so complete setup requires
# two round trips.
bsc_pdu = bsc_pdus.pop(bsc_handle, None)
- if bsc_pdu is None:
- rpkid_query.append(rpki.left_right.bsc_elt.make_pdu(
- action = "create",
- tag = "bsc",
- self_handle = ca.handle,
- bsc_handle = bsc_handle,
- generate_keypair = "yes"))
-
- elif bsc_pdu.pkcs10_request is None:
- rpkid_query.append(rpki.left_right.bsc_elt.make_pdu(
- action = "set",
- tag = "bsc",
- self_handle = ca.handle,
- bsc_handle = bsc_handle,
- generate_keypair = "yes"))
-
- rpkid_query.extend(rpki.left_right.bsc_elt.make_pdu(
- action = "destroy", self_handle = ca.handle, bsc_handle = b) for b in bsc_pdus)
+ if bsc_pdu is None or bsc_pdu.find(rpki.left_right.tag_pkcs10_request) is None:
+ SubElement(q_msg, rpki.left_right.tag_bsc,
+ action = "create" if bsc_pdu is None else "set",
+ tag = "bsc",
+ self_handle = ca.handle,
+ bsc_handle = bsc_handle,
+ generate_keypair = "yes")
+
+ for bsc_handle in bsc_pdus:
+ SubElement(q_msg, rpki.left_right.tag_bsc,
+ action = "destroy", self_handle = ca.handle, bsc_handle = bsc_handle)
# If we've already got actions queued up, run them now, so we
# can finish setting up the BSC before anything tries to use it.
- if rpkid_query:
- rpkid_query.append(rpki.left_right.bsc_elt.make_pdu(action = "list", tag = "bsc", self_handle = ca.handle))
- rpkid_reply = self.call_rpkid(rpkid_query)
- bsc_pdus = dict((x.bsc_handle, x)
- for x in rpkid_reply
- if isinstance(x, rpki.left_right.bsc_elt) and x.action == "list")
+ if len(q_msg) > 0:
+ SubElement(q_msg, rpki.left_right.tag_bsc, action = "list", tag = "bsc", self_handle = ca.handle)
+ r_msg = self.call_rpkid(q_msg)
+ bsc_pdus = dict((r_pdu.get("bsc_handle"), r_pdu)
+ for r_pdu in r_msg
+ if r_pdu.tag == rpki.left_right.tag_bsc and r_pdu.get("action") == "list")
bsc_pdu = bsc_pdus.pop(bsc_handle, None)
- self.check_error_report(rpkid_reply)
- rpkid_query = []
+ q_msg = self._compose_left_right_query()
- assert bsc_pdu.pkcs10_request is not None
+ bsc_pkcs10 = bsc_pdu.find(rpki.left_right.tag_pkcs10_request)
+ assert bsc_pkcs10 is not None
bsc, created = rpki.irdb.BSC.objects.get_or_certify(
issuer = ca,
handle = bsc_handle,
- pkcs10 = bsc_pdu.pkcs10_request)
-
- if bsc_pdu.signing_cert != bsc.certificate or bsc_pdu.signing_cert_crl != ca.latest_crl:
- rpkid_query.append(rpki.left_right.bsc_elt.make_pdu(
- action = "set",
- tag = "bsc",
- self_handle = ca.handle,
- bsc_handle = bsc_handle,
- signing_cert = bsc.certificate,
- signing_cert_crl = ca.latest_crl))
+ pkcs10 = rpki.x509.PKCS10(Base64 = bsc_pkcs10.text))
+
+ if (bsc_pdu.findtext(rpki.left_right.tag_signing_cert, "").decode("base64") != bsc.certificate.get_DER() or
+ bsc_pdu.findtext(rpki.left_right.tag_signing_cert_crl, "").decode("base64") != ca.latest_crl.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_bsc,
+ action = "set",
+ tag = "bsc",
+ self_handle = ca.handle,
+ bsc_handle = bsc_handle)
+ SubElement(q_pdu, rpki.left_right.tag_signing_cert).text = bsc.certificate.get_Base64()
+ SubElement(q_pdu, rpki.left_right.tag_signing_cert_crl).text = ca.latest_crl.get_Base64()
# At present we need one <repository/> per <parent/>, not because
# rpkid requires that, but because pubd does. pubd probably should
@@ -1388,20 +1399,21 @@ class Zookeeper(object):
repository_pdu = repository_pdus.pop(repository.handle, None)
if (repository_pdu is None or
- repository_pdu.bsc_handle != bsc_handle or
- repository_pdu.peer_contact_uri != repository.service_uri or
- repository_pdu.bpki_cert != repository.certificate):
- rpkid_query.append(rpki.left_right.repository_elt.make_pdu(
- action = "create" if repository_pdu is None else "set",
- tag = repository.handle,
- self_handle = ca.handle,
- repository_handle = repository.handle,
- bsc_handle = bsc_handle,
- peer_contact_uri = repository.service_uri,
- bpki_cert = repository.certificate))
-
- rpkid_query.extend(rpki.left_right.repository_elt.make_pdu(
- action = "destroy", self_handle = ca.handle, repository_handle = r) for r in repository_pdus)
+ repository_pdu.get("bsc_handle") != bsc_handle or
+ repository_pdu.get("peer_contact_uri") != repository.service_uri or
+ repository_pdu.findtext(rpki.left_right.tag_bpki_cert, "").decode("base64") != repository.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_repository,
+ action = "create" if repository_pdu is None else "set",
+ tag = repository.handle,
+ self_handle = ca.handle,
+ repository_handle = repository.handle,
+ bsc_handle = bsc_handle,
+ peer_contact_uri = repository.service_uri)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cert).text = repository.certificate.get_Base64()
+
+ for repository_handle in repository_pdus:
+ SubElement(q_msg, rpki.left_right.tag_repository, action = "destroy",
+ self_handle = ca.handle, repository_handle = repository_handle)
# <parent/> setup code currently assumes 1:1 mapping between
# <repository/> and <parent/>, and further assumes that the handles
@@ -1414,29 +1426,28 @@ class Zookeeper(object):
for parent in ca.parents.all():
try:
-
parent_pdu = parent_pdus.pop(parent.handle, None)
if (parent_pdu is None or
- parent_pdu.bsc_handle != bsc_handle or
- parent_pdu.repository_handle != parent.handle or
- parent_pdu.peer_contact_uri != parent.service_uri or
- parent_pdu.sia_base != parent.repository.sia_base or
- parent_pdu.sender_name != parent.child_handle or
- parent_pdu.recipient_name != parent.parent_handle or
- parent_pdu.bpki_cms_cert != parent.certificate):
- rpkid_query.append(rpki.left_right.parent_elt.make_pdu(
- action = "create" if parent_pdu is None else "set",
- tag = parent.handle,
- self_handle = ca.handle,
- parent_handle = parent.handle,
- bsc_handle = bsc_handle,
- repository_handle = parent.handle,
- peer_contact_uri = parent.service_uri,
- sia_base = parent.repository.sia_base,
- sender_name = parent.child_handle,
- recipient_name = parent.parent_handle,
- bpki_cms_cert = parent.certificate))
+ parent_pdu.get("bsc_handle") != bsc_handle or
+ parent_pdu.get("repository_handle") != parent.handle or
+ parent_pdu.get("peer_contact_uri") != parent.service_uri or
+ parent_pdu.get("sia_base") != parent.repository.sia_base or
+ parent_pdu.get("sender_name") != parent.child_handle or
+ parent_pdu.get("recipient_name") != parent.parent_handle or
+ parent_pdu.findtext(rpki.left_right.tag_bpki_cms_cert, "").decode("base64") != parent.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_parent,
+ action = "create" if parent_pdu is None else "set",
+ tag = parent.handle,
+ self_handle = ca.handle,
+ parent_handle = parent.handle,
+ bsc_handle = bsc_handle,
+ repository_handle = parent.handle,
+ peer_contact_uri = parent.service_uri,
+ sia_base = parent.repository.sia_base,
+ sender_name = parent.child_handle,
+ recipient_name = parent.parent_handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cms_cert).text = parent.certificate.get_Base64()
except rpki.irdb.Repository.DoesNotExist:
pass
@@ -1446,31 +1457,32 @@ class Zookeeper(object):
parent_pdu = parent_pdus.pop(ca.handle, None)
if (parent_pdu is None or
- parent_pdu.bsc_handle != bsc_handle or
- parent_pdu.repository_handle != ca.handle or
- parent_pdu.peer_contact_uri != ca.rootd.service_uri or
- parent_pdu.sia_base != ca.rootd.repository.sia_base or
- parent_pdu.sender_name != ca.handle or
- parent_pdu.recipient_name != ca.handle or
- parent_pdu.bpki_cms_cert != ca.rootd.certificate):
- rpkid_query.append(rpki.left_right.parent_elt.make_pdu(
- action = "create" if parent_pdu is None else "set",
- tag = ca.handle,
- self_handle = ca.handle,
- parent_handle = ca.handle,
- bsc_handle = bsc_handle,
- repository_handle = ca.handle,
- peer_contact_uri = ca.rootd.service_uri,
- sia_base = ca.rootd.repository.sia_base,
- sender_name = ca.handle,
- recipient_name = ca.handle,
- bpki_cms_cert = ca.rootd.certificate))
+ parent_pdu.get("bsc_handle") != bsc_handle or
+ parent_pdu.get("repository_handle") != ca.handle or
+ parent_pdu.get("peer_contact_uri") != ca.rootd.service_uri or
+ parent_pdu.get("sia_base") != ca.rootd.repository.sia_base or
+ parent_pdu.get("sender_name") != ca.handle or
+ parent_pdu.get("recipient_name") != ca.handle or
+ parent_pdu.findtext(rpki.left_right.tag_bpki_cms_cert).decode("base64") != ca.rootd.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_parent,
+ action = "create" if parent_pdu is None else "set",
+ tag = ca.handle,
+ self_handle = ca.handle,
+ parent_handle = ca.handle,
+ bsc_handle = bsc_handle,
+ repository_handle = ca.handle,
+ peer_contact_uri = ca.rootd.service_uri,
+ sia_base = ca.rootd.repository.sia_base,
+ sender_name = ca.handle,
+ recipient_name = ca.handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cms_cert).text = ca.rootd.certificate.get_Base64()
except rpki.irdb.Rootd.DoesNotExist:
pass
- rpkid_query.extend(rpki.left_right.parent_elt.make_pdu(
- action = "destroy", self_handle = ca.handle, parent_handle = p) for p in parent_pdus)
+ for parent_handle in parent_pdus:
+ SubElement(q_msg, rpki.left_right.tag_parent, action = "destroy",
+ self_handle = ca.handle, parent_handle = parent_handle)
# Children are simpler than parents, because they call us, so no URL
# to construct and figuring out what certificate to use is their
@@ -1481,33 +1493,29 @@ class Zookeeper(object):
child_pdu = child_pdus.pop(child.handle, None)
if (child_pdu is None or
- child_pdu.bsc_handle != bsc_handle or
- child_pdu.bpki_cert != child.certificate):
- rpkid_query.append(rpki.left_right.child_elt.make_pdu(
- action = "create" if child_pdu is None else "set",
- tag = child.handle,
- self_handle = ca.handle,
- child_handle = child.handle,
- bsc_handle = bsc_handle,
- bpki_cert = child.certificate))
-
- rpkid_query.extend(rpki.left_right.child_elt.make_pdu(
- action = "destroy", self_handle = ca.handle, child_handle = c) for c in child_pdus)
+ child_pdu.get("bsc_handle") != bsc_handle or
+ child_pdu.findtext(rpki.left_right.tag_bpki_cert).decode("base64") != child.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.left_right.tag_child,
+ action = "create" if child_pdu is None else "set",
+ tag = child.handle,
+ self_handle = ca.handle,
+ child_handle = child.handle,
+ bsc_handle = bsc_handle)
+ SubElement(q_pdu, rpki.left_right.tag_bpki_cert).text = child.certificate.get_Base64()
+
+ for child_handle in child_pdus:
+ SubElement(q_msg, rpki.left_right.tag_child, action = "destroy",
+ self_handle = ca.handle, child_handle = child_handle)
# If caller wants us to poke rpkid, add that to the very end of the message
if poke:
- rpkid_query.append(rpki.left_right.self_elt.make_pdu(
- action = "set", self_handle = ca.handle, run_now = "yes"))
+ SubElement(q_msg, rpki.left_right.tag_self, action = "set", self_handle = ca.handle, run_now = "yes")
- # If we changed anything, ship updates off to rpkid
+ # If we changed anything, ship updates off to rpkid.
- if rpkid_query:
- rpkid_reply = self.call_rpkid(rpkid_query)
- bsc_pdus = dict((x.bsc_handle, x) for x in rpkid_reply if isinstance(x, rpki.left_right.bsc_elt))
- if bsc_handle in bsc_pdus and bsc_pdus[bsc_handle].pkcs10_request:
- bsc_req = bsc_pdus[bsc_handle].pkcs10_request
- self.check_error_report(rpkid_reply)
+ if len(q_msg) > 0:
+ self.call_rpkid(q_msg)
def synchronize_pubd_core(self):
@@ -1527,43 +1535,57 @@ class Zookeeper(object):
if not self.run_pubd:
return
- # Make sure that pubd's BPKI CRL is up to date.
-
- self.call_pubd(rpki.publication.config_elt.make_pdu(
- action = "set",
- bpki_crl = self.server_ca.latest_crl))
-
# See what pubd already has on file
- pubd_reply = self.call_pubd(rpki.publication.client_elt.make_pdu(action = "list"))
- client_pdus = dict((x.client_handle, x) for x in pubd_reply if isinstance(x, rpki.publication.client_elt))
- pubd_query = []
+ q_msg = self._compose_publication_control_query()
+ SubElement(q_msg, rpki.publication_control.tag_client, action = "list")
+ r_msg = self.call_pubd(q_msg)
+ client_pdus = dict((r_pdu.get("client_handle"), r_pdu)
+ for r_pdu in r_msg)
# Check all clients
+ q_msg = self._compose_publication_control_query()
+
for client in self.server_ca.clients.all():
client_pdu = client_pdus.pop(client.handle, None)
if (client_pdu is None or
- client_pdu.base_uri != client.sia_base or
- client_pdu.bpki_cert != client.certificate):
- pubd_query.append(rpki.publication.client_elt.make_pdu(
- action = "create" if client_pdu is None else "set",
- client_handle = client.handle,
- bpki_cert = client.certificate,
- base_uri = client.sia_base))
+ client_pdu.get("base_uri") != client.sia_base or
+ client_pdu.findtext(rpki.publication_control.tag_bpki_cert, "").decode("base64") != client.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.publication_control.tag_client,
+ action = "create" if client_pdu is None else "set",
+ client_handle = client.handle,
+ base_uri = client.sia_base)
+ SubElement(q_pdu, rpki.publication_control.tag_bpki_cert).text = client.certificate.get_Base64()
+
+ # rootd instances are also a weird sort of client
+
+ for rootd in rpki.irdb.Rootd.objects.all():
+
+ client_handle = rootd.issuer.handle + "-root"
+ client_pdu = client_pdus.pop(client_handle, None)
+ sia_base = "rsync://%s/%s/%s/" % (self.rsync_server, self.rsync_module, client_handle)
+
+ if (client_pdu is None or
+ client_pdu.get("base_uri") != sia_base or
+ client_pdu.findtext(rpki.publication_control.tag_bpki_cert, "").decode("base64") != rootd.issuer.certificate.get_DER()):
+ q_pdu = SubElement(q_msg, rpki.publication_control.tag_client,
+ action = "create" if client_pdu is None else "set",
+ client_handle = client_handle,
+ base_uri = sia_base)
+ SubElement(q_pdu, rpki.publication_control.tag_bpki_cert).text = rootd.issuer.certificate.get_Base64()
# Delete any unknown clients
- pubd_query.extend(rpki.publication.client_elt.make_pdu(
- action = "destroy", client_handle = p) for p in client_pdus)
+ for client_handle in client_pdus:
+ SubElement(q_msg, rpki.publication_control.tag_client, action = "destroy", client_handle = client_handle)
# If we changed anything, ship updates off to pubd
- if pubd_query:
- pubd_reply = self.call_pubd(pubd_query)
- self.check_error_report(pubd_reply)
+ if len(q_msg) > 0:
+ self.call_pubd(q_msg)
def synchronize_rpkid_deleted_core(self):
@@ -1574,19 +1596,20 @@ class Zookeeper(object):
inside a Django commit wrapper.
"""
- rpkid_reply = self.call_rpkid(rpki.left_right.self_elt.make_pdu(action = "list"))
- self.check_error_report(rpkid_reply)
+ q_msg = self._compose_left_right_query()
+ SubElement(q_msg, rpki.left_right.tag_self, action = "list")
+ self.call_rpkid(q_msg)
- self_handles = set(s.self_handle for s in rpkid_reply)
+ self_handles = set(s.get("self_handle") for s in r_msg)
ca_handles = set(ca.handle for ca in rpki.irdb.ResourceHolderCA.objects.all())
assert ca_handles <= self_handles
- rpkid_query = [rpki.left_right.self_elt.make_pdu(action = "destroy", self_handle = handle)
- for handle in (self_handles - ca_handles)]
+ q_msg = self._compose_left_right_query()
+ for handle in (self_handles - ca_handles):
+ SubElement(q_msg, rpki.left_right.tag_self, action = "destroy", self_handle = handle)
- if rpkid_query:
- rpkid_reply = self.call_rpkid(rpkid_query)
- self.check_error_report(rpkid_reply)
+ if len(q_msg) > 0:
+ self.call_rpkid(q_msg)
@django.db.transaction.commit_on_success