def editName(self, fromName, toName): data = {} if fromName == toName: data["error"] = u"Name entry is the same as existing name" data["success"] = False return data db = DBHandler(app.config["DBFILE"]) c = db.getCursor() if db.exists("zones", "name", toName): data["error"] = u"Duplicate name entry in db" data["success"] = False return data if not db.exists("zones", "name", fromName): data["error"] = u"No old name entry in db" data["success"] = False return data try: c.execute( """ UPDATE zones SET old_value = name, name = ?, updated = 1, update_type = 'MODIFIED NAME' WHERE name LIKE ? """, [toName, fromName]) db.commit() data["success"] = True data["message"] = u"Entry %s updated from %s" % (toName, fromName) except Exception, e: errormsg = u"Unsuccessful database update transaction:" + str(e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def editHost(self, name, host): data = {} db = DBHandler(app.config["DBFILE"]) c = db.getCursor() dbdata = list( c.execute( """ SELECT host FROM zones WHERE name LIKE ? """, [name])) if len(dbdata) == 0: data["error"] = u"Zone doesn't exist" data["success"] = False return data else: zone = dbdata[0] if zone[0] == host: data["error"] = u"Host entry is the same as existing name" data["success"] = False return data try: c.execute( """ UPDATE zones SET host = ?, updated = 1, update_type = 'MODIFIED HOST' WHERE name LIKE ? """, [host, name]) db.commit() data["success"] = True data["message"] = u"Entry %s updated from %s" % (host, zone[0]) except Exception, e: errormsg = u"Unsuccessful database update transaction:" + str(e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def delete(self, name): data = {} db = DBHandler(app.config["DBFILE"]) c = db.getCursor() zone = list( c.execute( """ SELECT name FROM zones WHERE name LIKE ? """, [name])) if len(zone) > 0 and zone[0][0] == name: try: c.execute( """ UPDATE zones SET updated = 1, update_type = 'DELETE' WHERE name LIKE ? """, [name]) db.commit() data["success"] = True data["message"] = u"Entry %s deleted" % (name) except Exception, e: errormsg = u"Unsuccessful database delete transaction:" + str( e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def editHost(self, name, host): data = {} db = DBHandler(app.config["DBFILE"]) c = db.getCursor() dbdata = list(c.execute(""" SELECT host FROM zones WHERE name LIKE ? """,[name])) if len(dbdata) == 0: data["error"] = u"Zone doesn't exist" data["success"] = False return data else: zone = dbdata[0] if zone[0] == host: data["error"] = u"Host entry is the same as existing name" data["success"] = False return data try: c.execute(""" UPDATE zones SET host = ?, updated = 1, update_type = 'MODIFIED HOST' WHERE name LIKE ? """,[host,name]) db.commit() data["success"] = True data["message"] = u"Entry %s updated from %s"%(host, zone[0]) except Exception, e: errormsg = u"Unsuccessful database update transaction:" + str(e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def editName(self, fromName, toName): data = {} if fromName == toName: data["error"] = u"Name entry is the same as existing name" data["success"] = False return data db = DBHandler(app.config["DBFILE"]) c = db.getCursor() if db.exists("zones", "name", toName): data["error"] = u"Duplicate name entry in db" data["success"] = False return data if not db.exists("zones", "name", fromName): data["error"] = u"No old name entry in db" data["success"] = False return data try: c.execute(""" UPDATE zones SET old_value = name, name = ?, updated = 1, update_type = 'MODIFIED NAME' WHERE name LIKE ? """,[toName, fromName]) db.commit() data["success"] = True data["message"] = u"Entry %s updated from %s"%(toName, fromName) except Exception, e: errormsg = u"Unsuccessful database update transaction:" + str(e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def add(self, name, host): data = {} # Check if name exists db = DBHandler(app.config["DBFILE"]) c = db.getCursor() if db.exists("zones", "name", name): data["error"] = u"Duplicate name entry in db" data["success"] = False else: try: c.execute(""" INSERT INTO zones(name,host,updated,update_type) VALUES(?,?,1,'CREATE') """,[name,host]) db.commit() data["success"] = True data["message"] = u"Entry %s inserted"%(name) except Exception, e: errormsg = u"Unsuccessful database insert transaction:" + str(e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def delete(self, name): data = {} db = DBHandler(app.config["DBFILE"]) c = db.getCursor() zone = list(c.execute(""" SELECT name FROM zones WHERE name LIKE ? """,[name])) if len(zone) > 0 and zone[0][0] == name: try: c.execute(""" UPDATE zones SET updated = 1, update_type = 'DELETE' WHERE name LIKE ? """,[name]) db.commit() data["success"] = True data["message"] = u"Entry %s deleted"%(name) except Exception, e: errormsg = u"Unsuccessful database delete transaction:" + str(e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
def add(self, name, host): data = {} # Check if name exists db = DBHandler(app.config["DBFILE"]) c = db.getCursor() if db.exists("zones", "name", name): data["error"] = u"Duplicate name entry in db" data["success"] = False else: try: c.execute( """ INSERT INTO zones(name,host,updated,update_type) VALUES(?,?,1,'CREATE') """, [name, host]) db.commit() data["success"] = True data["message"] = u"Entry %s inserted" % (name) except Exception, e: errormsg = u"Unsuccessful database insert transaction:" + str( e) log.exception(errormsg, self.__class__.__name__) data["success"] = False data["error"] = errormsg
class DNSFileHandler: def __init__(self): self.zonefile = None self.tempfile = None self.serial = [";Serial", "; Serial"] def __del__(self): if self.zonefile is not None: self.zonefile.close() if self.tempfile is not None: self.tempfile.close() def readZonefile(self): self.zonefile = open(app.config["ZONEFILE"],"r") self.lines = self.zonefile.readlines() return self.lines def createTempFile(self): self.tempfile = open(app.config["TEMPZONEFILE"],"w") def moveZoneFile(self): os.rename(app.config["TEMPZONEFILE"], app.config["ZONEFILE"] ) def getAllEntries(self, lines): # return all entries found in the zone file data = [] printLines = False for line in lines: if line.find(app.config["ZONES_END_POINT"]) >= 0: printLines = False if printLines: zsplit = line.split() if len(zsplit) == 4: data.append(ZoneEntry(zsplit[0],zsplit[3])) if line.find(app.config["ZONES_START_POINT"]) >= 0: printLines = True return data def reloadBind(self): if call(app.config["BIND_RELOAD_CMD"], shell=True) != 0: errormsg = u"Couldn't reload BIND." log.exception(errormsg, self.__class__.__name__) def zonefileJob(self): self.db = DBHandler(app.config["DBFILE"]) self.c = self.db.getCursor() results = list(self.c.execute(""" SELECT name, host, update_type, old_value FROM zones WHERE updated = 1 """,[])) if len(results) > 0: self.updateZonefile(self.convertResults(results)) def updateZonefile(self, zones): self.readZonefile() self.createTempFile() for zone in zones: self.templines = [] if zone.updateType == "CREATE": self.addZone(zone) elif "MODIFIED" in zone.updateType: self.updateZone(zone) elif zone.updateType == "DELETE": self.deleteZone(zone) app.logger.info(zone.updateType+" zone: "+str(zone.name)) for item in ["CREATE", "MODIFIED", "DELETE"]: if item in zone.updateType: self.lines = list(self.templines) self.updateSerial() for line in self.lines: self.tempfile.write(line) self.tempfile.close() self.moveZoneFile() self.reloadBind() def addZone(self, zone): added = False for i, line in enumerate(self.lines): if app.config["ZONES_END_POINT"] in line: # Check if ip address or hostname try: socket.inet_aton(zone.host) newline = "%s\tIN\tA\t%s\n"%(zone.name,zone.host) except: if not zone.host[:-1] == ".": zone.host = zone.host + "." newline = "%s\tIN\tCNAME\t%s\n"%( zone.name,zone.host) self.templines.insert(i, newline) added = True if added: self.templines.insert(i+1, line) else: self.templines.insert(i, line) if added: try: self.c.execute(""" UPDATE zones SET updated = 0, update_type = NULL WHERE name LIKE ? """,[zone.name]) self.db.commit() except Exception, e: errormsg = u"Unsuccessful database update transaction:" + str(e) log.exception(errormsg, self.__class__.__name__)