예제 #1
0
파일: route53.py 프로젝트: 9apps/pgRDS
	def create_record(self, name, value):
		print "create_record"
		changes = ResourceRecordSets(self.route53, self.zone_id)

		change = changes.add_change("CREATE", name + ".", "CNAME", 60)
		change.add_value(value)
		changes.commit()
예제 #2
0
파일: test_route53.py 프로젝트: Affirm/moto
def test_use_health_check_in_resource_record_set():
    conn = boto.connect_route53('the_key', 'the_secret')

    check = HealthCheck(
        ip_addr="10.0.0.25",
        port=80,
        hc_type="HTTP",
        resource_path="/",
    )
    check = conn.create_health_check(
        check)['CreateHealthCheckResponse']['HealthCheck']
    check_id = check['Id']

    zone = conn.create_hosted_zone("testdns.aws.com")
    zone_id = zone["CreateHostedZoneResponse"][
        "HostedZone"]["Id"].split("/")[-1]

    changes = ResourceRecordSets(conn, zone_id)
    change = changes.add_change(
        "CREATE", "foo.bar.testdns.aws.com", "A", health_check=check_id)
    change.add_value("1.2.3.4")
    changes.commit()

    record_sets = conn.get_all_rrsets(zone_id)
    record_sets[0].health_check.should.equal(check_id)
예제 #3
0
def test_rrset():
    conn = boto.connect_route53('the_key', 'the_secret')

    conn.get_all_rrsets.when.called_with("abcd", type="A").\
                should.throw(boto.route53.exception.DNSServerError, "404 Not Found")

    zone = conn.create_hosted_zone("testdns.aws.com")
    zoneid = zone["CreateHostedZoneResponse"]["HostedZone"]["Id"]

    changes = ResourceRecordSets(conn, zoneid)
    change = changes.add_change("CREATE", "foo.bar.testdns.aws.com", "A")
    change.add_value("1.2.3.4")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid, type="A")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('1.2.3.4')

    rrsets = conn.get_all_rrsets(zoneid, type="CNAME")
    rrsets.should.have.length_of(0)

    changes = ResourceRecordSets(conn, zoneid)
    changes.add_change("DELETE", "foo.bar.testdns.aws.com", "A")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid)
    rrsets.should.have.length_of(0)
예제 #4
0
	def create_record(self, name, value, identifier=None, weight=None):
		changes = ResourceRecordSets(self.route53, self.zone_id)

		change = changes.add_change("CREATE", name + ".", "CNAME", 60,
									identifier=identifier, weight=weight)
		change.add_value(value)
		changes.commit()
예제 #5
0
def load(con, zone_name, file_in, **kwargs):
    ''' Send DNS records from input file to Route 53.

        Arguments are Route53 connection, zone name, vpc info, and file to open for reading.
    '''
    vpc = kwargs.get('vpc', {})
    zone = get_zone(con, zone_name, vpc)
    if not zone:
        zone = create_zone(con, zone_name, vpc)

    existing_records = comparable(skip_apex_soa_ns(zone, con.get_all_rrsets(zone['id'])))
    desired_records = comparable(skip_apex_soa_ns(zone, read_records(file_in)))

    to_delete = existing_records.difference(desired_records)
    to_add = desired_records.difference(existing_records)

    if to_add or to_delete:
        changes = ResourceRecordSets(con, zone['id'])
        for record in to_delete:
            change = changes.add_change('DELETE', **record.to_change_dict())
            print "DELETE", record.name, record.type
            for value in record.resource_records:
                change.add_value(value)
        for record in to_add:
            change = changes.add_change('CREATE', **record.to_change_dict())
            print "CREATE", record.name, record.type
            for value in record.resource_records:
                change.add_value(value)

        print "Applying changes..."
        changes.commit()
        print "Done."
    else:
        print "No changes."
예제 #6
0
파일: route53.py 프로젝트: chrisy/concoord
def _add_del_alias(conn, hosted_zone_id, change, name, type, identifier, weight, alias_hosted_zone_id, alias_dns_name, comment):
    from boto.route53.record import ResourceRecordSets
    changes = ResourceRecordSets(conn, hosted_zone_id, comment)
    change = changes.add_change(change, name, type,
                                identifier=identifier, weight=weight)
    change.set_alias(alias_hosted_zone_id, alias_dns_name)
    print changes.commit()
예제 #7
0
def load(con, zone_name, filename):
    zone = get_or_create_zone(con, zone_name)

    existing_records = comparable(skip_apex_soa_ns(zone, con.get_all_rrsets(zone['id'])))
    desired_records = comparable(skip_apex_soa_ns(zone, read_records(con, zone, filename)))

    to_delete = existing_records.difference(desired_records)
    to_add = desired_records.difference(existing_records)

    if to_add or to_delete:
        changes = ResourceRecordSets(con, zone['id'])
        for record in to_delete:
            change = changes.add_change('DELETE', **record.to_change_dict())
            print "DELETE", record.name, record.type
            for value in record.resource_records:
                change.add_value(value)
        for record in to_add:
            change = changes.add_change('CREATE', **record.to_change_dict())
            print "CREATE", record.name, record.type
            for value in record.resource_records:
                change.add_value(value)

        print "Applying changes..."
        changes.commit()
        print "Done."
    else:
        print "No changes."
예제 #8
0
    def update_type_A_domain(self, domain, point_to):
        """Update DNS domain record"""
        r53 = self.connections.get_route53()

        # Get Zone ID
        zone = r53.get_zone(self.env.domain)
        zone_id = zone.id

        if not zone.get_a(domain):
            sys.exit("\nAbort: {} does not exists! " \
                "Please create first!".format(domain))

        # Commit change
        try:
            changes = ResourceRecordSets(connection=r53, hosted_zone_id=zone_id)
            change = changes.add_change(action='UPSERT', name=domain, type="A")
            change.set_alias(
                alias_hosted_zone_id=zone_id,
                alias_dns_name=point_to,
                alias_evaluate_target_health=False)
            changes.commit()
        except DNSServerError:
            raise
        except Exception:
            print("Unexpected error: {}".format(traceback.format_exc()))
            sys.exit(1)

        # Print record set
        record = zone.get_a(domain)
        print("\nUpdated record set is:\n{}".format(record.to_print()))
