blob: 7cf0d932303ab2b5ae778e4b036d006885303dc5 [file] [log] [blame]
Norman Jamesb4914ad2015-10-26 07:14:29 -05001#!/usr/bin/python
2
3import sys
Norman Jamesfacbca42015-11-09 15:58:14 -06004#import subprocess
Norman Jamesb4914ad2015-10-26 07:14:29 -05005import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9import xml.etree.ElementTree as ET
Norman Jamesfacbca42015-11-09 15:58:14 -060010import json
Norman Jamesb4914ad2015-10-26 07:14:29 -050011
Norman James8cda6de2015-11-17 19:35:45 -060012
13def fix_byte(it,key,parent):
14 if (isinstance(it,dbus.Array)):
15 for i in range(0,len(it)):
16 traverse_it(it[i],i,it)
17 elif (isinstance(it, dict)):
18 for key in it.keys():
19 traverse_it(it[key],key,it)
20 elif (isinstance(it,dbus.Byte)):
21 if (key != None):
22 parent[key] = int(it)
23 else:
24 pass
25
Norman Jamesb4914ad2015-10-26 07:14:29 -050026
27def printDict(name,data):
Norman James8cda6de2015-11-17 19:35:45 -060028 if (isinstance(data, dict)):
Norman Jamesb4914ad2015-10-26 07:14:29 -050029 print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
30 print name
31 for p in data:
32 printDict(p,data[p])
33 else:
34 print name+" = "+str(data)
35
36def introspect(bus_name,obj_path,intf_name,method_name):
37 obj = bus.get_object(bus_name,obj_path)
38 introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
39 tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
40 #print method_name
41 #print introspect_iface.Introspect()
42 root = tree.getroot()
43 found = False
44 for node in root.iter('node'):
45 for intf in node.iter('interface'):
46 if (intf.attrib['name'] == intf_name):
47 for method in intf.iter('method'):
48 if (method.attrib['name'] == method_name):
49 for ar in method.iter('arg'):
50 if (ar.attrib['direction'] == "in"):
51 print "\t"+ar.attrib['name']+" ("+ar.attrib['type']+")"
52 found = True
53
54 return found
55
56
57dbus_objects = {
58 'power' : {
59 'bus_name' : 'org.openbmc.control.Power',
60 'object_name' : '/org/openbmc/control/power0',
61 'interface_name' : 'org.openbmc.control.Power'
62 },
63 'identify_led' : {
64 'bus_name' : 'org.openbmc.control.led',
Norman Jamesa23e7b82015-10-28 19:00:07 -050065 'object_name' : '/org/openbmc/control/led/IDENTIFY',
Norman Jamesb4914ad2015-10-26 07:14:29 -050066 'interface_name' : 'org.openbmc.Led'
67 },
68 'chassis' : {
69 'bus_name' : 'org.openbmc.control.Chassis',
70 'object_name' : '/org/openbmc/control/chassis0',
71 'interface_name' : 'org.openbmc.control.Chassis'
72 },
73 'poweron' : {
74 'bus_name' : 'org.openbmc.control.Chassis',
75 'object_name' : '/org/openbmc/control/chassis0',
76 'interface_name' : 'org.openbmc.control.Chassis',
77 'method' : 'powerOn',
78 },
79 'poweroff' : {
80 'bus_name' : 'org.openbmc.control.Chassis',
81 'object_name' : '/org/openbmc/control/chassis0',
82 'interface_name' : 'org.openbmc.control.Chassis',
83 'method' : 'powerOff',
84 },
85 'getsystemstate' : {
86 'bus_name' : 'org.openbmc.managers.System',
87 'object_name' : '/org/openbmc/managers/System',
88 'interface_name' : 'org.openbmc.managers.System',
89 'method' : 'getSystemState',
90 },
91 'bootprogress' : {
92 'bus_name' : 'org.openbmc.sensor.Power8Virtual',
93 'object_name' : '/org/openbmc/sensor/virtual/BootProgress',
94 'interface_name' : 'org.openbmc.SensorValue'
95 },
96 'updatebios' : {
97 'bus_name' : 'org.openbmc.control.Flash',
98 'object_name' : '/org/openbmc/control/flash/bios',
99 'interface_name' : 'org.openbmc.Flash',
100 'method' : 'updateViaTftp',
101 },
Norman Jamesfacbca42015-11-09 15:58:14 -0600102 'bios' : {
103 'bus_name' : 'org.openbmc.control.Flash',
104 'object_name' : '/org/openbmc/control/flash/bios',
105 'interface_name' : 'org.openbmc.Flash',
106 },
Norman Jamesb4914ad2015-10-26 07:14:29 -0500107 'getinventory' : {
108 'bus_name' : 'org.openbmc.managers.Inventory',
109 'object_name' : '/org/openbmc/inventory',
110 'interface_name' : 'org.openbmc.Object.Enumerate',
111 'method' : 'enumerate'
112 },
113 'getsensors' : {
114 'bus_name' : 'org.openbmc.managers.Sensors',
115 'object_name' : '/org/openbmc/sensors',
116 'interface_name' : 'org.openbmc.Object.Enumerate',
117 'method' : 'enumerate'
118 },
119 'inventorytest' : {
120 'bus_name' : 'org.openbmc.managers.Inventory',
121 'object_name' : '/org/openbmc/inventory/system/chassis/motherboard/cpu0',
122 'interface_name' : 'org.openbmc.InventoryItem',
123 'method' : 'update'
124 },
125
126}
127
128bus = dbus.SystemBus()
129
130
131if (len(sys.argv) == 1):
132 print "Usage: obmcutil [command] [[method] [*args]]"
133 print "\tIf [method] is blank, then all properties are printed\n"
134 print "Available commands:"
135 for name in dbus_objects:
136 m = ""
137 if (dbus_objects[name].has_key('method') == True):
138 m=" ("+dbus_objects[name]['interface_name']+"->"+dbus_objects[name]['method']+")"
139 print "\t"+name+m
140 exit(0)
141
142method_name = ""
143
144sys.argv.pop(0)
145objinfo = dbus_objects[sys.argv.pop(0)]
146
147if (objinfo.has_key('method')):
148 method_name = objinfo['method']
149elif (len(sys.argv)>0):
150 ## if command line args left and method not specified
151 ## then next arg must be method name
152 method_name = sys.argv.pop(0)
153
154bus_name = objinfo['bus_name']
155obj_path = objinfo['object_name']
156intf_name = objinfo['interface_name']
157obj = bus.get_object(bus_name,obj_path)
158
159if (method_name == ""):
160 intf = dbus.Interface(obj,"org.freedesktop.DBus.Properties")
161 props = intf.GetAll(intf_name)
162 for p in props:
163 print p+" = "+str(props[p])
164
165else:
166 methd = obj.get_dbus_method(method_name,intf_name)
167 try:
Norman James26f7dca2015-10-26 12:15:09 -0500168 ## too hard to do dicts from command line
169 ## hack just to test fru update function
Norman Jamesb4914ad2015-10-26 07:14:29 -0500170 if (method_name == "update"):
Norman James26f7dca2015-10-26 12:15:09 -0500171 tmp = { 'manufacturer' : sys.argv[0], 'part_num' : '3Nxxxx' }
Norman Jamesb4914ad2015-10-26 07:14:29 -0500172 methd(tmp)
173 else:
174 data = methd(*sys.argv)
Norman James8cda6de2015-11-17 19:35:45 -0600175 fix_byte(data)
Norman Jamesfacbca42015-11-09 15:58:14 -0600176 pydata = json.loads(json.dumps(data))
177 printDict("",pydata)
Norman Jamesb4914ad2015-10-26 07:14:29 -0500178 except Exception as e:
Norman James26f7dca2015-10-26 12:15:09 -0500179 print e
Norman Jamesb4914ad2015-10-26 07:14:29 -0500180 r = introspect(bus_name,obj_path,intf_name,method_name)
181 if (r == False):
182 print "ERROR: Invalid method: "+method_name
183 else:
184 print "ERROR: Incorrect arguments passed to method"
185
186
187