4 """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."""
11 CODEMUXCONF="/etc/codemux/codemux.conf"
13 def start(options, config):
18 """For each sliver with the codemux attribute, parse out "host,port" and make entry in conf. Restart service after."""
19 logger.log("codemux: Starting.", 2)
20 # slices already in conf
21 slicesinconf = parseConf()
22 # slices that need to be written to the conf
25 # Parse attributes and update dict of scripts
26 for sliver in data['slivers']:
27 for attribute in sliver['attributes']:
28 if attribute['name'] == 'codemux':
29 # add to conf. Attribute is [host, port]
30 [host, port] = attribute['value'].split()
32 # Check to see if sliver is running. If not, continue
33 if vserver.VServer(sliver['name']).is_running():
35 if sliver['name'] not in slicesinconf.keys():
36 logger.log("codemux: New slice %s using %s" % \
37 (sliver['name'], host))
38 codemuxslices[sliver['name']] = {'host': host, 'port': port}
40 # Check old slivers for changes
42 sliverinconf = slicesinconf[sliver['name']]
43 if (sliverinconf['host'] != host) or \
44 (sliverinconf['port'] != port):
45 logger.log("codemux: Updating slice %s" % sliver['name'])
47 codemuxslices[sliver['name']] = {'host': host, 'port': port}
49 logger.log("codemux: sliver %s not running yet. Deferring."\
52 logger.log_exc(name = "codemux")
55 # Remove slices from conf that no longer have the attribute
56 for deadslice in Set(slicesinconf.keys()) - Set(codemuxslices.keys()):
57 logger.log("codemux: Removing %s" % deadslice)
60 if _writeconf: writeConf(codemuxslices)
62 def writeConf(slivers, conf = CODEMUXCONF):
63 '''Write conf with default entry up top. Restart service.'''
65 f.write("* root 1080")
66 for (host, slice, port) in slivers.iteritems():
67 f.write("%s %s %s" % [host, slice, port])
70 logger.log("codemux: restarting codemux service")
71 os.system("/etc/init.d/codemux restart")
74 def parseConf(conf = CODEMUXCONF):
75 '''Parse the CODEMUXCONF and return dict of slices in conf. {slice: (host,port)}'''
79 for line in f.readlines():
80 if line.startswith("#") or (len(line.split()) != 3)\
81 or line.startswith("*"):
83 (host, slice, port) = line.split()[:3]
84 logger.log("codemux: found %s in conf" % slice, 2)
85 slicesinconf[slice] = {"host": host, "port": port}
87 except: logger.log_exc()