예제 #9
0
def main():
    args = options()
    route53_ips = get_route53(args)
    ec2_ips = get_ec2(args)
    report_ips = {}
    conn = Route53Connection()
    changes = ResourceRecordSets(conn, args.zoneid)
    print 'Following records will be deleted.'
    for name, ip in route53_ips.items():
        match = 0
        for ec2_id in ec2_ips:
            if ip in ec2_ips[ec2_id].values():
                match = 1
        if match == 0:
            report_ips[name] = ip
    for name, ip in sorted(report_ips.items()):
        if re.match('[\d\.]+', ip):
            print "A;%s;%s" % (ip, name)
            change = changes.add_change("DELETE", str(name), "A", 300)
            change.add_value(ip)
        else:
            print "CNAME;%s;%s" % (ip, name)
    changes.commit()
    print 'Deleted records: '
    pprint.pprint(changes)
예제 #10
0
파일: util.py 프로젝트: DualSpark/stacker
def create_route53_zone(conn, zone_name):
    """ Create's the given zone_name if it doesn't already exists.

    Also sets the SOA negative caching TTL to something short (300 seconds).
    """
    if not zone_name.endswith('.'):
        zone_name += '.'
    zone = conn.get_zone(zone_name)
    if not zone:
        logger.debug("Zone %s does not exist, creating.", zone_name)
        zone = conn.create_zone(zone_name)
    # Update SOA to lower negative caching value
    soa = zone.find_records(zone_name, 'SOA')
    old_soa_body = soa.resource_records[0]
    old_soa_parts = old_soa_body.split(' ')
    # If the negative cache value is already 300, don't update it.
    if old_soa_parts[-1] == '300':
        return
    logger.debug("Updating negative caching value on zone %s to 300.",
                 zone_name)
    new_soa_body = ' '.join(old_soa_body.split(' ')[:-1]) + ' 300'
    changes = ResourceRecordSets(conn, zone.id)
    delete_soa = changes.add_change('DELETE', zone.name, 'SOA', soa.ttl)
    delete_soa.add_value(old_soa_body)
    create_soa = changes.add_change('CREATE', zone.name, 'SOA', soa.ttl)
    create_soa.add_value(new_soa_body)
    changes.commit()
예제 #11
0
파일: build.py 프로젝트: Web5design/asuka
 def _uninstall(self):
     logger = self.get_logger('uninstall')
     self.terminate_instances()
     service_map = dict((s.name, s) for s in self.services)
     if self.route53_hosted_zone_id and self.route53_records:
         changeset = ResourceRecordSets(
             self.app.route53_connection,
             self.route53_hosted_zone_id,
             'Changed by Asuka: {0}, {1} [clean]'.format(self.app.name,
                                                         self.branch.label)
         )
         from .service import DomainService
         for service_name, domain_format in self.route53_records.items():
             service = service_map[service_name]
             if not isinstance(service, DomainService):
                 raise TypeError(repr(service) + 'is not an instance of '
                                 'crosspop.service.DomainService')
             domain = domain_format.format(branch=self.branch)
             service.remove_domain(domain, changeset)
         if changeset.changes:
             logger.info('Route 53 changeset:\n%s', changeset.to_xml())
             changeset.commit()
     for name, service in service_map.iteritems():
         logger.info('Uninstall %s...', name)
         service.uninstall()
         logger.info('Uninstalled %s', name)
예제 #12
0
    def update_dns(self, host_name, ip_address):
	ttl = 10
	host_name = ".".join([host_name, self.domain])
        conn = boto.connect_route53()

        response = conn.get_all_rrsets(self.hosted_zone_id, 'A', host_name, maxitems=1)
        if len(response):
            response = response[0]
            comment = "Starcluster route53 plugin deleted record for %s"%(host_name)
            changes = ResourceRecordSets(conn, self.hosted_zone_id, comment)
            change1 = changes.add_change("DELETE", host_name, 'A', response.ttl)
            for old_value in response.resource_records:
                change1.add_value(old_value)
            try:
                changes.commit()
                log.info(comment)
            except Exception as e:
                log.warning(e)

        comment = "Starcluster route53 plugin updated record for %s to %s"%(host_name, ip_address)
        changes = ResourceRecordSets(conn, self.hosted_zone_id, comment)
        change2 = changes.add_change("CREATE", host_name, 'A', ttl)
        change2.add_value(ip_address)
        try:
            changes.commit()
            log.info(comment)
        except Exception as e:
            log.warning(e)
예제 #13
0
def update_elb_dns(stack, elb_attr, hosted_zone_id, dns_name):

    ttl = 60
    elb_dns = cf.get_stack_output_value(stack, elb_attr)
    dns_record_name = dns_name + "."

    conn = boto.connect_route53()

    existing_entries = conn.get_all_rrsets(hosted_zone_id, "CNAME", dns_name)

    changes = ResourceRecordSets(conn, hosted_zone_id)
    for item in existing_entries:
        
        if dns_record_name != item.name:
            logging.info('Nothing to change for %s', dns_name)
            continue

        for record in item.resource_records:
            logging.warning('Deleting CNAME entry {0} -> {1}'.format(dns_name, record))
            change = changes.add_change("DELETE", dns_name, "CNAME", ttl=ttl)
            change.add_value(record)

    logging.warning("Adding CNAME entry %s -> %s", dns_name, elb_dns)
    change = changes.add_change("CREATE", dns_name, "CNAME", ttl=ttl)
    change.add_value(elb_dns)
    
    try:
        changes.commit()
        print '*** DNS record updated'
        print '{0} IN CNAME {1}'.format(dns_name, elb_dns)
    except Exception, e:
        logging.error(e)
