Esempio n. 1
0
class DNSAPI(object):
    """DNSAPI is an easy way to use your database so dockerlab-dns knows how to read your records. Use this class to interact with the database or just use it as an example."""

    def __init__(self, db_user, db_pass, db_host, db_name, migrate=False):
        super(DNSAPI, self).__init__()
        self.db = DAL("postgres://%s:%s@%s/%s" % (db_user, db_pass, db_host, db_name), migrate=migrate)

        if self.db:
            print 'Successfully connected to db "%s" on host "%s"' % (db_name, db_host)

        self.db.define_table(
            "dns_zones",
            Field(
                "name", "string"
            ),  # ends in . (e.g. example.com.); input should probably have a validator to ensure zones end in a .
        )

        self.db.define_table(
            "dns_zone_records",
            Field("zone", "reference dns_zones"),
            Field("record_name", "string"),  # (e.g. ns1.example.com.)
            Field(
                "record_type", "string", default="A", requires=IS_IN_SET(RECORD_TYPES)
            ),  # (e.g. A, AAAA, CNAME, MX, NS)
            Field(
                "record_value", "string"
            ),  # (e.g. an IP for A or AAAA, an address for CNAME, and an address and priority for MX)
            Field(
                "record_ttl", "integer", default=60 * 5
            ),  # A TTL in seconds before a client should check for a new value. Can reasonably set to lower or higher depending on the volatility of the records
        )

    def get_zones(self):
        return self.db(self.db.dns_zones).select().as_list()

    def get_zone(self, zone_name):
        return self.db(self.db.dns_zones.name == zone_name).select().as_list()

    def get_records(self, zone_id):
        return self.db((self.db.dns_zone_records.zone == zone_id)).select().as_list()

    def get_records_matching(self, zone_id, record_name=None, record_type=None):
        q = self.db.dns_zone_records.zone == zone_id
        if not record_name is None:
            q = q & (self.db.dns_zone_records.record_name == record_name)
        if not record_type is None:
            q = q & (self.db.dns_zone_records.record_type == record_type)
        return self.db(q).select().as_list()

    def delete_zone(self, zone_name):
        self.db.dns_zones(
            (self.db.dns_zone_records.zone == self.db.dns_zones.id) & (self.db.dns_zones.name == zone_name)
        ).delete()
        return self.db(self.db.dns_zones.name == zone_name).delete()

    def delete_record(self, record_id):
        return self.db((self.db.dns_zone_records.id == record_id)).delete()

    def delete_record_matching(self, zone_id, record_name, record_type):
        return self.db(
            (self.db.dns_zone_records.zone == zone_id)
            & (self.db.dns_zone_records.record_name == record_name)
            & (self.db.dns_zone_records.record_type == record_type)
        ).delete()

    def create_zone(self, zone_name):
        return self.db.dns_zones.insert(name=zone_name)

    def create_record(self, zone_id, record_name, record_type, record_value, record_ttl):
        return self.db.dns_zone_records.insert(
            zone=zone_id,
            record_name=record_name,
            record_type=record_type,
            record_value=record_value,
            record_ttl=record_ttl,
        )