added ObjectAdded signal
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 0cac579..dc5dee4 100755
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -49,11 +49,16 @@
self.Set(DBUS_NAME,"last_system_state","")
bus.add_signal_receiver(self.power_button_signal_handler,
- dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed",
+ 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 = "Pressed_Long",
+ path="/org/openbmc/buttons/power0" )
+
bus.add_signal_receiver(self.host_watchdog_signal_handler,
dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
+ self.ObjectAdded(name,CONTROL_INTF)
def getInterface(self,name):
@@ -114,8 +119,11 @@
in_signature='', out_signature='')
def reboot(self):
print "Rebooting"
- self.Set(DBUS_NAME,"reboot",1)
- intf.softPowerOff()
+ if state == POWER_OFF:
+ self.powerOn();
+ else:
+ self.Set(DBUS_NAME,"reboot",1)
+ intf.softPowerOff()
return None
@dbus.service.method(DBUS_NAME,
@@ -151,9 +159,10 @@
self.powerOn()
elif state == POWER_ON:
self.powerOff();
-
- # TODO: handle long press and reset
+ def reset_button_signal_handler(self):
+ self.reboot();
+
def host_watchdog_signal_handler(self):
print "Watchdog Error, Hard Rebooting"
#self.Set(DBUS_NAME,"reboot",1)
diff --git a/bin/inventory_items.py b/bin/inventory_items.py
index ab1aae3..e961683 100755
--- a/bin/inventory_items.py
+++ b/bin/inventory_items.py
@@ -23,10 +23,11 @@
FRUS = System.FRU_INSTANCES
-class Inventory(dbus.service.Object):
+class Inventory(Openbmc.DbusProperties):
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
self.objects = [ ]
+ self.ObjectAdded(name,ENUM_INTF)
def addItem(self,item):
self.objects.append(item)
@@ -47,13 +48,13 @@
dbus.service.Object.__init__(self,bus,name)
self.name = name
-
+
## this will load properties from cache
PropertyCacher.load(name,INTF_NAME,self.properties)
data = {'is_fru': is_fru, 'fru_type': fru_type, 'present': 'Inactive', 'fault': 'None'}
self.SetMultiple(INTF_NAME,data)
-
-
+ self.ObjectAdded(name,INTF_NAME)
+ self.ObjectAdded(name,INTF_NAME)
@dbus.service.method(INTF_NAME,
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 9bb42d9..f1af961 100755
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -17,7 +17,7 @@
OBJ_NAME = '/org/openbmc/sensors'
ENUM_INTF = 'org.openbmc.Object.Enumerate'
-class SensorManager(dbus.service.Object):
+class SensorManager(Openbmc.DbusProperties):
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
bus.add_signal_receiver(self.SensorChangedHandler,
@@ -37,6 +37,8 @@
signal_name = 'Critical', path_keyword='path')
self.sensor_cache = {}
+ self.ObjectAdded(name,DBUS_NAME);
+ self.ObjectAdded(name,ENUM_INTF);
@dbus.service.method(ENUM_INTF,
in_signature='', out_signature='a{sa{sv}}')
diff --git a/bin/sensors_virtual_p8.py b/bin/sensors_virtual_p8.py
index b3c975a..840ee04 100755
--- a/bin/sensors_virtual_p8.py
+++ b/bin/sensors_virtual_p8.py
@@ -16,6 +16,7 @@
def __init__(self):
Openbmc.DbusProperties.__init__(self)
self.Set(SensorValue.IFACE_NAME,'units',"")
+ self.ObjectAdded(name,SensorValue.IFACE_NAME)
@dbus.service.method(IFACE_NAME,
in_signature='v', out_signature='')
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 0ef92c4..086679f 100755
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -8,9 +8,7 @@
import dbus.mainloop.glib
import os
import time
-import json
-import xml.etree.ElementTree as ET
-
+import PropertyCacher
import Openbmc
if (len(sys.argv) < 2):
@@ -28,42 +26,13 @@
INTF_ITEM = 'org.openbmc.InventoryItem'
INTF_CONTROL = 'org.openbmc.Control'
-def get_objects(bus,bus_name,path,objects):
- tmp_path = path
- if (path == ""):
- tmp_path="/"
-
- obj = bus.get_object(bus_name,tmp_path)
- introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
- tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
- root = tree.getroot()
- parent = True
- ##print introspect_iface.Introspect()
- for node in root.iter('node'):
- for intf in node.iter('interface'):
- objects[path] = True
-
- if (node.attrib.has_key('name') == True):
- node_name = node.attrib['name']
- if (parent == False):
- get_objects(bus,bus_name,path+"/"+node_name,objects)
- else:
- if (node_name != "" and node_name != path):
- get_objects(bus,bus_name,node_name,objects)
-
- parent = False
-
-
-
class SystemManager(dbus.service.Object):
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
- ## Signal handlers
- bus.add_signal_receiver(self.NewBusHandler,
- dbus_interface = 'org.freedesktop.DBus',
- signal_name = "NameOwnerChanged")
+ bus.add_signal_receiver(self.NewObjectHandler,
+ signal_name = "ObjectAdded", sender_keyword = 'bus_name')
bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
self.current_state = ""
@@ -85,6 +54,11 @@
System.ID_LOOKUP[category][key] = new_val
self.SystemStateHandler(System.SYSTEM_STATES[0])
+
+ if not os.path.exists(PropertyCacher.CACHE_PATH):
+ print "Creating cache directory: "+PropertyCacher.CACHE_PATH
+ os.makedirs(PropertyCacher.CACHE_PATH)
+
print "SystemManager Init Done"
@@ -194,34 +168,26 @@
return True
- def NewBusHandler(self, bus_name, a, b):
- if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
- objects = {}
- try:
- get_objects(bus,bus_name,"",objects)
- for obj_path in objects.keys():
- self.bus_name_lookup[obj_path] = bus_name
- print "New object: "+obj_path+" ("+bus_name+")"
- if (System.EXIT_STATE_DEPEND[self.current_state].has_key(obj_path) == True):
- System.EXIT_STATE_DEPEND[self.current_state][obj_path] = 1
-
- except Exception as e:
- ## object probably disappeared
- #print e
- pass
-
+ def NewObjectHandler(self,obj_path, interface_name, bus_name = None):
+ if (self.bus_name_lookup.has_key(obj_path)):
+ if (self.bus_name_lookup[obj_path] == bus_name):
+ return
+ self.bus_name_lookup[obj_path] = bus_name
+ print "New object: "+obj_path+" ("+bus_name+")"
+ try:
+ if (System.EXIT_STATE_DEPEND[self.current_state].has_key(obj_path) == True):
+ System.EXIT_STATE_DEPEND[self.current_state][obj_path] = 1
## check if all required objects are started to move to next state
- try:
- state = 1
- for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
- if (System.EXIT_STATE_DEPEND[self.current_state][obj_path] == 0):
- state = 0
- ## all required objects have started so go to next state
- if (state == 1):
- self.gotoNextState()
- except:
- pass
-
+ state = 1
+ for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
+ if (System.EXIT_STATE_DEPEND[self.current_state][obj_path] == 0):
+ state = 0
+ ## all required objects have started so go to next state
+ if (state == 1):
+ print "All required objects started for "+self.current_state
+ self.gotoNextState()
+ except:
+ pass
@dbus.service.method(DBUS_NAME,