예제 #14
0
def update(zone_id):
    conn = get_connection()
    zone = get_zone(zone_id, conn)
    form = EditRecordForm(request.values)
    error = None

    if request.method == "GET" and not form.values:
        return redirect(url_for('.update_alias', zone_id=zone_id, **request.values.to_dict()))

    if request.method == "POST":
        changes = ResourceRecordSets(conn, zone_id, form.comment.data)
        del_change = changes.add_change("DELETE", form.previous_name.data,
            form.previous_type.data, form.previous_ttl.data)

        [del_change.add_value(v) for v in form.previous_values]

        change = changes.add_change("CREATE", form.name.data, form.type.data,
            form.ttl.data)

        [change.add_value(v) for v in form.values]

        changes.commit()
        flash('Updated %s record for %s' % (form.type.data, form.name.data))
        return redirect(url_for('zones.detail', zone_id=zone_id))

    return render_template('records/update.html', form=form, zone=zone,
        zone_id=zone_id, error=error)
예제 #15
0
def update_alias(zone_id):
    conn = get_connection()
    zone = get_zone(zone_id, conn)
    error = None
    form = RecordAliasForm(request.values, csrf_enabled=False)

    if form.validate_on_submit():

        changes = ResourceRecordSets(conn, zone_id, form.comment.data)

        change = changes.add_change("DELETE", form.name.data, form.type.data,
            form.ttl.data)
        change.set_alias(form.alias_hosted_zone_id.data,
            form.alias_dns_name.data)

        change = changes.add_change("CREATE", form.name.data, form.type.data,
            form.ttl.data)
        change.set_alias(form.alias_hosted_zone_id.data,
            form.alias_dns_name.data)

        changes.commit()
        flash('Updated alias %s for %s' % (form.type.data, form.name.data))
        return redirect(url_for('zones.detail', zone_id=zone_id))

    elbs = get_connection('elb').get_all_load_balancers()

    return render_template('records/update_alias.html', form=form, zone=zone,
        zone_id=zone_id, error=error, elbs=elbs)
예제 #16
0
    def add_to_slave_cname_pool(self):
        """ Add this instance to the pool of hostnames for slave.<cluster name>.goteam.be.

            This is a pool of 'weighted resource recordsets', which allows traffic to be distributed to
            multiple read-slaves.
        """
        route53_conn = self._get_route53_conn()

        changes = ResourceRecordSets(route53_conn, settings.ROUTE53_ZONE_ID)

        self.logger.info('Adding %s to CNAME pool for %s' % (self.metadata['instance-id'], self.slave_cname))
        add_record = changes.add_change('CREATE',
            self.slave_cname,
            'CNAME',
            ttl=settings.SLAVE_CNAME_TTL,
            weight='10',
            identifier=self.metadata['instance-id'])
        add_record.add_value(self.metadata['public-hostname'])
        try:
            changes.commit()
        except boto.route53.exception.DNSServerError, e:
            if e.error_message is not None and e.error_message.endswith('it already exists'):
                # This instance is already in the pool - carry on as normal.
                self.logger.warning('Attempted to create a CNAME, but one already exists for this instance')
            else:
                raise
예제 #17
0
def remove_domain():
    conn = boto.connect_route53()
    changes = ResourceRecordSets(conn, env.hosted_zone_id)
    for url in env.urls:
        change = changes.add_change("DELETE", url,"CNAME")
        change.add_value(env.public_host)
    changes.commit()
예제 #18
0
파일: botoplus.py 프로젝트: DanRode/misc
    def add_r53_record(self, fqdn, type, value, ttl=60):
	"""Add a record to Route53"""
	r53 = self.get_r53()
	zone_id = self.find_r53_zone_for(fqdn)
	changes = ResourceRecordSets(r53, zone_id)
	change = changes.add_change("CREATE", fqdn, type, ttl)
	change.add_value(value)
	changes.commit()
예제 #19
0
파일: route53.py 프로젝트: chrisy/concoord
def _add_del(conn, hosted_zone_id, change, name, type, identifier, weight, values, ttl, comment):
    from boto.route53.record import ResourceRecordSets
    changes = ResourceRecordSets(conn, hosted_zone_id, comment)
    change = changes.add_change(change, name, type, ttl,
                                identifier=identifier, weight=weight)
    for value in values.split(','):
        change.add_value(value)
    print changes.commit()
예제 #20
0
파일: domain.py 프로젝트: dreadatour/Cactus
    def _changeAlias(self, change, name, recordType, aliasHostedZoneId, aliasDNSName, identifier, weight, comment):

        logging.info('%s alias %s:%s in zone %s', change, name, recordType, self.domain)

        changes = ResourceRecordSets(self.connection, self.id, comment)
        change = changes.add_change(change, name, recordType, identifier=identifier, weight=weight)
        change.set_alias(aliasHostedZoneId, aliasDNSName)
        changes.commit()
예제 #21
0
파일: botoplus.py 프로젝트: DanRode/misc
    def delete_r53_record(self, fqdn, type, value, ttl=60):
        """Remove a record from Route53"""
	r53 = self.get_r53()
	zone_id = self.find_r53_zone_for(fqdn)
	changes = ResourceRecordSets(r53, _r53_zone_id)
	change = changes.add_change("DELETE", fqdn, type, ttl)
	change.add_value(value)
	changes.commit()
예제 #22
0
파일: app.py 프로젝트: exfm/singer
def add_cname(zone_id, src, dest, _type='CNAME'):
    app.logger.info("Add cname: {}, {}, {}, {}".format(zone_id, src, dest, _type))
    conn = boto.connect_route53(app.config['aws']['key'],
        app.config['aws']['secret'])

    changes = ResourceRecordSets(conn, zone_id, '')
    change = changes.add_change("CREATE", dest, _type, 300)
    change.add_value(src)
    changes.commit()
예제 #23
0
파일: r53.py 프로젝트: cnuber/gitbot
 def delete_route_to_bucket(self, bucket_name, region='us-east-1'):
     s3zone = s3zones[region]
     changes = ResourceRecordSets(self.connection, self.zone.id)
     change = changes.add_change('DELETE',
                 bucket_name + '.',
                 'A',
                 alias_dns_name='s3-website-'+ region + '.amazonaws.com.',
                 alias_hosted_zone_id=s3zone)
     changes.commit()
