Exemplo n.º 1
0
 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"
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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"
Exemplo n.º 7
0
 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"
Exemplo n.º 8
0
 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))
Exemplo n.º 9
0
 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"
Exemplo n.º 10
0
 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"
Exemplo n.º 11
0
    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')