blob: 3275dc9463ba4c7c3ddc79fe9931078158a30918 [file] [log] [blame]
Norman James89de9162015-08-27 21:41:36 -05001#!/usr/bin/env python
2
Norman James471ab592015-08-30 22:29:40 -05003import sys
Norman James89de9162015-08-27 21:41:36 -05004import subprocess
5import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
Norman James90baede2015-09-02 20:32:49 -05009#import xml.etree.ElementTree as ET
10import os
11import PropertyManager
Norman James471ab592015-08-30 22:29:40 -050012
13if (len(sys.argv) < 2):
14 print "Usage: system_manager.py [system name]"
15 exit(1)
16
17System = __import__(sys.argv[1])
18import Openbmc
Norman James89de9162015-08-27 21:41:36 -050019
20DBUS_NAME = 'org.openbmc.managers.System'
21OBJ_NAME = '/org/openbmc/managers/System'
Norman James471ab592015-08-30 22:29:40 -050022HEARTBEAT_CHECK_INTERVAL = 20000
Norman James89de9162015-08-27 21:41:36 -050023
Norman James89de9162015-08-27 21:41:36 -050024
25class SystemManager(dbus.service.Object):
26 def __init__(self,bus,name):
27 dbus.service.Object.__init__(self,bus,name)
Norman James90baede2015-09-02 20:32:49 -050028 #self.sensor_manager_running = False
29 #self.fru_manager_running = False
30 #self.inited = False
31
32 ## Signal handlers
33 bus.add_signal_receiver(self.NewBusHandler,
Norman James89de9162015-08-27 21:41:36 -050034 dbus_interface = 'org.freedesktop.DBus',
35 signal_name = "NameOwnerChanged")
Norman James90baede2015-09-02 20:32:49 -050036 #bus.add_signal_receiver(self.FruRunningHandler,
37 # dbus_interface = 'org.openbmc.managers.Frus'
38 # signal_name = "OpenBmcRunning")
39 #bus.add_signal_receiver(self.SensorRunningHandler,
40 # dbus_interface = 'org.openbmc.managers.Sensors'
41 # signal_name = "OpenBmcRunning")
42 bus.add_signal_receiver(self.CacheMeHandler,
43 signal_name = 'CacheMe', path_keyword='path',interface_keyword='interface')
Norman James89de9162015-08-27 21:41:36 -050044
Norman James90baede2015-09-02 20:32:49 -050045
46 try:
47 # launch dbus object processes
48 for bus_name in System.SYSTEM_CONFIG.keys():
49 self.start_process(bus_name)
50 except Exception as e:
51 ## TODO: error handling
52 pass
53
54 bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
Norman James471ab592015-08-30 22:29:40 -050055 gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
56
Norman James90baede2015-09-02 20:32:49 -050057 def CacheMeHandler(self,busname,path=None,interface=None):
58 #interface_name = 'org.openbmc.Fru'
59 print "CacheME: "+busname+","+path+","+interface
60 data = {}
61 cache = System.CACHED_INTERFACES.has_key(interface)
62 PropertyManager.saveProperties(bus,busname,path,interface,cache,data)
63
64
Norman James471ab592015-08-30 22:29:40 -050065 def start_process(self,bus_name):
66 exe_name = System.SYSTEM_CONFIG[bus_name]['exe_name']
67 cmdline = [ ]
68 cmdline.append(exe_name)
69 for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
70 cmdline.append(instance['name'])
71 try:
72 print "Starting process: "+" ".join(cmdline)
73 System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline);
74 except Exception as e:
75 ## TODO: error
76 print "Error starting process: "+" ".join(cmdline)
77
Norman James89de9162015-08-27 21:41:36 -050078 def heartbeat_check(self):
79 print "heartbeat check"
Norman James471ab592015-08-30 22:29:40 -050080 for bus_name in System.SYSTEM_CONFIG.keys():
81 ## even if process doesn't request heartbeat check,
82 ## make sure process is still alive
83 p = System.SYSTEM_CONFIG[bus_name]['popen']
84 p.poll()
85 if (p.returncode != None):
86 print "Process for "+bus_name+" appears to be dead"
87 self.start_process(bus_name)
88
Norman James90baede2015-09-02 20:32:49 -050089 ## process is alive, now check if heartbeat received
90 ## during previous interval
Norman James471ab592015-08-30 22:29:40 -050091 elif (System.SYSTEM_CONFIG[bus_name]['heartbeat'] == 'yes'):
92 if (System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] == 0):
Norman James89de9162015-08-27 21:41:36 -050093 print "Heartbeat error: "+bus_name
Norman James471ab592015-08-30 22:29:40 -050094 p = System.SYSTEM_CONFIG[bus_name]['popen']
Norman James90baede2015-09-02 20:32:49 -050095 ## TODO: error checking
Norman James471ab592015-08-30 22:29:40 -050096 p.poll()
97 if (p.returncode == None):
98 print "Process must be hung, so killing"
99 p.kill()
100
101 self.start_process(bus_name)
Norman James89de9162015-08-27 21:41:36 -0500102 else:
Norman James471ab592015-08-30 22:29:40 -0500103 System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
104 print "Heartbeat ok: "+bus_name
105
106 return True
Norman James89de9162015-08-27 21:41:36 -0500107
Norman James90baede2015-09-02 20:32:49 -0500108 def HeartbeatHandler(self,bus_name):
Norman James471ab592015-08-30 22:29:40 -0500109 System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1
Norman James89de9162015-08-27 21:41:36 -0500110
Norman James90baede2015-09-02 20:32:49 -0500111 def NewBusHandler(self, bus_name, a, b):
Norman James471ab592015-08-30 22:29:40 -0500112 if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
113 if (System.SYSTEM_CONFIG.has_key(bus_name)):
114 System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
Norman James90baede2015-09-02 20:32:49 -0500115 obj_root = "/"+bus_name.replace('.','/')
116 obj_paths = []
117
118 ## Loads object properties from system config file
119 ## then overlays saved properties from file
120 for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
121 obj_path = obj_root+'/'+instance['name']
122 obj_paths.append(obj_path)
123 if (instance.has_key('properties')):
124 PropertyManager.loadProperties(bus,bus_name,obj_path, instance['properties'])
125
126 ## After object properties are setup, call init method if requested
127 if (System.SYSTEM_CONFIG[bus_name].has_key('init_methods')):
128 for obj_path in obj_paths:
129 for init_interface in System.SYSTEM_CONFIG[bus_name]['init_methods']:
130 obj = bus.get_object(bus_name,obj_path)
131 intf = dbus.Interface(obj,init_interface)
132 print "calling init:" +init_interface
133 intf.init()
Norman James89de9162015-08-27 21:41:36 -0500134
Norman James89de9162015-08-27 21:41:36 -0500135
Norman James89de9162015-08-27 21:41:36 -0500136
137 @dbus.service.method(DBUS_NAME,
138 in_signature='s', out_signature='sis')
139 def gpioInit(self,name):
140 gpio_path = ''
141 gpio_num = 0
Norman James471ab592015-08-30 22:29:40 -0500142 if (System.GPIO_CONFIG.has_key(name) == False):
Norman James89de9162015-08-27 21:41:36 -0500143 # TODO: Error handling
144 print "ERROR: "+name+" not found in GPIO config table"
145 return ['',0,'']
146 else:
Norman James471ab592015-08-30 22:29:40 -0500147 gpio_num = System.GPIO_CONFIG[name]['gpio_num']
Norman James89de9162015-08-27 21:41:36 -0500148
Norman James471ab592015-08-30 22:29:40 -0500149 return [Openbmc.GPIO_DEV, gpio_num, System.GPIO_CONFIG[name]['direction']]
Norman James89de9162015-08-27 21:41:36 -0500150
151
152if __name__ == '__main__':
153 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
154 bus = dbus.SessionBus()
155 name = dbus.service.BusName(DBUS_NAME,bus)
156 obj = SystemManager(bus,OBJ_NAME)
157 mainloop = gobject.MainLoop()
158
Norman James89de9162015-08-27 21:41:36 -0500159 print "Running SystemManager"
160 mainloop.run()
161