#!/usr/bin/env python import sys import subprocess import dbus import string import os import fcntl import glib import gobject import dbus.service import dbus.mainloop.glib DBUS_NAME = 'org.openbmc.HostIpmi' OBJ_NAME = '/org/openbmc/HostIpmi/1' def header(seq, netfn, lun, cmd): return ( 'seq: 0x%02x\nnetfn: 0x%02x\n\nlun: 0x%02d\ncmd: 0x%02x\n') % ( seq, netfn, lun, cmd) def print_request(seq, netfn, lun, cmd, data): str = header(seq, netfn, lun, cmd) str += 'data: [%s]' % ', '.join(['0x%02x' % x for x in data]) print str def print_response(seq, netfn, lun, cmd, cc, data): str = header(seq, netfn, lun, cmd) str += 'cc: 0x%02x\ndata: [%s]' % ( cc, ', '.join(['0x%02x' % x for x in data]) ) print str class IpmiDebug(dbus.service.Object): def __init__(self, bus, name): dbus.service.Object.__init__(self, bus, name) @dbus.service.signal(DBUS_NAME, "yyyyay") def ReceivedMessage(self, seq, netfn, lun, cmd, data): print "IPMI packet from host:" print_request(seq, netfn, lun, cmd, data) @dbus.service.method(DBUS_NAME, "yyyyyay", "x") def sendMessage(self, seq, netfn, lun, cmd, ccode, data): print "IPMI packet sent to host:" print_response(seq, netfn, lun, cmd, ccode, data) return 0 @dbus.service.method(DBUS_NAME) def setAttention(self): print "IPMI SMS_ATN set" class ConsoleReader(object): def __init__(self, ipmi_obj): self.buffer = '' self.seq = 0 self.ipmi_obj = ipmi_obj flags = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL) flags |= os.O_NONBLOCK fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, flags) glib.io_add_watch(sys.stdin, glib.IO_IN, self.io_callback) def io_callback(self, fd, condition): chunk = fd.read() for char in chunk: self.buffer += char if char == '\n': self.line(self.buffer) self.buffer = '' return True def line(self, data): s = data.split(' ') if len(s) < 2: print "Not enough bytes to form a valid IPMI packet" return try: data = [int(c, 16) for c in s] except ValueError: return self.seq += 1 self.ipmi_obj.ReceivedMessage(self.seq, data[0], 0, data[1], data[2:]) def main(): dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() obj = IpmiDebug(bus, OBJ_NAME) mainloop = gobject.MainLoop() r = ConsoleReader(obj) obj.unmask_signals() name = dbus.service.BusName(DBUS_NAME, bus) print ("Enter IPMI packet as hex values. First three bytes will be used" "as netfn and cmd.\nlun will be zero.") mainloop.run() if __name__ == '__main__': sys.exit(main()) # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4