xref: /openbmc/skeleton/pyipmitest/ipmi_debug.py (revision 40a360c2)
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