blob: 02c2c2ccbc73aee0ec8adc5b675906858d0dd2e7 [file] [log] [blame]
Norman Jamesb4914ad2015-10-26 07:14:29 -05001#!/usr/bin/python
2
3import sys
Norman Jamesb4914ad2015-10-26 07:14:29 -05004import dbus
Norman Jamesfacbca42015-11-09 15:58:14 -06005import json
Brad Bishop3cec2962016-06-21 20:51:54 -04006import xml.etree.ElementTree as ET
Norman Jamesb4914ad2015-10-26 07:14:29 -05007
Norman James8cda6de2015-11-17 19:35:45 -06008
9def fix_byte(it,key,parent):
10 if (isinstance(it,dbus.Array)):
11 for i in range(0,len(it)):
Norman James9e9eba12015-11-19 16:05:57 -060012 fix_byte(it[i],i,it)
Norman James8cda6de2015-11-17 19:35:45 -060013 elif (isinstance(it, dict)):
14 for key in it.keys():
Norman James9e9eba12015-11-19 16:05:57 -060015 fix_byte(it[key],key,it)
Norman James8cda6de2015-11-17 19:35:45 -060016 elif (isinstance(it,dbus.Byte)):
17 if (key != None):
18 parent[key] = int(it)
19 else:
20 pass
21
Norman Jamesb4914ad2015-10-26 07:14:29 -050022
23def printDict(name,data):
Norman James8cda6de2015-11-17 19:35:45 -060024 if (isinstance(data, dict)):
Norman Jamesb4914ad2015-10-26 07:14:29 -050025 print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
26 print name
Norman James9e9eba12015-11-19 16:05:57 -060027 for p in sorted(data.keys()):
Norman Jamesb4914ad2015-10-26 07:14:29 -050028 printDict(p,data[p])
29 else:
30 print name+" = "+str(data)
31
32def introspect(bus_name,obj_path,intf_name,method_name):
33 obj = bus.get_object(bus_name,obj_path)
34 introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
35 tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
36 #print method_name
37 #print introspect_iface.Introspect()
38 root = tree.getroot()
39 found = False
40 for node in root.iter('node'):
41 for intf in node.iter('interface'):
42 if (intf.attrib['name'] == intf_name):
43 for method in intf.iter('method'):
44 if (method.attrib['name'] == method_name):
45 for ar in method.iter('arg'):
46 if (ar.attrib['direction'] == "in"):
47 print "\t"+ar.attrib['name']+" ("+ar.attrib['type']+")"
48 found = True
49
50 return found
51
52
53dbus_objects = {
54 'power' : {
55 'bus_name' : 'org.openbmc.control.Power',
56 'object_name' : '/org/openbmc/control/power0',
57 'interface_name' : 'org.openbmc.control.Power'
58 },
59 'identify_led' : {
60 'bus_name' : 'org.openbmc.control.led',
Adriana Kobylak9c751042016-02-09 13:44:32 -060061 'object_name' : '/org/openbmc/control/led/identify',
Norman Jamesb4914ad2015-10-26 07:14:29 -050062 'interface_name' : 'org.openbmc.Led'
63 },
64 'chassis' : {
65 'bus_name' : 'org.openbmc.control.Chassis',
66 'object_name' : '/org/openbmc/control/chassis0',
67 'interface_name' : 'org.openbmc.control.Chassis'
68 },
69 'poweron' : {
70 'bus_name' : 'org.openbmc.control.Chassis',
71 'object_name' : '/org/openbmc/control/chassis0',
72 'interface_name' : 'org.openbmc.control.Chassis',
73 'method' : 'powerOn',
74 },
75 'poweroff' : {
76 'bus_name' : 'org.openbmc.control.Chassis',
77 'object_name' : '/org/openbmc/control/chassis0',
78 'interface_name' : 'org.openbmc.control.Chassis',
79 'method' : 'powerOff',
80 },
Norman James9e9eba12015-11-19 16:05:57 -060081 'state' : {
Norman Jamesb4914ad2015-10-26 07:14:29 -050082 'bus_name' : 'org.openbmc.managers.System',
83 'object_name' : '/org/openbmc/managers/System',
84 'interface_name' : 'org.openbmc.managers.System',
85 'method' : 'getSystemState',
86 },
87 'bootprogress' : {
Norman James323ed972015-12-09 09:06:37 -060088 'bus_name' : 'org.openbmc.Sensors',
89 'object_name' : '/org/openbmc/sensors/host/BootProgress',
Norman Jamesb4914ad2015-10-26 07:14:29 -050090 'interface_name' : 'org.openbmc.SensorValue'
91 },
Norman James9e9eba12015-11-19 16:05:57 -060092 'biosupdate' : {
Norman Jamesb4914ad2015-10-26 07:14:29 -050093 'bus_name' : 'org.openbmc.control.Flash',
94 'object_name' : '/org/openbmc/control/flash/bios',
95 'interface_name' : 'org.openbmc.Flash',
96 'method' : 'updateViaTftp',
97 },
Norman James9e9eba12015-11-19 16:05:57 -060098 'biosflash' : {
Norman Jamesfacbca42015-11-09 15:58:14 -060099 'bus_name' : 'org.openbmc.control.Flash',
100 'object_name' : '/org/openbmc/control/flash/bios',
101 'interface_name' : 'org.openbmc.Flash',
102 },
Norman James9e9eba12015-11-19 16:05:57 -0600103 'bmcupdate' : {
Norman James8a65a542016-02-03 19:04:44 -0600104 'bus_name' : 'org.openbmc.control.BmcFlash',
Norman James9e9eba12015-11-19 16:05:57 -0600105 'object_name' : '/org/openbmc/control/flash/bmc',
Norman James8a65a542016-02-03 19:04:44 -0600106 'interface_name' : 'org.openbmc.control.BmcFlash',
Norman James9e9eba12015-11-19 16:05:57 -0600107 'method' : 'updateViaTftp',
108 },
109 'bmcflash' : {
Norman James8a65a542016-02-03 19:04:44 -0600110 'bus_name' : 'org.openbmc.control.BmcFlash',
Norman James9e9eba12015-11-19 16:05:57 -0600111 'object_name' : '/org/openbmc/control/flash/bmc',
Norman James8a65a542016-02-03 19:04:44 -0600112 'interface_name' : 'org.openbmc.control.BmcFlash',
Norman James9e9eba12015-11-19 16:05:57 -0600113 },
Norman Jamesb4914ad2015-10-26 07:14:29 -0500114 'getinventory' : {
Norman James323ed972015-12-09 09:06:37 -0600115 'bus_name' : 'org.openbmc.Inventory',
Norman Jamesb4914ad2015-10-26 07:14:29 -0500116 'object_name' : '/org/openbmc/inventory',
117 'interface_name' : 'org.openbmc.Object.Enumerate',
118 'method' : 'enumerate'
119 },
120 'getsensors' : {
Norman James323ed972015-12-09 09:06:37 -0600121 'bus_name' : 'org.openbmc.Sensors',
Norman Jamesb4914ad2015-10-26 07:14:29 -0500122 'object_name' : '/org/openbmc/sensors',
123 'interface_name' : 'org.openbmc.Object.Enumerate',
124 'method' : 'enumerate'
125 },
Norman Jamesc9415752015-11-30 11:55:14 -0600126 'host' : {
127 'bus_name' : 'org.openbmc.control.Host',
128 'object_name' : '/org/openbmc/control/host0',
129 'interface_name' : 'org.openbmc.control.Host',
130 },
131 'setdebugmode' : {
132 'bus_name' : 'org.openbmc.control.Host',
133 'object_name' : '/org/openbmc/control/host0',
134 'interface_name' : 'org.openbmc.control.Host',
135 'property' : 'debug_mode'
136 },
Norman Jamesb4914ad2015-10-26 07:14:29 -0500137}
138
139bus = dbus.SystemBus()
140
141
Norman James323ed972015-12-09 09:06:37 -0600142if (len(sys.argv) == 1 or sys.argv[1] == "-h" or dbus_objects.has_key(sys.argv[1])==False):
Norman Jamesb4914ad2015-10-26 07:14:29 -0500143 print "Usage: obmcutil [command] [[method] [*args]]"
144 print "\tIf [method] is blank, then all properties are printed\n"
145 print "Available commands:"
Norman James9e9eba12015-11-19 16:05:57 -0600146 for name in sorted(dbus_objects.keys()):
Norman Jamesb4914ad2015-10-26 07:14:29 -0500147 m = ""
148 if (dbus_objects[name].has_key('method') == True):
149 m=" ("+dbus_objects[name]['interface_name']+"->"+dbus_objects[name]['method']+")"
Norman Jamesc9415752015-11-30 11:55:14 -0600150 elif (dbus_objects[name].has_key('property') == True):
151 m=" ("+dbus_objects[name]['interface_name']+"->"+dbus_objects[name]['property']+")"
152
Norman Jamesb4914ad2015-10-26 07:14:29 -0500153 print "\t"+name+m
154 exit(0)
155
156method_name = ""
Norman Jamesc9415752015-11-30 11:55:14 -0600157property_name = ""
Norman Jamesb4914ad2015-10-26 07:14:29 -0500158
159sys.argv.pop(0)
160objinfo = dbus_objects[sys.argv.pop(0)]
161
162if (objinfo.has_key('method')):
163 method_name = objinfo['method']
Norman Jamesc9415752015-11-30 11:55:14 -0600164elif (objinfo.has_key('property')):
165 property_name = objinfo['property']
Norman Jamesb4914ad2015-10-26 07:14:29 -0500166elif (len(sys.argv)>0):
167 ## if command line args left and method not specified
168 ## then next arg must be method name
169 method_name = sys.argv.pop(0)
170
171bus_name = objinfo['bus_name']
172obj_path = objinfo['object_name']
173intf_name = objinfo['interface_name']
Norman James481a5dd2016-01-20 10:36:15 -0600174obj = bus.get_object(bus_name,obj_path)
Norman Jamesb4914ad2015-10-26 07:14:29 -0500175
Norman Jamesc9415752015-11-30 11:55:14 -0600176if (method_name != ""):
Norman Jamesb4914ad2015-10-26 07:14:29 -0500177 methd = obj.get_dbus_method(method_name,intf_name)
178 try:
Norman James9e9eba12015-11-19 16:05:57 -0600179 data = methd(*sys.argv)
Norman Jamesc9415752015-11-30 11:55:14 -0600180 fix_byte(data,None,None)
Norman James9e9eba12015-11-19 16:05:57 -0600181 pydata = json.loads(json.dumps(data))
182 printDict("",pydata)
Norman Jamesb4914ad2015-10-26 07:14:29 -0500183 except Exception as e:
Norman James26f7dca2015-10-26 12:15:09 -0500184 print e
Norman Jamesb4914ad2015-10-26 07:14:29 -0500185 r = introspect(bus_name,obj_path,intf_name,method_name)
186 if (r == False):
187 print "ERROR: Invalid method: "+method_name
188 else:
189 print "ERROR: Incorrect arguments passed to method"
Norman Jamesc9415752015-11-30 11:55:14 -0600190elif (property_name != ""):
191 intf = dbus.Interface(obj,"org.freedesktop.DBus.Properties")
192 property_value = eval(sys.argv.pop(0))
193 intf.Set(intf_name,property_name,property_value)
194else:
195 intf = dbus.Interface(obj,"org.freedesktop.DBus.Properties")
196 props = intf.GetAll(intf_name)
197 for p in props:
198 print p+" = "+str(props[p])
199
Norman Jamesb4914ad2015-10-26 07:14:29 -0500200
201