summaryrefslogtreecommitdiffstats
path: root/pychassisctl
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@fuzziesquirrel.com>2016-05-28 18:41:04 -0400
committerBrad Bishop <bradleyb@fuzziesquirrel.com>2016-06-10 18:06:59 -0400
commit40a360c2a4feef97a8f7041e655b2a42e51e0224 (patch)
tree75dfea3064d7c3243788c72cb9f30e2ce6241dea /pychassisctl
parenta73122191a7aba80f97332687a2e03cfb0336981 (diff)
downloadtalos-skeleton-40a360c2a4feef97a8f7041e655b2a42e51e0224.tar.gz
talos-skeleton-40a360c2a4feef97a8f7041e655b2a42e51e0224.zip
Reorganize directory structure
Moving to directory per-application layout. This facilitates building single applications which is useful in the Yocto build environment since different applications satisfy different OpenBMC build requirements. A number of issues are also addressed: - All applications were pulling in libsystemd and the gdbus libs irrespective of whether or not they were needed. - gpio.o duplicated in every application - moved to libopenbmc_intf - Added install target Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'pychassisctl')
l---------pychassisctl/Makefile1
-rw-r--r--pychassisctl/chassis_control.py224
l---------pychassisctl/setup.cfg1
-rw-r--r--pychassisctl/setup.py6
4 files changed, 232 insertions, 0 deletions
diff --git a/pychassisctl/Makefile b/pychassisctl/Makefile
new file mode 120000
index 0000000..76a90fc
--- /dev/null
+++ b/pychassisctl/Makefile
@@ -0,0 +1 @@
+../Makefile.python \ No newline at end of file
diff --git a/pychassisctl/chassis_control.py b/pychassisctl/chassis_control.py
new file mode 100644
index 0000000..376e0e9
--- /dev/null
+++ b/pychassisctl/chassis_control.py
@@ -0,0 +1,224 @@
+#!/usr/bin/python -u
+
+import sys
+import uuid
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+from obmc.dbuslib.bindings import get_dbus, DbusProperties, DbusObjectManager
+
+DBUS_NAME = 'org.openbmc.control.Chassis'
+OBJ_NAME = '/org/openbmc/control/chassis0'
+CONTROL_INTF = 'org.openbmc.Control'
+
+MACHINE_ID = '/etc/machine-id'
+
+POWER_OFF = 0
+POWER_ON = 1
+
+BOOTED = 100
+
+class ChassisControlObject(DbusProperties,DbusObjectManager):
+ def getUuid(self):
+ uuid = "";
+ try:
+ with open(MACHINE_ID) as f:
+ data = f.readline().rstrip('\n')
+ if (len(data) == 32):
+ uuid = data
+ else:
+ print "ERROR: UUID is not formatted correctly: "+data
+ except:
+ print "ERROR: Unable to open uuid file: "+MACHINE_ID
+
+ return uuid
+
+ def __init__(self,bus,name):
+ self.dbus_objects = { }
+ DbusProperties.__init__(self)
+ DbusObjectManager.__init__(self)
+ dbus.service.Object.__init__(self,bus,name)
+ ## load utilized objects
+ self.dbus_objects = {
+ 'power_control' : {
+ 'bus_name' : 'org.openbmc.control.Power',
+ 'object_name' : '/org/openbmc/control/power0',
+ 'interface_name' : 'org.openbmc.control.Power'
+ },
+ 'identify_led' : {
+ 'bus_name' : 'org.openbmc.control.led',
+ 'object_name' : '/org/openbmc/control/led/identify',
+ 'interface_name' : 'org.openbmc.Led'
+ },
+ 'watchdog' : {
+ 'bus_name' : 'org.openbmc.watchdog.Host',
+ 'object_name' : '/org/openbmc/watchdog/host0',
+ 'interface_name' : 'org.openbmc.Watchdog'
+ },
+ 'host_services' : {
+ 'bus_name' : 'org.openbmc.HostServices',
+ 'object_name' : '/org/openbmc/HostServices',
+ 'interface_name' : 'org.openbmc.HostServices'
+ },
+ 'settings' : {
+ 'bus_name' : 'org.openbmc.settings.Host',
+ 'object_name' : '/org/openbmc/settings/host0',
+ 'interface_name' : 'org.freedesktop.DBus.Properties'
+ },
+ }
+
+ #uuid
+ self.Set(DBUS_NAME,"uuid",self.getUuid())
+ self.Set(DBUS_NAME,"reboot",0)
+
+ bus.add_signal_receiver(self.power_button_signal_handler,
+ dbus_interface = "org.openbmc.Button", signal_name = "Released",
+ path="/org/openbmc/buttons/power0" )
+ bus.add_signal_receiver(self.reset_button_signal_handler,
+ dbus_interface = "org.openbmc.Button", signal_name = "PressedLong",
+ path="/org/openbmc/buttons/power0" )
+ bus.add_signal_receiver(self.softreset_button_signal_handler,
+ dbus_interface = "org.openbmc.Button", signal_name = "Released",
+ path="/org/openbmc/buttons/reset0" )
+
+ bus.add_signal_receiver(self.host_watchdog_signal_handler,
+ dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
+
+ bus.add_signal_receiver(self.emergency_shutdown_signal_handler,
+ dbus_interface = "org.openbmc.SensorThresholds", signal_name = "Emergency")
+
+ bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
+ self.InterfacesAdded(name,self.properties)
+
+
+ def getInterface(self,name):
+ o = self.dbus_objects[name]
+ obj = bus.get_object(o['bus_name'],o['object_name'],introspect=False)
+ return dbus.Interface(obj,o['interface_name'])
+
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def setIdentify(self):
+ print "Turn on identify"
+ intf = self.getInterface('identify_led')
+ intf.setOn()
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def clearIdentify(self):
+ print "Turn on identify"
+ intf = self.getInterface('identify_led')
+ intf.setOff()
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def powerOn(self):
+ print "Turn on power and boot"
+ self.Set(DBUS_NAME,"reboot",0)
+ if (self.getPowerState()==0):
+ intf = self.getInterface('power_control')
+ intf.setPowerState(POWER_ON)
+ intfwatchdog = self.getInterface('watchdog')
+ #Start watchdog with 30s timeout per the OpenPower Host IPMI Spec
+ #Once the host starts booting, it'll reset and refresh the timer
+ intfwatchdog.set(30000)
+ intfwatchdog.start()
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def powerOff(self):
+ print "Turn off power"
+ intfwatchdog = self.getInterface('watchdog')
+ intfwatchdog.stop()
+ intf = self.getInterface('power_control')
+ intf.setPowerState(POWER_OFF)
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def softPowerOff(self):
+ print "Soft off power"
+ intf = self.getInterface('host_services')
+ ## host services will call power off when ready
+ intf.SoftPowerOff()
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def reboot(self):
+ print "Rebooting"
+ if self.getPowerState() == POWER_OFF:
+ self.powerOn();
+ else:
+ self.Set(DBUS_NAME,"reboot",1)
+ self.powerOff()
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def softReboot(self):
+ print "Soft Rebooting"
+ if self.getPowerState() == POWER_OFF:
+ self.powerOn();
+ else:
+ self.Set(DBUS_NAME,"reboot",1)
+ self.softPowerOff()
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='i')
+ def getPowerState(self):
+ intf = self.getInterface('power_control')
+ return intf.getPowerState()
+
+ ## Signal handler
+
+ def SystemStateHandler(self,state_name):
+ if (state_name == "HOST_POWERED_OFF" or state_name == "HOST_POWERED_ON"):
+ intf = self.getInterface('settings')
+ intf.Set("org.openbmc.settings.Host","system_state",state_name)
+
+ if (state_name == "HOST_POWERED_OFF" and self.Get(DBUS_NAME,"reboot")==1):
+ self.powerOn()
+
+ def power_button_signal_handler(self):
+ # toggle power
+ state = self.getPowerState()
+ if state == POWER_OFF:
+ self.powerOn()
+ elif state == POWER_ON:
+ self.powerOff();
+
+ def reset_button_signal_handler(self):
+ self.reboot();
+
+ def softreset_button_signal_handler(self):
+ self.softReboot();
+
+ def host_watchdog_signal_handler(self):
+ print "Watchdog Error, Hard Rebooting"
+ self.Set(DBUS_NAME,"reboot",1)
+ self.powerOff()
+
+ def emergency_shutdown_signal_handler(self):
+ print "Emergency Shutdown!"
+ self.powerOff()
+
+
+
+if __name__ == '__main__':
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+ bus = get_dbus()
+ name = dbus.service.BusName(DBUS_NAME, bus)
+ obj = ChassisControlObject(bus, OBJ_NAME)
+ mainloop = gobject.MainLoop()
+
+ print "Running ChassisControlService"
+ mainloop.run()
+
diff --git a/pychassisctl/setup.cfg b/pychassisctl/setup.cfg
new file mode 120000
index 0000000..29939b5
--- /dev/null
+++ b/pychassisctl/setup.cfg
@@ -0,0 +1 @@
+../setup.cfg \ No newline at end of file
diff --git a/pychassisctl/setup.py b/pychassisctl/setup.py
new file mode 100644
index 0000000..b86c7e8
--- /dev/null
+++ b/pychassisctl/setup.py
@@ -0,0 +1,6 @@
+from distutils.core import setup
+
+setup(name='pychassisctl',
+ version='1.0',
+ scripts=['chassis_control.py'],
+ )
OpenPOWER on IntegriCloud