예제 #24
0
파일: app.py 프로젝트: exfm/singer
def delete_cname(zone_id, src, dest):
    conn = boto.connect_route53(app.config['aws']['key'],
        app.config['aws']['secret'])

    changes = ResourceRecordSets(conn, zone_id, '')
    change = changes.add_change('DELETE', dest, 'CNAME', 300)
    change.set_alias(None, None)
    change.add_value(src)
    changes.commit()
예제 #25
0
파일: dns.py 프로젝트: algby/redirect
    def new_domain(self, main_domain, domain):
        conn = boto.connect_route53(self.aws_access_key_id, self.aws_secret_access_key)
        changes = ResourceRecordSets(conn, self.hosted_zone_id)

        self.cname_change(changes, main_domain, domain, 'UPSERT')
        self.a_change(changes, main_domain, domain, 'UPSERT')
        self.services_change(changes, main_domain, 'UPSERT', domain.services)

        changes.commit()
예제 #26
0
파일: launch.py 프로젝트: alivesay/launch
  def _add_dns_record(self, hosted_zone, record_name, record_type, record_value, record_ttl=300, record_comment=''):
    from boto.route53.record import ResourceRecordSets
    conn = boto.connect_route53()

    zone = conn.get_zone(hosted_zone)
    changes = ResourceRecordSets(conn, zone.id, record_comment)
    change = changes.add_change('CREATE', '%s.%s' % (record_name, hosted_zone), record_type, record_ttl)
    change.add_value(record_value)
#    if not self.config['dry_run']:
    changes.commit()
예제 #27
0
def cname(route53conn, zone, domain_name, alt_name, ttl=60, remove=False):
    from boto.route53.record import ResourceRecordSets
    
    zone_id = get_zone_id(zone)
    changes = ResourceRecordSets(route53conn, zone_id)
    change = changes.add_change("DELETE" if remove else "CREATE",
                                name=domain_name,
                                type="CNAME", ttl=ttl)
    if alt_name:
        change.add_value(alt_name)
    changes.commit()
예제 #28
0
    def test_add_change(self):
        rrs = ResourceRecordSets(self.conn, self.zone.id)

        created = rrs.add_change("CREATE", "vpn.example.com.", "A")
        created.add_value("192.168.0.25")
        rrs.commit()

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        deleted = rrs.add_change("DELETE", "vpn.example.com.", "A")
        deleted.add_value("192.168.0.25")
        rrs.commit()
예제 #29
0
    def test_add_change(self):
        rrs = ResourceRecordSets(self.conn, self.zone.id)

        created = rrs.add_change("CREATE", "vpn.%s." % self.base_domain, "A")
        created.add_value('192.168.0.25')
        rrs.commit()

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        deleted = rrs.add_change('DELETE', "vpn.%s." % self.base_domain, "A")
        deleted.add_value('192.168.0.25')
        rrs.commit()
예제 #30
0
def change_record(conn, hosted_zone_id, name, type, values, ttl=600):
    """Delete and then add a record to a zone"""

    changes = ResourceRecordSets(conn, hosted_zone_id)
    response = conn.get_all_rrsets(hosted_zone_id, type, name, maxitems=1)[0]
    change1 = changes.add_change("DELETE", name, type, response.ttl)
    for old_value in response.resource_records:
        change1.add_value(old_value)
    change2 = changes.add_change("CREATE", name, type, ttl)
    for new_value in values.split(','):
        change2.add_value(new_value)
    print changes.commit()
예제 #31
0
def test_rrset_with_multiple_values():
    conn = boto.connect_route53("the_key", "the_secret")
    zone = conn.create_hosted_zone("testdns.aws.com")
    zoneid = zone["CreateHostedZoneResponse"]["HostedZone"]["Id"].split(
        "/")[-1]

    changes = ResourceRecordSets(conn, zoneid)
    change = changes.add_change("CREATE", "foo.bar.testdns.aws.com", "A")
    change.add_value("1.2.3.4")
    change.add_value("5.6.7.8")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid, type="A")
    rrsets.should.have.length_of(1)
    set(rrsets[0].resource_records).should.equal(set(["1.2.3.4", "5.6.7.8"]))
예제 #32
0
    def _changeRecord(self, change, name, recordType, values, ttl):

        logging.info('%s record %s:%s in zone %s', change, name, recordType,
                     self.domain)

        if type(values) is not types.ListType:
            values = [values]

        changes = ResourceRecordSets(self.connection, self.id)
        change = changes.add_change(change, name, recordType, ttl)

        for value in values:
            change.add_value(value)

        changes.commit()
예제 #33
0
    def test_set_alias_backwards_compatability(self):
        base_record = dict(
            name="alias.%s." % self.base_domain,
            type="A",
            identifier="boto:TestRoute53AliasResourceRecordSets")

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        new = rrs.add_change(action="UPSERT", **base_record)
        new.set_alias(self.zone.id, "target.%s" % self.base_domain)
        rrs.commit()

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        delete = rrs.add_change(action="DELETE", **base_record)
        delete.set_alias(self.zone.id, "target.%s" % self.base_domain)
        rrs.commit()
    def test_add_alias(self):
        base_record = dict(name="alias.%s." % self.base_domain,
                           type="A",
                           alias_evaluate_target_health=False,
                           alias_dns_name="target.%s" % self.base_domain,
                           alias_hosted_zone_id=self.zone.id,
                           identifier="boto:TestRoute53AliasResourceRecordSets")

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        rrs.add_change(action="UPSERT", **base_record)
        rrs.commit()

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        rrs.add_change(action="DELETE", **base_record)
        rrs.commit()
