1#!/usr/bin/env python 2 3import gobject 4import dbus 5import dbus.service 6import dbus.mainloop.glib 7import os 8import obmc.dbuslib.propertycacher as PropertyCacher 9from obmc.dbuslib.bindings import DbusProperties, DbusObjectManager, get_dbus 10import obmc.enums 11import obmc_system_config as System 12import obmc.mapper.utils 13import obmc.inventory 14import obmc.system 15 16DBUS_NAME = 'org.openbmc.managers.System' 17OBJ_NAME = '/org/openbmc/managers/System' 18INTF_SENSOR = 'org.openbmc.SensorValue' 19INTF_ITEM = 'org.openbmc.InventoryItem' 20 21 22class SystemManager(DbusProperties, DbusObjectManager): 23 def __init__(self, bus, obj_name): 24 super(SystemManager, self).__init__( 25 conn=bus, 26 object_path=obj_name) 27 self.bus = bus 28 29 bus.add_signal_receiver( 30 self.NewObjectHandler, 31 signal_name="InterfacesAdded", sender_keyword='bus_name') 32 bus.add_signal_receiver( 33 self.SystemStateHandler, signal_name="GotoSystemState") 34 35 self.Set(DBUS_NAME, "current_state", "") 36 37 ## replace symbolic path in ID_LOOKUP 38 for category in System.ID_LOOKUP: 39 for key in System.ID_LOOKUP[category]: 40 val = System.ID_LOOKUP[category][key] 41 new_val = val.replace( 42 "<inventory_root>", obmc.inventory.INVENTORY_ROOT) 43 System.ID_LOOKUP[category][key] = new_val 44 45 self.SystemStateHandler(System.SYSTEM_STATES[0]) 46 47 print "SystemManager Init Done" 48 49 def SystemStateHandler(self, state_name): 50 print "Running System State: "+state_name 51 52 self.Set(DBUS_NAME, "current_state", state_name) 53 54 waitlist = System.EXIT_STATE_DEPEND.get(state_name, {}).keys() 55 if waitlist: 56 self.waiter = obmc.mapper.utils.Wait( 57 self.bus, waitlist, 58 callback=self.gotoNextState) 59 60 def gotoNextState(self): 61 s = 0 62 current_state = self.Get(DBUS_NAME, "current_state") 63 for i in range(len(System.SYSTEM_STATES)): 64 if (System.SYSTEM_STATES[i] == current_state): 65 s = i+1 66 67 if (s == len(System.SYSTEM_STATES)): 68 print "ERROR SystemManager: No more system states" 69 else: 70 new_state_name = System.SYSTEM_STATES[s] 71 print "SystemManager Goto System State: "+new_state_name 72 self.SystemStateHandler(new_state_name) 73 74 @dbus.service.method(DBUS_NAME, in_signature='', out_signature='s') 75 def getSystemState(self): 76 return self.Get(DBUS_NAME, "current_state") 77 78 def doObjectLookup(self, category, key): 79 obj_path = "" 80 intf_name = INTF_ITEM 81 try: 82 obj_path = System.ID_LOOKUP[category][key] 83 parts = obj_path.split('/') 84 if (parts[3] == 'sensors'): 85 intf_name = INTF_SENSOR 86 except Exception as e: 87 print "ERROR SystemManager: "+str(e)+" not found in lookup" 88 89 return [obj_path, intf_name] 90 91 @dbus.service.method(DBUS_NAME, in_signature='ss', out_signature='(ss)') 92 def getObjectFromId(self, category, key): 93 return self.doObjectLookup(category, key) 94 95 @dbus.service.method(DBUS_NAME, in_signature='sy', out_signature='(ss)') 96 def getObjectFromByteId(self, category, key): 97 byte = int(key) 98 return self.doObjectLookup(category, byte) 99 100 # Get the FRU area names defined in ID_LOOKUP table given a fru_id. 101 # If serval areas are defined for a fru_id, the areas are returned 102 # together as a string with each area name seperated with ','. 103 # If no fru area defined in ID_LOOKUP, an empty string will be returned. 104 @dbus.service.method(DBUS_NAME, in_signature='y', out_signature='s') 105 def getFRUArea(self, fru_id): 106 ret_str = '' 107 fru_id = '_' + str(fru_id) 108 area_list = [ 109 area for area in System.ID_LOOKUP['FRU_STR'].keys() 110 if area.endswith(fru_id)] 111 for area in area_list: 112 ret_str = area + ',' + ret_str 113 # remove the last ',' 114 return ret_str[:-1] 115 116 def NewObjectHandler(self, obj_path, iprops, bus_name=None): 117 current_state = self.Get(DBUS_NAME, "current_state") 118 if current_state not in System.EXIT_STATE_DEPEND: 119 return 120 121 if obj_path in System.EXIT_STATE_DEPEND[current_state]: 122 print "New object: "+obj_path+" ("+bus_name+")" 123 124 @dbus.service.method(DBUS_NAME, in_signature='s', out_signature='sis') 125 def gpioInit(self, name): 126 gpio_path = '' 127 gpio_num = -1 128 r = ['', gpio_num, ''] 129 if name not in System.GPIO_CONFIG: 130 # TODO: Error handling 131 print "ERROR: "+name+" not found in GPIO config table" 132 else: 133 134 gpio_num = -1 135 gpio = System.GPIO_CONFIG[name] 136 if 'gpio_num' in System.GPIO_CONFIG[name]: 137 gpio_num = gpio['gpio_num'] 138 else: 139 if 'gpio_pin' in System.GPIO_CONFIG[name]: 140 gpio_num = obmc.system.convertGpio(gpio['gpio_pin']) 141 else: 142 print "ERROR: SystemManager - GPIO lookup failed for "+name 143 144 if (gpio_num != -1): 145 r = [obmc.enums.GPIO_DEV, gpio_num, gpio['direction']] 146 return r 147 148 149if __name__ == '__main__': 150 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 151 bus = get_dbus() 152 obj = SystemManager(bus, OBJ_NAME) 153 mainloop = gobject.MainLoop() 154 obj.unmask_signals() 155 name = dbus.service.BusName(DBUS_NAME, bus) 156 157 print "Running SystemManager" 158 mainloop.run() 159 160# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 161