[svn] commit: r904 - /experiments/each-zoneload/loadzone.py
BIND 10 source code commits
bind10-changes at lists.isc.org
Sat Feb 20 19:33:33 UTC 2010
Author: each
Date: Sat Feb 20 19:33:33 2010
New Revision: 904
Log:
cleanup, comment
Modified:
experiments/each-zoneload/loadzone.py
Modified: experiments/each-zoneload/loadzone.py
==============================================================================
--- experiments/each-zoneload/loadzone.py (original)
+++ experiments/each-zoneload/loadzone.py Sat Feb 20 19:33:33 2010
@@ -1,12 +1,23 @@
#! /usr/bin/python3
import sqlite3, sys, string, re, random
+#########################################################################
+# define exceptions
+#########################################################################
class DatabaseError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
+#########################################################################
+# set up regular expressions
+#########################################################################
+decomment = re.compile(' *;.*$')
+
+#########################################################################
+# create_db: set up schema for a newly created zones/records database
+#########################################################################
def create_db(cur):
"""Create new zone database"""
cur.execute("CREATE TABLE schema_version (version INTEGER NOT NULL)")
@@ -23,6 +34,79 @@
cur.execute("CREATE INDEX records_byrname ON records (rname)");
cur.execute("CREATE INDEX zones_byname ON zones (name)");
+#########################################################################
+# open_db: open a database. if the database is not yet set up,
+# call create_db to do so.
+# input:
+# dbfile - the filename for the sqlite3 database
+# returns:
+# sqlite3 connection, sqlite3 cursor
+#########################################################################
+def open_db(dbfile):
+ """Open the database file. If necessary, set it up"""
+ try:
+ conn = sqlite3.connect(dbfile)
+ cur = conn.cursor()
+ except Exception as e:
+ fail = "Failed to open " + dbfile + ": " + e.args[0]
+ raise DatabaseError(fail)
+
+ # Does the database exist yet? If not, create it.
+ try:
+ cur.execute("SELECT version FROM schema_version")
+ row = cur.fetchone()
+ except:
+ create_db(cur)
+ conn.commit()
+ row = [1]
+
+ if row == None or row[0] != 1:
+ raise DatabaseError("Bad database schema version")
+
+ return conn, cur
+
+#########################################################################
+# findzone:
+# returns the zone_id for a given zone name, or an empty
+# string if the zone is not found
+#########################################################################
+def findzone(zone, cur):
+ cur.execute("SELECT id FROM zones WHERE name = ?", [zone])
+ row = cur.fetchone()
+ if row:
+ return row[0]
+ else:
+ return ''
+
+#########################################################################
+# getRR:
+# converts a line from a zone file into data suitable for
+# insertion into the database.
+# input:
+# line - a line from the zone file. (must be a complete resource
+# record, as generated by named-compilezone.)
+# returns:
+# name, ttl, rdclass, rdtype, sigtype, rdata
+#########################################################################
+def getRR(line):
+ global decomment;
+ line = decomment.sub('', line)
+ line = line.split()
+ name = line.pop(0).strip()
+ ttl = int(line.pop(0).strip())
+ rdclass = line.pop(0).strip()
+ rdtype = line.pop(0).strip()
+ rdata = ' '.join(line).strip()
+ sigtype = ''
+ if rdtype == 'RRSIG':
+ sigtype == line[0]
+ return name, ttl, rdclass, rdtype, sigtype, rdata
+
+#########################################################################
+# reverse_name:
+# reverse the labels of a DNS name. (for example,
+# "bind10.isc.org." would become "org.isc.bind10.")
+#########################################################################
def reverse_name(name):
"""Reverse the labels of a domain name; for example,
given 'www.isc.org.', return 'org.isc.www.' This is needed
@@ -33,85 +117,75 @@
new.pop(0)
return '.'.join(new)+'.'
-try:
- zone = sys.argv[1]
- if zone[-1] != '.':
- zone += '.'
- zonefile = sys.argv[2]
-except:
+#########################################################################
+# usage: print usage note and exit
+#########################################################################
+def usage():
print("Usage: " + sys.argv[0] + " <zone name> <zone file> [database]")
exit(1)
-try: dbfile=sys.argv[3]
-except: dbfile='/tmp/zone.sqlite3'
+#########################################################################
+# main
+#########################################################################
+def main():
+ try:
+ zone = sys.argv[1]
+ if zone[-1] != '.':
+ zone += '.'
+ zonefile = sys.argv[2]
+ except:
+ usage()
-conn = sqlite3.connect(dbfile)
-cur = conn.cursor()
+ try:
+ dbfile = sys.argv[3]
+ except:
+ dbfile = '/tmp/zone.sqlite3'
-# Does the database exist yet? If not, create it.
-try:
- cur.execute("SELECT version FROM schema_version")
- row = cur.fetchone()
-except:
- create_db(cur)
- conn.commit()
- row = [1]
+ try:
+ conn, cur = open_db(dbfile)
+ except DatabaseError as e:
+ print("Couldn't open database: " + e.args[0]);
+ exit(1)
-if row == None or row[0] != 1:
- raise DatabaseError("Bad database schema version")
+ try:
+ data = open(zonefile).read().splitlines()
+ except:
+ print("Unable to open zone file " + zonefile + ": ", sys.exc_info()[0])
+ exit(1)
-try:
- data = open(zonefile).read().splitlines()
-except:
- print("Unable to open " + zonefile)
- exit(1)
+ old_zone_id = findzone(zone, cur)
-cur.execute("SELECT id FROM zones WHERE name = ?", [zone])
-row=cur.fetchone()
-if row:
- old_zone_id=row[0]
-else:
- old_zone_id=""
+ temp = str(random.randrange(100000))
+ cur.execute("INSERT INTO zones (name, rdclass) VALUES (?, 'IN')", [temp])
+ new_zone_id = cur.lastrowid
-zonename = zone + str(random.randrange(10000))
-cur.execute("INSERT INTO zones (name, rdclass) VALUES (?, 'IN')", [zonename])
-new_zone_id=cur.lastrowid
+ for line in data:
+ name, ttl, rdclass, rdtype, sigtype, rdata = getRR(line)
+ if sigtype:
+ cur.execute("""INSERT INTO records
+ (zone_id, name, rname, ttl, rdtype, sigtype, rdata)
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
+ [new_zone_id, name, reverse_name(name), ttl,
+ 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])
-decomment = re.compile(' *;.*$')
-for line in data:
- line = decomment.sub('', line)
- line = line.split()
- name = line.pop(0).strip()
- ttl = int(line.pop(0).strip())
- rdclass = line.pop(0).strip()
- rdtype = line.pop(0).strip()
- rdata = ' '.join(line).strip()
+ if old_zone_id:
+ cur.execute("DELETE FROM zones WHERE id=?", [old_zone_id])
+ cur.execute("UPDATE zones SET name=? WHERE id=?", [zone, new_zone_id])
+ conn.commit()
+ cur.execute("DELETE FROM records WHERE zone_id=?", [old_zone_id])
+ conn.commit()
+ else:
+ cur.execute("UPDATE zones SET name=? WHERE id=?", [zone, new_zone_id])
+ conn.commit()
- if rdtype == 'RRSIG':
- sigtype = line[0]
- cur.execute("""INSERT INTO records
- (zone_id, name, rname, ttl, rdtype, sigtype, rdata)
- VALUES (?, ?, ?, ?, ?, ?, ?)""",
- [new_zone_id, name, reverse_name(name), ttl, 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])
+ cur.close()
+ conn.close()
-if old_zone_id:
- tempname=zone + "DELETE"
- cur.execute("UPDATE zones SET name=? WHERE id=?", [tempname, old_zone_id])
- cur.execute("UPDATE zones SET name=? WHERE id=?", [zone, new_zone_id])
- cur.execute("DELETE FROM zones WHERE id=?", [old_zone_id])
- conn.commit()
- cur.execute("DELETE FROM records WHERE zone_id=?", [old_zone_id])
- conn.commit()
-else:
- cur.execute("UPDATE zones SET name=? WHERE id=?", [zone, new_zone_id])
- conn.commit()
-
-cur.close()
-conn.close()
+if __name__ == "__main__":
+ main()
More information about the bind10-changes
mailing list