| #!/usr/bin/python |
| # ----------------------------------------------------------------------- |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # ----------------------------------------------------------------------- |
| import os |
| import sys |
| import getopt |
| import json |
| |
| from ducc_util import DuccUtil |
| |
| class DuccStateListener(DuccUtil): |
| |
| def run(self): |
| CMD = self.java() + ' org.apache.uima.ducc.tools.DuccPubListener' |
| CMD = CMD + ' -host ' + self.host |
| CMD = CMD + ' -port ' + self.port |
| CMD = CMD + ' -topic ' + self.topic |
| CMD = CMD + ' -output ' + self.output |
| if ( self.agent != None ): |
| CMD = CMD + ' -agent ' + self.agent |
| |
| os.system(CMD) |
| |
| if ( self.agent != None ): |
| self.output = self.output + '.' + self.agent |
| |
| fi = open(self.output + '.json') |
| fo = open(self.output + '.json.pretty', 'w') |
| obj = json.load(fi) |
| print "Pretty-printing to", self.output |
| json.dump(obj, fo, indent=3) |
| fi.close() |
| fo.close() |
| os.remove(self.output + '.json') |
| os.rename(self.output + '.json.pretty', self.output); |
| |
| def usage(self, msg): |
| if ( msg != None ): |
| print msg |
| print "Usage:" |
| print " ducc_statedump [options]" |
| print " If no options are given this help screen is shown." |
| print "" |
| print "Options:" |
| print " -n This is DUCC's ActiveMQ node, defaults to 'localhost'." |
| print "" |
| print " -p This is DUCC's ActiveMQ port, defaults to 61616." |
| print "" |
| print " -s This is the state to dump. One of rm sm or pm metrics inventory." |
| print "" |
| print " -o This is the name of a tempfile where the state is written, defaults to duccstate.out." |
| print "" |
| print " --nocp Inhibit the classpath in the OR state dumps." |
| print "" |
| print "Remember that you will likely have to wait a few seconds for publications to arrive after starting." |
| print "" |
| print "To get a pretty-printed version of the xstream outpout." |
| print " xmllint --format duccstate.out --output duccstate.out.pretty" |
| |
| sys.exit(0) |
| |
| def main(self, argv): |
| |
| if ( len(argv) == 0 ): |
| self.usage(None) |
| |
| self.host = 'localhost' |
| self.port = '61616' |
| self.output = None |
| self.state = 'or' |
| self.agent = None |
| |
| try: |
| opts, args = getopt.getopt(argv, 'n:o:p:s:t:?h') |
| except: |
| self.usage('Invalid arguments ' + ' '.join(argv)) |
| |
| for ( o, a ) in opts: |
| if o in ( '-n' ): |
| self.host = a |
| elif o in ( '-o' ): |
| self.output = a |
| elif o in ( '-p' ): |
| port = int(a) # quick check to see if it converts |
| self.port = a |
| elif o in ( '-s' ): |
| self.state = a |
| elif o in ( '-t' ): |
| timeout = int(a) |
| self.timeout = a |
| elif o in ( '-?', '-h' ): |
| self.usage() |
| |
| CLASSPATH = os.environ['CLASSPATH'] |
| CLASSPATH = CLASSPATH + ':' + self.DUCC_HOME + '/lib/uima-ducc/examples/*' |
| os.environ['CLASSPATH'] = CLASSPATH |
| |
| if ( self.state == 'or' ): |
| self.topic = 'ducc.orchestrator.state' |
| elif (self.state == 'rm' ): |
| self.topic = 'ducc.rm.state' |
| elif (self.state == 'sm' ): |
| self.topic = 'ducc.sm.state' |
| elif (self.state == 'pm' ): |
| self.topic = 'ducc.pm.state' |
| elif (self.state.startswith('inventory') ): |
| toks = self.state.split('@') |
| if ( len(toks) != 2 ): |
| print "Invalid state, must be 'inventory@node'" |
| sys.exit(1) |
| self.topic = 'ducc.node.inventory' |
| self.agent = toks[1] |
| elif (self.state.startswith('metrics') ): |
| toks = self.state.split('@') |
| print 'toks', toks |
| if ( len(toks) != 2 ): |
| print "Invalid state, must be 'metrics@node'" |
| sys.exit(1) |
| self.topic = 'ducc.node.metrics' |
| self.agent = toks[1] |
| |
| if ( self.output == None ): |
| of = self.topic |
| if ( self.agent != None ): |
| of = of + ".agent" |
| self.output = of |
| |
| print '-----------------------' |
| print 'host', self.host |
| print 'port', self.port |
| print 'output file', self.output |
| print 'topic', self.topic |
| if ( self.agent != 'none' ): |
| print 'agent', self.agent |
| print '-----------------------' |
| |
| self.run() |
| |
| if __name__ == "__main__": |
| dsl = DuccStateListener() |
| CLASSPATH = os.environ['CLASSPATH'] + ':' + dsl.DUCC_HOME + '/examples/lib/uima-ducc-examples.jar' |
| os.environ['CLASSPATH'] = CLASSPATH |
| dsl.main(sys.argv[1:]) |