51c7cf216f09bcf1b58f5d44f9e4e4a8be670ecf
[nodemanager.git] / plugins / interfaces.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 xmlrpclib
9 try:
10     from hashlib import sha1 as sha
11 except ImportError:
12     from sha import sha
13 import subprocess
14
15 def checksum(path):
16     try:
17         f = open(path)
18         try: return sha(f.read()).digest()
19         finally: f.close()
20     except IOError: 
21         return None
22
23 def start():
24     logger.log("interfaces: plugin starting up...")
25
26 def GetSlivers(data, config=None, plc=None):
27
28     if 'slivers' not in data:
29         logger.log_missing_data("interfaces.GetSlivers",'slivers')
30         return
31
32     for sliver in data['slivers']:
33         slicename = sliver['name']
34         for tag in sliver['attributes']:
35             if tag['tagname'] == 'interface':
36                 mydict = eval(tag['value'])
37                 contents=""
38                 # First look for filename/url combination for custom config files
39                 if 'filename' in mydict and 'url' in mydict:
40                     dest = "/vservers/%s/%s" % (slicename, mydict['filename'])
41                     url = mydict['url']
42                     try:
43                         contents = curlwrapper.retrieve(url)
44                     except xmlrpclib.ProtocolError,e:
45                         logger.log('interfaces (%s): failed to retrieve %s' % (slicename, url))
46                         continue
47                 else:
48                     # Otherwise generate /etc/sysconfig/network-scripts/ifcfg-<device>
49                     try:
50                         dest = "/vservers/%s/etc/sysconfig/network-scripts/ifcfg-%s" % (slicename, mydict['DEVICE'])
51                     except:
52                         logger.log('interfaces (%s): no DEVICE specified' % slicename)
53                         continue
54
55                     for key, value in mydict.items():
56                         if key in ['bridge']: 
57                             continue
58                         contents += '%s="%s"\n' % (key, value)
59
60                 if sha(contents).digest() == checksum(dest):
61                     logger.log('interfaces (%s): no changes to %s' % (slicename, dest))
62                     continue
63
64                 logger.log('interfaces (%s): installing file %s' % (slicename, dest))
65                 try: 
66                     os.makedirs(os.path.dirname(dest))
67                 except OSError: 
68                     pass
69
70                 try:
71                     f = open (dest, "w")
72                     f.write(contents)
73                     f.close()
74                 except:
75                     logger.log('interfaces (%s): error writing file %s' % (slicename, dest))
76                     continue
77
78                 try:
79                     subprocess.check_call(['/usr/sbin/lxcsu', slicename, '/sbin/service', 
80                                            'network', 'restart'])
81                 except:
82                     logger.log('interfaces (%s): error restarting network service' % slicename)
83