[PATCH phosphor-settingsd] Add system_state dbus property

OpenBMC Patches openbmc-patches at stwcx.xyz
Fri Jan 29 10:00:38 AEDT 2016


From: Adriana Kobylak <anoo at us.ibm.com>

Add system_state property to keep track of the system
state across reboots.
Include the generated settings_file.py since some build
machines cannot have the yaml python module installed. This
file will be removed once the code is ported to C in the next rework.
Add the path where the settings will be stored in bmc:
/var/lib/obmc/
Address review comments from the initial commit.
---
 settings.yaml       |  4 +++
 settings_file.py    |  2 +-
 settings_manager.py | 77 ++++++++++++++++++++++++-----------------------------
 3 files changed, 40 insertions(+), 43 deletions(-)

diff --git a/settings.yaml b/settings.yaml
index 8bd9543..5f7e767 100644
--- a/settings.yaml
+++ b/settings.yaml
@@ -12,3 +12,7 @@ host:
         name: boot_flags
         type: s
         default: "0000000000"
+    sysstate:
+        name: system_state
+        type: s
+        default: "BMC_INIT"
diff --git a/settings_file.py b/settings_file.py
index 85f04f0..7ffe391 100644
--- a/settings_file.py
+++ b/settings_file.py
@@ -1,2 +1,2 @@
 #!/usr/bin/python -u
-SETTINGS={'host': {'bootflags': {'default': '0000000000', 'type': 's', 'name': 'boot_flags'}, 'powercap': {'name': 'power_cap', 'min': 0, 'default': 0, 'max': 1000, 'type': 'i', 'unit': 'watts'}}}
\ No newline at end of file
+SETTINGS={'host': {'bootflags': {'default': '0000000000', 'type': 's', 'name': 'boot_flags'}, 'powercap': {'name': 'power_cap', 'min': 0, 'default': 0, 'max': 1000, 'type': 'i', 'unit': 'watts'}, 'sysstate': {'default': 'BMC_INIT', 'type': 's', 'name': 'system_state'}}}
\ No newline at end of file
diff --git a/settings_manager.py b/settings_manager.py
index 53ce7fb..e49b466 100755
--- a/settings_manager.py
+++ b/settings_manager.py
@@ -4,6 +4,8 @@ import gobject
 import dbus
 import dbus.service
 import dbus.mainloop.glib
+import os
+import os.path as path
 import Openbmc
 import settings_file as s
 
@@ -11,14 +13,14 @@ DBUS_NAME = 'org.openbmc.settings.Host'
 OBJ_NAME = '/org/openbmc/settings/host0'
 CONTROL_INTF = 'org.openbmc.Settings'
 
-# TODO Save settings in tmp until persistant storage is available
-# Path where the settings are stored in the BMC
-SETTINGS_PATH = '/tmp/'
-
 class HostSettingsObject(Openbmc.DbusProperties):
-    def __init__(self,bus,name):
+    def __init__(self, bus, name, settings, path):
         Openbmc.DbusProperties.__init__(self)
-        dbus.service.Object.__init__(self,bus,name)
+        dbus.service.Object.__init__(self, bus, name)
+
+        self.path = path
+        if not os.path.exists(path):
+            os.mkdir(path)
 
         # Listen to changes in the property values and sync them to the BMC
         bus.add_signal_receiver(self.settings_signal_handler,
@@ -27,58 +29,49 @@ class HostSettingsObject(Openbmc.DbusProperties):
             path = "/org/openbmc/settings/host0")
 
         # Create the dbus properties
-        for i in s.SETTINGS['host'].iterkeys():
-            self.sname = s.SETTINGS['host'][i]['name']
-            self.stype = s.SETTINGS['host'][i]['type']
-            self.svalue = s.SETTINGS['host'][i]['default']
-            self.bmcvalue = self.svalue # Default BMC value to file value
-            self.set_settings_property()
+        for i in settings['host'].iterkeys():
+            shk = settings['host'][i]
+            self.set_settings_property(shk['name'],
+                                       shk['type'],
+                                       shk['default'])
 
-    # Check if the requested value is the same as the current one in the BMC
-    def check_settings_need_update(self):
-        filepath = SETTINGS_PATH + self.sname
-        update = True
+    def get_bmc_value(self, name):
         try:
-            with open(filepath, 'r') as f:
-                self.bmcvalue = f.read() # Upate BMC value with value on system
-                if self.bmcvalue == self.svalue:
-                    update = False
+            with open(path.join(self.path, name), 'r') as f:
+                return f.read()
         except (IOError):
             pass
-        return update
+        return None
 
     # Create dbus properties based on bmc value. This will be either a value
     # previously set, or the default file value if the BMC value does not exist.
-    def set_settings_property(self):
-        update = self.check_settings_need_update()
-        if update == True:
-            self.svalue = self.bmcvalue # Update svalue with the value that will be used 
-            if self.stype=="i":
-                self.Set(DBUS_NAME,self.sname,self.svalue)
-            elif self.stype=="s":
-                self.Set(DBUS_NAME,self.sname,str(self.svalue))
+    def set_settings_property(self, name, type, value):
+        bmcv = self.get_bmc_value(name)
+        if bmcv:
+            value = bmcv
+        if type=="i":
+            self.Set(DBUS_NAME, name, value)
+        elif type=="s":
+            self.Set(DBUS_NAME, name, str(value))
 
     # Save the settings to the BMC. This will write the settings value in
     # individual files named by the property name to the BMC.
-    def set_system_settings(self):
-        update = self.check_settings_need_update()
-        if update == True:
-            filepath = SETTINGS_PATH + self.sname
+    def set_system_settings(self, name, value):
+        bmcv = self.get_bmc_value(name)
+        if bmcv != value:
+            filepath = path.join(self.path, name)
             with open(filepath, 'w') as f:
-                f.write(str(self.svalue))
+                f.write(str(value))
 
     # Signal handler for when one ore more settings properties were updated.
     # This will sync the changes to the BMC.
     def settings_signal_handler(self, interface_name, changed_properties, invalidated_properties):
-        data = changed_properties                                           
-        for i in data:                                                      
-            self.sname = i
-            self.svalue = data[i]
-            self.set_system_settings()
+        for name, value in changed_properties.items():
+            self.set_system_settings(name, value)
 
     # Placeholder signal. Needed to register the settings interface.
-    @dbus.service.signal(DBUS_NAME,signature='s')
-    def SettingsUpdated(self,sname):
+    @dbus.service.signal(DBUS_NAME, signature='s')
+    def SettingsUpdated(self, sname):
         pass
 
 if __name__ == '__main__':
@@ -86,7 +79,7 @@ if __name__ == '__main__':
 
     bus = Openbmc.getDBus()
     name = dbus.service.BusName(DBUS_NAME, bus)
-    obj = HostSettingsObject(bus, OBJ_NAME)
+    obj = HostSettingsObject(bus, OBJ_NAME, s.SETTINGS, "/var/lib/obmc/")
     mainloop = gobject.MainLoop()
 
     print "Running HostSettingsService"
-- 
2.6.4




More information about the openbmc mailing list