diff options
author | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2016-05-28 18:41:04 -0400 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2016-06-10 18:06:59 -0400 |
commit | 40a360c2a4feef97a8f7041e655b2a42e51e0224 (patch) | |
tree | 75dfea3064d7c3243788c72cb9f30e2ce6241dea /pychassisctl | |
parent | a73122191a7aba80f97332687a2e03cfb0336981 (diff) | |
download | talos-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/Makefile | 1 | ||||
-rw-r--r-- | pychassisctl/chassis_control.py | 224 | ||||
l--------- | pychassisctl/setup.cfg | 1 | ||||
-rw-r--r-- | pychassisctl/setup.py | 6 |
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'], + ) |