X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Fcodemux.py;h=ef8634ff9d0212bd1906dd56e498eaeedaa4220c;hb=3b803c07f52a5ed6394c965d9a31e73402c439ba;hp=ce69e4a13b1865f29558a7028567fe3dec32ef47;hpb=c1536d8a8913935cb9283592da225a13b94b7583;p=nodemanager.git diff --git a/plugins/codemux.py b/plugins/codemux.py index ce69e4a..ef8634f 100644 --- a/plugins/codemux.py +++ b/plugins/codemux.py @@ -6,20 +6,24 @@ import logger import os import vserver -from sets import Set from config import Config CODEMUXCONF="/etc/codemux/codemux.conf" -def start(options, config): - pass +def start(options, conf): + logger.log("codemux: plugin starting up...") - -def GetSlivers(data): +def GetSlivers(data, config, plc = None): """ For each sliver with the codemux attribute, parse out "host,port" and make entry in conf. Restart service after. """ + if 'OVERRIDES' in dir(config): + if config.OVERRIDES.get('codemux') == '-1': + logger.log("codemux: Disabled", 2) + stopService() + return + logger.log("codemux: Starting.", 2) # slices already in conf slicesinconf = parseConf() @@ -31,12 +35,23 @@ def GetSlivers(data): else: _writeconf = True # Parse attributes and update dict of scripts + if 'slivers' not in data: + logger.log_missing_data("codemux.GetSlivers", 'slivers') + return for sliver in data['slivers']: for attribute in sliver['attributes']: if attribute['tagname'] == 'codemux': # add to conf. Attribute is [host, port] - params = {'host': attribute['value'].split(",")[0], - 'port': attribute['value'].split(",")[1]} + parts = attribute['value'].split(",") + if len(parts)<2: + logger.log("codemux: attribute value (%s) for codemux not separated by comma. Skipping."%attribute['value']) + continue + if len(parts) == 3: + ip = parts[2] + else: + ip = "" + params = {'host': parts[0], 'port': parts[1], 'ip': ip} + try: # Check to see if sliver is running. If not, continue if vserver.VServer(sliver['name']).is_running(): @@ -57,13 +72,16 @@ def GetSlivers(data): pass # Remove slices from conf that no longer have the attribute - for deadslice in Set(slicesinconf.keys()) - Set(codemuxslices.keys()): + for deadslice in set(slicesinconf.keys()) - set(codemuxslices.keys()): # XXX Hack for root slice if deadslice != "root": logger.log("codemux: Removing %s" % deadslice) _writeconf = True - if _writeconf: writeConf(sortDomains(codemuxslices)) + if _writeconf: writeConf(sortDomains(codemuxslices)) + # ensure the service is running + startService() + def writeConf(slivers, conf = CODEMUXCONF): '''Write conf with default entry up top. Elements in [] should have lower order domain names first. Restart service.''' @@ -78,18 +96,19 @@ def writeConf(slivers, conf = CODEMUXCONF): for mapping in slivers: for (host, params) in mapping.iteritems(): if params['slice'] == "root": continue - f.write("%s %s %s\n" % (host, params['slice'], params['port'])) + f.write("%s %s %s %s\n" % (host, params['slice'], params['port'], params['ip'])) f.truncate() f.close() try: restartService() - except: logger.log_exc() + except: logger.log_exc("codemux.writeConf failed to restart service") + def sortDomains(slivers): '''Given a dict of {slice: {domainname, port}}, return array of slivers with lower order domains first''' dnames = {} # {host: slice} for (slice, params) in slivers.iteritems(): for mapping in params: - dnames[mapping['host']] = {"slice":slice, "port": mapping['port']} + dnames[mapping['host']] = {"slice":slice, "port": mapping['port'], "ip": mapping['ip']} hosts = dnames.keys() # sort by length hosts.sort(key=str.__len__) @@ -100,6 +119,7 @@ def sortDomains(slivers): for host in hosts: sortedslices.append({host: dnames[host]}) return sortedslices + def parseConf(conf = CODEMUXCONF): '''Parse the CODEMUXCONF and return dict of slices in conf. {slice: (host,port)}''' @@ -116,18 +136,35 @@ def parseConf(conf = CODEMUXCONF): slicesinconf.setdefault(slice, []) slicesinconf[slice].append({"host": host, "port": port}) f.close() - except IOError: logger.log_exc() + except IOError: logger.log_exc("codemux.parseConf got IOError") return slicesinconf + +def isRunning(): + if len(os.popen("pidof codemux").readline().rstrip("\n")) > 0: + return True + else: + return False + def restartService(): + if not os.path.exists("/etc/init.d/codemux"): return logger.log("codemux: Restarting codemux service") - os.system("/etc/init.d/codemux stop") - f = os.popen("/sbin/pidof codemux") - tmp = f.readlines() - f.close() - if len(tmp) > 0: - pids = tmp[0].rstrip("\n").split() - for pid in pids: - logger.log("codemux: Killing stalled pid %s" % pid, 2) - os.kill(pid, 9) - os.system("/etc/init.d/codemux start") + if isRunning(): + logger.log_call(["/etc/init.d/codemux","condrestart", ]) + else: + logger.log_call(["/etc/init.d/codemux","restart", ]) + +def startService(): + if not os.path.exists("/etc/init.d/codemux"): return + if not isRunning(): + logger.log("codemux: Starting codemux service") + logger.log_call(["/etc/init.d/codemux", "start", ]) + logger.log_call(["/sbin/chkconfig", "codemux", "on"]) + + +def stopService(): + if not os.path.exists("/etc/init.d/codemux"): return + if isRunning(): + logger.log("codemux: Stopping codemux service") + logger.log_call(["/etc/init.d/codemux", "stop", ]) + logger.log_call(["/sbin/chkconfig", "codemux", "off"])