#!/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()