blob: fe0f2b4caad22e94422c3e4841eb8a8af146f947 [file] [log] [blame]
#!/usr/bin/python
"""Pre-fetches top requested hosts.
Sorts dictionary represented in hit_log.json by number of hits
and sends DNS requests to a predetermined number of the top hosts.
"""
import argparse
import json
import dns.resolver
TOP_N = 50
HITS_LOG_JSON_PATH = '/tmp/hits_log.json'
def sort_hits_log(path):
"""Sorts hosts in hits log by number of hits.
Args:
path: Path of JSON representation of dictionary mapping host
to tuple of most recent hit time and hit count.
Returns:
A list of hosts sorted by number of hits in descending order.
"""
try:
log_json = open(path, 'r')
except IOError:
print 'unable to open ' + path
raise
else:
log = json.load(log_json)
return sorted(log, key=log.get, reverse=True)
def prefetch(hosts, port, server):
"""Pre-fetches list of hosts.
Args:
hosts: List of hosts to be fetched sorted by number of hits
in descending order.
port: Port to which to send queries (default is 53).
server: Alternate nameservers to query (default is None).
"""
my_resolver = dns.resolver.Resolver()
my_resolver.port = port
if server is not None:
my_resolver.nameservers = server
if len(hosts) > TOP_N:
hosts = hosts[:TOP_N]
for host in hosts:
my_resolver.query(host)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--port', nargs='?', default=53, type=int,
help='port to which to send queries (default is 53).')
parser.add_argument('-s', '--server', nargs='*', type=str,
help='alternate nameservers to query (default is None).')
args = parser.parse_args()
sorted_log = sort_hits_log(HITS_LOG_JSON_PATH)
prefetch(sorted_log, args.port, args.server)