|
@@ -148,17 +148,20 @@ def reverse_name(name):
|
|
|
new.pop(0)
|
|
|
return '.'.join(new)+'.'
|
|
|
|
|
|
-
|
|
|
#########################################################################
|
|
|
# load:
|
|
|
# load a zone into the SQL database.
|
|
|
# input:
|
|
|
# dbfile: the sqlite3 database fileanme
|
|
|
# zone: the zone origin
|
|
|
-# reader: an generator function producing an iterable set of
|
|
|
+# reader: a generator function producing an iterable set of
|
|
|
# name/ttl/class/rrtype/rdata-text tuples
|
|
|
#########################################################################
|
|
|
def load(dbfile, zone, reader):
|
|
|
+ # if the zone name doesn't contain the trailing dot, automatically add it.
|
|
|
+ if zone[-1] != '.':
|
|
|
+ zone += '.'
|
|
|
+
|
|
|
conn, cur = open(dbfile)
|
|
|
old_zone_id = get_zoneid(zone, cur)
|
|
|
|
|
@@ -184,13 +187,13 @@ def load(dbfile, zone, reader):
|
|
|
rdtype, sigtype, rdata)
|
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
|
[new_zone_id, name, reverse_name(name), ttl,
|
|
|
- rdtype, sigtype, rdata])
|
|
|
+ rdtype, sigtype, rdata])
|
|
|
else:
|
|
|
cur.execute("""INSERT INTO records
|
|
|
(zone_id, name, rname, ttl, rdtype, rdata)
|
|
|
VALUES (?, ?, ?, ?, ?, ?)""",
|
|
|
[new_zone_id, name, reverse_name(name), ttl,
|
|
|
- rdtype, rdata])
|
|
|
+ rdtype, rdata])
|
|
|
except Exception as e:
|
|
|
fail = "Error while loading " + zone + ": " + e.args[0]
|
|
|
raise Sqlite3DSError(fail)
|
|
@@ -208,78 +211,3 @@ def load(dbfile, zone, reader):
|
|
|
|
|
|
cur.close()
|
|
|
conn.close()
|
|
|
-
|
|
|
-
|
|
|
-#########################################################################
|
|
|
-# temp sqlite3 datasource backend for axfr in. The code should be refectored
|
|
|
-# later.
|
|
|
-#########################################################################
|
|
|
-class AXFRInDB:
|
|
|
- def __init__(self, dbfile, zone_name):
|
|
|
- self._dbfile = dbfile
|
|
|
- self._zone_name = zone_name
|
|
|
- # if the zone name doesn't contain the trailing dot, automatically
|
|
|
- # add it.
|
|
|
- if self._zone_name[-1] != '.':
|
|
|
- self._zone_name += '.'
|
|
|
- self._old_zone_id = None
|
|
|
- self._new_zone_id = None
|
|
|
-
|
|
|
- def prepare_axfrin(self):
|
|
|
- self._conn, self._cur = open(self._dbfile)
|
|
|
- self._old_zone_id = get_zoneid(self._zone_name, self._cur)
|
|
|
-
|
|
|
- temp = str(random.randrange(100000))
|
|
|
- self._cur.execute("INSERT INTO zones (name, rdclass) VALUES (?, 'IN')", [temp])
|
|
|
- self._new_zone_id = self._cur.lastrowid
|
|
|
-
|
|
|
-
|
|
|
- def insert_axfr_record(self, rrsets):
|
|
|
- '''insert zone records to sqlite3 database'''
|
|
|
-
|
|
|
- try:
|
|
|
- for name, ttl, rdclass, rdtype, rdata in rrsets:
|
|
|
- sigtype = ''
|
|
|
- if rdtype.lower() == 'rrsig':
|
|
|
- sigtype = rdata.split()[0]
|
|
|
-
|
|
|
- if rdtype.lower() == 'nsec3' or sigtype.lower() == 'nsec3':
|
|
|
- hash = name.split('.')[0]
|
|
|
- self._cur.execute("""INSERT INTO nsec3
|
|
|
- (zone_id, hash, owner, ttl, rdtype, rdata)
|
|
|
- VALUES (?, ?, ?, ?, ?, ?)""",
|
|
|
- [self._new_zone_id, hash, name, ttl, rdtype, rdata])
|
|
|
- elif rdtype.lower() == 'rrsig':
|
|
|
- self._cur.execute("""INSERT INTO records
|
|
|
- (zone_id, name, rname, ttl,
|
|
|
- rdtype, sigtype, rdata)
|
|
|
- VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
|
- [self._new_zone_id, name, reverse_name(name), ttl,
|
|
|
- rdtype, sigtype, rdata])
|
|
|
- else:
|
|
|
- self._cur.execute("""INSERT INTO records
|
|
|
- (zone_id, name, rname, ttl, rdtype, rdata)
|
|
|
- VALUES (?, ?, ?, ?, ?, ?)""",
|
|
|
- [self._new_zone_id, name, reverse_name(name), ttl,
|
|
|
- rdtype, rdata])
|
|
|
- except Exception as e:
|
|
|
- fail = "Error while loading " + self._zone_name + ": " + e.args[0]
|
|
|
- raise Sqlite3DSError(fail)
|
|
|
-
|
|
|
-
|
|
|
- def finish_axfrin(self):
|
|
|
- '''commit changes and close sqlite3 database'''
|
|
|
-
|
|
|
- if self._old_zone_id:
|
|
|
- self._cur.execute("DELETE FROM zones WHERE id=?", [self._old_zone_id])
|
|
|
- self._cur.execute("UPDATE zones SET name=? WHERE id=?", [self._zone_name, self._new_zone_id])
|
|
|
- self._conn.commit()
|
|
|
- self._cur.execute("DELETE FROM records WHERE zone_id=?", [self._old_zone_id])
|
|
|
- self._cur.execute("DELETE FROM nsec3 WHERE zone_id=?", [self._old_zone_id])
|
|
|
- self._conn.commit()
|
|
|
- else:
|
|
|
- self._cur.execute("UPDATE zones SET name=? WHERE id=?", [self._zone_name, self._new_zone_id])
|
|
|
- self._conn.commit()
|
|
|
-
|
|
|
- self._cur.close()
|
|
|
- self._conn.close()
|