diff options
Diffstat (limited to 'pyipmitest/ipmi_debug.py')
| -rw-r--r-- | pyipmitest/ipmi_debug.py | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/pyipmitest/ipmi_debug.py b/pyipmitest/ipmi_debug.py new file mode 100644 index 0000000..0fc6a86 --- /dev/null +++ b/pyipmitest/ipmi_debug.py @@ -0,0 +1,99 @@ +#!/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() + name = dbus.service.BusName(DBUS_NAME, bus) + obj = IpmiDebug(bus, OBJ_NAME) + mainloop = gobject.MainLoop() + r = ConsoleReader(obj) + + 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()) |

