Yang, Morgan (US SSA) wrote:

Hi All:

I just downloaded and installed OpenIPMI-python-2.0.9-2. I’m looking to write a simple application to establish a RMCP LAN connection to a shelf manager, scan sensors, retrieve FRUs, and modify FRU information. Is there any documentation or sample python code snippet in existing that I can use to get started?

Much Thanks

Morgan Yang


This question is probably more appropriate for the OpenIPMI list than the ipmitool list.

There aren't any python examples except for the gui, which is rather large. The perl examples can be helpful, since the concepts are mostly the same, you can look in swig/perl for those. You just have to remove you brain and screw it in sideways to program in perl.

I've converted the perl sample program to python and attached it, it will be in new distributions of OpenIPMI. Hopefully this helps.

-corey

#!/usr/bin/python

# sample
#
# A sample file that uses most of the python/OpenIPMI interface
#
# Author: MontaVista Software, Inc.
#         Corey Minyard <miny...@mvista.com>
#         sou...@mvista.com
#
# Copyright 2010 MontaVista Software Inc.
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public License
#  as published by the Free Software Foundation; either version 2 of
#  the License, or (at your option) any later version.
#
#
#  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
#  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
#  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
#  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
#  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
#  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this program; if not, write to the Free
#  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

import sys
import OpenIPMI

# Used to count things waiting for shutdown
stop_count = 1
main_handler = None

class MC_Nameget:
    def __init__(self):
        self.name = None
        pass

    def mc_cb(self, mc):
	self.name = mc.get_name()
        pass
    pass

threshold_list = ("ln", "lc", "lr", "un", "uc", "ur")
low_high = ("l", "h")
act_deact = ("a", "d")

