-# $Id$
-# $URL$
-
"""Codemux configurator. Monitors slice attributes and configures CoDemux to mux port 80 based on HOST field in HTTP request. Forwards to localhost port belonging to configured slice."""
import logger
import os
-import vserver
-from sets import Set
+
from config import Config
+import slivermanager
CODEMUXCONF="/etc/codemux/codemux.conf"
-def start(options, conf):
- logger.log("codemux plugin starting up...")
+def start():
+ logger.log("codemux: plugin starting up...")
def GetSlivers(data, config, plc = None):
"""
- For each sliver with the codemux attribute, parse out "host,port"
+ For each sliver with the codemux attribute, parse out "host,port"
and make entry in conf. Restart service after.
"""
if 'OVERRIDES' in dir(config):
slicesinconf = parseConf()
# slices that need to be written to the conf
codemuxslices = {}
-
+
# XXX Hack for planetflow
if slicesinconf.has_key("root"): _writeconf = False
else: _writeconf = True
if len(parts)<2:
logger.log("codemux: attribute value (%s) for codemux not separated by comma. Skipping."%attribute['value'])
continue
- params = {'host': parts[0], 'port': parts[1]}
+ 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():
+ if slivermanager.is_running(sliver['name']):
# Check if new or needs updating
if (sliver['name'] not in slicesinconf.keys()) \
or (params not in slicesinconf.get(sliver['name'], [])):
- logger.log("codemux: Updaiting slice %s using %s" % \
+ logger.log("codemux: Updating slice %s using %s" % \
(sliver['name'], params['host']))
# Toggle write.
_writeconf = True
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":
+ if deadslice != "root":
logger.log("codemux: Removing %s" % deadslice)
- _writeconf = True
+ _writeconf = True
- if _writeconf: writeConf(sortDomains(codemuxslices))
+ if _writeconf: writeConf(sortDomains(codemuxslices))
# ensure the service is running
startService()
'''Write conf with default entry up top. Elements in [] should have lower order domain names first. Restart service.'''
f = open(conf, "w")
# This needs to be the first entry...
- try:
+ try:
f.write("* root 1080 %s\n" % Config().PLC_PLANETFLOW_HOST)
- except AttributeError:
+ except AttributeError:
logger.log("codemux: Can't find PLC_CONFIG_HOST in config. Using PLC_API_HOST")
f.write("* root 1080 %s\n" % Config().PLC_API_HOST)
# Sort items for like domains
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()
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__)
# make list of slivers
sortedslices = []
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)}'''
slicesinconf = {} # default
- try:
+ try:
f = open(conf)
for line in f.readlines():
- if line.startswith("#") \
- or (len(line.split()) > 4) \
- or (len(line.split()) < 3):
+ parts = line.split()
+ if line.startswith("#") or (len(parts) > 4) or (len(parts) < 3):
continue
- (host, slice, port) = line.split()[:3]
- logger.log("codemux: found %s in conf" % slice, 2)
- slicesinconf.setdefault(slice, [])
- slicesinconf[slice].append({"host": host, "port": port})
+ if len(parts) == 4:
+ (host, slice, port, ip) = parts
+ logger.log("codemux: found %s in conf" % slice, 2)
+ slicesinconf.setdefault(slice, [])
+ slicesinconf[slice].append({"host": host, "port": port, "ip": ip})
+ else:
+ (host, slice, port) = parts[:3]
+ logger.log("codemux: found %s in conf" % slice, 2)
+ slicesinconf.setdefault(slice, [])
+ slicesinconf[slice].append({"host": host, "port": port})
f.close()
except IOError: logger.log_exc("codemux.parseConf got IOError")
return slicesinconf
else:
return False
-
def restartService():
+ if not os.path.exists("/etc/init.d/codemux"): return
logger.log("codemux: Restarting codemux service")
if isRunning():
- logger.log_call("/etc/init.d/codemux","condrestart")
+ logger.log_call(["/etc/init.d/codemux","condrestart", ])
else:
- logger.log_call("/etc/init.d/codemux","restart")
-
+ 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(["/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(["/etc/init.d/codemux", "stop", ])
+ logger.log_call(["/sbin/chkconfig", "codemux", "off"])
+