mirror of
https://github.com/altlinux/gpupdate.git
synced 2025-03-21 18:50:38 +03:00
Merge pull request #95 from altlinux/gsettings_expansion
Appliers for GSettings expanded with Windows key support
This commit is contained in:
commit
c701565325
@ -46,19 +46,39 @@ class system_gsetting:
|
||||
with open(self.file_path, 'w') as f:
|
||||
config.write(f)
|
||||
|
||||
def glib_map(value, glib_type):
|
||||
result_value = value
|
||||
|
||||
if glib_type == 'i':
|
||||
result_value = GLib.Variant(glib_type, int(value))
|
||||
else:
|
||||
result_value = GLib.Variant(glib_type, value)
|
||||
|
||||
return result_value
|
||||
|
||||
class user_gsetting:
|
||||
def __init__(self, schema, path, value):
|
||||
def __init__(self, schema, path, value, helper_function=None):
|
||||
logging.debug('Creating GSettings element {} (in {}) with value {}'.format(path, schema, value))
|
||||
self.schema = schema
|
||||
self.path = path
|
||||
self.value = value
|
||||
self.helper_function = helper_function
|
||||
|
||||
def apply(self):
|
||||
source = Gio.SettingsSchemaSource.get_default()
|
||||
schema = source.lookup(self.schema, True)
|
||||
key = schema.get_key(self.path)
|
||||
gvformat = key.get_value_type()
|
||||
val = GLib.Variant(gvformat.dup_string(), self.value)
|
||||
schema.set_value(self.path, val)
|
||||
logging.debug('Setting GSettings key {} (in {}) to {}'.format(self.path, self.schema, self.value))
|
||||
if self.helper_function:
|
||||
self.helper_function(self.schema, self.path, self.value)
|
||||
# Access the current schema
|
||||
settings = Gio.Settings(self.schema)
|
||||
# Get the key to modify
|
||||
key = settings.get_value(self.path)
|
||||
# Query the data type for the key
|
||||
glib_value_type = key.get_type_string()
|
||||
# Build the new value with the determined type
|
||||
val = glib_map(self.value, glib_value_type)
|
||||
# Set the value
|
||||
settings.set_value(self.path, val)
|
||||
|
||||
#gso = Gio.Settings.new(self.schema)
|
||||
#variants = gso.get_property(self.path)
|
||||
#if (variants.has_key(self.path)):
|
||||
|
23
gpoa/frontend/appliers/util.py
Normal file
23
gpoa/frontend/appliers/util.py
Normal file
@ -0,0 +1,23 @@
|
||||
#
|
||||
# GPOA - GPO Applier for Linux
|
||||
#
|
||||
# Copyright (C) 2019-2020 BaseALT Ltd.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from enum import Enum
|
||||
|
||||
class WallpaperStretchMode(Enum):
|
||||
STRETCH = 2
|
||||
|
@ -18,8 +18,14 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import pwd
|
||||
import subprocess
|
||||
|
||||
from gi.repository import (
|
||||
Gio
|
||||
, GLib
|
||||
)
|
||||
|
||||
from .applier_frontend import (
|
||||
applier_frontend
|
||||
, check_enabled
|
||||
@ -36,6 +42,7 @@ class gsettings_applier(applier_frontend):
|
||||
__module_enabled = False
|
||||
__registry_branch = 'Software\\BaseALT\\Policies\\gsettings'
|
||||
__global_schema = '/usr/share/glib-2.0/schemas'
|
||||
__windows_settings = dict()
|
||||
|
||||
def __init__(self, storage):
|
||||
self.storage = storage
|
||||
@ -79,6 +86,32 @@ class gsettings_applier(applier_frontend):
|
||||
else:
|
||||
logging.debug(slogm('GSettings applier for machine will not be started'))
|
||||
|
||||
class GSettingsMapping:
|
||||
def __init__(self, hive_key, gsettings_schema, gsettings_key):
|
||||
self.hive_key = hive_key
|
||||
self.gsettings_schema = gsettings_schema
|
||||
self.gsettings_key = gsettings_key
|
||||
|
||||
try:
|
||||
self.schema_source = Gio.SettingsSchemaSource.get_default()
|
||||
self.schema = self.schema_source.lookup(self.gsettings_schema, True)
|
||||
self.gsettings_schema_key = self.schema.get_key(self.gsettings_key)
|
||||
self.gsettings_type = self.gsettings_schema_key.get_value_type()
|
||||
except Exception as exc:
|
||||
print(exc)
|
||||
|
||||
def preg2gsettings(self):
|
||||
'''
|
||||
Transform PReg key variant into GLib.Variant. This function
|
||||
performs mapping of PReg type system into GLib type system.
|
||||
'''
|
||||
pass
|
||||
|
||||
def gsettings2preg(self):
|
||||
'''
|
||||
Transform GLib.Variant key type into PReg key type.
|
||||
'''
|
||||
pass
|
||||
|
||||
class gsettings_applier_user(applier_frontend):
|
||||
__module_name = 'GSettingsApplierUser'
|
||||
@ -95,17 +128,66 @@ class gsettings_applier_user(applier_frontend):
|
||||
self.gsettings = list()
|
||||
self.__module_enabled = check_enabled(self.storage, self.__module_name, self.__module_enabled)
|
||||
|
||||
self.__windows_settings = dict()
|
||||
self.windows_settings = list()
|
||||
mapping = [
|
||||
# Disable or enable screen saver
|
||||
GSettingsMapping(
|
||||
'Software\\Policies\\Microsoft\\Windows\\Control Panel\\Desktop\\ScreenSaveActive'
|
||||
, 'org.mate.screensaver'
|
||||
, 'idle-activation-enabled'
|
||||
)
|
||||
# Timeout in seconds for screen saver activation. The value of zero effectively disables screensaver start
|
||||
, GSettingsMapping(
|
||||
'Software\\Policies\\Microsoft\\Windows\\Control Panel\\Desktop\\ScreenSaveTimeOut'
|
||||
, 'org.mate.session'
|
||||
, 'idle-delay'
|
||||
)
|
||||
# Enable or disable password protection for screen saver
|
||||
, GSettingsMapping(
|
||||
'Software\\Policies\\Microsoft\\Windows\\Control Panel\\Desktop\\ScreenSaverIsSecure'
|
||||
, 'org.mate.screensaver'
|
||||
, 'lock-enabled'
|
||||
)
|
||||
# Specify image which will be used as a wallpaper
|
||||
, GSettingsMapping(
|
||||
'Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\Wallpaper'
|
||||
, 'org.mate.background'
|
||||
, 'picture-filename'
|
||||
)
|
||||
]
|
||||
self.windows_settings.extend(mapping)
|
||||
|
||||
for element in self.windows_settings:
|
||||
self.__windows_settings[element.hive_key] = element
|
||||
|
||||
|
||||
def run(self):
|
||||
for setting in self.gsettings_keys:
|
||||
valuename = setting.hive_key.rpartition('\\')[2]
|
||||
rp = valuename.rpartition('.')
|
||||
schema = rp[0]
|
||||
path = rp[2]
|
||||
self.gsettings.append(user_gsetting(schema, path, setting.data))
|
||||
#for setting in self.gsettings_keys:
|
||||
# valuename = setting.hive_key.rpartition('\\')[2]
|
||||
# rp = valuename.rpartition('.')
|
||||
# schema = rp[0]
|
||||
# path = rp[2]
|
||||
# self.gsettings.append(user_gsetting(schema, path, setting.data))
|
||||
|
||||
os.environ['DBUS_SESSION_BUS_ADDRESS'] = 'unix:path=/run/user/{}/bus'.format(pwd.getpwnam(self.username).pw_uid)
|
||||
|
||||
for setting_key in self.__windows_settings.keys():
|
||||
logging.debug('Checking for GSettings mapping {}'.format(setting_key))
|
||||
value = self.storage.get_hkcu_entry(self.sid, setting_key)
|
||||
if value:
|
||||
logging.debug('Found GSettings mapping {} to {}'.format(setting_key, value.data))
|
||||
mapping = self.__windows_settings[setting_key]
|
||||
self.gsettings.append(user_gsetting(mapping.gsettings_schema, mapping.gsettings_key, value.data))
|
||||
else:
|
||||
logging.debug('GSettings mapping of {} to {} not found'.format(setting_key, value.data))
|
||||
|
||||
for gsetting in self.gsettings:
|
||||
logging.debug('Applying setting {}/{}'.format(gsetting.schema, gsetting.path))
|
||||
gsetting.apply()
|
||||
|
||||
del os.environ['DBUS_SESSION_BUS_ADDRESS']
|
||||
|
||||
def user_context_apply(self):
|
||||
if self.__module_enabled:
|
||||
logging.debug(slogm('Running GSettings applier for user in user context'))
|
||||
|
Loading…
x
Reference in New Issue
Block a user