class Handlers:
    def __init__(self, name):
        self.name = name
        return

    def event_cb(self, domain, event):
	mcid = event.get_mc_id()

	name = MC_Nameget()
	mcid.to_mc(name)
        name = name.name
	data = event.get_data()

	print ("Got event: " + name + " " + str(event.get_record_id()) +
               " " + str(event.get_type()) + " " + str(event.get_timestamp()))
        datastr = ""
        for b in data:
            datastr += " %2.2x" % b
            pass
	print "  Data:" + datastr
        return

    def entity_presence_cb(self, entity, present, event):
	print "Entity " + entity.get_name() + " presence is " + str(present)

        if event:
	    self.event_cb(entity.get_domain(), event)
            pass
        return

    def threshold_event_cb(self, sensor, event_spec, raw_set, raw,
                           value_set, value, event):
	print "Sensor " + sensor.get_name() + " got event " + event_spec
        if raw_set:
	    print "  raw value = " + str(raw)
            pass
        if value_set:
	    print "  value = " + str(value)
            pass
        if event:
            entity = sensor.get_entity()
	    self.event_cb(entity.get_domain(), event)
            pass
        return

    def discrete_event_cb(self, sensor, event_spec, severity, old_severity,
                          event):
	print "Sensor " + sensor.get_name() + " got event " + event_spec
	print "  severity = " + str(severity) + " was = " + str(old_severity)
        if event:
            entity = sensor.get_entity()
	    self.event_cb(entity.get_domain(), event)
            pass
        return

    def entity_sensor_update_cb(self, op, entity, sensor):
	print op + " sensor " + sensor.get_name()
        if ((op == "added") or (op == "changed")):
	    print "  lun = " + str(sensor.get_lun())
	    print "  num = " + str(sensor.get_num())
	    print "  sensor_type_string = " + sensor.get_sensor_type_string()
	    print "  sensor_type = " + str(sensor.get_sensor_type())
	    print("  event_reading_type_string = " +
                  sensor.get_event_reading_type_string())
	    print("  event_reading_type = "
                  + str(sensor.get_event_reading_type()))
	    print "  entity_id = " + str(sensor.get_entity_id())
	    print "  entity_instance = " + str(sensor.get_entity_instance())
	    print("  sensor_init_scanning = " +
                   str(sensor.get_sensor_init_scanning()))
	    print("  sensor_init_events = "
                  + str(sensor.get_sensor_init_events()))
	    print("  sensor_init_thresholds = " +
                  str(sensor.get_sensor_init_thresholds()))
	    print("  sensor_init_hysteresis = " +
                  str(sensor.get_sensor_init_hysteresis()))
	    print("  sensor_init_type = " +
                  str(sensor.get_sensor_init_type()))
	    print("  sensor_init_pu_events = " +
                  str(sensor.get_sensor_init_pu_events()))
	    print("  sensor_init_pu_scanning = " +
                  str(sensor.get_sensor_init_pu_scanning()))
	    print("  ignore_if_no_entity = " +
                  str(sensor.get_ignore_if_no_entity()))
	    print("  supports_auto_rearm = " +
                  str(sensor.get_supports_auto_rearm()))
	    print "  event_support = " + str(sensor.get_event_support())
	    print "  sensor_direction = " + str(sensor.get_sensor_direction())
	    print "  oem1 = " + str(sensor.get_oem1())
	    print "  sensor_id = " + sensor.get_sensor_id()

	    if (sensor.get_event_reading_type()
                == OpenIPMI.EVENT_READING_TYPE_THRESHOLD):
		print "  rate_unit_string = " + sensor.get_rate_unit_string()
		print "  rate_unit = " + str(sensor.get_rate_unit())
		print("  base_unit_string = " +
                      sensor.get_base_unit_string())
		print "  base_unit = " + str(sensor.get_base_unit())
		print("  modifier_unit_string = " +
		       sensor.get_modifier_unit_string())
		print "  modifier_unit = " + str(sensor.get_modifier_unit())
		print("  modifier_unit_use = " +
                      str(sensor.get_modifier_unit_use()))
		print "  percentage = " + str(sensor.get_percentage())
		print("  threshold_access = " +
		      str(sensor.get_threshold_access()))
		print("  hysteresis_support = " +
		      str(sensor.get_hysteresis_support()))

                val = [ 0.0 ]
                if sensor.get_normal_min_specified():
		    rv = sensor.get_normal_min(val)
                    if rv:
                        print "***Error getting normal min: " + rv
		    else:
			print "  normal_min = " + str(val[0])
                        pass
                    pass

		if sensor.get_normal_max_specified():
		    rv = sensor.get_normal_max(val)
                    if rv:
                        print "***Error getting normal max: " + rv
		    else:
			print "  normal_max = " + str(val[0])
                        pass
                    pass

                if sensor.get_nominal_reading_specified():
		    rv = sensor.get_nominal_reading(val)
                    if rv:
			print "***Error getting nominal reading: " + str(rv)
		    else:
			print "  nominal_reading = " + str(val[0])
                        pass
                    pass
                
		rv = sensor.get_sensor_max(val)
                if rv:
		    print "***Error getting sensor max: " + str(rv)
		else:
		    print "  sensor_max = " + str(val[0])
                    pass
                pass

		rv = sensor.get_sensor_min(val)
                if rv:
		    print "***Error getting sensor min: " + str(rv)
		else:
		    print "  sensor_min = " + str(val[0])
                    pass
                pass

		rv = sensor.get_tolerance(128, val)
                if rv == 0:
		    print "  tolerance at 128 is " + str(val[0])
                    pass

		rv = sensor.get_accuracy(128, val)
                if rv == 0:
		    print "  accuracy at 128 is " + str(val[0])
                    pass

                for i in threshold_list:
		    supported = [ 0 ]
		    settable = [ 0 ]
		    readable = [ 0 ]

		    rv = sensor.threshold_reading_supported(i, supported)
                    if rv:
			print("***Error getting supported for threshold %s: %s"
                              % (i, str(rv)))
                        pass
                    supported = supported[0]

                    if not supported:
			continue

		    tstr = "  Threshold '" + i + "' supported:"

		    rv = sensor.threshold_settable(i, settable)
                    if rv:
			print("***Error getting settable for threshold %s: %s"
                              % (i, str(rv)))
                        pass
                    settable = settable[0]
                    if settable:
			tstr += " settable"
                        pass

		    rv = sensor.threshold_readable(i, readable)
                    if rv:
			print("***Error getting readable for threshold %s: %s"
                              % (i, str(rv)))
                        pass
                    readable = readable[0]
                    if readable:
			tstr += " readable"
                        pass
		    print tstr

		    tstr = "    Supports events:"
                    for j in low_high:
                        for k in act_deact:
			    e = i + j + k
			    s = [ 0 ]
			    rv = sensor.threshold_event_supported(e, s)
                            if rv:
				print ("***Error getting ev support for event "
                                       + e + ": " + str(rv))
			    elif s[0]:
				tstr += " " + e
                                pass
                            pass
                        pass
		    print tstr
                    pass
                pass
            else:
                for i in range(0, 14):
		    a_supported = [ 0 ]
		    d_supported = [ 0 ]
		    readable = [ 0 ]

		    rv = sensor.discrete_event_readable(i, readable)
                    if rv:
			print ("***Error getting readable for offset %d: %s"
                               % (i, str(rv)))
                        pass
                    readable = readable[0]
                    
		    rv = sensor.discrete_event_supported(str(i) + "a",
                                                         a_supported)
                    if rv:
			print ("***Error getting a supported for offset %d: %s"
                               % (i, str(rv)))
                        pass
                    a_supported = a_supported[0]

		    rv = sensor.discrete_event_supported(str(i) + "d",
                                                         d_supported)
                    if rv:
			print ("***Error getting d supported for offset %s: %s"
                               % (i, str(rv)))
                        pass
                    d_supported = d_supported[0]

                    if readable or a_supported or d_supported:
			s = sensor.reading_name_string(i)
			tstr = "  Offset %d (%s) supported:" % (i, s)

                        if readable:
			    tstr += " readable"
                            pass
                        if a_supported:
			    tstr += " assert"
                            pass
                        if d_supported:
			    tstr += " deassert"
                            pass
                        print tstr
                        pass
                    pass
                pass
	    
            if op == "added":
		rv = sensor.add_event_handler(self)
                if rv:
		    print "***Unable to add event handler: " + str(rv)
                    pass
                pass
            pass
        elif op == "deleted":
            rv = sensor.remove_event_handler(self)
            if rv:
		print "***Unable to remove event handler: " + str(rv)
                pass
            pass
        return

    def control_get_val_cb(self, control, err, vals):
	tstr = "Control %s err = %s, values = " % (control.get_name(),str(err))
        for v in vals:
            tstr += " %d" % v
            pass
	print tstr
        return

    def control_get_light_cb(self, control, err, vals):
	print("Control %s err = %s, light value = %s"
              % (control.get_name(), str(err), vals))
        return

    def control_get_id_cb(self, control, err, val):
	tstr = ("Control %s err = %s, id value = "
                % (control.get_name(), str(err)))
        for v in vals:
            tstr += " %2.2x" % v
            pass
        print tstr
        return

    def control_event_val_cb(self, control, event, num, valids, vals):
	tstr = "Control " + control.get_name() + " event, values ="
        for i in range(0, len(valids)):
            if valids[i]:
                v = "valid"
            else:
                v = "invalid"
                pass
            tstr += " (%s, %d)" % (v, vals[i])
            pass
        print tstr
        return

    def entity_control_update_cb(self, op, entity, control):
	use_setting = 0

	print op + " control " + control.get_name()
        if ((op == "added") or (op == "changed")):
	    t = control.get_type()
	    print "  type = " + str(t)
	    print "  entity_id = " + str(control.get_entity_id())
	    print "  entity_instance = " + str(control.get_entity_instance())
	    print "  settable = " + str(control.is_settable())
	    print "  readable = " + str(control.is_readable())
	    print("  ignore_if_no_entity = " +
		  str(control.get_ignore_if_no_entity()))
	    print "  control_id = " + str(control.get_control_id())
	    print "  has_events = " + str(control.has_events())
	    num_vals = control.get_num_vals()
	    print "  num_vals = " + str(num_vals)

            if t == OpenIPMI.CONTROL_LIGHT:
		use_setting = control.light_set_with_setting()
                pass

	    if use_setting:
		print "  light controlled with setting"
		tstr = "  Colors: "
                for i in range(0, OpenIPMI.CONTROL_NUM_COLORS):
                    if (control.light_is_color_supported(i)):
			tstr += " " + OpenIPMI.color_string(i) + ("(%d)" % i)
                        pass
                    pass
		print tstr
		print("  light_has_local_control = " +
		      str(control.light_has_local_control()))
		rv = control.ipmi_control_get_light(self)
                if rv:
		    print "***Error getting light: " + str(rv)
                    pass
                pass
	    elif t == OpenIPMI.CONTROL_IDENTIFIER:
		print("  identifier_get_max_length = " +
		      str(control.identifier_get_max_length()))
		rv = control.identifier_get_val(self)
                if rv:
		    print "***Error getting control id: " + str(rv)
                    pass
                pas
            elif t == OpenIPMI.CONTROL_LIGHT:
                for i in range(0, num_vals) :
                    n = control.get_num_light_values(i)
                    print "  Light %d" % i
                    for j in range (0, n):
                        print "    Value %d" % j
                        o = control.get_num_light_transitions(i, j)
                        for k in range (0, o):
                            tstr = "    Transition %d:" & k
                            v = control.get_light_color(i, j, k)
                            tstr += " " + OpenIPMI.color_string(v)
                            v = control.get_light_color_time(i, j, k)
                            tstr += " time(" + str(v) + ")"
                            pass
                        pass
                    pass
                pass

            if op == "added":
		rv = control.add_event_handler(self)
                if rv:
		    print "***Error adding control event handler: " + str(rv)
                    pass
                pass
            pass
        elif op == "deleted":
	    rv = control.remove_event_handler(self)
            if rv:
		print "***Error removing control event handler: " + str(rv)
                pass
            pass
        return
    
    def print_multirecord(self, node, indent):
	name = [ "" ]
	t = [ "" ]
	value = [ "" ]
	sub_node = [ None ]
    
	i = 0
        while True:
	    rv = node.get_field(i, name, t, value, sub_node)
            if rv == OpenIPMI.einval:
		return
	    i += 1
            if rv:
		continue

	    print "%s%s, %s, %s" % (indent, name[0], t[0], value[0])
            if t == "subnode":
		self.print_multirecord(subnode[0], indent + "  ")
                pass
            pass
        return

    def entity_fru_update_cb(self, op, entity, fru):
	print op + " fru for " + entity.get_name()
        if ((op == "added") or (op == "changed")):
	    i = fru.str_to_index("internal_use_version")
            if i == -1:
		print "*** FRU string 'internal_use_version' was invalid"
	    else:
		print "  internal_use_version index is %d" % i
                pass
	    i = fru.str_to_index("blah blah")
            if i != -1:
		print "*** FRU string 'blah blah' was valid"
                pass

	    i = 0
	    j = [ 0 ]
	    k = j[0]
	    rv = fru.get(i, j)
            while rv:
                v = rv.split(" ", 2)
                if len(v) > 2:
                    name = v[0]
                    t = v[1]
		    print "  %s, %s, %s" % (name, t, v[2])
                    pass
                if j[0] != k:
                    if j[0] == -1:
			i += 1
			j = [ 0 ]
                        pass
                    pass
                else:
		    i += 1
		    j = [ 0 ]
                    pass

		k = j[0]
		rv = fru.get(i, j)
                pass
	    j = fru.get_num_multi_records()
	    print "%d multirecords" % j
            for i in range(0, j):
		name = [ "" ]
		sub_node = [ None ]
		rv = fru.multi_record_get_root_node(i, name, sub_node)
                if rv:
		    print "Multirecord %d has no decoder" % i
		    continue
		print "Multirecord %d (%s)" % (i, name[0])
		self.print_multirecord(sub_node[0], "  ")
                pass
            pass
        return

    def entity_hot_swap_update_cb(self, entity, old_state, new_state, event):
	print("Hot swap change for %s was %s now %s"
              % (entity.get_name(), old_state, new_state))
        if event:
	    self.event_cb(entity.get_domain(), event)
            pass
        return

    def entity_update_cb(self, op, domain, entity):
	print op + " entity " + entity.get_name()
        if ((op == "added") or (op == "changed")):
	    print "  type = " + entity.get_type()
	    print "  is_fru = " + str(entity.is_fru())
	    print "  entity_id = " + str(entity.get_entity_id())
	    print "  entity_instance = " + str(entity.get_entity_instance())
	    print("  device_channel = " +
		  str(entity.get_entity_device_channel()))
	    print("  device_address = " +
		  str(entity.get_entity_device_address()))
	    print("  presence_sensor_always_there = " +
		   str(entity.get_presence_sensor_always_there()))
	    print "  channel = " + str(entity.get_channel())
	    print "  lun = " + str(entity.get_lun())
	    print "  oem = " + str(entity.get_oem())
	    print "  access_address = " + str(entity.get_access_address())
	    print "  private_bus_id = " + str(entity.get_private_bus_id())
	    print "  device_type = " + str(entity.get_device_type())
	    print "  device_modifier = " + str(entity.get_device_modifier())
	    print "  slave_address = " + str(entity.get_slave_address())
	    print "  is_logical_fru = " + str(entity.get_is_logical_fru())
	    print "  fru_device_id = " + str(entity.get_fru_device_id())
	    print("  ACPI_system_power_notify_required = " +
		  str(entity.get_ACPI_system_power_notify_required()))
	    print("  ACPI_device_power_notify_required = " +
		  str(entity.get_ACPI_device_power_notify_required()))
	    print("  controller_logs_init_agent_errors = " +
		  str(entity.get_controller_logs_init_agent_errors()))
	    print("  log_init_agent_errors_accessing = " +
		  str(entity.get_log_init_agent_errors_accessing()))
	    print "  global_init = " + str(entity.get_global_init())
	    print "  chassis_device = " + str(entity.get_chassis_device())
	    print "  bridge = " + str(entity.get_bridge())
	    print("  IPMB_event_generator = " +
		  str(entity.get_IPMB_event_generator()))
	    print("  IPMB_event_receiver = " +
		  str(entity.get_IPMB_event_receiver()))
	    print("  FRU_inventory_device = " +
		  str(entity.get_FRU_inventory_device()))
	    print "  SEL_device = " + str(entity.get_SEL_device())
	    print("  SDR_repository_device = " +
		  str(entity.get_SDR_repository_device()))
	    print "  sensor_device = " + str(entity.get_sensor_device())
	    print "  address_span = " + str(entity.get_address_span())
	    print "  dlr_id = " + str(entity.get_dlr_id())
	    print "  present = " + str(entity.is_present())
	    print "  hot_swappable = " + str(entity.is_hot_swappable())
            if op == "added":
		rv = entity.add_presence_handler(self)
                if rv:
		    print "***Unable to add presence handler: " + str(rv)
                    pass
		rv = entity.add_sensor_update_handler(self)
                if rv:
		    print "***Unable to add sensor update handler: " + str(rv)
                    pass
		rv = entity.add_control_update_handler(self)
                if rv:
		    print "***Unable to add control update handler: " + str(rv)
                    pass
		rv = entity.add_hot_swap_handler(self)
                if rv:
		    print "***Unable to add hot-swap handler: " + str(rv)
                    pass
		rv = entity.add_fru_update_handler(self)
                if rv:
		    print "***Unable to add fru handler: " + str(rv)
                    pass
                pass
            pass
        elif op == "deleted":
	    rv = entity.remove_presence_handler(self)
	    if rv:
                print "***Unable to remove presence handler: " + str(rv)
                pass
	    rv = entity.remove_sensor_update_handler(self)
	    if rv:
                print "***Unable to remove sensor update handler: " + str(rv)
                pass
	    rv = entity.remove_control_update_handler(self)
	    if rv:
                print "***Unable to remove control update handler: " + str(rv)
                pass
	    rv = entity.remove_hot_swap_handler(self)
            if rv:
		print "***Unable to remove hot-swap handler: " + str(rv)
                pass
	    rv = entity.remove_fru_update_handler(self)
            if rv:
		print "***Unable to add fru handler: " + str(rv)
                pass
            pass
        return

    def mc_active_cb(self, mc, active):
	print "MC " + mc.get_name() + " active set to " + str(active)
        return

    def mc_events_enable_cb(self, mc, err, domain):
        global stop_count
	print "Events enabled for " + mc.get_name() + " err = " + str(err)
	stop_count -= 1
        if stop_count == 0:
	    domain.close(main_handler)
            pass
        return

    def mc_reread_sel_cb(self, mc, err):
        global stop_count
	domain = mc.get_domain()

	print "SEL reread for " + mc.get_name() + " err = " + str(err)
	stop_count -= 1
        if stop_count == 0:
	    domain.close(main_handler)
            pass
        return

    def mc_reread_sensors_cb(self, mc, err):
        global stop_count
	domain = mc.get_domain()

	print "Sensors reread for " + mc.get_name() + " err = " + str(err)
	stop_count -= 1
        if stop_count == 0:
	    domain.close(main_handler)
            pass
        return

    def mc_get_sel_time_cb(self, mc, err, time):
        global stop_count
	domain = mc.get_domain()

	print("SEL time for " + mc.get_name() + " is " + str(time) + ", err = "
              + str(err))
	stop_count -= 1
        if stop_count == 0:
	    domain.close(main_handler)
            pass
        return

    def mc_update_cb(self, op, domain, mc):
        global stop_count
	print op + " MC " + mc.get_name()
        if ((op == "added") or (op == "changed")):
	    print("  provides_device_sdrs = " +
		  str(mc.provides_device_sdrs()))
	    print "  device_available = " + str(mc.device_available())
	    print "  chassis_support = " + str(mc.chassis_support())
	    print "  bridge_support = " + str(mc.bridge_support())
	    print("  ipmb_event_generator_support = " +
		  str(mc.ipmb_event_generator_support()))
	    print("  ipmb_event_receiver_support = " +
                  str(mc.ipmb_event_receiver_support()))
	    print("  fru_inventory_support = " +
		  str(mc.fru_inventory_support()))
	    print("  sel_device_support = " +
		  str(mc.sel_device_support()))
	    print("  sdr_repository_support = " +
		  str(mc.sdr_repository_support()))
	    print("  sensor_device_support = " +
		  str(mc.sensor_device_support()))
	    print "  device_id = " + str(mc.device_id())
	    print "  device_revision = " + str(mc.device_revision())
	    print "  major_fw_revision = " + str(mc.major_fw_revision())
	    print "  minor_fw_revision = " + str(mc.minor_fw_revision())
	    print "  major_version = " + str(mc.major_version())
	    print "  minor_version = " + str(mc.minor_version())
	    print "  manufacturer_id = " + str(mc.manufacturer_id())
	    print "  product_id = " + str(mc.product_id())
	    print "  aux_fw_revision = " + str(mc.aux_fw_revision())
	    print "  is_active = " + str(mc.is_active())
	    print "  get_events_enable = " + str(mc.get_events_enable())
	    print "  sel_count = " + str(mc.sel_count())
	    print "  sel_entries_used = " + str(mc.sel_entries_used())
	    print("  sel_get_major_version = " +
		  str(mc.sel_get_major_version()))
	    print("  sel_get_minor_version = " +
		  str(mc.sel_get_minor_version()))
	    print("  sel_get_num_entries = " +
		  str(mc.sel_get_num_entries()))
	    print "  sel_get_free_bytes = " + str(mc.sel_get_free_bytes())
	    print "  sel_get_overflow = " + str(mc.sel_get_overflow())
	    print("  sel_get_supports_delete_sel = " +
		  str(mc.sel_get_supports_delete_sel()))
	    print("  sel_get_supports_partial_add_sel = " +
		  str(mc.sel_get_supports_partial_add_sel()))
	    print("  sel_get_supports_reserve_sel = " +
		  str(mc.sel_get_supports_reserve_sel()))
	    print("  sel_get_supports_get_sel_allocation = " +
		  str(mc.sel_get_supports_get_sel_allocation()))
	    print("  sel_get_last_addition_timestamp = " +
		  str(mc.sel_get_last_addition_timestamp()))
	    print("  get_sel_rescan_time = " +
		  str(mc.get_sel_rescan_time()))

	    stop_count += 2
	    rv = mc.set_events_enable(1, self)
	    if rv:
		print "***Error enabling MC events: " + str(rv)
                stop_count -= 1
                pass

	    stop_count += 1
	    rv = mc.reread_sensors(self)
            if rv:
		print "***Error rereading MC sensors: " + str(rv)
		stop_count -= 1
                pass

	    mc.set_sel_rescan_time(5)

	    stop_count += 1
	    rv = mc.reread_sel(self)
            if rv:
		print "***Error rereading MC SEL: " + str(rv)
		stop_count -= 1
                pass

	    stop_count += 1
	    rv = mc.get_current_sel_time(self)
            if rv:
		print "***Error getting current MC SEL time: " + str(rv)
		stop_count -= 1
                pass

	    # Stop count for this incremented at first.
	    rv = mc.send_command(0, 10, 0x43,
                                 [ 0, 0, 0, 0, 0, 0xff ], self)
            if rv:
		print "***Unable to send mc command: " + str(rv)
		stop_count -= 1
                pass

            if op == "added":
		rv = mc.add_active_handler(self)
                if rv:
		    print "***Unable to add active handler: " + str(rv)
                    pass
                pass
            pass
        elif op == "deleted":
            rv = mc.remove_active_handler(self)
            if rv:
                print "***Unable to remove active handler: " + str(rv)
                pass
            pass
        return

    def domain_addr_cmd_cb(self, domain, addr, lun, netfn, cmd, data):
	print "Got message from " + domain.get_name()
	print " addr = " + addr
	print " lun=%d, netfn=%d, cmd=%d" % (lun, netfn, cmd)
	tstr = " data:"
        for b in data:
	    tstr += " %2.2x" % b
            pass
	print tstr
        return

    def mc_cmd_cb(self, mc, netfn, cmd, data):
        global stop_count
	print "Got message from " + mc.get_name()
	print " netfn=%d, cmd=%d" % (netfn, cmd)
	tstr = " data:"
        for b in data:
	    tstr += " %2.2x" % b
            pass
	print tstr
	stop_count -= 1
        if stop_count == 0:
	    mc.get_domain().close(main_handler)
            pass
        return

    def conn_change_cb(self, domain, err, conn_num, port_num, still_connected):
	print "Open done (%s): %s" % (self.name, domain.get_name())
        if self.name == "hello":
	    i = Handlers("goodbye")
	    rv = domain.add_connect_change_handler(i)
            if rv:
		print "Unable to add connect change handler: " + str(rv)
                pass
	    rv = domain.remove_connect_change_handler(self)
            if rv:
		print "Unable to remove connect change handler: " + str(rv)
                pass

	    rv = domain.add_entity_update_handler(i)
            if rv:
		print "Unable to add entity updated handler: " + str(rv)
                pass
	    rv = domain.add_mc_update_handler(i)
            if rv:
		print "Unable to add mc updated handler: " + str(rv)
                pass

	    rv = domain.send_command_addr("smi 15 ", 0, 6, 1, [], self)
            if rv:
		print "Unable to send domain command (1): " + str(rv)
                pass

	    rv = domain.add_event_handler(self)
            if rv:
		print "Unable to add event handler: " + str(rv)
                pass
	else:
	    rv = domain.send_command_addr("ipmb 0 32", 0, 10, 0x43,
                                          [ 0, 0, 0, 0, 0, 0xff ], self)
            if rv:
		print "Unable to send domain command (2): " + str(rv)
                pass
            pass
        return

    def domain_up_cb(self, domain):
        global stop_count
	print "Domain up: " + domain.get_name()
	print "  type = " + domain.get_type()
	print "  sel_rescan_type = " + str(domain.get_sel_rescan_time())
	print "  ipmb_rescan_type = " + str(domain.get_ipmb_rescan_time())
	domain.set_sel_rescan_time(5)
	domain.set_ipmb_rescan_time(20)
	domain.iterate_entities(self)
	domain.iterate_mcs(self)

	event = domain.first_event()
        while event:
	    self.event_cb(domain, event)
	    event = domain.next_event(event)
            pass

	# stop count is incremented at domain startup, don't need another.
	stop_count += 1
	rv = domain.start_ipmb_mc_scan(0, 0x20, 0x20, self)
        if rv:
	    print "Error starting IPMB scan: " + str(rv)
	    stop_count -= 1
            pass

	rv = domain.reread_sels(self)
        if rv:
	    print "Error starting IPMB scan: " + str(rv)
	    stop_count -= 1
            pass
        return

    def domain_reread_sels_cb(self, domain, err):
        global stop_count
	print "SEL rescan done for " + domain.get_name() + " err=" + str(err)
	stop_count -= 1
        if stop_count == 0:
	    domain.close(main_handler)
            pass
        return

    def domain_close_done_cb(self):
	self.name = "done"
        return

    def domain_ipmb_mc_scan_cb(self, domain, err):
        global stop_count
	print "IPMB scan done for " + domain.get_name() + " err=" + str(err)
	stop_count -= 1
        if stop_count == 0:
	    domain.close(main_handler)
            pass
        return

    def entity_iter_entities_cb(self, relative, entity):
	print "    " + entity.get_name()
        return

    def entity_iter_sensors_cb(self, entity, sensor):
	print "Sensor: " + sensor.get_name()

    def entity_iter_controls_cb(self, entity, control):
	print "Control: " + control.get_name()

    def domain_iter_entity_cb(self, domain, entity):
	print "Entity: " + entity.get_name()
        if entity.is_child():
	    print "  Parents:"
	    entity.iterate_parents(self)
            pass
        if entity.is_parent():
	    print "  Children:"
	    entity.iterate_children(self)
            pass

	entity.iterate_sensors(self)
	entity.iterate_controls(self)
        return

    def domain_iter_mc_cb(self, domain, mc):
	print "MC: " + mc.get_name()

	event = mc.first_event()
        while event:
	    self.event_cb(mc.get_domain(), event)
	    event = mc.next_event(event)
            pass
        return

    def log(self, level, log):
	print level + ": " + log
        return

    pass

OpenIPMI.enable_debug_malloc()
OpenIPMI.init_posix()

main_handler = Handlers("hello")

OpenIPMI.set_log_handler(main_handler)

a = OpenIPMI.open_domain2("test", sys.argv[1:], main_handler, main_handler)
if not a:
    print "open failed"
    sys.exit(1)
    pass

while main_handler.name != "done":
    OpenIPMI.wait_io(1000)
    pass

OpenIPMI.shutdown_everything()
print "done"
sys.exit(0)

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to