From 4c60e5ec7bc4567a13fc5ffea0cb51e7850fa9b5 Mon Sep 17 00:00:00 2001 From: Adriana Kobylak Date: Sun, 10 Jan 2016 15:22:45 -0600 Subject: Create the settings dbus object. Host settings are specified in a yaml file. Parser converts the yaml file into a dictionary. The settings manager runs on the BMC and uses the dictionary to create the dbus properties and save the values in the BMC so that the values persist. --- settings.yaml | 14 ++++++++ settings_file.py | 2 ++ settings_manager.py | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ settings_parser.py | 20 ++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 settings.yaml create mode 100644 settings_file.py create mode 100755 settings_manager.py create mode 100755 settings_parser.py diff --git a/settings.yaml b/settings.yaml new file mode 100644 index 0000000..8bd9543 --- /dev/null +++ b/settings.yaml @@ -0,0 +1,14 @@ +--- +# Settings Config File +host: + powercap: + name: power_cap + type: i + default: 0 + min: 0 + max: 1000 + unit: watts + bootflags: + name: boot_flags + type: s + default: "0000000000" diff --git a/settings_file.py b/settings_file.py new file mode 100644 index 0000000..85f04f0 --- /dev/null +++ b/settings_file.py @@ -0,0 +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 diff --git a/settings_manager.py b/settings_manager.py new file mode 100755 index 0000000..53ce7fb --- /dev/null +++ b/settings_manager.py @@ -0,0 +1,94 @@ +#!/usr/bin/python -u + +import gobject +import dbus +import dbus.service +import dbus.mainloop.glib +import Openbmc +import settings_file as s + +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): + Openbmc.DbusProperties.__init__(self) + dbus.service.Object.__init__(self,bus,name) + + # Listen to changes in the property values and sync them to the BMC + bus.add_signal_receiver(self.settings_signal_handler, + dbus_interface = "org.freedesktop.DBus.Properties", + signal_name = "PropertiesChanged", + 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() + + # 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 + 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 + except (IOError): + pass + return update + + # 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)) + + # 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 + with open(filepath, 'w') as f: + f.write(str(self.svalue)) + + # 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() + + # Placeholder signal. Needed to register the settings interface. + @dbus.service.signal(DBUS_NAME,signature='s') + def SettingsUpdated(self,sname): + pass + +if __name__ == '__main__': + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + + bus = Openbmc.getDBus() + name = dbus.service.BusName(DBUS_NAME, bus) + obj = HostSettingsObject(bus, OBJ_NAME) + mainloop = gobject.MainLoop() + + print "Running HostSettingsService" + mainloop.run() + diff --git a/settings_parser.py b/settings_parser.py new file mode 100755 index 0000000..46bb474 --- /dev/null +++ b/settings_parser.py @@ -0,0 +1,20 @@ +#!/usr/bin/python -u + +# Simple parser to create a python dictionary from a yaml file. +# It saves the applications from doing the parsing and +# adding dependencies to additional modules like yaml + +import yaml + +SETTINGS_FILE = 'settings.yaml' +OUTPUT_FILE = 'settings_file.py' +FILE_HEADER = '#!/usr/bin/python -u' + +with open(SETTINGS_FILE) as s: + data = yaml.safe_load(s) + +with open(OUTPUT_FILE, 'w') as f: + f.write(FILE_HEADER) + f.write('\n') + f.write('SETTINGS=') + f.write(str(data)) -- cgit v1.2.1