lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index 65d8683..50a3492 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -1,4 +1,6 @@
#! /usr/bin/python
+
+## todos: event logger,
import dbus
import Openbmc
@@ -12,6 +14,24 @@
SYSTEM_CONFIG = {}
+SYSTEM_CONFIG['org.openbmc.watchdog.HostWatchdog'] = {
+ 'start_process' : True,
+ 'process_name' : 'host_watchdog.exe',
+ 'heartbeat' : 'no',
+ 'rest_name' : 'watchdog',
+ 'instances' : [
+ {
+ 'name' : 'Watchdog1',
+ 'user_label': 'Host Watchdog',
+ 'properties' : {
+ 'org.openbmc.Watchdog' : {
+ 'poll_interval': 300000,
+ }
+ }
+ }
+ ]
+ }
+
SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
'start_process' : True,
'process_name' : 'sensor_manager.py',
@@ -59,6 +79,11 @@
{
'name' : 'PowerControl1',
'user_label': 'Power control',
+ 'properties' : {
+ 'org.openbmc.Control': {
+ 'poll_interval' : 3000
+ }
+ }
}
]
}
@@ -68,13 +93,15 @@
'process_name' : 'sensor_ambient.exe',
'heartbeat' : 'yes',
'init_methods' : ['org.openbmc.SensorValue'],
- 'poll_interval': 5000,
'instances' : [
{
'name' : 'AmbientTemperature1',
'user_label': 'Ambient Temperature 1',
'sensor_id' : 41,
'properties' : {
+ 'org.openbmc.SensorValue': {
+ 'poll_interval' : 5000
+ },
'org.openbmc.SensorThreshold' : {
'lower_critical': 5,
'lower_warning' : 10,
@@ -91,6 +118,9 @@
'name' : 'AmbientTemperature2',
'user_label': 'Ambient Temperature 2',
'properties' : {
+ 'org.openbmc.SensorValue': {
+ 'poll_interval' : 5000
+ },
'org.openbmc.SensorThreshold' : {
'lower_critical': 5,
'lower_warning' : 10,
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index 4b10739..12f93c7 100644
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -1,4 +1,5 @@
import dbus
+import xml.etree.ElementTree as ET
BUS_PREFIX = 'org.openbmc'
GPIO_DEV = '/sys/class/gpio'
@@ -28,6 +29,19 @@
def bus_to_object_name(bus_name):
return "/"+bus_name.replace('.','/')
+def get_methods(obj):
+ methods = {}
+ introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
+ tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
+ root = tree.getroot()
+ for intf in root.iter('interface'):
+ intf_name = intf.attrib['name']
+ if (intf_name.find(BUS_PREFIX)==0):
+ methods[intf_name] = {}
+ for method in intf.iter('method'):
+ methods[intf_name][method.attrib['name']] = True
+
+ return methods
class DbusProperty:
def __init__(self,name,value):
diff --git a/bin/PropertyManager.py b/bin/PropertyManager.py
index ff0e200..6af3af7 100644
--- a/bin/PropertyManager.py
+++ b/bin/PropertyManager.py
@@ -57,7 +57,6 @@
for prop in properties.keys():
print "Saving properties: "+prop
## convert property to correct dbus type
- print type(properties[prop])
prop_intf.Set(interface_name,prop,properties[prop])
dbus_props = []
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 15a8feb..4be1afc 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -12,10 +12,13 @@
POWER_OFF = 0
POWER_ON = 1
+BOOTED = 100
+
class ChassisControlObject(dbus.service.Object):
def __init__(self,bus,name):
self.dbus_objects = { }
+ dbus.service.Object.__init__(self,bus,name)
## load utilized objects
self.dbus_busses = {
'org.openbmc.control.Power' :
@@ -26,16 +29,10 @@
[ { 'name' : 'HostControl1', 'intf' : 'org.openbmc.control.Host' } ]
}
self.power_sequence = 0
- dbus.service.Object.__init__(self,bus,name)
- bus = dbus.SessionBus()
- try:
- for bus_name in self.dbus_busses.keys():
- self.request_name(bus_name,"",bus_name)
+ self.reboot = 0
+ self.last_power_state = 0
- except:
- ## its ok if this fails. hotplug will detect too
- print "Warning: One of processes not started yet."
- pass
+ bus = dbus.SessionBus()
## add signal handler to detect when new objects show up on dbus
bus.add_signal_receiver(self.request_name,
@@ -46,9 +43,23 @@
dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed",
path="/org/openbmc/buttons/ButtonPower/PowerButton1" )
bus.add_signal_receiver(self.power_good_signal_handler,
- dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood",
- path="/org/openbmc/control/Power/PowerControl1")
+ dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood")
+ bus.add_signal_receiver(self.power_lost_signal_handler,
+ dbus_interface = "org.openbmc.control.Power", signal_name = "PowerLost")
+ bus.add_signal_receiver(self.host_watchdog_signal_handler,
+ dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
+ bus.add_signal_receiver(self.host_status_signal_handler,
+ dbus_interface = "org.openbmc.SensorMatch", signal_name = "SensorMatch",
+ path="/org/openbmc/sensors/HostStatus/HostStatus1")
+ try:
+ for bus_name in self.dbus_busses.keys():
+ self.request_name(bus_name,"",bus_name)
+
+ except:
+ ## its ok if this fails. hotplug will detect too
+ print "Warning: One of processes not started yet."
+ pass
def request_name(self, bus_name, a, b):
@@ -60,6 +71,7 @@
obj_path = "/"+bus_name.replace('.','/')
for objs in self.dbus_busses[bus_name]:
inst_name = objs['name']
+ print "Chassis control: "+inst_name
obj = bus.get_object(bus_name,obj_path+"/"+inst_name)
self.dbus_objects[inst_name] = dbus.Interface(obj, objs['intf'])
@@ -69,7 +81,6 @@
def getID(self):
return id
-
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='')
def setIdentify(self):
@@ -77,7 +88,6 @@
self.dbus_objects['ChassisIdentify1'].setOn()
return None
-
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='')
def clearIdentify(self):
@@ -90,6 +100,7 @@
def setPowerOn(self):
print "Turn on power and boot"
self.power_sequence = 0
+ self.reboot = 0
if (self.getPowerState()==0):
self.dbus_objects['PowerControl1'].setPowerState(POWER_ON)
self.power_sequence = 1
@@ -98,6 +109,7 @@
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='')
def setPowerOff(self):
+ self.power_sequence = 0
print "Turn off power"
self.dbus_objects['PowerControl1'].setPowerState(POWER_OFF);
return None
@@ -118,9 +130,10 @@
def setPowerPolicy(self,policy):
return None
+
## Signal handler
def power_button_signal_handler(self):
- # only power on if not currently powered on
+ # toggle power
state = self.getPowerState()
if state == POWER_OFF:
self.setPowerOn()
@@ -129,13 +142,27 @@
# TODO: handle long press and reset
- ## Signal handler
+ ## Signal handlers
def power_good_signal_handler(self):
if (self.power_sequence==1):
self.dbus_objects['HostControl1'].boot()
self.power_sequence = 2
+ def host_status_signal_handler(self,value):
+ if (value == BOOTED and self.power_sequence==2):
+ self.power_sequence=0
+ print "Host booted"
+ def power_lost_signal_handler(self):
+ ## Reboot if power is lost but reboot requested
+ if (self.reboot == 1):
+ self.setPowerOn()
+
+ def host_watchdog_signal_handler(self):
+ print "Watchdog Error, Rebooting"
+ self.reboot = 1
+ self.setPowerOff()
+
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
diff --git a/bin/ipmi_bt.py b/bin/ipmi_bt.py
index 375eb2a..d3e79cd 100644
--- a/bin/ipmi_bt.py
+++ b/bin/ipmi_bt.py
@@ -39,7 +39,7 @@
@dbus.service.method(DBUS_NAME)
def emitUpdateSensor(self,ipmi_id,data):
- self.UpdateSensor(ipmi_id,int(data))
+ self.UpdateSensor(ipmi_id,dbus.Byte(int(data)))
print "update sensor emitted"
return 'Signal emitted'
@@ -49,11 +49,31 @@
intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
return intf.getSensor(ipmi_id)
+ def pokeHostWatchdog(self):
+ obj = bus.get_object('org.openbmc.managers.IpmiTranslator',
+ '/org/openbmc/managers/IpmiTranslator/Barreleye')
+ intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
+ intf.pokeHostWatchdog()
+
+ def startHostWatchdog(self):
+ obj = bus.get_object('org.openbmc.managers.IpmiTranslator',
+ '/org/openbmc/managers/IpmiTranslator/Barreleye')
+ intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
+ intf.startHostWatchdog()
+
+
+
+
if __name__ == '__main__':
-
- cmd = sys.argv[2]
- ipmi_id = int(sys.argv[3])
+
+ cmd = ""
+ data = None
+ ipmi_id = 0
+ if (len(sys.argv) > 2):
+ cmd = sys.argv[2]
+ if (len(sys.argv) > 3):
+ ipmi_id = int(sys.argv[3])
if (len(sys.argv)>4):
data = sys.argv[4]
@@ -69,7 +89,13 @@
obj.emitUpdateSensor(ipmi_id,data)
elif (cmd == 'getsensor'):
print obj.getSensor(ipmi_id)
-
+ elif (cmd == 'pokewatchdog'):
+ print obj.pokeHostWatchdog()
+ elif (cmd == 'startwatchdog'):
+ print obj.startHostWatchdog()
+ else:
+ print "ERROR: Invalid command"
+ print "Valid commands: updatefru, setsensor, getsensor, startwatchdog, pokewatchdog"
#mainloop.run()
diff --git a/bin/ipmi_translator.py b/bin/ipmi_translator.py
index f7a7aab..2f3d0bb 100644
--- a/bin/ipmi_translator.py
+++ b/bin/ipmi_translator.py
@@ -73,15 +73,13 @@
## change to variant data type
## comes in off dbus from ipmi_bt as a basic data type
dvalue = Openbmc.DbusProperty('value',value)
- dvalue.setVariant(2)
- data = { 'value' : dvalue.getValue() }
+ dvalue.setVariant(1)
## save sensor value
- ## TODO: need to accomodate any sensor interface
interface_name = 'org.openbmc.SensorValue'
cache = System.CACHED_INTERFACES.has_key(interface_name)
obj = bus.get_object(bus_name,obj_path)
intf = dbus.Interface(obj, interface_name)
- self.property_manager.saveProperties(bus_name,obj_path,interface_name,cache,data)
+ intf.setValue(dvalue.getValue())
else:
## TODO: error handling
pass
@@ -99,10 +97,34 @@
'/org/openbmc/managers/Sensors/Barreleye')
intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
val = intf.getSensor(obj_path)
- print "value = "+str(val)
return val
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def pokeHostWatchdog(self):
+ ## TODO don't do hardcoding
+ obj = bus.get_object('org.openbmc.watchdog.HostWatchdog',
+ '/org/openbmc/watchdog/HostWatchdog/Watchdog1')
+ intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
+ intf.poke()
+
+ return None
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='')
+ def startHostWatchdog(self):
+ ## TODO don't do hardcoding
+ obj = bus.get_object('org.openbmc.watchdog.HostWatchdog',
+ '/org/openbmc/watchdog/HostWatchdog/Watchdog1')
+ intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
+ intf.start()
+
+ return None
+
+
+
+
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 2314a7f..cb0904e 100644
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -19,8 +19,8 @@
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
bus.add_signal_receiver(self.UpdateSensor,
- dbus_interface = 'org.freedesktop.DBus.Properties',
- signal_name = 'PropertiesChanged', path_keyword='path')
+ dbus_interface = 'org.openbmc.SensorValue',
+ signal_name = 'Changed', path_keyword='path')
bus.add_signal_receiver(self.NormalThreshold,
dbus_interface = 'org.openbmc.SensorThreshold',
signal_name = 'Normal', path_keyword='path')
@@ -41,11 +41,10 @@
val = self.sensor_cache[path]['value']
return val
- def UpdateSensor(self,interface,prop_dict,props, path = None):
- if (interface == "org.openbmc.SensorValue"):
- self.initSensorEntry(path)
- for p in prop_dict.keys():
- self.sensor_cache[path][p] = prop_dict[p]
+ def UpdateSensor(self,value,units,path = None):
+ self.initSensorEntry(path)
+ self.sensor_cache[path]['value'] = value
+ self.sensor_cache[path]['units'] = units
@dbus.service.signal(DBUS_NAME)
def CriticalThreshold(self, path = None):
@@ -68,10 +67,6 @@
def initSensorEntry(self,path):
if (self.sensor_cache.has_key(path) == False):
self.sensor_cache[path] = {}
- obj = bus.get_object(Openbmc.object_to_bus_name(path),path)
- intf = dbus.Interface(obj,'org.freedesktop.DBus.Properties')
- self.sensor_cache[path]['units'] = intf.Get('org.openbmc.SensorValue','units')
-
if __name__ == '__main__':
diff --git a/bin/system_manager.py b/bin/system_manager.py
index e96e547..cb37c41 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -3,13 +3,14 @@
import sys
import subprocess
from gi.repository import GObject
-
import dbus
import dbus.service
import dbus.mainloop.glib
import os
import PropertyManager
+import Openbmc
+
if (len(sys.argv) < 2):
print "Usage: system_manager.py [system name]"
exit(1)
@@ -25,15 +26,15 @@
class SystemManager(dbus.service.Object):
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
-
self.property_manager = PropertyManager.PropertyManager(bus,System.CACHE_PATH)
+
## Signal handlers
bus.add_signal_receiver(self.NewBusHandler,
dbus_interface = 'org.freedesktop.DBus',
signal_name = "NameOwnerChanged")
bus.add_signal_receiver(self.CacheMeHandler,
signal_name = 'CacheMe', path_keyword='path',interface_keyword='interface')
-
+ bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
try:
# launch dbus object processes
@@ -43,8 +44,9 @@
## TODO: error handling
pass
- bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
+ ## Add poll for heartbeat
GObject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
+
def CacheMeHandler(self,busname,path=None,interface=None):
#interface_name = 'org.openbmc.Fru'
@@ -115,15 +117,21 @@
obj_path = obj_root+'/'+instance['name']
obj_paths.append(obj_path)
if (instance.has_key('properties')):
+ print "load props: "+obj_path
self.property_manager.loadProperties(bus_name,obj_path, instance['properties'])
+ ## scan all used interfaces and get interfaces with init method
+
+
## After object properties are setup, call init method if requested
- if (System.SYSTEM_CONFIG[bus_name].has_key('init_methods')):
- for obj_path in obj_paths:
- for init_interface in System.SYSTEM_CONFIG[bus_name]['init_methods']:
- obj = bus.get_object(bus_name,obj_path)
- intf = dbus.Interface(obj,init_interface)
- print "calling init:" +init_interface
+ #if (System.SYSTEM_CONFIG[bus_name].has_key('init_methods')):
+ for obj_path in obj_paths:
+ obj = bus.get_object(bus_name,obj_path)
+ methods = Openbmc.get_methods(obj)
+ for intf_name in methods.keys():
+ if (methods[intf_name].has_key('init')):
+ intf = dbus.Interface(obj,intf_name)
+ print "Calling init: " +intf_name
intf.init()