예제 #35
0
def test_rrset():
    conn = boto.connect_route53('the_key', 'the_secret')

    conn.get_all_rrsets.when.called_with("abcd", type="A").should.throw(
        boto.route53.exception.DNSServerError, "404 Not Found")

    zone = conn.create_hosted_zone("testdns.aws.com")
    zoneid = zone["CreateHostedZoneResponse"]["HostedZone"]["Id"].split("/")[-1]

    changes = ResourceRecordSets(conn, zoneid)
    change = changes.add_change("CREATE", "foo.bar.testdns.aws.com", "A")
    change.add_value("1.2.3.4")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid, type="A")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('1.2.3.4')

    rrsets = conn.get_all_rrsets(zoneid, type="CNAME")
    rrsets.should.have.length_of(0)

    changes = ResourceRecordSets(conn, zoneid)
    changes.add_change("DELETE", "foo.bar.testdns.aws.com", "A")
    change = changes.add_change("CREATE", "foo.bar.testdns.aws.com", "A")
    change.add_value("5.6.7.8")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid, type="A")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('5.6.7.8')

    changes = ResourceRecordSets(conn, zoneid)
    changes.add_change("DELETE", "foo.bar.testdns.aws.com", "A")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid)
    rrsets.should.have.length_of(0)

    changes = ResourceRecordSets(conn, zoneid)
    change = changes.add_change("CREATE", "foo.bar.testdns.aws.com", "A")
    change.add_value("1.2.3.4")
    change = changes.add_change("CREATE", "bar.foo.testdns.aws.com", "A")
    change.add_value("5.6.7.8")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid, type="A")
    rrsets.should.have.length_of(2)

    rrsets = conn.get_all_rrsets(zoneid, name="foo.bar.testdns.aws.com", type="A")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('1.2.3.4')

    rrsets = conn.get_all_rrsets(zoneid, name="bar.foo.testdns.aws.com", type="A")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('5.6.7.8')

    rrsets = conn.get_all_rrsets(zoneid, name="foo.foo.testdns.aws.com", type="A")
    rrsets.should.have.length_of(0)
def update_route53_record(conn, ip_address, hostname, domain):
    hosted_zone_name = domain if domain.endswith('.') else domain + '.'
    zone = conn.get_hosted_zone_by_name(hosted_zone_name)
    zone_id = zone['GetHostedZoneResponse']['HostedZone']['Id'].split('/')[2]
    rrsets = conn.get_all_rrsets(zone_id,
                                 type='A',
                                 name=hostname + '.' + hosted_zone_name)
    changes = ResourceRecordSets(conn, zone_id)

    if len(rrsets) != 0:
        for rrset in rrsets:
            # For some stupid reason Route53 will return RRsets that have nothing
            # to do with what we asked for, so this checks to be sure we're working
            # with the RRset we asked for.
            if rrset.type == 'A' and rrset.name == hostname + '.' + hosted_zone_name:
                change = changes.add_change('DELETE', rrset.name, rrset.type)
                for rr in rrset.resource_records:
                    change.add_value(rr)
    change = changes.add_change('CREATE', hostname + '.' + hosted_zone_name,
                                'A')
    change.add_value(ip_address)
    try:
        ret = changes.commit()
    except boto.route53.exception.DNSServerError as e:
        sys.stderr.write('Error:  Failed to update RRs\n  %s' % e)
        return False
    return True
예제 #37
0
def change_alias(conn,
                 hosted_zone_id,
                 name,
                 type,
                 new_alias_hosted_zone_id,
                 new_alias_dns_name,
                 identifier=None,
                 weight=None,
                 comment=""):
    """Delete and then add an alias to a zone.  identifier and weight are optional."""
    from boto.route53.record import ResourceRecordSets
    changes = ResourceRecordSets(conn, hosted_zone_id, comment)
    # Assume there are not more than 10 WRRs for a given (name, type)
    responses = conn.get_all_rrsets(hosted_zone_id, type, name, maxitems=10)
    for response in responses:
        if response.name != name or response.type != type:
            continue
        if response.identifier != identifier or response.weight != weight:
            continue
        change1 = changes.add_change("DELETE",
                                     name,
                                     type,
                                     identifier=response.identifier,
                                     weight=response.weight)
        change1.set_alias(response.alias_hosted_zone_id,
                          response.alias_dns_name)
    change2 = changes.add_change("CREATE",
                                 name,
                                 type,
                                 identifier=identifier,
                                 weight=weight)
    change2.set_alias(new_alias_hosted_zone_id, new_alias_dns_name)
    print(changes.commit())
예제 #38
0
def test_alias_rrset():
    conn = boto.connect_route53('the_key', 'the_secret')
    zone = conn.create_hosted_zone("testdns.aws.com")
    zoneid = zone["CreateHostedZoneResponse"]["HostedZone"]["Id"].split("/")[-1]

    changes = ResourceRecordSets(conn, zoneid)
    changes.add_change("CREATE", "foo.alias.testdns.aws.com", "A", alias_hosted_zone_id="Z3DG6IL3SJCGPX", alias_dns_name="foo.testdns.aws.com")
    changes.add_change("CREATE", "bar.alias.testdns.aws.com", "CNAME", alias_hosted_zone_id="Z3DG6IL3SJCGPX", alias_dns_name="bar.testdns.aws.com")
    changes.commit()

    rrsets = conn.get_all_rrsets(zoneid, type="A")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('foo.testdns.aws.com')
    rrsets = conn.get_all_rrsets(zoneid, type="CNAME")
    rrsets.should.have.length_of(1)
    rrsets[0].resource_records[0].should.equal('bar.testdns.aws.com')
def create_record(name, value, type, zone):
    """Create DNS entries in route53"""
    conn = boto.connect_route53()
    change_set = ResourceRecordSets(conn, zone)
    change = change_set.add_change("CREATE", name, type)
    change.add_value(value)
    result = change_set.commit()
