Last active
December 14, 2015 15:49
-
-
Save niwinz/5110937 to your computer and use it in GitHub Desktop.
Simple command for automatic update of current ip of ec2 instance in route53.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import print_function | |
import argparse | |
import socket | |
import fcntl | |
import struct | |
import os | |
import sys | |
from boto.route53.connection import Route53Connection, ResourceRecordSets | |
def get_ip_address(ifname): | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
return socket.inet_ntoa(fcntl.ioctl( | |
s.fileno(), | |
0x8915, # SIOCGIFADDR | |
struct.pack('256s', ifname[:15]) | |
)[20:24]) | |
class Route53(object): | |
def __init__(self, key, secret, ifname): | |
self.connection = Route53Connection(key, secret) | |
self.ifname = ifname | |
def get_new_value(self): | |
return get_ip_address(self.ifname) | |
def zone_name_to_id(self, zone_name): | |
zone = self.connection.get_hosted_zone_by_name(zone_name) | |
zone_id = zone.HostedZone.Id.rsplit("/", 1)[1] | |
return zone_id | |
def update_or_create(self, zone_name, domain, ttl=120): | |
zone_id = self.zone_name_to_id(zone_name) | |
changes = ResourceRecordSets(self.connection, zone_id, "") | |
if not domain.endswith("."): | |
domain = domain + "." | |
for record in self.connection.get_all_rrsets(zone_id, "A", zone_name): | |
if record.name == domain: | |
change_delete = changes.add_change("DELETE", record.name, record.type, record.ttl, | |
identifier=record.identifier, weight=record.weight) | |
for item in record.resource_records: | |
change_delete.add_value(item) | |
break | |
value = self.get_new_value() | |
change_create = changes.add_change("CREATE", domain, "A", ttl) | |
change_create.add_value(value) | |
print("IP ADDR:", value) | |
return changes.commit() | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description='SimpleUpdate route53') | |
parser.add_argument('-z', '--zone', dest="zone", required=True, | |
help=u"Zone name change or create") | |
parser.add_argument('-d', '--domain', dest="domain", required=True, | |
help=u"Domain name change or create") | |
parser.add_argument('--access-key', dest="aws_key", | |
help=u"AWS api key.") | |
parser.add_argument('--secret-key', dest="aws_secret", | |
help=u"AWS secret key.") | |
parser.add_argument('--ifname', dest="ifname", default="eth0", | |
help=u"Interface name.") | |
parser.add_argument('--ttl', type=int, dest="ttl", default=120) | |
args = parser.parse_args() | |
route53 = Route53(args.aws_key, args.aws_secret, args.ifname) | |
result = route53.update_or_create(args.zone, args.domain, args.ttl) | |
print(result) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment