spaces after comma
[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
35         if not os.path.exists("/vservers/%s" % slicename):
36             # Avoid creating slice directory if slice does not exist, as it
37             # breaks slice creation when sliver_lxc eventually gets around
38             # to creating the sliver.
39             logger.log("vserver %s does not exist yet. Skipping interfaces." % slicename)
40             continue
41
42         for tag in sliver['attributes']:
43             if tag['tagname'] == 'interface':
44                 interfaces = eval(tag['value'])
45
46                 if not isinstance(interfaces, (list, tuple)):
47                     # if interface is not a list, then make it into a singleton list
48                     interfaces = [interfaces]
49
50                 for mydict in interfaces:
51                     contents=""
52                     # First look for filename/url combination for custom config files
53                     if 'filename' in mydict and 'url' in mydict:
54                         dest = "/vservers/%s/%s" % (slicename, mydict['filename'])
55                         url = mydict['url']
56                         try:
57                             contents = curlwrapper.retrieve(url)
58                         except xmlrpclib.ProtocolError as e:
59                             logger.log('interfaces (%s): failed to retrieve %s' % (slicename, url))
60                             continue
61                     else:
62                         # Otherwise generate /etc/sysconfig/network-scripts/ifcfg-<device>
63                         try:
64                             dest = "/vservers/%s/etc/sysconfig/network-scripts/ifcfg-%s" % (slicename, mydict['DEVICE'])
65                         except:
66                             logger.log('interfaces (%s): no DEVICE specified' % slicename)
67                             continue
68
69                         for key, value in mydict.items():
70                             if key in ['bridge', 'vlan']:
71                                 continue
72                             contents += '%s="%s"\n' % (key, value)
73
74                     if sha(contents).digest() == checksum(dest):
75                         logger.log('interfaces (%s): no changes to %s' % (slicename, dest))
76                         continue
77
78                     logger.log('interfaces (%s): installing file %s' % (slicename, dest))
79                     try:
80                         os.makedirs(os.path.dirname(dest))
81                     except OSError:
82                         pass
83
84                     try:
85                         f = open (dest, "w")
86                         f.write(contents)
87                         f.close()
88                     except:
89                         logger.log('interfaces (%s): error writing file %s' % (slicename, dest))
90                         continue
91
92                     result = logger.log_call(['/usr/sbin/lxcsu', slicename, '/sbin/service', 'network', 'restart'])
93                     if not result:
94                         logger.log('interfaces (%s): error restarting network service' % slicename)
95 #                    try:
96 #                        subprocess.check_call(['/usr/sbin/lxcsu', slicename, '/sbin/service',
97 #                                               'network', 'restart'])
98 #                    except:
99 #                        logger.log('interfaces (%s): error restarting network service' % slicename)
100