3d030e6c35c33df5f87c806559b40e6aeb9329e3
[nodemanager.git] / plugins / hostmap.py
1 """
2 Configure interfaces inside a container by pulling down files via URL.
3 """
4
5 import logger
6 import os
7 import curlwrapper
8 import re
9 import xmlrpclib
10 try:
11     from hashlib import sha1 as sha
12 except ImportError:
13     from sha import sha
14 import subprocess
15
16 def checksum(path):
17     try:
18         f = open(path)
19         try: return sha(f.read()).digest()
20         finally: f.close()
21     except IOError: 
22         return None
23
24 def start():
25     logger.log("interfaces: plugin starting up...")
26
27 PREFIX = "# ----- This section added by nodemanager hostmap module. Do not edit. -----"
28 SUFFIX = "# ----- End -----"
29
30 def GetSlivers(data, config=None, plc=None):
31
32     if 'slivers' not in data:
33         logger.log_missing_data("hostmap.GetSlivers",'slivers')
34         return
35
36     if 'hostname' not in data:
37         logger.log_missing_data("hostmap.GetSlivers", 'hostname')
38
39     hostname = data['hostname']
40
41     for sliver in data['slivers']:
42         slicename = sliver['name']
43         for tag in sliver['attributes']:
44             if tag['tagname'] == 'slice_hostmap':
45                 fn = "/vservers/%s/etc/hosts" % slicename
46                 if not os.path.exists(fn):
47                     continue
48
49                 contents = file(fn,"r").read()
50
51                 hostmap = []
52                 for index, entry in enumerate(tag["value"].split("\n")):
53                     parts = entry.split(" ")
54                     if len(parts)==2:
55                        if parts[1] == hostname:
56                            line = "127.0.0.1 %s.%s private%d" % (slicename, parts[1], index)
57                        else:
58                            line = "%s %s.%s private%d" % (parts[0], slicename, parts[1], index)
59
60                        if (index==0):
61                            line = line + " headnode"
62
63                        hostmap.append(line)
64
65                 hostmap = "\n".join(hostmap)
66                 hostmap = PREFIX + "\n" + hostmap + "\n" + SUFFIX + "\n"
67
68                 if (hostmap in contents):
69                     # it's already there
70                     continue
71
72                 # remove anything between PREFIX and SUFFIX from contents
73
74                 pattern = PREFIX + ".*" + SUFFIX
75                 regex = re.compile(pattern, re.DOTALL)
76                 if regex.search(contents) != None:
77                     contents = regex.sub(hostmap, contents)
78                 else:
79                     contents = contents + hostmap
80
81                 try:
82                     file(fn, "w").write(contents)
83                 except:
84                     logger.log_exc("hostmap (%s): failed to write %s" % (slicename, fn))
85
86
87