def add(self, v): rec=Records() rec.domain_id=self.domain_id rec.name=rec.name=v.name+"."+self.zone_name if v.name else self.zone_name rec.name=DNSRecord.normname(rec.name) rec.type=v.type rec.content=v.content rec.ttl=v.ttl rec.prio=v.priority rec.change_date=int(time.time()) self.session.add(rec) self.session.flush() LOG.info("[%s]: Record (%s, %s, '%s') was added" % (self.zone_name, rec.name, rec.type, rec.content)) self._update_serial(rec.change_date) if v.name: top_level_zone=".".join(self.zone_name.split(".")[1:]) file_name= FLAGS.dns_powerdns_geomaps_dir+ "/" + v.name + "." + top_level_zone with open(file_name,"w") as f: f.write("$RECORD %s\n"%(v.name)) f.write("$ORIGIN %s\n"%(top_level_zone)) f.write("0 %s.external\n"%(v.name)) f.write("900 %s.internal\n"%(v.name)) f.flush() subprocess.call(["sudo","pdns_control","rediscover"]) subprocess.call(['sudo','pdnssec','--config-dir=/etc/powerdns/pdnssec','rectify-zone',self.zone_name]) return "ok"
def _q(self, name=None, type=None): q = self.session.query(Records).filter(Records.domain_id == self.domain_id) if type: q = q.filter(Records.type == DNSRecord.normtype(type)) if name is None: return q fqdn = name + "." + self.zone_name if name else self.zone_name return q.filter(Records.name == fqdn)
def _q(self, name=None, type=None): q=self.session.query(Records).filter(Records.domain_id==self.domain_id) if type: q=q.filter(Records.type==DNSRecord.normtype(type)) if name is None: return q fqdn=name+"."+self.zone_name if name else self.zone_name return q.filter(Records.name==fqdn)
def get(self, name=None, type=None): res=[] for r in self._q(name, type).all(): if r.type=='SOA': res.append(DNSSOARecord(*r.content.split())) else: res.append(DNSRecord(name=r.name, type=r.type, content=r.content, priority=r.prio, ttl=r.ttl)) return res
def _add_zone(self, name): try: self.dnsmanager.add(name) zone = self.dnsmanager.get(name) for ns in FLAGS.dns_ns: (name, content) = ns.split(':', 2) zone.add(DNSRecord(name=name, type="NS", content=content)) except ValueError as e: LOG.warn(str(e)) except: #TODO add exception ZoneExists and pass only it pass
def add(self, zone_name, soa={}): if zone_name in self.list(): raise Exception('Zone already exists') zone_name=DNSRecord.normname(zone_name) self.session.add(Domains(name=zone_name, type="NATIVE")) self.session.flush() LOG.info("[%s]: Zone was added" % (zone_name)) soa=DNSSOARecord(**soa) # PowerDNS-specific. TODO make this more pytonish - with objects # and bells soa.content=" ".join((str(f) for f in (soa.primary, soa.hostmaster, soa.serial, soa.refresh, soa.retry, soa.expire, soa.ttl))) PowerDNSZone(zone_name).add(soa) return "ok"
def _pollip(self): while True: time.sleep(SLEEP) if not len(self.pending): continue #TODO change select to i.id in ( pendings ) to speed up for r in self.conn.execute(""" select i.hostname, i.id, i.project_id, i.uuid, f.address from instances i, fixed_ips f where i.id=f.instance_id"""): if r.uuid not in self.pending: continue LOG.info("Instance %s hostname %s adding ip %s" % (r.uuid, r.hostname, r.address)) del self.pending[r.uuid] zones_list = self.dnsmanager.list() if FLAGS.dns_zone not in zones_list: #Lazy create main zone and populate by ns self._add_zone(FLAGS.dns_zone) zonename = AUTH.tenant2zonename(r.project_id) if zonename not in zones_list: self._add_zone(zonename) try: self.dnsmanager.get(zonename).add( DNSRecord(name=r.hostname, type='A', content=r.address)) except ValueError as e: LOG.warn(str(e)) except: pass if FLAGS.dns_ptr: (ptr_zonename, octet) = self.ip2zone(r.address) if ptr_zonename not in zones_list: self._add_zone(ptr_zonename) self.dnsmanager.get(ptr_zonename).add( DNSRecord(name=octet, type='PTR', content=r.hostname + '.' + zonename))
def add(self, v): rec = Records() rec.domain_id = self.domain_id rec.name = rec.name = v.name + "." + self.zone_name if v.name else self.zone_name rec.name = DNSRecord.normname(rec.name) rec.type = v.type rec.content = v.content rec.ttl = v.ttl rec.prio = v.priority rec.change_date = int(time.time()) self.session.add(rec) self.session.flush() LOG.info("[%s]: Record (%s, %s, '%s') was added" % (self.zone_name, rec.name, rec.type, rec.content)) self._update_serial(rec.change_date) return "ok"
def add(self, v): rec=Records() rec.domain_id=self.domain_id rec.name=rec.name=v.name+"."+self.zone_name if v.name else self.zone_name rec.name=DNSRecord.normname(rec.name) rec.type=v.type rec.content=v.content rec.ttl=v.ttl rec.prio=v.priority rec.change_date=int(time.time()) self.session.add(rec) self.session.flush() LOG.info("[%s]: Record (%s, %s, '%s') was added" % (self.zone_name, rec.name, rec.type, rec.content)) self._update_serial(rec.change_date) return "ok"
def __call__(self, req): """ """ try: args = req.environ["wsgiorg.routing_args"][1] action = args["action"] if action in ('index', 'zone_get', 'list'): action_type = "read" else: action_type = "write" #TODO remove keystone middleware and directly authenticate #with keystoneclient.tokens.authneticate - right now this is #buggy - if token incorect, keystonectlient return amazing #error 'maximum recursion depth exceeded in cmp' if not AUTH.can(req, args.get('zonename', ''))[action_type]: raise Exception('unauthorized') result={} if action=="index": result=self.manager.list() elif action=="zone_get": result=self.manager.get(args['zonename']).get_soa().__dict__ elif action=="zone_del": result=self.manager.drop(args['zonename'], req.GET.get('force', None)) elif action=="zone_add": soa={} for p in ("primary", "hostmaster", "serial", "refresh", "retry", "expire", "ttl"): soa[p]=req.GET.get(p, None) result=self.manager.add(args['zonename'], soa) elif action=="list": name=req.GET.get('name', None) name="" if name=='@' else name type=req.GET.get('type', None) records=self.manager.get(args['zonename']).get(name=name, type=type) result=[r.__dict__ for r in records] elif action=="record_add": rec=DNSRecord( name="" if args['name']=='@' else args['name'], content=args['content'], type=args['type'], ttl=req.GET.get('ttl', None), priority=req.GET.get('priority', None)) result=self.manager.get(args['zonename']).add(rec) elif action=="record_del": name="" if args['name']=='@' else args['name'] result=self.manager.get(args['zonename']).delete(name, args['type']) elif action=="record_edit": name="" if args['name']=='@' else args['name'] result=self.manager.get(args['zonename']).set( name=name, type=args['type'], content=req.GET.get('content', None), ttl=req.GET.get('ttl', None), priority=req.GET.get('priority', None) ) else: raise Exception("Incorrect action: "+action) return webob.Response(json.dumps({"result":result, "error":None}), content_type='application/json') except Exception as e: return webob.Response(json.dumps({"result":None, "error":str(e)}), content_type='application/json')