def rr_delete(name, zone, view, profile, free_ips, references, user, type=None, **kwargs): fqdn = make_fqdn(name, view.zone.name) rrs = RR.query.filter_by(name=make_fqdn(name, view.zone.name), view=view) display_query = [fqdn] if type: rrs = rrs.filter_by(type=type) display_query.append(type) if kwargs: kwargs = RR.validate_args(type, **kwargs) value = RR.get_class(type).value_from_fields(**kwargs) rrs = rrs.filter_by(value=value) if 'ip' in kwargs: rrs = rrs.filter_by(ipblock=kwargs['ip']) display_query.append(value) # this should never be needed if rrs.count() > 1: raise DimError('%s is ambiguous' % ' '.join(display_query)) elif rrs.count() == 0: raise DimError('%s does not exist' % ' '.join(display_query)) delete_with_references(rrs, free_ips=free_ips, references=references, user=user)
def fqdn_target(cls, value, zone_name): target_fields = set(cls.fields) & set(RRType.target_fields) if target_fields: fields = cls.fields_from_value(value) for name in target_fields: fields[name] = make_fqdn(fields[name], zone_name) return cls.value_from_fields(**fields) else: return value
def create_single_rr(name, rr_type, zone, view, user, overwrite=False, **kwargs): ''' :type zone: Zone :type view: string :param view: name of the view :param rr_type: RR type (string) :return: True if the record was created or already existed ''' view = get_view(zone, view) existed = False created = True name = make_fqdn(name, view.zone.name) rr_query = RR.query.filter(RR.name == name).filter(RR.type == rr_type)\ .join(ZoneView).filter(RR.view == view) new_rr = RR.create(name=name, type=rr_type, view=view, **kwargs) rrs = rr_query.all() if rrs: if overwrite: for rr in rrs: Messages.warn("Deleting RR %s from %s" % (rr.bind_str(relative=True), rr.view)) delete_single_rr(rr, user) else: samerr = None for rr in rrs: if rr.value == new_rr.value and (rr.type not in ('A', 'AAAA', 'PTR') or rr.ipblock == new_rr.ipblock): samerr = rr break if samerr: created = False existed = True Messages.info("%s already exists" % samerr) else: if rr_type == 'PTR': # Don't allow PTR round robin records created = False Messages.warn("Not overwriting: %s" % rrs[0]) else: Messages.warn("The name %s already existed, creating round robin record" % name) if created: if rr_type == 'RP': point_to = _same_view_or_different_zone(new_rr).filter(RR.name == new_rr.target) if point_to.filter(RR.type == 'TXT').count() == 0: Messages.warn('TXT Record %s not found' % (new_rr.target,)) elif rr_type == 'SSHFP': same_name = _same_view_or_different_zone(new_rr).filter(RR.name == new_rr.name) if same_name.filter(or_(RR.type == 'A', RR.type == 'AAAA')).count() == 0: Messages.warn('No A or AAAA found for %s' % (new_rr.name,)) check_new_rr(new_rr) Messages.info(u"Creating RR {rr}{comment_msg} in {view_msg}".format( rr=new_rr.bind_str(relative=True), comment_msg=u' comment {0}'.format(kwargs['comment']) if kwargs.get('comment', None) else '', view_msg=new_rr.view)) if new_rr.target and rr_type not in ['PTR', 'RP']: # Creating a PTR record also creates the A/AAAA record if _same_view_or_different_zone(new_rr).filter(RR.name == new_rr.target).count() == 0: Messages.warn('%s does not exist.' % new_rr.target) new_rr.insert() return created or existed
def _send_rr_action_to_zone(rr, action, zone_name, output): db.session.add(OutputUpdate( action=action, output=output, zone_name=zone_name, serial=rr.view.serial, name=make_fqdn(RR.record_name(rr.name, rr.view.zone.name), zone_name), ttl=rr.ttl or rr.view.ttl, type=rr.type, content=rr.value))
def apply_profile(view, zone, from_profile): for rr in RR.query.filter_by(view=from_profile.views[0]): new_rr = RR(name=make_fqdn(RR.record_name(rr.name, rr.view.zone.name), zone.name), view=view, type=rr.type, ttl=rr.ttl, ipblock=rr.ipblock, target=rr.target, value=rr.value) try: check_new_rr(new_rr) db.session.add(new_rr) except InvalidParameterError: pass
def create(name, type, view, ttl, comment=None, **kwargs): if type == 'SRV': labels = name.split('.') if len(labels) < 2 or not labels[0].startswith('_') or not labels[1].startswith('_'): raise InvalidParameterError('SRV records must start with two _ labels service and proto') kwargs = RR.validate_args(type, **kwargs) rr = RR(name=name, type=type, view=view, ttl=ttl, comment=comment) for field in kwargs.keys(): if field == 'ip': rr.ipblock = kwargs['ip'] elif field in RRType.target_fields: rr.target = make_fqdn(kwargs[field], view.zone.name) rr.value = RR.get_class(type).value_from_fields(**kwargs) return rr
def create(zone, name, from_profile=None, soa_attributes=None, copy_rrs=True): if from_profile: assert len(from_profile.views) == 1 from_view = from_profile.views[0] fields = dict(ttl=from_view.ttl, primary=from_view.primary, mail=from_view.mail, refresh=from_view.refresh, retry=from_view.retry, expire=from_view.expire, minimum=from_view.minimum) else: fields = dict(primary='localhost.', mail='hostmaster.' + (zone.name or 'root') + '.', refresh=app.config['DNS_DEFAULT_REFRESH'], retry=app.config['DNS_DEFAULT_RETRY'], expire=app.config['DNS_DEFAULT_EXPIRE'], minimum=app.config['DNS_DEFAULT_MINIMUM'], ttl=app.config['DNS_DEFAULT_ZONE_TTL']) if soa_attributes: fields.update(soa_attributes) if not fields.get('serial', None): fields['serial'] = int(datetime.date.today().strftime("%Y%m%d01")) zoneview = ZoneView(name=name, zone=zone, **fields) if from_profile and copy_rrs: for rr in RR.query.filter_by(view=from_view): db.session.add( RR(name=make_fqdn( RR.record_name(rr.name, rr.view.zone.name), zone.name), view=zoneview, type=rr.type, ttl=rr.ttl, ipblock=rr.ipblock, target=rr.target, value=rr.value)) db.session.add(zoneview) zone.update_modified() return zoneview