Skip to content

Instantly share code, notes, and snippets.

@niwinz
Last active December 14, 2015 15:49
Show Gist options
  • Save niwinz/5110937 to your computer and use it in GitHub Desktop.
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.
# -*- 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