needed when building *only* myplc-native
[myplc.git] / dns-config
1 #!/usr/bin/env /usr/bin/plcsh
2 #
3 # Writes IP addresses and hostnames of PlanetLab nodes to
4 # /etc/plc_hosts. Useful for dnsmasq, specify "addn-hosts
5 # /etc/plc_hosts" in /etc/dnsmasq.conf.
6 #
7 # Mark Huang <mlhuang@cs.princeton.edu>
8 # Copyright (C) 2006 The Trustees of Princeton University
9 #
10 # $Id$
11 #
12
13 from plc_config import PLCConfiguration
14 import os, sys
15
16 def writepid(prog):
17     """
18     Check PID file. Exit if already running. Update PID file.
19     """
20
21     try:
22         pidfile = file("/var/run/%s.pid" % prog, "r")
23         pid = pidfile.readline().strip()
24         pidfile.close()
25         if os.path.isdir("/proc/" + pid):
26             print "Error: Another copy of %s is still running (%s)" % (prog, pid)
27             sys.exit(1)
28     except IOError:
29         pass
30
31     pidfile = file("/var/run/%s.pid" % prog, "w")
32     pidfile.write(str(os.getpid()))
33     pidfile.close()
34
35 def removepid(prog):
36     os.unlink("/var/run/%s.pid" % prog)
37
38 def main():
39     writepid("dns-config")
40
41     cfg = PLCConfiguration()
42     cfg.load()
43     variables = cfg.variables()
44
45     (category, variablelist) = variables['plc_dns']
46     plc_dns = dict(zip(variablelist.keys(),
47                        [variable['value'] for variable in variablelist.values()]))
48
49     if plc_dns['enabled'] != "true":
50         return 0
51
52     # Get the primary IP address for each node
53     hosts = {}
54
55     nodes = {}
56     for node in GetNodes():
57         nodes[node['node_id']] = node
58
59     nodenetwork_ids = set()
60     for node in nodes.values():
61         nodenetwork_ids.update(node['nodenetwork_ids'])
62
63     for nodenetwork in GetNodeNetworks(list(nodenetwork_ids)):
64         if not nodenetwork['ip']:
65             continue
66
67         if nodenetwork['hostname']:
68             hostname = nodenetwork['hostname']
69         else:
70             hostname = nodes[nodenetwork['node_id']]['hostname']
71
72         if hosts.has_key(nodenetwork['ip']):
73             if hostname not in hosts[nodenetwork['ip']]:
74                 hosts[nodenetwork['ip']].append(hostname)
75         else:
76             hosts[nodenetwork['ip']] = [hostname]
77     
78     # Write /etc/plc_hosts
79     plc_hosts = open("/etc/plc_hosts", "w")
80     plc_hosts.write("# DO NOT EDIT; File is writen and removed by automatic scripts\n")
81     for ip, hostnames in hosts.iteritems():
82         plc_hosts.write(ip + "\t" + " ".join(hostnames) + "\n")
83     plc_hosts.close()
84
85     # From the default dnsmasq.conf configuration file:
86     #
87     # The [domain-needed and bogus-priv] options make you a better
88     # netizen, since they tell dnsmasq to filter out queries which
89     # the public DNS cannot answer, and which load the servers
90     # (especially the root servers) uneccessarily.
91     #
92     file("/etc/dnsmasq.conf", "w").write("""
93 domain-needed
94 bogus-priv
95 addn-hosts=/etc/plc_hosts
96 resolv-file=/etc/resolv.conf
97 """.lstrip())
98
99     # Reload dnsmasq
100     os.system("killall -q -HUP dnsmasq")
101
102     removepid("dns-config")
103
104 if __name__ == '__main__':
105     main()