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