#!/usr/bin/python3 """ DRL configurator. """ import os import shutil import logger import tools drl = """ %s """ def start(): logger.log('drl plugin starting up...') def DRLSetup(site_name, slice_name, site_id, bw_limit, peer): DRL_file = '/vservers/%s/etc/drl.xml' % slice_name DRL_config = drl % (site_name, site_id, bw_limit, peer) # Check config changes if os.path.exists(DRL_file): import md5 new_digest = md5.new(DRL_config).digest() old_digest = md5.new(open(DRL_file).read()).digest() if old_digest == new_digest: logger.log('drl: %s already exists...' % DRL_file) DRLInstall(slice_name) return DRLConfig(DRL_file, DRL_config) DRLInstall(slice_name) def DRLConfig(DRL_file, DRL_config): logger.log('drl: %s is out-dated...' % DRL_file) logger.log('drl: generating %s' % DRL_file) f = open( DRL_file, 'w') f.write(DRL_config) f.close() def DRLInstall(slice_name): if not os.path.exists('/vservers/%s/etc/yum.repos.d/myplc.repo' % slice_name): shutil.copyfile('/etc/yum.myplc.d/myplc.repo', '/vservers/%s/etc/yum.repos.d/myplc.repo' % slice_name) logger.log('drl: installing DistributedRateLimiting into %s slice' % slice_name) logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'yum', 'install', '-y', '-q', 'DistributedRateLimiting']) logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'chkconfig', '--add', 'ulogd']) else: logger.log('drl: updating DistributedRateLimiting on %s slice' % slice_name) logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'yum', 'update', '-y', '-q', 'DistributedRateLimiting']) logger.log('drl: (re)starting DistributedRateLimiting service') logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'service', 'ulogd', 'restart']) def GetSlivers(data, conf = None, plc = None): DRL_SLICE_NAME = '' HAVE_DRL = 0 node_id = tools.node_id() if 'slivers' not in data: logger.log_missing_data("drl.GetSlivers", 'slivers') return for sliver in data['slivers']: for attribute in sliver['attributes']: tag = attribute['tagname'] value = attribute['value'] if tag == 'drl' and value == '1': HAVE_DRL = 1 DRL_SLICE_NAME = sliver['name'] if HAVE_DRL: site_id = plc.GetNodes({'node_id': int(node_id) }, ['site_id']) site_id = site_id[0]['site_id'] q = plc.GetSites({'site_id': site_id, 'enabled': True, 'peer_site_id': None}, ['name', 'node_ids']) for i in q: if i['node_ids'] != [] and len(i['node_ids']) > 1: z = plc.GetInterfaces({'node_id': i['node_ids'], 'is_primary': True, '~bwlimit': None}, ['node_id', 'ip', 'bwlimit']) total_bwlimit = 0 peer = '' node_has_bwlimit = 0 for j in range(len(z)): total_bwlimit += z[j]['bwlimit'] if z[j]['node_id'] != int(node_id): peer += '\t%s\n' % z[j]['ip'] else: node_has_bwlimit = 1 if node_has_bwlimit: DRLSetup(i['name'], DRL_SLICE_NAME, site_id, total_bwlimit/1000, peer) else: logger.log('drl: This node has no bwlimit') else: logger.log('drl: This site has only %s node' % len(i['node_ids'])) else: logger.log('drl: This node has no drl slice!...')