blob: 537bb19a800709785c0928db9cc5de923ff5aed7 [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())
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4