[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