#!/usr/bin/python # # Writes IP addresses and hostnames of PlanetLab nodes to # /etc/plc_hosts. Useful for dnsmasq, specify "addn-hosts # /etc/plc_hosts" in /etc/dnsmasq.conf. # # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # # $Id: api-config,v 1.10 2006/05/24 03:08:55 mlhuang Exp $ # import plcapilib (plcapi, moreopts, argv) = plcapilib.plcapi(globals()) from plc_config import PLCConfiguration import os, sys def writepid(prog): """ Check PID file. Exit if already running. Update PID file. """ try: pidfile = file("/var/run/%s.pid" % prog, "r") pid = pidfile.readline().strip() pidfile.close() if os.path.isdir("/proc/" + pid): print "Error: Another copy of %s is still running (%s)" % (prog, pid) sys.exit(1) except IOError: pass pidfile = file("/var/run/%s.pid" % prog, "w") pidfile.write(str(os.getpid())) pidfile.close() def removepid(prog): os.unlink("/var/run/%s.pid" % prog) def main(): writepid("dns-config") cfg = PLCConfiguration() cfg.load() variables = cfg.variables() (category, variablelist) = variables['plc_dns'] plc_dns = dict(zip(variablelist.keys(), [variable['value'] for variable in variablelist.values()])) if plc_dns['enabled'] != "true": return 0 # Get the primary IP address for each node hosts = {} nodes = AdmGetNodes([], ['node_id', 'hostname']) plcapi.begin() for node in nodes: AdmGetAllNodeNetworks(node['node_id']) nodenetworks_list = plcapi.commit() if nodenetworks_list is not None: for i, nodenetworks in enumerate(nodenetworks_list): for nodenetwork in nodenetworks: if nodenetwork['hostname']: hostname = nodenetwork['hostname'] else: hostname = nodes[i]['hostname'] if hosts.has_key(nodenetwork['ip']): if hostname not in hosts[nodenetwork['ip']]: hosts[nodenetwork['ip']].append(hostname) else: hosts[nodenetwork['ip']] = [hostname] # Write /etc/plc_hosts plc_hosts = open("/etc/plc_hosts", "w") for ip, hostnames in hosts.iteritems(): plc_hosts.write(ip + "\t" + " ".join(hostnames) + "\n") plc_hosts.close() # From the default dnsmasq.conf configuration file: # # The [domain-needed and bogus-priv] options make you a better # netizen, since they tell dnsmasq to filter out queries which # the public DNS cannot answer, and which load the servers # (especially the root servers) uneccessarily. # file("/etc/dnsmasq.conf", "w").write(""" domain-needed bogus-priv addn-hosts=/etc/plc_hosts """.lstrip()) # Reload dnsmasq os.system("killall -q -HUP dnsmasq") removepid("dns-config") if __name__ == '__main__': main()