refactored
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 75fb74f..b33f78f 100755
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -7,9 +7,10 @@
import dbus.service
import dbus.mainloop.glib
import os
-import PropertyManager
import time
import json
+import xml.etree.ElementTree as ET
+
import Openbmc
if (len(sys.argv) < 2):
@@ -27,10 +28,37 @@
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)
- self.property_manager = PropertyManager.PropertyManager(bus,System.CACHE_PATH)
## Signal handlers
bus.add_signal_receiver(self.NewBusHandler,
@@ -43,11 +71,11 @@
self.bus_name_lookup = {}
self.bin_path = os.path.dirname(os.path.realpath(sys.argv[0]))
- for bus_name in System.SYSTEM_CONFIG.keys():
- sys_state = System.SYSTEM_CONFIG[bus_name]['system_state']
+ for name in System.APPS.keys():
+ sys_state = System.APPS[name]['system_state']
if (self.system_states.has_key(sys_state) == False):
self.system_states[sys_state] = []
- self.system_states[sys_state].append(bus_name)
+ self.system_states[sys_state].append(name)
## replace symbolic path in ID_LOOKUP
for category in System.ID_LOOKUP:
@@ -61,18 +89,6 @@
def SystemStateHandler(self,state_name):
- print "Checking previous state started..."
- i = 0
- started = self.check_state_started()
- while(i<10 and started == False):
- started = self.check_state_started()
- i=i+1
- time.sleep(1)
-
- if (i == STATE_START_TIMEOUT):
- print "ERROR: Timeout waiting for state to finish: "+self.current_state
- return
-
## clearing object started flags
try:
for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
@@ -82,8 +98,8 @@
print "Running System State: "+state_name
if (self.system_states.has_key(state_name)):
- for bus_name in self.system_states[state_name]:
- self.start_process(bus_name)
+ for name in self.system_states[state_name]:
+ self.start_process(name)
if (state_name == "BMC_INIT"):
## Add poll for heartbeat
@@ -144,81 +160,56 @@
byte = int(key)
return self.doObjectLookup(category,byte)
- def start_process(self,bus_name):
- if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
- process_name = self.bin_path+"/"+System.SYSTEM_CONFIG[bus_name]['process_name']
+ def start_process(self,name):
+ if (System.APPS[name]['start_process'] == True):
+ app = System.APPS[name]
+ process_name = self.bin_path+"/"+app['process_name']
cmdline = [ ]
cmdline.append(process_name)
- System.SYSTEM_CONFIG[bus_name]['popen'] = None
- for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
- cmdline.append(instance['name'])
+ app['popen'] = None
+ if (app.has_key('args')):
+ for a in app['args']:
+ cmdline.append(a)
try:
- print "Starting process: "+" ".join(cmdline)+": "+bus_name
- System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline)
+ print "Starting process: "+" ".join(cmdline)+": "+name
+ app['popen'] = subprocess.Popen(cmdline)
except Exception as e:
## TODO: error
print "ERROR: starting process: "+" ".join(cmdline)
def heartbeat_check(self):
- for bus_name in System.SYSTEM_CONFIG.keys():
- if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True and
- System.SYSTEM_CONFIG[bus_name].has_key('popen') and
- System.SYSTEM_CONFIG[bus_name]['monitor_process'] == True):
+ for name in System.APPS.keys():
+ app = System.APPS[name]
+ if (app['start_process'] == True and
+ app.has_key('popen') and
+ app['monitor_process'] == True):
+
## make sure process is still alive
- p = System.SYSTEM_CONFIG[bus_name]['popen']
+ p = app['popen']
p.poll()
if (p.returncode != None):
- print "Process for "+bus_name+" appears to be dead"
- self.start_process(bus_name)
+ print "Process for "+name+" appears to be dead"
+ self.start_process(name)
return True
- def check_state_started(self):
- r = True
- if (self.current_state == ""):
- return True
- if (self.system_states.has_key(self.current_state)):
- for bus_name in self.system_states[self.current_state]:
- if (System.SYSTEM_CONFIG[bus_name].has_key('popen') == False and
- System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
- r = False
- break;
- return r
-
def NewBusHandler(self, bus_name, a, b):
if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
objects = {}
try:
- Openbmc.get_objs(bus,bus_name,"",objects)
- for instance_name in objects.keys():
- obj_path = objects[instance_name]['PATH']
- #obj = bus.get_object("org.openbmc.managers.Property",
- # "/org/openbmc/managers/Property")
- #intf = dbus.Interface(obj,"org.openbmc.managers.Property")
- #intf.loadFromCache(bus_name,obj_path)
+ 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
- if (System.SYSTEM_CONFIG.has_key(bus_name)):
- for instance_name in objects.keys():
- obj_path = objects[instance_name]['PATH']
- for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
- if (instance.has_key('properties') and instance['name'] == instance_name):
- props = instance['properties']
- print "Load Properties: "+obj_path
- self.property_manager.loadProperties(bus_name,obj_path,props)
- ## If object has an init method, call it
- for init_intf in objects[instance_name]['INIT']:
- obj = bus.get_object(bus_name,obj_path)
- intf = dbus.Interface(obj,init_intf)
- print "Calling init method: " +obj_path+" : "+init_intf
- intf.init()
-
- ## check if all objects are started to move to next state
+ ## 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]:
@@ -236,16 +227,26 @@
in_signature='s', out_signature='sis')
def gpioInit(self,name):
gpio_path = ''
- gpio_num = 0
+ gpio_num = -1
+ r = ['',gpio_num,'']
if (System.GPIO_CONFIG.has_key(name) == False):
# TODO: Error handling
print "ERROR: "+name+" not found in GPIO config table"
- return ['',0,'']
else:
- gpio_num = System.GPIO_CONFIG[name]['gpio_num']
-
- return [Openbmc.GPIO_DEV, gpio_num, System.GPIO_CONFIG[name]['direction']]
-
+
+ gpio_num = -1
+ gpio = System.GPIO_CONFIG[name]
+ if (System.GPIO_CONFIG[name].has_key('gpio_num')):
+ gpio_num = gpio['gpio_num']
+ else:
+ if (System.GPIO_CONFIG[name].has_key('gpio_pin')):
+ gpio_num = System.convertGpio(gpio['gpio_pin'])
+ else:
+ print "ERROR: SystemManager - GPIO lookup failed for "+name
+
+ if (gpio_num != -1):
+ r = [Openbmc.GPIO_DEV, gpio_num, gpio['direction']]
+ return r
if __name__ == '__main__':