100 if __name__ ==
'__main__':
101 import optparse, atexit, time
108 import os, sys, signal
111 "ip address show primary scope global | grep '^ *inet' | sed -e 's%^ *inet *%%' -e 's%/.*%%'"
112 ipfd = os.popen(PrimaryIPcmd,
'r')
113 OurAddrStr=('%s:%d' % (ipfd.readline().rstrip(), DefaultPort))
118 parser = optparse.OptionParser(prog=
'CMA', version=
'0.0.1',
119 description=
'Collective Management Authority for the Assimilation System',
120 usage=
'cma.py [--bind address:port]')
122 parser.add_option(
'-b',
'--bind', action=
'store', default=
None, dest=
'bind'
123 , metavar=
'address:port-to-bind-to'
124 , help=
'Address:port to listen to - for nanoprobes to connect to')
126 parser.add_option(
'-d',
'--debug', action=
'count', default=0, dest=
'debug'
127 , help=
'enable debug for CMA and libraries - multiple occurances increase debug value')
129 parser.add_option(
'-s',
'--status', action=
'store_true', default=
False, dest=
'status'
130 , help=
'Return status of running CMA')
132 parser.add_option(
'-k',
'--kill', action=
'store_true', default=
False, dest=
'kill'
133 , help=
'Shut down running CMA.')
135 parser.add_option(
'-e',
'--erasedb', action=
'store_true', default=
False, dest=
'erasedb'
136 , help=
'Erase Neo4J before starting')
138 parser.add_option(
'-f',
'--foreground', action=
'store_true', default=
False, dest=
'foreground'
139 , help=
'keep the CMA from going into the background')
141 parser.add_option(
'-p',
'--pidfile', action=
'store', default=
'/var/run/cma', dest=
'pidfile'
142 , metavar=
'pidfile-pathname'
143 , help=
'full pathname of where to locate our pid file')
145 parser.add_option(
'-T',
'--trace', action=
'store_true', default=
False, dest=
'doTrace'
146 , help=
'Trace CMA execution')
149 opt, args = parser.parse_args()
151 from AssimCtypes
import daemonize_me, assimilation_openlog, are_we_already_running, \
152 kill_pid_service, pidrunningstat_to_status, remove_pid_file, rmpid_and_exit_on_signal
161 print >> sys.stderr,
"Unable to stop CMA."
180 from packetlistener
import PacketListener
181 from messagedispatcher
import MessageDispatcher
182 from dispatchtarget
import DispatchSTARTUP, DispatchHBDEAD, DispatchJSDISCOVERY, \
183 DispatchSWDISCOVER, DispatchHBSHUTDOWN
185 from AssimCclasses
import pyNetAddr, pySignFrame, pyConfigContext, pyReliableUDP, \
187 from AssimCtypes
import CONFIGNAME_CMAINIT, CONFIGNAME_CMAADDR, CONFIGNAME_CMADISCOVER, \
188 CONFIGNAME_CMAFAIL, CONFIGNAME_CMAPORT, CONFIGNAME_HBPORT, CONFIGNAME_OUTSIG, \
189 CONFIGNAME_DEADTIME, CONFIGNAME_WARNTIME, CONFIGNAME_HBTIME, CONFIGNAME_OUTSIG,\
190 proj_class_incr_debug, VERSION_STRING, LONG_LICENSE_STRING
191 from frameinfo
import FrameTypes, FrameSetTypes
193 for debug
in range(opt.debug):
197 BindAddrStr = (
'0.0.0.0:%d' % DefaultPort)
199 BindAddrStr = opt.bind
200 OurAddrStr = opt.bind
202 OurAddr = pyNetAddr(OurAddrStr)
203 BindAddr = pyNetAddr(BindAddrStr)
204 if OurAddr.port() == 0:
205 OurAddr.setport(DefaultPort)
206 OurPort = OurAddr.port()
210 CONFIGNAME_CMAINIT: BindAddr,
211 CONFIGNAME_CMAADDR: OurAddr,
212 CONFIGNAME_CMADISCOVER: OurAddr,
213 CONFIGNAME_CMAFAIL: OurAddr,
214 CONFIGNAME_CMAPORT: OurPort,
215 CONFIGNAME_HBPORT: OurPort,
216 CONFIGNAME_OUTSIG: pySignFrame(1),
217 CONFIGNAME_DEADTIME: 10*1000000,
218 CONFIGNAME_WARNTIME: 3*1000000,
219 CONFIGNAME_HBTIME: 1*1000000,
220 CONFIGNAME_OUTSIG: pySignFrame(1),
222 config = pyConfigContext(init=configinit)
223 io = pyReliableUDP(config, pyPacketDecoder(0))
227 cmadb.CMAdb.initglobal(io, cleanoutdb=opt.erasedb, debug=(opt.debug > 0))
228 except py2neo.rest.SocketError:
232 print >>sys.stderr, (
'Neo4j still not started - giving up.')
233 cmadb.CMAdb.log.critical(
'Neo4j still not started - giving up.')
235 if (trycount % 60) == 1:
236 print >>sys.stderr, (
'Waiting for Neo4j to start.')
237 cmadb.CMAdb.log.warning(
'Waiting for Neo4j to start.')
244 cmadb.CMAdb.log.info(
'Listening on: %s' % str(config[CONFIGNAME_CMAINIT]))
245 cmadb.CMAdb.log.info(
'Requesting return packets sent to: %s' % str(OurAddr))
246 if cmadb.CMAdb.debug:
247 cmadb.CMAdb.log.info(
'TheOneRing created - id = %d' % cmadb.CMAdb.TheOneRing.node.id)
248 cmadb.CMAdb.log.info(
'Config Object sent to nanoprobes: %s' % config)
250 print FrameTypes.get(1)[2]
251 disp = MessageDispatcher(
252 { FrameSetTypes.STARTUP: DispatchSTARTUP(),
253 FrameSetTypes.HBDEAD: DispatchHBDEAD(),
254 FrameSetTypes.JSDISCOVERY: DispatchJSDISCOVERY(),
255 FrameSetTypes.SWDISCOVER: DispatchSWDISCOVER(),
256 FrameSetTypes.HBSHUTDOWN: DispatchHBSHUTDOWN()
258 cmadb.CMAdb.log.info(
'Starting CMA version %s - licensed under %s'
259 % (VERSION_STRING, LONG_LICENSE_STRING))
261 print >>sys.stderr, (
'Starting CMA version %s - licensed under %s'
262 % (VERSION_STRING, LONG_LICENSE_STRING))
265 listener = PacketListener(config, disp, io=io)
268 tracer = trace.Trace(count=
False, trace=
True)
269 if cmadb.CMAdb.debug: cmadb.CMAdb.log.debug(
270 'Starting up traced listener.listen(); debug=%d' % opt.debug)
271 if opt.foreground:
print >>sys.stderr, (
272 'cma: Starting up traced listener.listen() in foreground; debug=%d' % opt.debug)
273 tracer.run(
'listener.listen()')
275 if cmadb.CMAdb.debug: cmadb.CMAdb.log.debug(
276 'Starting up untraced listener.listen(); debug=%d' % opt.debug)
277 if opt.foreground:
print >>sys.stderr, (
278 'cma: Starting up untraced listener.listen() in foreground; debug=%d' % opt.debug)