blob: aee294b7d8df18465ac1b68f3bb9a2b7b673296b [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
Andrew Jeffery0b6883d2017-10-11 22:08:55 +10305import argparse
Norman Jamesb4914ad2015-10-26 07:14:29 -05006
Andrew Jefferyde4ed022017-10-12 01:26:55 +10307from dbus.mainloop.glib import DBusGMainLoop
8import gobject
9
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +103010descriptors = {
Andrew Geisslercae038e2016-12-19 15:29:10 -060011 'power': {
12 'bus_name': 'org.openbmc.control.Power',
13 'object_name': '/org/openbmc/control/power0',
14 'interface_name': 'org.openbmc.control.Power'
15 },
Andrew Geissler2cbbb672017-05-17 10:52:49 -050016 'chassison': {
17 'bus_name': 'xyz.openbmc_project.State.Chassis',
18 'object_name': '/xyz/openbmc_project/state/chassis0',
19 'interface_name': 'xyz.openbmc_project.State.Chassis',
20 'property': 'RequestedPowerTransition',
Andrew Jefferyde4ed022017-10-12 01:26:55 +103021 'value': 'xyz.openbmc_project.State.Chassis.Transition.On',
22 'monitor': 'obmc-chassis-poweron@0.target',
Andrew Geissler2cbbb672017-05-17 10:52:49 -050023 },
24 'chassisoff': {
25 'bus_name': 'xyz.openbmc_project.State.Chassis',
26 'object_name': '/xyz/openbmc_project/state/chassis0',
27 'interface_name': 'xyz.openbmc_project.State.Chassis',
28 'property': 'RequestedPowerTransition',
Andrew Jefferyde4ed022017-10-12 01:26:55 +103029 'value': 'xyz.openbmc_project.State.Chassis.Transition.Off',
30 'monitor': 'obmc-chassis-hard-poweroff@0.target',
Andrew Geissler2cbbb672017-05-17 10:52:49 -050031 },
Andrew Geisslercae038e2016-12-19 15:29:10 -060032 'poweron': {
Andrew Geissler25b9a852016-12-19 16:14:09 -060033 'bus_name': 'xyz.openbmc_project.State.Host',
34 'object_name': '/xyz/openbmc_project/state/host0',
35 'interface_name': 'xyz.openbmc_project.State.Host',
36 'property': 'RequestedHostTransition',
Andrew Jefferyde4ed022017-10-12 01:26:55 +103037 'value': 'xyz.openbmc_project.State.Host.Transition.On',
38 'monitor': 'obmc-host-start@0.target',
Andrew Geisslercae038e2016-12-19 15:29:10 -060039 },
40 'poweroff': {
Andrew Geissler25b9a852016-12-19 16:14:09 -060041 'bus_name': 'xyz.openbmc_project.State.Host',
42 'object_name': '/xyz/openbmc_project/state/host0',
43 'interface_name': 'xyz.openbmc_project.State.Host',
44 'property': 'RequestedHostTransition',
Andrew Jefferyde4ed022017-10-12 01:26:55 +103045 'value': 'xyz.openbmc_project.State.Host.Transition.Off',
46 'monitor': 'obmc-host-stop@0.target',
Andrew Geisslercae038e2016-12-19 15:29:10 -060047 },
Andrew Geissler8f8cbce2017-02-20 16:10:26 -060048 'bmcstate': {
49 'bus_name': 'xyz.openbmc_project.State.BMC',
50 'object_name': '/xyz/openbmc_project/state/bmc0',
51 'interface_name': 'xyz.openbmc_project.State.BMC',
52 'property': 'CurrentBMCState',
53 },
54 'chassisstate': {
55 'bus_name': 'xyz.openbmc_project.State.Chassis',
56 'object_name': '/xyz/openbmc_project/state/chassis0',
57 'interface_name': 'xyz.openbmc_project.State.Chassis',
58 'property': 'CurrentPowerState',
59 },
60 'hoststate': {
61 'bus_name': 'xyz.openbmc_project.State.Host',
62 'object_name': '/xyz/openbmc_project/state/host0',
63 'interface_name': 'xyz.openbmc_project.State.Host',
64 'property': 'CurrentHostState',
Andrew Geisslercae038e2016-12-19 15:29:10 -060065 },
66 'bootprogress': {
George Keishing3be09952017-08-18 09:48:03 -050067 'bus_name': 'xyz.openbmc_project.State.Host',
68 'object_name': '/xyz/openbmc_project/state/host0',
69 'interface_name': 'xyz.openbmc_project.State.Boot.Progress',
70 'property': 'BootProgress',
Andrew Geisslercae038e2016-12-19 15:29:10 -060071 },
Andrew Jeffery0b6883d2017-10-11 22:08:55 +103072 'state' : ['bmcstate', 'chassisstate', 'hoststate']
Norman Jamesb4914ad2015-10-26 07:14:29 -050073}
74
Andrew Jefferyde4ed022017-10-12 01:26:55 +103075def run_set_property(dbus_bus, dbus_iface, descriptor, args):
76 mainloop = gobject.MainLoop()
77
78 iface = descriptor['interface_name']
79 prop = descriptor['property']
80
81 if 'monitor' not in descriptor:
82 dbus_iface.Set(iface, prop, descriptor['value'])
83 return True
84
85 def property_listener(job, path, unit, state):
86 if descriptor['monitor'] != unit:
87 return
88
89 property_listener.success = (state == 'done')
90 mainloop.quit()
91
92 property_listener.success = True
93
94 if args.wait:
95 sig_match = dbus_bus.add_signal_receiver(property_listener, "JobRemoved")
96
97 dbus_iface.Set(iface, prop, descriptor['value'])
98
99 if args.wait:
100 mainloop.run()
101 sig_match.remove()
102
103 return property_listener.success
104
105def run_one_command(dbus_bus, descriptor, args):
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +1030106 bus = descriptor['bus_name']
107 obj = descriptor['object_name']
108 iface = descriptor['interface_name']
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030109 dbus_obj = dbus_bus.get_object(bus, obj)
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030110 result = None
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030111
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +1030112 if (descriptor.has_key('property')):
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030113 dbus_iface = dbus.Interface(dbus_obj, "org.freedesktop.DBus.Properties")
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +1030114 if descriptor.has_key('value'):
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030115 result = run_set_property(dbus_bus, dbus_iface, descriptor, args)
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030116 else:
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030117 prop = descriptor['property']
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030118 dbus_prop = dbus_iface.Get(iface, prop)
119 print '{:<20}: {}'.format(prop, str(dbus_prop))
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030120 result = True
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030121 else:
122 dbus_iface = dbus.Interface(dbus_obj, "org.freedesktop.DBus.Properties")
123 props = dbus_iface.GetAll(iface)
124 for p in props:
Andrew Jefferybba82bd2017-10-11 22:20:30 +1030125 print "{} = {}".format(p, str(props[p]))
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030126 result = True
Andrew Jefferye4dcaef2017-10-11 18:08:01 +1030127
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030128 return result
129
130def run_all_commands(dbus_bus, recipe, args):
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +1030131 if isinstance(recipe, dict):
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030132 return run_one_command(dbus_bus, recipe, args)
Andrew Jeffery7b376e72017-10-11 18:12:05 +1030133
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +1030134 assert isinstance(recipe, list)
135 for command in recipe:
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030136 descriptor = descriptors[command]
137 if not run_one_command(dbus_bus, descriptor, args):
138 print "Failed to execute command: {}".format(descriptor)
139 return False
140
141 return True
Andrew Jeffery7b376e72017-10-11 18:12:05 +1030142
Andrew Jeffery44e6d9c2017-10-11 16:57:31 +1030143def main():
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030144 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
145
Andrew Jeffery0b6883d2017-10-11 22:08:55 +1030146 parser = argparse.ArgumentParser()
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030147 parser.add_argument('--wait', '-w', action='store_true',
148 help='Block until the state transition succeeds or fails')
Andrew Jefferyc6b5deb2017-10-11 22:18:27 +1030149 parser.add_argument('recipe', choices=sorted(descriptors.keys()))
Andrew Jeffery0b6883d2017-10-11 22:08:55 +1030150 args = parser.parse_args()
Andrew Geissler8f8cbce2017-02-20 16:10:26 -0600151
Andrew Jefferybdb74352017-10-11 17:29:48 +1030152 dbus_bus = dbus.SystemBus()
Andrew Jeffery0b6883d2017-10-11 22:08:55 +1030153 try:
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030154 return run_all_commands(dbus_bus, descriptors[args.recipe], args)
Andrew Jeffery0b6883d2017-10-11 22:08:55 +1030155 finally:
156 dbus_bus.close()
Andrew Jeffery44e6d9c2017-10-11 16:57:31 +1030157
158if __name__ == "__main__":
Andrew Jefferyde4ed022017-10-12 01:26:55 +1030159 sys.exit(0 if main() else 1)