예제 #40
0
    def remove_from_slave_cname_pool(self):
        """ Remove this instance from the pool of slave hostnames, usually after a promotion.
        """
        route53_conn = self._get_route53_conn()
        changes = ResourceRecordSets(route53_conn, settings.ROUTE53_ZONE_ID)

        self.logger.info('Removing  %s from CNAME pool for %s' %
                         (self.metadata['instance-id'], self.slave_cname))
        del_record = changes.add_change(
            'DELETE',
            self.slave_cname,
            'CNAME',
            ttl=settings.SLAVE_CNAME_TTL,
            weight='10',
            identifier=self.metadata['instance-id'])
        del_record.add_value(self.metadata['public-hostname'])
        changes.commit()
예제 #41
0
    def _add_dns_record(self,
                        hosted_zone,
                        record_name,
                        record_type,
                        record_value,
                        record_ttl=300,
                        record_comment=''):
        from boto.route53.record import ResourceRecordSets
        conn = boto.connect_route53()

        zone = conn.get_zone(hosted_zone)
        changes = ResourceRecordSets(conn, zone.id, record_comment)
        change = changes.add_change('CREATE',
                                    '%s.%s' % (record_name, hosted_zone),
                                    record_type, record_ttl)
        change.add_value(record_value)
        #    if not self.config['dry_run']:
        changes.commit()
    def test_incomplete_add_alias_failure(self):
        base_record = dict(name="alias.%s." % self.base_domain,
                           type="A",
                           alias_dns_name="target.%s" % self.base_domain,
                           alias_hosted_zone_id=self.zone.id,
                           identifier="boto:TestRoute53AliasResourceRecordSets")

        rrs = ResourceRecordSets(self.conn, self.zone.id)
        rrs.add_change(action="UPSERT", **base_record)

        try:
            self.assertRaises(DNSServerError, rrs.commit)
        except:
            # if the call somehow goes through, delete our unexpected new record before failing test
            rrs = ResourceRecordSets(self.conn, self.zone.id)
            rrs.add_change(action="DELETE", **base_record)
            rrs.commit()
            raise
예제 #43
0
def post_changes(con, zone, commit_flag, oper, recs, chunk_size, **kwargs):
    logging.info("Preparing to %s %d records" % (oper, len(recs)))
    try:
        changes = ResourceRecordSets(con, zone['id'])
        for chunk in chunker(recs, chunk_size):
            for rec in chunk:
                change = changes.add_change(oper, **rec.to_change_dict())
                for value in rec.resource_records:
                    change.add_value(value)

            if commit_flag:
                logging.debug("Commiting %d %s records." % (len(chunk), oper))
                changes.commit()
        logging.info("Done")

    except Exception as ex:
        logging.info("post_changes for %s with %d records, commit=%s failed." %
                     (open, len(recs), commit_flag))
예제 #44
0
    def __action_domain(self, main_domain, domain, action):

        ip = domain.dns_ip()
        if ip is None:
            return

        conn = boto.connect_route53(self.aws_access_key_id, self.aws_secret_access_key)
        changes = ResourceRecordSets(conn, self.hosted_zone_id)

        full_domain = domain.dns_name(main_domain)
        ip_version = IP(ip).version()
        self.a_change(changes, ip, full_domain, action, ip_version)
        self.a_change(changes, ip, '*.{0}'.format(full_domain), action, ip_version)
        self.mx_change(changes, full_domain, action)
        self.spf_change(changes, ip, full_domain, action, ip_version)
        
        self.statsd_client.incr('dns.ip.commit')
        
        changes.commit()
예제 #45
0
 def add_record(self, resource_type, name, value, ttl=60, comment=""):
     """Add a new record to a zone"""
     changes = ResourceRecordSets(route53, self.id, comment)
     change = changes.add_change("CREATE", name, resource_type, ttl)
     if type(value) in [list, tuple, set]:
         for record in value:
             change.add_value(record)
     else:
         change.add_value(value)
     status = Status(changes.commit()['ChangeResourceRecordSetsResponse']['ChangeInfo'])
예제 #46
0
def test_use_health_check_in_resource_record_set():
    conn = boto.connect_route53("the_key", "the_secret")

    check = HealthCheck(ip_addr="10.0.0.25", port=80, hc_type="HTTP", resource_path="/")
    check = conn.create_health_check(check)["CreateHealthCheckResponse"]["HealthCheck"]
    check_id = check["Id"]

    zone = conn.create_hosted_zone("testdns.aws.com")
    zone_id = zone["CreateHostedZoneResponse"]["HostedZone"]["Id"].split("/")[-1]

    changes = ResourceRecordSets(conn, zone_id)
    change = changes.add_change(
        "CREATE", "foo.bar.testdns.aws.com", "A", health_check=check_id
    )
    change.add_value("1.2.3.4")
    changes.commit()

    record_sets = conn.get_all_rrsets(zone_id)
    record_sets[0].health_check.should.equal(check_id)
예제 #47
0
파일: main.py 프로젝트: nfons/Crows-Nest
def closed(branch, port=8080, ZONE_ID=ZONE_ID, DNS=DNS, DNS_TYPE='A', NODE_IP=NODE_IP):
    '''
    We will need to get ingress, and then remove the ingress rule for this dns.
    delete deployments from this branch, as well as remove r53 record
    '''
    change_set = ResourceRecordSets(conn, ZONE_ID)
    changes1 = change_set.add_change("DELETE", branch + '.' + DNS, type=DNS_TYPE, ttl=60)
    changes1.add_value(NODE_IP)
    change_set.commit()

    pod = {
        "name": branch,
        "image": 'none',  # dont need image here for deletion
        "host": branch + '.' + DNS,
        "port": port
    }

    # runs through the create stack process
    deleteStack(pod, KUBE_CONF)
