Implement list dns records
This commit is contained in:
parent
59257703ba
commit
71833e1b88
|
|
@ -0,0 +1,139 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import http.client
|
||||
import xml.etree.ElementTree as ElementTree
|
||||
import sys
|
||||
import os
|
||||
|
||||
def read_api_key():
|
||||
return os.getenv('NAMESILO_API_KEY')
|
||||
|
||||
def make_request_url(api_key, operation, args_dict):
|
||||
"""Helper function to create URLs for a given `operation`.
|
||||
The arguments for the operation are passed in `args_dict` dictionary"""
|
||||
|
||||
# Only version and response type currently supported by namesilo
|
||||
API_VERSION = 1
|
||||
RESPONSE_TYPE = 'xml'
|
||||
|
||||
url_template = "/api/{}?version={}&type={}&key={}"
|
||||
url = url_template.format(operation, API_VERSION, RESPONSE_TYPE, api_key)
|
||||
for name, value in args_dict.items():
|
||||
arg = "&{}={}".format(name, value)
|
||||
url += arg
|
||||
return url
|
||||
|
||||
def http_get_request(hostname, req_url):
|
||||
conn = http.client.HTTPSConnection(hostname)
|
||||
conn.request('GET', req_url)
|
||||
with conn.getresponse() as resp:
|
||||
res = resp.read()
|
||||
conn.close()
|
||||
return res
|
||||
|
||||
def make_request(api_key, operation, args_dict):
|
||||
"""Helper function to perform to perform the asked `operation`.
|
||||
`args_dict` is a dict containing all the required arguments for the operation.
|
||||
Returns the parsed xml body"""
|
||||
NAMESILO_HOSTNAME = 'www.namesilo.com'
|
||||
req_url = make_request_url(api_key, operation, args_dict)
|
||||
# TODO: Maybe an incremental streaming solution is better
|
||||
resp = http_get_request(NAMESILO_HOSTNAME, req_url)
|
||||
return ElementTree.fromstring(resp)
|
||||
|
||||
class Command:
|
||||
"""Base Command type"""
|
||||
def run(self, ctx, args):
|
||||
"""Run command"""
|
||||
pass
|
||||
|
||||
def description(self):
|
||||
"""Command description"""
|
||||
pass
|
||||
|
||||
def print_help(self, ctx):
|
||||
"""Print help message for this command"""
|
||||
pass
|
||||
|
||||
class ListDnsRecords(Command):
|
||||
def run(self, ctx, args):
|
||||
if len(args) < 1:
|
||||
print("Missing domain name argument")
|
||||
self.print_help()
|
||||
return
|
||||
|
||||
domain = args[0]
|
||||
self.list_dns_records_summary(ctx['api_key'], domain)
|
||||
|
||||
def description(self):
|
||||
return "Get a summary of the currently active DNS records for a domain"
|
||||
|
||||
def print_help(self, ctx):
|
||||
print(self.description())
|
||||
print("Usage: {} list-dns-records <domain-name>".format(ctx['executable_name']))
|
||||
print("\ndomain-name\t domain name whose DNS records you want to see")
|
||||
|
||||
def list_dns_records_summary(self, api_key, domain):
|
||||
"""Get a summary of the currently active DNS records for the given `domain`"""
|
||||
xml_tree = make_request(api_key, "dnsListRecords", { "domain": domain })
|
||||
|
||||
code = xml_tree.find('./reply/code').text
|
||||
if code != "300":
|
||||
detail = xml_tree.find('./reply/detail').text
|
||||
print("Error code {}: {}".format(code, detail))
|
||||
else:
|
||||
print('record\thostname')
|
||||
print('----------------')
|
||||
for record in xml_tree.iter('resource_record'):
|
||||
record_type = record.find('type').text
|
||||
host = record.find('host').text
|
||||
print("{}\t{}".format(record_type, host))
|
||||
|
||||
class Help(Command):
|
||||
def run(self, ctx, args):
|
||||
if len(args) > 0:
|
||||
command_name = args[0]
|
||||
if command_name in ctx['commands']:
|
||||
ctx['commands'][command_name].print_help()
|
||||
else:
|
||||
print("Unknown command.")
|
||||
else:
|
||||
print("Available commands (run {} help <command-name> for more info):".format(ctx['executable_name']))
|
||||
for name, cmd in ctx['commands'].items():
|
||||
print(name)
|
||||
|
||||
def description(self):
|
||||
return "Get help about commands (help <command-name>)"
|
||||
|
||||
def print_help(self, ctx):
|
||||
print(self.description())
|
||||
print("Usage: {} help <command-name>".format(ctx['executable_name']))
|
||||
|
||||
# Main Program
|
||||
|
||||
if __name__ == "__main__":
|
||||
context = {
|
||||
'api_key': read_api_key(),
|
||||
'executable_name': sys.argv[0],
|
||||
'commands': {
|
||||
'list-dns-records': ListDnsRecords(),
|
||||
'help': Help()
|
||||
}
|
||||
}
|
||||
|
||||
# Main program
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
command_name = sys.argv[1]
|
||||
if command_name in context['commands']:
|
||||
# Take only the remainder of the arguments,
|
||||
# they are arguments for the specified command
|
||||
command_args = sys.argv[2:]
|
||||
context['commands'][command_name].run(context, command_args)
|
||||
|
||||
else:
|
||||
print("Unknown command {}".format(command_name))
|
||||
Help().run(context, [])
|
||||
else:
|
||||
print("No command specified")
|
||||
Help().run(context, [])
|
||||
Loading…
Reference in New Issue