예제 #1
0
파일: dns.py 프로젝트: TheMeier/dim
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)
예제 #2
0
파일: rrtype.py 프로젝트: tlex/dim
 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
예제 #3
0
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
예제 #4
0
 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))
예제 #5
0
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
예제 #6
0
 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
예제 #7
0
파일: dns.py 프로젝트: TheMeier/dim
 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