blob: 8d19d1ecfc0da103251a7d7dcd67cae863568021 [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 James2656f332015-10-26 06:42:41 -050021class ChassisControlObject(Openbmc.DbusProperties):
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 James9e6acf92015-09-08 07:00:04 -050025 dbus.service.Object.__init__(self,bus,name)
Norman James90baede2015-09-02 20:32:49 -050026 ## load utilized objects
Norman James362a80f2015-09-14 14:04:39 -050027 self.dbus_objects = {
28 'power_control' : {
29 'bus_name' : 'org.openbmc.control.Power',
Norman Jamesa3e47c42015-10-18 14:43:10 -050030 'object_name' : '/org/openbmc/control/power0',
Norman James362a80f2015-09-14 14:04:39 -050031 'interface_name' : 'org.openbmc.control.Power'
32 },
33 'identify_led' : {
Norman Jamesa3e47c42015-10-18 14:43:10 -050034 'bus_name' : 'org.openbmc.control.led',
35 'object_name' : '/org/openbmc/led/IDENTIFY',
Norman James362a80f2015-09-14 14:04:39 -050036 'interface_name' : 'org.openbmc.Led'
Norman Jamesc07c4732015-10-26 07:12:58 -050037 },
38 'watchdog' : {
39 'bus_name' : 'org.openbmc.watchdog.Host',
Norman James8fee6f22015-10-28 12:48:43 -050040 'object_name' : '/org/openbmc/watchdog/host0',
Norman Jamesc07c4732015-10-26 07:12:58 -050041 'interface_name' : 'org.openbmc.Watchdog'
Norman James98e1f7b2015-11-24 22:17:56 -060042 },
43 'host_services' : {
44 'bus_name' : 'org.openbmc.HostServices',
45 'object_name' : '/org/openbmc/HostServices',
46 'interface_name' : 'org.openbmc.HostServices'
47 },
Norman James471ab592015-08-30 22:29:40 -050048 }
Norman James90baede2015-09-02 20:32:49 -050049
Adriana Kobylak08d3bdb2015-10-20 16:59:14 -050050 #uuid
Norman James2656f332015-10-26 06:42:41 -050051 self.Set(DBUS_NAME,"uuid",str(uuid.uuid1()))
52 self.Set(DBUS_NAME,"reboot",0)
53 self.Set(DBUS_NAME,"power_policy",0)
54 self.Set(DBUS_NAME,"last_system_state","")
Adriana Kobylak08d3bdb2015-10-20 16:59:14 -050055
Norman James471ab592015-08-30 22:29:40 -050056 bus.add_signal_receiver(self.power_button_signal_handler,
Norman Jamescfc2b442015-10-31 17:31:46 -050057 dbus_interface = "org.openbmc.Button", signal_name = "Released",
Norman James8fee6f22015-10-28 12:48:43 -050058 path="/org/openbmc/buttons/power0" )
Norman Jamescfc2b442015-10-31 17:31:46 -050059 bus.add_signal_receiver(self.reset_button_signal_handler,
Norman James807ed1f2015-11-09 10:53:03 -060060 dbus_interface = "org.openbmc.Button", signal_name = "PressedLong",
Norman Jamescfc2b442015-10-31 17:31:46 -050061 path="/org/openbmc/buttons/power0" )
62
Norman James9e6acf92015-09-08 07:00:04 -050063 bus.add_signal_receiver(self.host_watchdog_signal_handler,
64 dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
Norman James362a80f2015-09-14 14:04:39 -050065 bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
Norman Jamescfc2b442015-10-31 17:31:46 -050066 self.ObjectAdded(name,CONTROL_INTF)
Norman James471ab592015-08-30 22:29:40 -050067
Norman James9e6acf92015-09-08 07:00:04 -050068
Norman James362a80f2015-09-14 14:04:39 -050069 def getInterface(self,name):
70 o = self.dbus_objects[name]
71 obj = bus.get_object(o['bus_name'],o['object_name'])
72 return dbus.Interface(obj,o['interface_name'])
Norman Jamese2765102015-08-19 22:00:55 -050073
Norman Jamese2765102015-08-19 22:00:55 -050074
Norman James3f97c5d2015-08-26 17:44:14 -050075 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050076 in_signature='', out_signature='')
77 def setIdentify(self):
78 print "Turn on identify"
Norman James362a80f2015-09-14 14:04:39 -050079 intf = self.getInterface('identify_led')
80 intf.setOn()
Norman Jamese2765102015-08-19 22:00:55 -050081 return None
82
Norman James3f97c5d2015-08-26 17:44:14 -050083 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050084 in_signature='', out_signature='')
85 def clearIdentify(self):
Norman James362a80f2015-09-14 14:04:39 -050086 print "Turn on identify"
87 intf = self.getInterface('identify_led')
88 intf.setOff()
Norman Jamese2765102015-08-19 22:00:55 -050089 return None
90
Norman James3f97c5d2015-08-26 17:44:14 -050091 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050092 in_signature='', out_signature='')
Norman James362a80f2015-09-14 14:04:39 -050093 def powerOn(self):
Norman Jamese2765102015-08-19 22:00:55 -050094 print "Turn on power and boot"
Norman James2656f332015-10-26 06:42:41 -050095 self.Set(DBUS_NAME,"reboot",0)
Norman Jamese2765102015-08-19 22:00:55 -050096 if (self.getPowerState()==0):
Norman James362a80f2015-09-14 14:04:39 -050097 intf = self.getInterface('power_control')
98 intf.setPowerState(POWER_ON)
Norman Jamesc07c4732015-10-26 07:12:58 -050099 intfwatchdog = self.getInterface('watchdog')
Adriana Kobylak025d13f2015-10-22 12:45:24 -0500100 #Start watchdog with 30s timeout per the OpenPower Host IPMI Spec
101 #Once the host starts booting, it'll reset and refresh the timer
102 intfwatchdog.set(30000)
103 intfwatchdog.start()
Norman Jamese2765102015-08-19 22:00:55 -0500104 return None
105
Norman James3f97c5d2015-08-26 17:44:14 -0500106 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500107 in_signature='', out_signature='')
Norman James362a80f2015-09-14 14:04:39 -0500108 def powerOff(self):
Norman Jamese2765102015-08-19 22:00:55 -0500109 print "Turn off power"
Norman James362a80f2015-09-14 14:04:39 -0500110 intf = self.getInterface('power_control')
111 intf.setPowerState(POWER_OFF)
112 return None
113
114 @dbus.service.method(DBUS_NAME,
115 in_signature='', out_signature='')
116 def softPowerOff(self):
117 print "Soft off power"
Norman James98e1f7b2015-11-24 22:17:56 -0600118 intf = self.getInterface('host_services')
119 ## host services will call power off when ready
120 intf.SoftPowerOff()
Norman James362a80f2015-09-14 14:04:39 -0500121 return None
122
123 @dbus.service.method(DBUS_NAME,
124 in_signature='', out_signature='')
125 def reboot(self):
126 print "Rebooting"
Norman James8d2e3ef2015-11-17 19:34:25 -0600127 if self.getPowerState() == POWER_OFF:
Norman Jamescfc2b442015-10-31 17:31:46 -0500128 self.powerOn();
129 else:
130 self.Set(DBUS_NAME,"reboot",1)
Norman James8d2e3ef2015-11-17 19:34:25 -0600131 self.softPowerOff()
Norman Jamese2765102015-08-19 22:00:55 -0500132 return None
133
Norman James3f97c5d2015-08-26 17:44:14 -0500134 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500135 in_signature='', out_signature='i')
136 def getPowerState(self):
Norman James362a80f2015-09-14 14:04:39 -0500137 intf = self.getInterface('power_control')
138 return intf.getPowerState()
Norman Jamese2765102015-08-19 22:00:55 -0500139
Norman James3f97c5d2015-08-26 17:44:14 -0500140 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500141 in_signature='', out_signature='')
142 def setDebugMode(self):
143 return None
144
Norman James3f97c5d2015-08-26 17:44:14 -0500145 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500146 in_signature='i', out_signature='')
147 def setPowerPolicy(self,policy):
Norman James2656f332015-10-26 06:42:41 -0500148 self.Set(DBUS_NAME,"power_policy",policy)
Norman Jamese2765102015-08-19 22:00:55 -0500149 return None
150
Norman James9e6acf92015-09-08 07:00:04 -0500151
Norman Jamese2765102015-08-19 22:00:55 -0500152 ## Signal handler
Norman James362a80f2015-09-14 14:04:39 -0500153
154 def SystemStateHandler(self,state_name):
Norman James2656f332015-10-26 06:42:41 -0500155 self.Set(DBUS_NAME,"last_system_state",state_name)
156 if (state_name == "HOST_POWERED_OFF" and self.Get(DBUS_NAME,"reboot")==1):
Norman James362a80f2015-09-14 14:04:39 -0500157 self.powerOn()
158
159
Norman Jamese2765102015-08-19 22:00:55 -0500160 def power_button_signal_handler(self):
Norman James9e6acf92015-09-08 07:00:04 -0500161 # toggle power
Norman Jamese2765102015-08-19 22:00:55 -0500162 state = self.getPowerState()
Norman James2a3d20b2015-08-20 07:09:33 -0500163 if state == POWER_OFF:
Norman James362a80f2015-09-14 14:04:39 -0500164 self.powerOn()
Norman James2a3d20b2015-08-20 07:09:33 -0500165 elif state == POWER_ON:
Norman James362a80f2015-09-14 14:04:39 -0500166 self.powerOff();
Norman Jamese2765102015-08-19 22:00:55 -0500167
Norman Jamescfc2b442015-10-31 17:31:46 -0500168 def reset_button_signal_handler(self):
169 self.reboot();
170
Norman James9e6acf92015-09-08 07:00:04 -0500171 def host_watchdog_signal_handler(self):
Norman James362a80f2015-09-14 14:04:39 -0500172 print "Watchdog Error, Hard Rebooting"
Norman Jamesc07c4732015-10-26 07:12:58 -0500173 #self.Set(DBUS_NAME,"reboot",1)
174 #self.powerOff()
Norman James9e6acf92015-09-08 07:00:04 -0500175
Norman Jamese2765102015-08-19 22:00:55 -0500176
177if __name__ == '__main__':
178 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
179
Norman James5e792e32015-10-07 17:36:17 -0500180 bus = Openbmc.getDBus()
Norman James3f97c5d2015-08-26 17:44:14 -0500181 name = dbus.service.BusName(DBUS_NAME, bus)
182 obj = ChassisControlObject(bus, OBJ_NAME)
Norman James6f8d0422015-09-14 18:48:00 -0500183 mainloop = gobject.MainLoop()
Norman James81dbd352015-08-19 22:44:53 -0500184
Norman Jamese2765102015-08-19 22:00:55 -0500185 print "Running ChassisControlService"
186 mainloop.run()
187