def update_record(self): if self.new_record == self.old_record: return if self.new_record['rtype'] == self.old_record['rtype'] and \ self.new_record['name'] == self.old_record['name']: pdns().update_record( zone=self.zone_name, name=self.old_record['name'], rtype=self.old_record['rtype'], old_content=self.old_record['content'], new_ttl=self.new_record['ttl'], new_content=self.new_record['content'], ) return try: self._delete(self.old_record) except PDNSError as e: self.add_error(None, _('Could not delete old record.') + ' ' + _('PowerDNS error: {}').format(e.message)) return try: self._create(self.new_record) except PDNSError as e_new: self.add_error(None, _('Could not create new record.') + ' ' + _('PowerDNS error: {}').format(e_new.message)) try: self._create(self.old_record) except PDNSError as e: self.add_error(None, _('Could not re-create old record; it may be missing now.') + ' ' + _('PowerDNS error: {}').format(e.message)) return
def delete_entity(self, rr): # permission check is done based on kwarg, so make sure we use the same for deletion. # even without this check the delete would eventually fail because the client tries # to delete "www.example.com." out of zone "example.org.", which only makes sense # for every special constellations (e.g. "customer.com.internal.proxy"). if rr['zone'] != self.kwargs['zone']: raise SuspiciousOperation('zone name in kwargs does not match zone name in payload.') pdns().delete_record(rr['zone'], rr['name'], rr['rtype'], rr['content'])
def create_record(self): try: pdns().create_record( zone=self.zone_name, name=self.cleaned_data['name'], rtype=self.cleaned_data['rtype'], ttl=self.cleaned_data['ttl'], content=self.cleaned_data['content'], ) except PDNSError as e: self.add_error(None, _('PowerDNS error: {}').format(e.message))
def create_zone(self): try: pdns().create_zone( name=self.cleaned_data['name'], kind=settings.ZONE_DEFAULT_KIND, nameservers=settings.ZONE_DEFAULT_NAMESERVERS, ) zone = Zone.objects.create(name=self.cleaned_data['name']) for tenant in self.cleaned_data['tenants']: tenant.zones.add(zone) except PDNSError as e: self.add_error(None, _('PowerDNS error: {}').format(e.message))
def filtered_records(self): q = self.request.GET.get('q') try: records = pdns().get_records(self.zone_name) except PDNSNotFoundException: raise Http404() if q: q = q.lower() is_apex_search = (q == '@') return [ r for r in records if q.upper() == r['rtype'] or q in r['name'].lower() or ( is_apex_search and r['name'] == self.zone_name) ] else: return records
def _refresh_zones(self): if not self._zones_refreshed: # TODO: doing this every time the list is loaded is a bad idea Zone.import_from_powerdns(pdns().get_zones()) self._zones_refreshed = True
def _delete(self, record): record = record.copy() record.pop('ttl', None) pdns().delete_record(zone=self.zone_name, **record)
def _create(self, record): pdns().create_record(zone=self.zone_name, **record)
def delete_entity(self, pk): if not self.request.user.has_perm(self.permission_required, pk): raise PermissionDenied() pdns().delete_zone(pk) Zone.objects.filter(name=pk).delete()