blob: 455030b3ac17bfce4fc3a0ffa34612920e00e3b4 [file] [log] [blame]
Norman Jamese2765102015-08-19 22:00:55 -05001#!/usr/bin/env python
2
Norman James471ab592015-08-30 22:29:40 -05003import sys
Norman James5d78b4d2015-09-05 13:34:34 -05004from gi.repository import GObject
Norman Jamese2765102015-08-19 22:00:55 -05005import dbus
6import dbus.service
7import dbus.mainloop.glib
8
Norman James3f97c5d2015-08-26 17:44:14 -05009DBUS_NAME = 'org.openbmc.control.Chassis'
Norman James362a80f2015-09-14 14:04:39 -050010OBJ_NAME = '/org/openbmc/control/'+sys.argv[1]
Norman James3f97c5d2015-08-26 17:44:14 -050011
Norman James2a3d20b2015-08-20 07:09:33 -050012POWER_OFF = 0
13POWER_ON = 1
14
Norman James9e6acf92015-09-08 07:00:04 -050015BOOTED = 100
16
Norman Jamese2765102015-08-19 22:00:55 -050017class ChassisControlObject(dbus.service.Object):
18 def __init__(self,bus,name):
Norman James471ab592015-08-30 22:29:40 -050019 self.dbus_objects = { }
Norman James90baede2015-09-02 20:32:49 -050020
Norman James9e6acf92015-09-08 07:00:04 -050021 dbus.service.Object.__init__(self,bus,name)
Norman James90baede2015-09-02 20:32:49 -050022 ## load utilized objects
Norman James362a80f2015-09-14 14:04:39 -050023 self.dbus_objects = {
24 'power_control' : {
25 'bus_name' : 'org.openbmc.control.Power',
26 'object_name' : '/org/openbmc/control/SystemPower_0',
27 'interface_name' : 'org.openbmc.control.Power'
28 },
29 'identify_led' : {
30 'bus_name' : 'org.openbmc.leds.ChassisIdentify',
31 'object_name' : '/org/openbmc/leds/ChassisIdentify_0',
32 'interface_name' : 'org.openbmc.Led'
33 }
Norman James471ab592015-08-30 22:29:40 -050034 }
Norman James362a80f2015-09-14 14:04:39 -050035 #self.power_sequence = 0
Norman James9e6acf92015-09-08 07:00:04 -050036 self.reboot = 0
37 self.last_power_state = 0
Norman James90baede2015-09-02 20:32:49 -050038
Norman James9e6acf92015-09-08 07:00:04 -050039 bus = dbus.SessionBus()
Norman James90baede2015-09-02 20:32:49 -050040
Norman Jamese2765102015-08-19 22:00:55 -050041
Norman James471ab592015-08-30 22:29:40 -050042 bus.add_signal_receiver(self.power_button_signal_handler,
43 dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed",
Norman James362a80f2015-09-14 14:04:39 -050044 path="/org/openbmc/buttons/PowerButton_0" )
Norman James9e6acf92015-09-08 07:00:04 -050045 bus.add_signal_receiver(self.host_watchdog_signal_handler,
46 dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
Norman James362a80f2015-09-14 14:04:39 -050047 bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
Norman James471ab592015-08-30 22:29:40 -050048
Norman James9e6acf92015-09-08 07:00:04 -050049
Norman James362a80f2015-09-14 14:04:39 -050050 def getInterface(self,name):
51 o = self.dbus_objects[name]
52 obj = bus.get_object(o['bus_name'],o['object_name'])
53 return dbus.Interface(obj,o['interface_name'])
Norman Jamese2765102015-08-19 22:00:55 -050054
Norman James3f97c5d2015-08-26 17:44:14 -050055 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050056 in_signature='', out_signature='s')
57 def getID(self):
58 return id
59
Norman James3f97c5d2015-08-26 17:44:14 -050060 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050061 in_signature='', out_signature='')
62 def setIdentify(self):
63 print "Turn on identify"
Norman James362a80f2015-09-14 14:04:39 -050064 intf = self.getInterface('identify_led')
65 intf.setOn()
Norman Jamese2765102015-08-19 22:00:55 -050066 return None
67
Norman James3f97c5d2015-08-26 17:44:14 -050068 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050069 in_signature='', out_signature='')
70 def clearIdentify(self):
Norman James362a80f2015-09-14 14:04:39 -050071 print "Turn on identify"
72 intf = self.getInterface('identify_led')
73 intf.setOff()
Norman Jamese2765102015-08-19 22:00:55 -050074 return None
75
Norman James3f97c5d2015-08-26 17:44:14 -050076 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050077 in_signature='', out_signature='')
Norman James362a80f2015-09-14 14:04:39 -050078 def powerOn(self):
Norman Jamese2765102015-08-19 22:00:55 -050079 print "Turn on power and boot"
Norman James9e6acf92015-09-08 07:00:04 -050080 self.reboot = 0
Norman Jamese2765102015-08-19 22:00:55 -050081 if (self.getPowerState()==0):
Norman James362a80f2015-09-14 14:04:39 -050082 intf = self.getInterface('power_control')
83 intf.setPowerState(POWER_ON)
Norman Jamese2765102015-08-19 22:00:55 -050084 return None
85
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='')
Norman James362a80f2015-09-14 14:04:39 -050088 def powerOff(self):
Norman Jamese2765102015-08-19 22:00:55 -050089 print "Turn off power"
Norman James362a80f2015-09-14 14:04:39 -050090 intf = self.getInterface('power_control')
91 intf.setPowerState(POWER_OFF)
92 return None
93
94 @dbus.service.method(DBUS_NAME,
95 in_signature='', out_signature='')
96 def softPowerOff(self):
97 print "Soft off power"
98 ## Somehow tell host to shutdown via ipmi
99 return None
100
101 @dbus.service.method(DBUS_NAME,
102 in_signature='', out_signature='')
103 def reboot(self):
104 print "Rebooting"
105 self.reboot=1
106 intf.softPowerOff()
Norman Jamese2765102015-08-19 22:00:55 -0500107 return None
108
Norman James3f97c5d2015-08-26 17:44:14 -0500109 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500110 in_signature='', out_signature='i')
111 def getPowerState(self):
Norman James362a80f2015-09-14 14:04:39 -0500112 intf = self.getInterface('power_control')
113 return intf.getPowerState()
Norman Jamese2765102015-08-19 22:00:55 -0500114
Norman James3f97c5d2015-08-26 17:44:14 -0500115 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500116 in_signature='', out_signature='')
117 def setDebugMode(self):
118 return None
119
Norman James3f97c5d2015-08-26 17:44:14 -0500120 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500121 in_signature='i', out_signature='')
122 def setPowerPolicy(self,policy):
123 return None
124
Norman James9e6acf92015-09-08 07:00:04 -0500125
Norman Jamese2765102015-08-19 22:00:55 -0500126 ## Signal handler
Norman James362a80f2015-09-14 14:04:39 -0500127
128 def SystemStateHandler(self,state_name):
129 if (state_name == "POWERED_OFF" and self.reboot==1):
130 self.powerOn()
131
132
Norman Jamese2765102015-08-19 22:00:55 -0500133 def power_button_signal_handler(self):
Norman James9e6acf92015-09-08 07:00:04 -0500134 # toggle power
Norman Jamese2765102015-08-19 22:00:55 -0500135 state = self.getPowerState()
Norman James2a3d20b2015-08-20 07:09:33 -0500136 if state == POWER_OFF:
Norman James362a80f2015-09-14 14:04:39 -0500137 self.powerOn()
Norman James2a3d20b2015-08-20 07:09:33 -0500138 elif state == POWER_ON:
Norman James362a80f2015-09-14 14:04:39 -0500139 self.powerOff();
Norman Jamese2765102015-08-19 22:00:55 -0500140
141 # TODO: handle long press and reset
142
Norman James9e6acf92015-09-08 07:00:04 -0500143 def host_watchdog_signal_handler(self):
Norman James362a80f2015-09-14 14:04:39 -0500144 print "Watchdog Error, Hard Rebooting"
Norman James9e6acf92015-09-08 07:00:04 -0500145 self.reboot = 1
Norman James362a80f2015-09-14 14:04:39 -0500146 self.powerOff()
Norman James9e6acf92015-09-08 07:00:04 -0500147
Norman Jamese2765102015-08-19 22:00:55 -0500148
149if __name__ == '__main__':
150 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
151
152 bus = dbus.SessionBus()
Norman James3f97c5d2015-08-26 17:44:14 -0500153 name = dbus.service.BusName(DBUS_NAME, bus)
154 obj = ChassisControlObject(bus, OBJ_NAME)
Norman James5d78b4d2015-09-05 13:34:34 -0500155 mainloop = GObject.MainLoop()
Norman James81dbd352015-08-19 22:44:53 -0500156
Norman Jamese2765102015-08-19 22:00:55 -0500157 print "Running ChassisControlService"
158 mainloop.run()
159