From 54d2d2dffabd3758ff155b7d94912f9f50571bda Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Fri, 20 Mar 2015 17:09:30 -0400 Subject: [PATCH] Draft nodesensors command It's not functional yet, but this command will be the CLI access to sensor data and collection --- confluent_client/bin/nodesensors | 110 +++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 confluent_client/bin/nodesensors diff --git a/confluent_client/bin/nodesensors b/confluent_client/bin/nodesensors new file mode 100644 index 00000000..31999255 --- /dev/null +++ b/confluent_client/bin/nodesensors @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2015 Lenovo +# +# Licensed 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 optparse +import os +import sys + +path = os.path.dirname(os.path.realpath(__file__)) +path = os.path.realpath(os.path.join(path, '..', 'lib', 'python')) +if path.startswith('/opt'): + sys.path.append(path) + +import confluent.client as client + +sensorcollections = { + 'all': 'hardware/all/all', + 'temperature': 'hardware/temperature/all', + 'power': 'hardware/power/all', + 'fans': 'hardware/fans/all' +} + + +argparser = optparse.OptionParser( + usage="Usage: %prog [options] noderange [sensor(s)") +argparser.add_option('-i', '--interval', type='int', + help='Interval to do repeated samples over') +argparser.add_option('-n', '--numreadings', type='int', + help='Number of readings to gather') +argparser.add_option('-c', '--csv', action='store_true') +(options, args) = argparser.parse_args() +repeatmode = False +if options.interval: + repeatmode = True +if options.numreadings: + repeatmode = options.numreadings + if options.interval is None: + options.interval = 1 + +noderange = args[0] +sensors = [] +for sensorgroup in args[2:]: + for sensor in sensorgroup.split(','): + sensor.replace('.', '/') + if '/' not in sensor: + if sensor in sensorcollections: + sensors.append(sensorcollections[sensor]) + else: + sensors.append('hardware/all/' + sensor) +if not sensors: + sensors = ['sensors/hardware/all/all'] + +session = client.Command() +exitcode = 0 +sensornames = set([]) + +def sensorpass(showout=True): + resultdata = {} + for reqsensor in sensors: + for reading in session.read('/noderange/' + noderange + '/' + reqsensor): + if not isinstance(reading, dict): + sys.stderr.write(reading) + continue + for node in reading: + if 'error' in reading[node]: + sys.stderr.write( + '{0}: Error: {1}\n'.format(reading[node]['error'])) + if 'sensors' not in reading[node]: + continue + for sensedata in reading[node]['sensors']: + print repr(sensedata) + sensornames.add(sensedata['name']) + + try: + sensedata['state'].remove('Ok') + except ValueError: + pass + resultdata[sensedata['name']] = sensedata + if showout: + if sensedata['units'] is not None: + showval = '{0} {1}'.format( + sensedata['value'], sensedata['units']) + else: + showval = sensedata['value'] + if showval is None: + showval = '' + datadescription = [sensedata['health']] + datadescription.extend(sensedata['states']) + showval += ' ({0})'.format(','.join(datadescription)) + print('{0}: {1}: {2}'.format( + node, sensedata['name'], showval)) + + + + + +sensorpass() \ No newline at end of file