blob: b8983183fc06252fe2e58b70696f254d39729302 [file] [log] [blame]
#!/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())