예제 #48
0
def main():
    
    # Get your public IP from the hypervisor
    # If you wish to use this on a non-AWS server, use http://ip.42.pl/raw instead
    current_ip = urllib2.urlopen('http://169.254.169.254/latest/meta-data/public-ipv4').read()

    # Avoid to hit the Route53 API if is not necessary.
    # so compare first to a DNS server if the IP changed
    resolved_ip = resolve_name_ip(DOMAIN_NAME)
    if resolved_ip == current_ip:
        logger.debug('DNS response (%s) and public IP (%s) are the same, nothing to do' % (resolved_ip, current_ip))
        return
    
    conn = Route53Connection()

    try:
        zone = conn.get_hosted_zone(HOSTED_ZONE)
    except DNSServerError:
        logger.error('%s Zone Not Found' % HOSTED_ZONE)
        sys.exit(1)

    response = conn.get_all_rrsets(HOSTED_ZONE, 'A', DOMAIN_NAME, maxitems=1)[0]
    
    if current_ip not in response.resource_records:
        logger.info('Found new IP: %s' % current_ip)

        # Delete the old record, and create a new one.
        # This code is from route53.py script, the change record command
        changes = ResourceRecordSets(conn, HOSTED_ZONE, '')
        change1 = changes.add_change("DELETE", DOMAIN_NAME, 'A', response.ttl)
        for old_value in response.resource_records:
            change1.add_value(old_value)
        change2 = changes.add_change("CREATE", DOMAIN_NAME, 'A', response.ttl)
        change2.add_value(current_ip)

        try:
            commit = changes.commit()
            logger.debug('%s' % commit)
        except:
            logger.error("Changes can't be made: %s" % commit)
            sys.exit(1)
        else:
            
            change = conn.get_change(get_change_id(commit['ChangeResourceRecordSetsResponse']))
            logger.debug('%s' % change)

            while get_change_status(change['GetChangeResponse']) == 'PENDING':
                time.sleep(2)
                change = conn.get_change(get_change_id(change['GetChangeResponse']))
                logger.debug('%s' % change)                
            if get_change_status(change['GetChangeResponse']) == 'INSYNC':
                logger.info('Change %s A de %s -> %s' % (DOMAIN_NAME, response.resource_records[0], current_ip))
            else:
                logger.warning('Unknow status for the change: %s' % change)
                logger.debug('%s' % change)
예제 #49
0
파일: snippet.py 프로젝트: szabo92/gistable
    def add_a_record_to_zone(self, hostname, ip, zone):

        route53_connection = route53.connection.Route53Connection(
            self.access_key, self.secret)
        zone_id = route53_connection.get_hosted_zone_by_name(zone)
        if not zone_id:
            raise Exception('No such zone found: {}'.format(zone))

        zone_id = zone_id['GetHostedZoneResponse']['HostedZone']['Id'].replace(
            '/hostedzone/', '')
        fqdn = '{}.{}'.format(hostname, zone)
        changes = ResourceRecordSets(route53_connection, zone_id)

        # find existing record
        existing_records = route53_connection.get_all_rrsets(zone_id,
                                                             'A',
                                                             fqdn,
                                                             maxitems=1)
        if existing_records:
            record = existing_records[0]

            if record.resource_records == [ip]:
                print 'Record A {} with {} already exists. Skipping.'.format(
                    fqdn, ip)
                return

            # schedule removal
            print 'Removing existing A record {}'.format(fqdn)
            changes.changes.append(("DELETE", record))

        # add new
        print 'Adding A record {} for {}'.format(fqdn, ip)

        add = changes.add_change('CREATE', fqdn, 'A')
        add.add_value(ip)

        # go for it
        try:
            changes.commit()
            print 'Done.'
        except route53.exception.DNSServerError, e:
            print e.error_message
예제 #50
0
def update_dns_cname_record(conn, zone_id, cname_record, cname_value):
  # zone_id = 'Z2IBYTQ6W9V2HA'
  # cname_record = 'sol1-salt1.devopslogic.com'
  result = None
  try:
    changes = ResourceRecordSets(conn, zone_id)
    change = changes.add_change("UPSERT", cname_record, "CNAME", 60)
    change.add_value(cname_value)
    result = changes.commit()
  except Exception, e:
    print "Exception: %s" % e
예제 #51
0
 def restore_other(self, record, zone_name):
     record_name = record['Name']
     record_values = record['Value']
     record_ttl = record['TTL']
     record_type = record['Type']
     zone = self.connection.get_zone(zone_name)
     try:
         record_changes = ResourceRecordSets(self.connection, zone.id)
         new_record = record_changes.add_change("UPSERT",
                                                record_name,
                                                record_type,
                                                ttl=record_ttl)
         for value in record_values:
             new_record.add_value(value)
         record_changes.commit()
         print 'Adding record %s %s' % (record_type, record_name)
         time.sleep(0.25)
     except (boto.route53.exception.DNSServerError, AttributeError):
         print 'Failed to insert %s %s => %s' \
             % (record_type, record_name, str(record_values))
예제 #52
0
def main():
    currentInterface = environ.get('PPP_IFACE')
    if currentInterface:
        if currentInterface != IF_NAME:
            return
        address = environ.get('PPP_LOCAL')
    if not address:
        return
    hostname = gethostname()

    conn = connect_route53(AWS_ACCESS_KEY, AWS_SECRET_KEY)
    rrset = conn.get_all_rrsets(ZONE_ID, 'A', hostname, maxitems=1)[0]
    if address not in rrset.resource_records:
        changes = ResourceRecordSets(conn, ZONE_ID)
        change1 = changes.add_change('DELETE', hostname, 'A', rrset.ttl)
        for rr in rrset.resource_records:
            change1.add_value(rr)
        change2 = changes.add_change('CREATE', hostname, 'A', rrset.ttl)
        change2.add_value(address)
        changes.commit()
예제 #53
0
def _add_del_alias(conn, hosted_zone_id, change, name, type, identifier,
                   weight, alias_hosted_zone_id, alias_dns_name, comment):
    from boto.route53.record import ResourceRecordSets
    changes = ResourceRecordSets(conn, hosted_zone_id, comment)
    change = changes.add_change(change,
                                name,
                                type,
                                identifier=identifier,
                                weight=weight)
    change.set_alias(alias_hosted_zone_id, alias_dns_name)
    print(changes.commit())
