1*40a360c2SBrad Bishop#!/usr/bin/env python 2*40a360c2SBrad Bishop 3*40a360c2SBrad Bishopimport sys 4*40a360c2SBrad Bishopimport subprocess 5*40a360c2SBrad Bishopimport dbus 6*40a360c2SBrad Bishopimport string 7*40a360c2SBrad Bishopimport os 8*40a360c2SBrad Bishopimport fcntl 9*40a360c2SBrad Bishopimport glib 10*40a360c2SBrad Bishopimport gobject 11*40a360c2SBrad Bishopimport dbus.service 12*40a360c2SBrad Bishopimport dbus.mainloop.glib 13*40a360c2SBrad Bishop 14*40a360c2SBrad BishopDBUS_NAME = 'org.openbmc.HostIpmi' 15*40a360c2SBrad BishopOBJ_NAME = '/org/openbmc/HostIpmi/1' 16*40a360c2SBrad Bishop 17*40a360c2SBrad Bishopdef header(seq, netfn, lun, cmd): 18*40a360c2SBrad Bishop return ( 19*40a360c2SBrad Bishop 'seq: 0x%02x\nnetfn: 0x%02x\n\nlun: 0x%02d\ncmd: 0x%02x\n') % ( 20*40a360c2SBrad Bishop seq, netfn, lun, cmd) 21*40a360c2SBrad Bishop 22*40a360c2SBrad Bishop 23*40a360c2SBrad Bishopdef print_request(seq, netfn, lun, cmd, data): 24*40a360c2SBrad Bishop str = header(seq, netfn, lun, cmd) 25*40a360c2SBrad Bishop str += 'data: [%s]' % ', '.join(['0x%02x' % x for x in data]) 26*40a360c2SBrad Bishop print str 27*40a360c2SBrad Bishop 28*40a360c2SBrad Bishopdef print_response(seq, netfn, lun, cmd, cc, data): 29*40a360c2SBrad Bishop str = header(seq, netfn, lun, cmd) 30*40a360c2SBrad Bishop str += 'cc: 0x%02x\ndata: [%s]' % ( 31*40a360c2SBrad Bishop cc, ', '.join(['0x%02x' % x for x in data]) 32*40a360c2SBrad Bishop ) 33*40a360c2SBrad Bishop print str 34*40a360c2SBrad Bishop 35*40a360c2SBrad Bishopclass IpmiDebug(dbus.service.Object): 36*40a360c2SBrad Bishop def __init__(self,bus,name): 37*40a360c2SBrad Bishop dbus.service.Object.__init__(self,bus,name) 38*40a360c2SBrad Bishop 39*40a360c2SBrad Bishop @dbus.service.signal(DBUS_NAME, "yyyyay") 40*40a360c2SBrad Bishop def ReceivedMessage(self, seq, netfn, lun, cmd, data): 41*40a360c2SBrad Bishop print "IPMI packet from host:" 42*40a360c2SBrad Bishop print_request(seq, netfn, lun, cmd, data) 43*40a360c2SBrad Bishop 44*40a360c2SBrad Bishop @dbus.service.method(DBUS_NAME, "yyyyyay", "x") 45*40a360c2SBrad Bishop def sendMessage(self, seq, netfn, lun, cmd, ccode, data): 46*40a360c2SBrad Bishop print "IPMI packet sent to host:" 47*40a360c2SBrad Bishop print_response(seq, netfn, lun, cmd, ccode, data) 48*40a360c2SBrad Bishop return 0 49*40a360c2SBrad Bishop 50*40a360c2SBrad Bishop @dbus.service.method(DBUS_NAME) 51*40a360c2SBrad Bishop def setAttention(self): 52*40a360c2SBrad Bishop print "IPMI SMS_ATN set" 53*40a360c2SBrad Bishop 54*40a360c2SBrad Bishopclass ConsoleReader(object): 55*40a360c2SBrad Bishop def __init__(self, ipmi_obj): 56*40a360c2SBrad Bishop self.buffer = '' 57*40a360c2SBrad Bishop self.seq = 0 58*40a360c2SBrad Bishop self.ipmi_obj = ipmi_obj 59*40a360c2SBrad Bishop flags = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL) 60*40a360c2SBrad Bishop flags |= os.O_NONBLOCK 61*40a360c2SBrad Bishop fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, flags) 62*40a360c2SBrad Bishop glib.io_add_watch(sys.stdin, glib.IO_IN, self.io_callback) 63*40a360c2SBrad Bishop 64*40a360c2SBrad Bishop def io_callback(self, fd, condition): 65*40a360c2SBrad Bishop chunk = fd.read() 66*40a360c2SBrad Bishop for char in chunk: 67*40a360c2SBrad Bishop self.buffer += char 68*40a360c2SBrad Bishop if char == '\n': 69*40a360c2SBrad Bishop self.line(self.buffer) 70*40a360c2SBrad Bishop self.buffer = '' 71*40a360c2SBrad Bishop 72*40a360c2SBrad Bishop return True 73*40a360c2SBrad Bishop 74*40a360c2SBrad Bishop def line(self, data): 75*40a360c2SBrad Bishop s = data.split(' ') 76*40a360c2SBrad Bishop if len(s) < 2: 77*40a360c2SBrad Bishop print "Not enough bytes to form a valid IPMI packet" 78*40a360c2SBrad Bishop return 79*40a360c2SBrad Bishop try: 80*40a360c2SBrad Bishop data = [int(c, 16) for c in s] 81*40a360c2SBrad Bishop except ValueError: 82*40a360c2SBrad Bishop return 83*40a360c2SBrad Bishop self.seq += 1 84*40a360c2SBrad Bishop self.ipmi_obj.ReceivedMessage(self.seq, data[0], 0, data[1], data[2:]) 85*40a360c2SBrad Bishop 86*40a360c2SBrad Bishopdef main(): 87*40a360c2SBrad Bishop dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 88*40a360c2SBrad Bishop bus = dbus.SystemBus() 89*40a360c2SBrad Bishop name = dbus.service.BusName(DBUS_NAME, bus) 90*40a360c2SBrad Bishop obj = IpmiDebug(bus, OBJ_NAME) 91*40a360c2SBrad Bishop mainloop = gobject.MainLoop() 92*40a360c2SBrad Bishop r = ConsoleReader(obj) 93*40a360c2SBrad Bishop 94*40a360c2SBrad Bishop print ("Enter IPMI packet as hex values. First three bytes will be used" 95*40a360c2SBrad Bishop "as netfn and cmd.\nlun will be zero.") 96*40a360c2SBrad Bishop mainloop.run() 97*40a360c2SBrad Bishop 98*40a360c2SBrad Bishopif __name__ == '__main__': 99*40a360c2SBrad Bishop sys.exit(main()) 100