From 70203faa181d96414acbbf6f0779c5d1344aea7c Mon Sep 17 00:00:00 2001 From: Andy Bavier Date: Tue, 18 Sep 2012 15:29:54 -0400 Subject: [PATCH] Plugin for configuring network interfaces inside a container. --- plugins/interfaces.py | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 plugins/interfaces.py diff --git a/plugins/interfaces.py b/plugins/interfaces.py new file mode 100644 index 0000000..51c7cf2 --- /dev/null +++ b/plugins/interfaces.py @@ -0,0 +1,83 @@ +""" +Configure interfaces inside a container by pulling down files via URL. +""" + +import logger +import os +import curlwrapper +import xmlrpclib +try: + from hashlib import sha1 as sha +except ImportError: + from sha import sha +import subprocess + +def checksum(path): + try: + f = open(path) + try: return sha(f.read()).digest() + finally: f.close() + except IOError: + return None + +def start(): + logger.log("interfaces: plugin starting up...") + +def GetSlivers(data, config=None, plc=None): + + if 'slivers' not in data: + logger.log_missing_data("interfaces.GetSlivers",'slivers') + return + + for sliver in data['slivers']: + slicename = sliver['name'] + for tag in sliver['attributes']: + if tag['tagname'] == 'interface': + mydict = eval(tag['value']) + contents="" + # First look for filename/url combination for custom config files + if 'filename' in mydict and 'url' in mydict: + dest = "/vservers/%s/%s" % (slicename, mydict['filename']) + url = mydict['url'] + try: + contents = curlwrapper.retrieve(url) + except xmlrpclib.ProtocolError,e: + logger.log('interfaces (%s): failed to retrieve %s' % (slicename, url)) + continue + else: + # Otherwise generate /etc/sysconfig/network-scripts/ifcfg- + try: + dest = "/vservers/%s/etc/sysconfig/network-scripts/ifcfg-%s" % (slicename, mydict['DEVICE']) + except: + logger.log('interfaces (%s): no DEVICE specified' % slicename) + continue + + for key, value in mydict.items(): + if key in ['bridge']: + continue + contents += '%s="%s"\n' % (key, value) + + if sha(contents).digest() == checksum(dest): + logger.log('interfaces (%s): no changes to %s' % (slicename, dest)) + continue + + logger.log('interfaces (%s): installing file %s' % (slicename, dest)) + try: + os.makedirs(os.path.dirname(dest)) + except OSError: + pass + + try: + f = open (dest, "w") + f.write(contents) + f.close() + except: + logger.log('interfaces (%s): error writing file %s' % (slicename, dest)) + continue + + try: + subprocess.check_call(['/usr/sbin/lxcsu', slicename, '/sbin/service', + 'network', 'restart']) + except: + logger.log('interfaces (%s): error restarting network service' % slicename) + -- 2.43.0