blob: 53ce7fb3f7e21882bd55b6f95e5b04fdf3ae28ce [file] [log] [blame]
#!/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()