예제 #54
0
 def delete_record(self, resource_type, name, value, ttl=None, comment=""):
     """Delete a record from a zone"""
     ttl = ttl or default_ttl
     changes = ResourceRecordSets(route53, self.id, comment)
     change = changes.add_change("DELETE", name, resource_type, ttl)
     if type(value) in [list, tuple, set]:
         for record in value:
             change.add_value(record)
     else:
         change.add_value(value)
     status = Status(changes.commit()['ChangeResourceRecordSetsResponse']['ChangeInfo'])
예제 #55
0
def add_dns_cname(ROUTE53_ZONE_NAME, record, cname):
    conn = boto.route53.connection.Route53Connection(AWSAccessKeyId,
                                                     AWSSecretKey)
    results = conn.get_all_hosted_zones()
    zones = results['ListHostedZonesResponse']['HostedZones']
    found = 0
    for zone in zones:
        if zone['Name'] == ROUTE53_ZONE_NAME:
            found = 1
            break
    if not found:
        return "::ERROR:: No Route53 zone found for %s" % ROUTE53_ZONE_NAME

    zone_id = zone['Id'].replace('/hostedzone/', '')
    changes = ResourceRecordSets(conn, zone_id)
    change = changes.add_change("CREATE", record + ROUTE53_ZONE_NAME, "CNAME",
                                60)
    change.add_value(cname)
    changes.commit()

    return "\nDNS: " + record + ROUTE53_ZONE_NAME + " -> " + cname
예제 #56
0
    def _update_recordset(self, action, records):
        """Take a specific action on a recordset with a collection of records.

    Args:
      action - The action to take (CREATE, DELETE)
      records - An iterable of Route53Record objects or a single Route53Record.
    """
        if isinstance(records, Route53Record):
            records = [records]

        record_set = ResourceRecordSets(self.conn.route53,
                                        self._hosted_zone_id)
        for r in records:
            change = record_set.add_change(action=action,
                                           name=r.domain,
                                           type=RecordType.CNAME,
                                           identifier=r.hostname,
                                           ttl=r.ttl,
                                           weight=1)
            change.add_value(r.hostname)
        record_set.commit()
예제 #57
0
def zone_clone(source, dest):
    conn = connector()
    changes = ResourceRecordSets(conn, dest.id)
    for record in source.get_records():
        if record.type == 'TXT':
            continue
        elif record.type != 'NS' and record.type != 'SOA':
            new = record.name.replace(source.name, dest.name)
            if record.alias_dns_name:
                change = changes.add_change(
                    "CREATE",
                    new,
                    record.type,
                    record.ttl,
                    alias_dns_name=record.alias_dns_name,
                    alias_hosted_zone_id=record.alias_hosted_zone_id,
                    alias_evaluate_target_health=False)
            else:
                change = changes.add_change("CREATE", new, record.type,
                                            record.ttl)
                change.add_value(record.to_print())
    changes.commit()
예제 #58
0
def change_record(conn, hosted_zone_id, name, type, newvalues, ttl=600,
                   identifier=None, weight=None, comment=""):
    """Delete and then add a record to a zone.  identifier and weight are optional."""
    from boto.route53.record import ResourceRecordSets
    changes = ResourceRecordSets(conn, hosted_zone_id, comment)
    # Assume there are not more than 10 WRRs for a given (name, type)
    responses = conn.get_all_rrsets(hosted_zone_id, type, name, maxitems=10)
    for response in responses:
        if response.name != name or response.type != type:
            continue
        if response.identifier != identifier or response.weight != weight:
            continue
        change1 = changes.add_change("DELETE", name, type, response.ttl,
                                     identifier=response.identifier,
                                     weight=response.weight)
        for old_value in response.resource_records:
            change1.add_value(old_value)
    change2 = changes.add_change("CREATE", name, type, ttl,
            identifier=identifier, weight=weight)
    for new_value in newvalues.split(','):
        change2.add_value(new_value)
    print changes.commit()
예제 #59
0
def _add_del(conn, hosted_zone_id, change, name, type, identifier, weight,
             values, ttl, comment):
    from boto.route53.record import ResourceRecordSets
    changes = ResourceRecordSets(conn, hosted_zone_id, comment)
    change = changes.add_change(change,
                                name,
                                type,
                                ttl,
                                identifier=identifier,
                                weight=weight)
    for value in values.split(','):
        change.add_value(value)
    print(changes.commit())
예제 #60
0
def r53_change_record(name,
                      values,
                      aws_access_key_id,
                      aws_secret_access_key,
                      proxy=None,
                      proxy_port=None,
                      type="A",
                      ttl="600",
                      comment=""):

    # note: if the network is unreachable this function will retry,
    #       blocking up to one minute before the last retry (not configurable?)
    conn = boto.connect_route53(aws_access_key_id=aws_access_key_id,
                                aws_secret_access_key=aws_secret_access_key,
                                proxy=proxy,
                                proxy_port=proxy_port)
    res = conn.get_all_hosted_zones()

    domain_name = re.sub('^[^\.]*\.', '', name)
    if name[0] == '.':
        name = name[1:]

    hosted_zone_id = None
    for zoneinfo in res['ListHostedZonesResponse']['HostedZones']:
        zonename = zoneinfo['Name']
        _zone_id = zoneinfo['Id']
        _zone_id = re.sub('/hostedzone/', '', _zone_id)
        if zonename[-1] == '.':
            zonename = zonename[:-1]

#print domain_name, zonename
        if domain_name == zonename:
            hosted_zone_id = _zone_id
            break

    if not hosted_zone_id:
        raise RuntimeError, 'domain_name ' + repr(
            domain_name) + ' not found in hosted zones'

    changes = ResourceRecordSets(conn, hosted_zone_id, comment)

    response = conn.get_all_rrsets(hosted_zone_id, type, name, maxitems=1)
    if response:
        rrset = response[0]
        change1 = changes.add_change("DELETE", name, type, rrset.ttl)
        for old_value in rrset.resource_records:
            change1.add_value(old_value)
    change2 = changes.add_change("CREATE", name, type, ttl)
    for new_value in values.split(','):
        change2.add_value(new_value)
    return changes.commit()