support passing a list of dicts as the slice interface tag to configure multiple...
[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                 interfaces = eval(tag['value'])
37
38                 if not isinstance(interfaces, (list,tuple)):
39                     # if interface is not a list, then make it into a singleton list
40                     interfaces = [interfaces]
41
42                 for mydict in interfaces:
43                     contents=""
44                     # First look for filename/url combination for custom config files
45                     if 'filename' in mydict and 'url' in mydict:
46                         dest = "/vservers/%s/%s" % (slicename, mydict['filename'])
47                         url = mydict['url']
48                         try:
49                             contents = curlwrapper.retrieve(url)
50                         except xmlrpclib.ProtocolError,e:
51                             logger.log('interfaces (%s): failed to retrieve %s' % (slicename, url))
52                             continue
53                     else:
54                         # Otherwise generate /etc/sysconfig/network-scripts/ifcfg-<device>
55                         try:
56                             dest = "/vservers/%s/etc/sysconfig/network-scripts/ifcfg-%s" % (slicename, mydict['DEVICE'])
57                         except:
58                             logger.log('interfaces (%s): no DEVICE specified' % slicename)
59                             continue
60
61                         for key, value in mydict.items():
62                             if key in ['bridge', 'vlan']:
63                                 continue
64                             contents += '%s="%s"\n' % (key, value)
65
66                     if sha(contents).digest() == checksum(dest):
67                         logger.log('interfaces (%s): no changes to %s' % (slicename, dest))
68                         continue
69
70                     logger.log('interfaces (%s): installing file %s' % (slicename, dest))
71                     try:
72                         os.makedirs(os.path.dirname(dest))
73                     except OSError:
74                         pass
75
76                     try:
77                         f = open (dest, "w")
78                         f.write(contents)
79                         f.close()
80                     except:
81                         logger.log('interfaces (%s): error writing file %s' % (slicename, dest))
82                         continue
83
84                     try:
85                         subprocess.check_call(['/usr/sbin/lxcsu', slicename, '/sbin/service',
86                                                'network', 'restart'])
87                     except:
88                         logger.log('interfaces (%s): error restarting network service' % slicename)
89