blob: fbadcde11bea184e2dcba46d532b9d6f28ba1dd8 [file] [log] [blame]
Norman James42c1be82015-10-22 14:34:26 -05001#!/usr/bin/python -u
Norman Jamese2765102015-08-19 22:00:55 -05002
Norman James471ab592015-08-30 22:29:40 -05003import sys
Adriana Kobylak08d3bdb2015-10-20 16:59:14 -05004import uuid
Norman James6f8d0422015-09-14 18:48:00 -05005#from gi.repository import GObject
6import gobject
Norman Jamese2765102015-08-19 22:00:55 -05007import dbus
8import dbus.service
9import dbus.mainloop.glib
Norman James5e792e32015-10-07 17:36:17 -050010import Openbmc
Norman Jamese2765102015-08-19 22:00:55 -050011
Norman James3f97c5d2015-08-26 17:44:14 -050012DBUS_NAME = 'org.openbmc.control.Chassis'
Norman James8fee6f22015-10-28 12:48:43 -050013OBJ_NAME = '/org/openbmc/control/chassis0'
Norman Jamesa3e47c42015-10-18 14:43:10 -050014CONTROL_INTF = 'org.openbmc.Control'
Norman James3f97c5d2015-08-26 17:44:14 -050015
Norman James2a3d20b2015-08-20 07:09:33 -050016POWER_OFF = 0
17POWER_ON = 1
18
Norman James9e6acf92015-09-08 07:00:04 -050019BOOTED = 100
20
Norman James323ed972015-12-09 09:06:37 -060021class ChassisControlObject(Openbmc.DbusProperties,Openbmc.DbusObjectManager):
Norman Jamese2765102015-08-19 22:00:55 -050022 def __init__(self,bus,name):
Norman James471ab592015-08-30 22:29:40 -050023 self.dbus_objects = { }
Norman James2656f332015-10-26 06:42:41 -050024 Openbmc.DbusProperties.__init__(self)
Norman James323ed972015-12-09 09:06:37 -060025 Openbmc.DbusObjectManager.__init__(self)
Norman James9e6acf92015-09-08 07:00:04 -050026 dbus.service.Object.__init__(self,bus,name)
Norman James90baede2015-09-02 20:32:49 -050027 ## load utilized objects
Norman James362a80f2015-09-14 14:04:39 -050028 self.dbus_objects = {
29 'power_control' : {
30 'bus_name' : 'org.openbmc.control.Power',
Norman Jamesa3e47c42015-10-18 14:43:10 -050031 'object_name' : '/org/openbmc/control/power0',
Norman James362a80f2015-09-14 14:04:39 -050032 'interface_name' : 'org.openbmc.control.Power'
33 },
34 'identify_led' : {
Norman Jamesa3e47c42015-10-18 14:43:10 -050035 'bus_name' : 'org.openbmc.control.led',
Adriana Kobylak9c751042016-02-09 13:44:32 -060036 'object_name' : '/org/openbmc/control/led/identify',
Norman James362a80f2015-09-14 14:04:39 -050037 'interface_name' : 'org.openbmc.Led'
Norman Jamesc07c4732015-10-26 07:12:58 -050038 },
39 'watchdog' : {
40 'bus_name' : 'org.openbmc.watchdog.Host',
Norman James8fee6f22015-10-28 12:48:43 -050041 'object_name' : '/org/openbmc/watchdog/host0',
Norman Jamesc07c4732015-10-26 07:12:58 -050042 'interface_name' : 'org.openbmc.Watchdog'
Norman James98e1f7b2015-11-24 22:17:56 -060043 },
44 'host_services' : {
45 'bus_name' : 'org.openbmc.HostServices',
46 'object_name' : '/org/openbmc/HostServices',
47 'interface_name' : 'org.openbmc.HostServices'
48 },
Norman Jamesf5edb9e2016-01-31 13:32:24 -060049 'settings' : {
50 'bus_name' : 'org.openbmc.settings.Host',
51 'object_name' : '/org/openbmc/settings/host0',
52 'interface_name' : 'org.freedesktop.DBus.Properties'
53 },
Norman James471ab592015-08-30 22:29:40 -050054 }
Norman James90baede2015-09-02 20:32:49 -050055
Adriana Kobylak08d3bdb2015-10-20 16:59:14 -050056 #uuid
Norman James2656f332015-10-26 06:42:41 -050057 self.Set(DBUS_NAME,"uuid",str(uuid.uuid1()))
58 self.Set(DBUS_NAME,"reboot",0)
Adriana Kobylak08d3bdb2015-10-20 16:59:14 -050059
Norman James471ab592015-08-30 22:29:40 -050060 bus.add_signal_receiver(self.power_button_signal_handler,
Norman Jamescfc2b442015-10-31 17:31:46 -050061 dbus_interface = "org.openbmc.Button", signal_name = "Released",
Norman James8fee6f22015-10-28 12:48:43 -050062 path="/org/openbmc/buttons/power0" )
Norman Jamescfc2b442015-10-31 17:31:46 -050063 bus.add_signal_receiver(self.reset_button_signal_handler,
Norman James807ed1f2015-11-09 10:53:03 -060064 dbus_interface = "org.openbmc.Button", signal_name = "PressedLong",
Norman Jamescfc2b442015-10-31 17:31:46 -050065 path="/org/openbmc/buttons/power0" )
Kenc95eccd2015-12-19 07:02:34 +080066 bus.add_signal_receiver(self.softreset_button_signal_handler,
67 dbus_interface = "org.openbmc.Button", signal_name = "Released",
68 path="/org/openbmc/buttons/reset0" )
Norman Jamescfc2b442015-10-31 17:31:46 -050069
Norman James9e6acf92015-09-08 07:00:04 -050070 bus.add_signal_receiver(self.host_watchdog_signal_handler,
71 dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
Norman James72567ba2016-01-13 16:57:48 -060072
73 bus.add_signal_receiver(self.emergency_shutdown_signal_handler,
74 dbus_interface = "org.openbmc.SensorThresholds", signal_name = "Emergency")
75
Norman James362a80f2015-09-14 14:04:39 -050076 bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
Norman James323ed972015-12-09 09:06:37 -060077 self.InterfacesAdded(name,self.properties)
Norman James471ab592015-08-30 22:29:40 -050078
Norman James9e6acf92015-09-08 07:00:04 -050079
Norman James362a80f2015-09-14 14:04:39 -050080 def getInterface(self,name):
81 o = self.dbus_objects[name]
Norman James85f050b2015-12-18 14:58:20 -060082 obj = bus.get_object(o['bus_name'],o['object_name'],introspect=False)
Norman James362a80f2015-09-14 14:04:39 -050083 return dbus.Interface(obj,o['interface_name'])
Norman Jamese2765102015-08-19 22:00:55 -050084
Norman Jamese2765102015-08-19 22:00:55 -050085
Norman James3f97c5d2015-08-26 17:44:14 -050086 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050087 in_signature='', out_signature='')
88 def setIdentify(self):
89 print "Turn on identify"
Norman James362a80f2015-09-14 14:04:39 -050090 intf = self.getInterface('identify_led')
91 intf.setOn()
Norman Jamese2765102015-08-19 22:00:55 -050092 return None
93
Norman James3f97c5d2015-08-26 17:44:14 -050094 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050095 in_signature='', out_signature='')
96 def clearIdentify(self):
Norman James362a80f2015-09-14 14:04:39 -050097 print "Turn on identify"
98 intf = self.getInterface('identify_led')
99 intf.setOff()
Norman Jamese2765102015-08-19 22:00:55 -0500100 return None
101
Norman James3f97c5d2015-08-26 17:44:14 -0500102 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500103 in_signature='', out_signature='')
Norman James362a80f2015-09-14 14:04:39 -0500104 def powerOn(self):
Norman Jamese2765102015-08-19 22:00:55 -0500105 print "Turn on power and boot"
Norman James2656f332015-10-26 06:42:41 -0500106 self.Set(DBUS_NAME,"reboot",0)
Norman Jamese2765102015-08-19 22:00:55 -0500107 if (self.getPowerState()==0):
Norman James362a80f2015-09-14 14:04:39 -0500108 intf = self.getInterface('power_control')
109 intf.setPowerState(POWER_ON)
Norman Jamesc07c4732015-10-26 07:12:58 -0500110 intfwatchdog = self.getInterface('watchdog')
Adriana Kobylak025d13f2015-10-22 12:45:24 -0500111 #Start watchdog with 30s timeout per the OpenPower Host IPMI Spec
112 #Once the host starts booting, it'll reset and refresh the timer
113 intfwatchdog.set(30000)
114 intfwatchdog.start()
Norman Jamese2765102015-08-19 22:00:55 -0500115 return None
116
Norman James3f97c5d2015-08-26 17:44:14 -0500117 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500118 in_signature='', out_signature='')
Norman James362a80f2015-09-14 14:04:39 -0500119 def powerOff(self):
Norman Jamese2765102015-08-19 22:00:55 -0500120 print "Turn off power"
Adriana Kobylak5f7fe662016-02-04 12:39:06 -0600121 intfwatchdog = self.getInterface('watchdog')
122 intfwatchdog.stop()
Norman James362a80f2015-09-14 14:04:39 -0500123 intf = self.getInterface('power_control')
124 intf.setPowerState(POWER_OFF)
125 return None
126
127 @dbus.service.method(DBUS_NAME,
128 in_signature='', out_signature='')
129 def softPowerOff(self):
130 print "Soft off power"
Norman James98e1f7b2015-11-24 22:17:56 -0600131 intf = self.getInterface('host_services')
132 ## host services will call power off when ready
133 intf.SoftPowerOff()
Norman James362a80f2015-09-14 14:04:39 -0500134 return None
135
136 @dbus.service.method(DBUS_NAME,
137 in_signature='', out_signature='')
138 def reboot(self):
139 print "Rebooting"
Norman James8d2e3ef2015-11-17 19:34:25 -0600140 if self.getPowerState() == POWER_OFF:
Norman Jamescfc2b442015-10-31 17:31:46 -0500141 self.powerOn();
142 else:
143 self.Set(DBUS_NAME,"reboot",1)
Norman Jamesb4ef3182015-12-03 17:54:35 -0600144 self.powerOff()
145 return None
146
Norman Jamesb4bd9e22015-12-18 15:47:50 -0600147 @dbus.service.method(DBUS_NAME,
148 in_signature='', out_signature='')
Norman Jamesb4ef3182015-12-03 17:54:35 -0600149 def softReboot(self):
150 print "Soft Rebooting"
151 if self.getPowerState() == POWER_OFF:
152 self.powerOn();
153 else:
154 self.Set(DBUS_NAME,"reboot",1)
Norman James8d2e3ef2015-11-17 19:34:25 -0600155 self.softPowerOff()
Norman Jamese2765102015-08-19 22:00:55 -0500156 return None
157
Norman James3f97c5d2015-08-26 17:44:14 -0500158 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500159 in_signature='', out_signature='i')
160 def getPowerState(self):
Norman James362a80f2015-09-14 14:04:39 -0500161 intf = self.getInterface('power_control')
162 return intf.getPowerState()
Norman Jamese2765102015-08-19 22:00:55 -0500163
Norman Jamese2765102015-08-19 22:00:55 -0500164 ## Signal handler
Norman James362a80f2015-09-14 14:04:39 -0500165
166 def SystemStateHandler(self,state_name):
Norman Jamesf5edb9e2016-01-31 13:32:24 -0600167 if (state_name == "HOST_POWERED_OFF" or state_name == "HOST_POWERED_ON"):
168 intf = self.getInterface('settings')
169 intf.Set("org.openbmc.settings.Host","system_state",state_name)
170
Norman James2656f332015-10-26 06:42:41 -0500171 if (state_name == "HOST_POWERED_OFF" and self.Get(DBUS_NAME,"reboot")==1):
Norman James362a80f2015-09-14 14:04:39 -0500172 self.powerOn()
Norman James362a80f2015-09-14 14:04:39 -0500173
Norman Jamese2765102015-08-19 22:00:55 -0500174 def power_button_signal_handler(self):
Norman James9e6acf92015-09-08 07:00:04 -0500175 # toggle power
Norman Jamese2765102015-08-19 22:00:55 -0500176 state = self.getPowerState()
Norman James2a3d20b2015-08-20 07:09:33 -0500177 if state == POWER_OFF:
Norman James362a80f2015-09-14 14:04:39 -0500178 self.powerOn()
Norman James2a3d20b2015-08-20 07:09:33 -0500179 elif state == POWER_ON:
Norman James362a80f2015-09-14 14:04:39 -0500180 self.powerOff();
Norman Jamese2765102015-08-19 22:00:55 -0500181
Norman Jamescfc2b442015-10-31 17:31:46 -0500182 def reset_button_signal_handler(self):
183 self.reboot();
Kenc95eccd2015-12-19 07:02:34 +0800184
185 def softreset_button_signal_handler(self):
186 self.softReboot();
Norman Jamescfc2b442015-10-31 17:31:46 -0500187
Norman James9e6acf92015-09-08 07:00:04 -0500188 def host_watchdog_signal_handler(self):
Norman James362a80f2015-09-14 14:04:39 -0500189 print "Watchdog Error, Hard Rebooting"
Adriana Kobylakdbc81052016-02-08 15:48:21 -0600190 self.Set(DBUS_NAME,"reboot",1)
191 self.powerOff()
Norman James72567ba2016-01-13 16:57:48 -0600192
193 def emergency_shutdown_signal_handler(self):
194 print "Emergency Shutdown!"
195 self.powerOff()
196
Norman James9e6acf92015-09-08 07:00:04 -0500197
Norman Jamese2765102015-08-19 22:00:55 -0500198
199if __name__ == '__main__':
200 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
201
Norman James5e792e32015-10-07 17:36:17 -0500202 bus = Openbmc.getDBus()
Norman James3f97c5d2015-08-26 17:44:14 -0500203 name = dbus.service.BusName(DBUS_NAME, bus)
204 obj = ChassisControlObject(bus, OBJ_NAME)
Norman James6f8d0422015-09-14 18:48:00 -0500205 mainloop = gobject.MainLoop()
Norman James81dbd352015-08-19 22:44:53 -0500206
Norman Jamese2765102015-08-19 22:00:55 -0500207 print "Running ChassisControlService"
208 mainloop.run()
209