blob: 4be1afc2d666a326d164faaf221091961143eee6 [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 James471ab592015-08-30 22:29:40 -050010OBJ_NAME = '/org/openbmc/control/Chassis/'+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 James471ab592015-08-30 22:29:40 -050023 self.dbus_busses = {
Norman James90baede2015-09-02 20:32:49 -050024 'org.openbmc.control.Power' :
25 [ { 'name' : 'PowerControl1' , 'intf' : 'org.openbmc.control.Power' } ],
26 'org.openbmc.leds.ChassisIdentify' :
27 [ { 'name' : 'ChassisIdentify1', 'intf' : 'org.openbmc.control.Chassis' } ],
28 'org.openbmc.control.Host' :
29 [ { 'name' : 'HostControl1', 'intf' : 'org.openbmc.control.Host' } ]
Norman James471ab592015-08-30 22:29:40 -050030 }
Norman James2a3d20b2015-08-20 07:09:33 -050031 self.power_sequence = 0
Norman James9e6acf92015-09-08 07:00:04 -050032 self.reboot = 0
33 self.last_power_state = 0
Norman James90baede2015-09-02 20:32:49 -050034
Norman James9e6acf92015-09-08 07:00:04 -050035 bus = dbus.SessionBus()
Norman James90baede2015-09-02 20:32:49 -050036
37 ## add signal handler to detect when new objects show up on dbus
38 bus.add_signal_receiver(self.request_name,
39 dbus_interface = 'org.freedesktop.DBus',
40 signal_name = "NameOwnerChanged")
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",
44 path="/org/openbmc/buttons/ButtonPower/PowerButton1" )
45 bus.add_signal_receiver(self.power_good_signal_handler,
Norman James9e6acf92015-09-08 07:00:04 -050046 dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood")
47 bus.add_signal_receiver(self.power_lost_signal_handler,
48 dbus_interface = "org.openbmc.control.Power", signal_name = "PowerLost")
49 bus.add_signal_receiver(self.host_watchdog_signal_handler,
50 dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
51 bus.add_signal_receiver(self.host_status_signal_handler,
52 dbus_interface = "org.openbmc.SensorMatch", signal_name = "SensorMatch",
53 path="/org/openbmc/sensors/HostStatus/HostStatus1")
Norman James471ab592015-08-30 22:29:40 -050054
Norman James9e6acf92015-09-08 07:00:04 -050055 try:
56 for bus_name in self.dbus_busses.keys():
57 self.request_name(bus_name,"",bus_name)
58
59 except:
60 ## its ok if this fails. hotplug will detect too
61 print "Warning: One of processes not started yet."
62 pass
Norman James471ab592015-08-30 22:29:40 -050063
64
65 def request_name(self, bus_name, a, b):
66 # bus added
67 if (len(b) > 0 ):
Norman James90baede2015-09-02 20:32:49 -050068 ## if bus in required list for this object, then save a pointer to interface
69 ## for method calls
Norman James471ab592015-08-30 22:29:40 -050070 if (self.dbus_busses.has_key(bus_name)):
71 obj_path = "/"+bus_name.replace('.','/')
72 for objs in self.dbus_busses[bus_name]:
73 inst_name = objs['name']
Norman James9e6acf92015-09-08 07:00:04 -050074 print "Chassis control: "+inst_name
Norman James471ab592015-08-30 22:29:40 -050075 obj = bus.get_object(bus_name,obj_path+"/"+inst_name)
Norman James471ab592015-08-30 22:29:40 -050076 self.dbus_objects[inst_name] = dbus.Interface(obj, objs['intf'])
77
Norman Jamese2765102015-08-19 22:00:55 -050078
Norman James3f97c5d2015-08-26 17:44:14 -050079 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050080 in_signature='', out_signature='s')
81 def getID(self):
82 return id
83
Norman James3f97c5d2015-08-26 17:44:14 -050084 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050085 in_signature='', out_signature='')
86 def setIdentify(self):
87 print "Turn on identify"
Norman James471ab592015-08-30 22:29:40 -050088 self.dbus_objects['ChassisIdentify1'].setOn()
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='')
93 def clearIdentify(self):
94 print "Turn off identify"
Norman James471ab592015-08-30 22:29:40 -050095 r=self.dbus_objects['ChassisIdentify1'].setOff()
Norman Jamese2765102015-08-19 22:00:55 -050096 return None
97
Norman James3f97c5d2015-08-26 17:44:14 -050098 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -050099 in_signature='', out_signature='')
100 def setPowerOn(self):
101 print "Turn on power and boot"
Norman James2a3d20b2015-08-20 07:09:33 -0500102 self.power_sequence = 0
Norman James9e6acf92015-09-08 07:00:04 -0500103 self.reboot = 0
Norman Jamese2765102015-08-19 22:00:55 -0500104 if (self.getPowerState()==0):
Norman James471ab592015-08-30 22:29:40 -0500105 self.dbus_objects['PowerControl1'].setPowerState(POWER_ON)
Norman James2a3d20b2015-08-20 07:09:33 -0500106 self.power_sequence = 1
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='')
111 def setPowerOff(self):
Norman James9e6acf92015-09-08 07:00:04 -0500112 self.power_sequence = 0
Norman Jamese2765102015-08-19 22:00:55 -0500113 print "Turn off power"
Norman James471ab592015-08-30 22:29:40 -0500114 self.dbus_objects['PowerControl1'].setPowerState(POWER_OFF);
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='i')
119 def getPowerState(self):
Norman James471ab592015-08-30 22:29:40 -0500120 state = self.dbus_objects['PowerControl1'].getPowerState();
Norman Jamese2765102015-08-19 22:00:55 -0500121 return state
122
Norman James3f97c5d2015-08-26 17:44:14 -0500123 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500124 in_signature='', out_signature='')
125 def setDebugMode(self):
126 return None
127
Norman James3f97c5d2015-08-26 17:44:14 -0500128 @dbus.service.method(DBUS_NAME,
Norman Jamese2765102015-08-19 22:00:55 -0500129 in_signature='i', out_signature='')
130 def setPowerPolicy(self,policy):
131 return None
132
Norman James9e6acf92015-09-08 07:00:04 -0500133
Norman Jamese2765102015-08-19 22:00:55 -0500134 ## Signal handler
135 def power_button_signal_handler(self):
Norman James9e6acf92015-09-08 07:00:04 -0500136 # toggle power
Norman Jamese2765102015-08-19 22:00:55 -0500137 state = self.getPowerState()
Norman James2a3d20b2015-08-20 07:09:33 -0500138 if state == POWER_OFF:
Norman Jamese2765102015-08-19 22:00:55 -0500139 self.setPowerOn()
Norman James2a3d20b2015-08-20 07:09:33 -0500140 elif state == POWER_ON:
Norman Jamese2765102015-08-19 22:00:55 -0500141 self.setPowerOff();
142
143 # TODO: handle long press and reset
144
Norman James9e6acf92015-09-08 07:00:04 -0500145 ## Signal handlers
Norman Jamese2765102015-08-19 22:00:55 -0500146 def power_good_signal_handler(self):
Norman James2a3d20b2015-08-20 07:09:33 -0500147 if (self.power_sequence==1):
Norman James471ab592015-08-30 22:29:40 -0500148 self.dbus_objects['HostControl1'].boot()
Norman James2a3d20b2015-08-20 07:09:33 -0500149 self.power_sequence = 2
Norman Jamese2765102015-08-19 22:00:55 -0500150
Norman James9e6acf92015-09-08 07:00:04 -0500151 def host_status_signal_handler(self,value):
152 if (value == BOOTED and self.power_sequence==2):
153 self.power_sequence=0
154 print "Host booted"
Norman Jamese2765102015-08-19 22:00:55 -0500155
Norman James9e6acf92015-09-08 07:00:04 -0500156 def power_lost_signal_handler(self):
157 ## Reboot if power is lost but reboot requested
158 if (self.reboot == 1):
159 self.setPowerOn()
160
161 def host_watchdog_signal_handler(self):
162 print "Watchdog Error, Rebooting"
163 self.reboot = 1
164 self.setPowerOff()
165
Norman Jamese2765102015-08-19 22:00:55 -0500166
167if __name__ == '__main__':
168 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
169
170 bus = dbus.SessionBus()
Norman James3f97c5d2015-08-26 17:44:14 -0500171 name = dbus.service.BusName(DBUS_NAME, bus)
172 obj = ChassisControlObject(bus, OBJ_NAME)
Norman James5d78b4d2015-09-05 13:34:34 -0500173 mainloop = GObject.MainLoop()
Norman James81dbd352015-08-19 22:44:53 -0500174
Norman Jamese2765102015-08-19 22:00:55 -0500175 print "Running ChassisControlService"
176 mainloop.run()
177