# $Id$ # # Copyright (C) 2013--2014 Dragon Research Labs ("DRL") # Portions copyright (C) 2011--2012 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 notices and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND DRL AND ISC DISCLAIM ALL # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DRL OR # 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. """ Internet Registry (IR) Database, Django-style. This is the back-end code's interface to the database. It's intended to be usable by command line programs and other scripts, not just Django GUI code, so be careful. """ # pylint: disable=W0232,C1001 import django.db.models import rpki.x509 import rpki.sundial import rpki.resource_set import socket import rpki.POW from south.modelsinspector import add_introspection_rules ## @var ip_version_choices # Choice argument for fields implementing IP version numbers. ip_version_choices = ((4, "IPv4"), (6, "IPv6")) ## @var ca_certificate_lifetime # Lifetime for a BPKI CA certificate. ca_certificate_lifetime = rpki.sundial.timedelta(days = 3652) ## @var crl_interval # Expected interval between BPKI CRL updates. This should be a little # longer than the real regeneration cycle, so that the old CRL will # not go stale while we're generating the new one. Eg, if we # regenerate daily, an interval of 24 hours is too short, but 25 hours # would be OK, as would 24 hours and 30 minutes. crl_interval = rpki.sundial.timedelta(hours = 25) ## @var ee_certificate_lifetime # Lifetime for a BPKI EE certificate. ee_certificate_lifetime = rpki.sundial.timedelta(days = 60) ### # Field types class HandleField(django.db.models.CharField): """ A handle field type. """ description = 'A "handle" in one of the RPKI protocols' def __init__(self, *args, **kwargs): 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.SubfieldBas