You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2016/11/30 22:19:15 UTC

svn commit: r1772124 - in /uima/uima-ducc/trunk/src/main/scripts/tools: ./ ducc_status

Author: degenaro
Date: Wed Nov 30 22:19:15 2016
New Revision: 1772124

URL: http://svn.apache.org/viewvc?rev=1772124&view=rev
Log:
UIMA-5053 DUCC ducc_watcher optional admin script to determine status and send notifications

- tools/ducc_status

Added:
    uima/uima-ducc/trunk/src/main/scripts/tools/
    uima/uima-ducc/trunk/src/main/scripts/tools/ducc_status   (with props)

Added: uima/uima-ducc/trunk/src/main/scripts/tools/ducc_status
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/src/main/scripts/tools/ducc_status?rev=1772124&view=auto
==============================================================================
--- uima/uima-ducc/trunk/src/main/scripts/tools/ducc_status (added)
+++ uima/uima-ducc/trunk/src/main/scripts/tools/ducc_status Wed Nov 30 22:19:15 2016
@@ -0,0 +1,333 @@
+#! /usr/bin/env 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.
+# -----------------------------------------------------------------------
+
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+# +
+# + ducc_status
+# +
+# + purpose: report current ducc daemons status
+# + 
+# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+import datetime
+import sys
+import time
+
+from HTMLParser import HTMLParser
+from optparse import OptionParser
+
+# -----------------------------------------------------------------------
+# Extend OptionParser class
+class ExtendedOptionParser(OptionParser):
+    # override epilog formatter so 
+    # that newlines are not deleted!
+    def format_epilog(self, formatter):
+        return self.epilog
+# -----------------------------------------------------------------------
+# parser for the system.daemons WS page
+class DuccHtmlParser(HTMLParser):
+    
+    tr_state = False
+    daemon_state = None
+    daemon_name = None  
+    daemon_date = None
+    daemon_ip = None
+    daemon_host = None
+    daemons = {}
+    
+    def get_daemons(self):
+        return self.daemons
+    
+    def handle_starttag(self, tag, attrs):
+        if(tag == 'tr' ):
+            self.tr_state = True
+        
+    def handle_endtag(self, tag):   
+        if(tag == 'tr'):
+            self.tr_state = False
+            self.daemon_state = None
+            self.daemon_name = None
+            self.daemon_date = None
+            self.daemon_ip = None
+            self.daemon_host = None
+        
+    def handle_data(self, data):
+        if(self.tr_state):
+            if(self.daemon_state == None):
+                self.daemon_state = data
+            elif(self.daemon_name == None):
+                self.daemon_name = data
+                if(self.daemon_name == 'Agent'):
+                    pass
+                else:
+                    self.daemons[self.daemon_name] = self.daemon_state
+            elif(self.daemon_date == None):
+                self.daemon_date = data
+            elif(self.daemon_ip == None):
+                self.daemon_ip = data
+            elif(self.daemon_host == None):
+                self.daemon_host = data
+                self.daemon_name = data
+                self.daemons[self.daemon_name] = self.daemon_state
+# -----------------------------------------------------------------------
+
+default_host = 'localhost'
+default_port = '42133'
+protocol = 'http://'
+servlet = '/ducc-servlet/classic-system-daemons-data'
+options = None
+
+webserver = 'Webserver'
+head_daemons = [ 'Orchestrator',  'ResourceManager', 'Database', 'Broker', 'ProcessManager', 'ServiceManager', webserver ]
+
+newline = '\n'
+version = '1.0'
+
+# to console
+def to_stdout(text):
+    try:
+        print text
+    except:
+        pass
+    try:
+        sys.stdout.flush()
+    except:
+        pass
+    try:
+        sys.stdout.close()
+    except:
+        pass
+    try:
+        sys.stderr.flush()
+    except:
+        pass
+    try:
+        sys.stderr.close()
+    except:
+        pass
+    
+# check for log-style formating of text message
+def is_log_format():
+    retVal = False
+    if(not options == None):
+        if(options.flag_log_format):
+            retVal = True
+    return retVal
+
+# produce a time stamp
+def get_timestamp():
+    global options
+    tod = time.time()
+    timestamp = datetime.datetime.fromtimestamp(tod).strftime('%Y-%m-%d %H:%M:%S')   
+    return timestamp
+
+# exception
+def exception(e):
+    to_stdout(str(e))
+
+# error message
+def error(text):
+    prefix = ''
+    if(is_log_format()):
+        type = 'E'
+        prefix = get_timestamp()+' '+type+' '
+    line = prefix+text
+    to_stdout(line)
+
+# info message
+def info(text):
+    prefix = ''
+    if(is_log_format()):
+        type = 'I'
+        prefix = get_timestamp()+' '+type+' '
+    line = prefix+text
+    to_stdout(line)
+
+# debug message
+def debug(text):
+    global options
+    if(not options == None):
+        if(options.flag_debug):
+            prefix = ''
+            if(is_log_format()):
+                type = 'D'
+                prefix = get_timestamp()+' '+type+' '
+            line = prefix+text
+            to_stdout(line)
+
+# trace message
+def trace(text):
+    pass
+
+# exit
+def exit(code,msg=True):
+    if(msg):
+        text = 'exit code='+str(code)
+        error(text)
+    sys.exit(code)
+
+# epilog for --help
+def get_epilog():
+    epilog = ''
+    return epilog
+
+# --target host:port of WS for fetching of daemons status
+def validate_target():
+    global options
+    global default_port
+    global protocol
+    global servlet
+    target = options.target
+    if(':' not in target):
+        target = target+':'+default_port
+    if(target.startswith(protocol)):
+        target = target.replace(protocol,'',1)
+    options.ducc_url_base = protocol+target
+    options.ducc_url_servlet = protocol+target+servlet
+    debug('target: '+options.ducc_url_base)
+    
+# parse command line
+def parse_cmdline():
+    global options
+    global default_host
+    global default_port
+    parser = ExtendedOptionParser(epilog=get_epilog())
+    width = 45
+    parser.formatter.help_position = width
+    parser.formatter.max_help_position = width
+    parser.add_option('-a','--agents', action='store_true', dest='flag_agents', default=False, 
+                               help='include agents')
+    parser.add_option('-d','--debug', action='store_true', dest='flag_debug', default=False, 
+                               help='display debugging messages')
+    parser.add_option('-e','--enumerate', action='store_true', dest='flag_enumerate', default=False, 
+                               help='display each individual daemon status')
+    parser.add_option('-l','--log-format', action='store_true', dest='flag_log_format', default=False, 
+                               help='display in log format')
+    parser.add_option('-t','--target', action='store', dest='target', default=default_host+':'+default_port,
+                               help='<host>:<port> with default of '+default_host+':'+default_port)
+    parser.add_option('-v','--version', action='store_true', dest='flag_version', default=False, 
+                               help='display version of this script')
+    (options, args) = parser.parse_args()
+    if(options.flag_version):
+        info('version='+version)
+        exit(1,msg=False)
+    validate_target()
+
+# fetch current daemons state
+def fetch_state_current():
+    global options
+    import urllib2
+    try:
+        opener = urllib2.build_opener()
+        if(options.flag_agents):
+            opener.addheaders.append(('Cookie', 'DUCCagents=show'))
+        response = opener.open(options.ducc_url_servlet)
+        options.ducc_raw_data = response.read()
+        trace(options.ducc_raw_data)
+    except Exception,e:
+        error('unable to fetch data from '+options.ducc_url_servlet)
+        exception(e)
+        exit(1)
+
+# filter non-head daemons
+def filter():
+    global options
+    global head_daemons
+    if(not options.flag_agents):
+        daemons = options.daemons
+        options.daemons = {}
+        for key in daemons:
+            if(key in head_daemons):
+                options.daemons[key] = daemons[key]
+            else:
+                debug('delete '+key)
+
+# transform raw data               
+def transform():
+    global options
+    global head_daemons
+    try:
+        parser = DuccHtmlParser()
+        parser.feed(options.ducc_raw_data)
+        options.daemons = parser.get_daemons()
+        options.daemons_head = {}
+        options.daemons_agent = {}
+        for key in options.daemons:
+            value = options.daemons[key]
+            if(key in head_daemons):
+                options.daemons_head[key] = value
+            else:
+                options.daemons_agent[key] = value
+        debug(str(options.daemons))
+        filter()
+    except Exception,e:
+        error('unable to transform data from '+options.ducc_url_servlet)
+        exception(e)
+        exit(1)
+
+# summarize
+def summarize():
+    global options
+    global head_daemons
+    options.head_up = 0
+    options.head_down = 0
+    options.agent_up = 0
+    options.agent_down = 0
+    for key in options.daemons_head:
+        value = options.daemons_head[key]
+        if(value == 'up'):
+            options.head_up = options.head_up + 1
+        else:
+            options.head_down = options.head_down + 1
+    for key in options.daemons_agent:
+        value = options.daemons_agent[key]
+        if(value == 'up'):
+            options.agent_up = options.agent_up + 1
+        else:
+            options.agent_down = options.agent_down + 1
+
+# display results
+def display():
+    global options
+    global newline
+    summarize();
+    text0 = options.target
+    text1 = 'head: '+'up='+str(options.head_up)+' '+'down='+str(options.head_down)
+    text2 = 'agent: '+'up='+str(options.agent_up)+' '+'down='+str(options.agent_down)
+    if(options.flag_agents):
+        text = text0+' '+text1+' '+text2
+    else:
+        text = text0+' '+text1
+    output = text
+    if(options.flag_enumerate):
+        for key in sorted(options.daemons):
+            text = key+'='+options.daemons[key]
+            output = output+newline+text
+    info(output)
+    
+# report current ducc daemons status
+def main(argv):
+    parse_cmdline()
+    fetch_state_current()
+    transform()
+    display()
+
+if __name__ == '__main__':
+    main(sys.argv[1:])

Propchange: uima/uima-ducc/trunk/src/main/scripts/tools/ducc_status
------------------------------------------------------------------------------
    svn:executable = *