summaryrefslogtreecommitdiff
path: root/python/samba/gp_ext_loader.py
diff options
context:
space:
mode:
authorDavid Mulder <dmulder@suse.com>2018-05-09 09:24:37 -0600
committerAndrew Bartlett <abartlet@samba.org>2018-07-12 22:11:23 +0200
commit126b789268a3a21ee4d5769290b69d45860bb608 (patch)
treeff3b7b3c42b16160b16a0f305a90263392b5d338 /python/samba/gp_ext_loader.py
parentfb6c250bdeebfd00d1605dd76ac54d1013ea4ba2 (diff)
downloadsamba-126b789268a3a21ee4d5769290b69d45860bb608.tar.gz
gpo: Dynamically load gp_exts
This loads Group Policy Client Side Extensions similar to the way that they are loaded on a Windows client. Extensions are installed to a configuration file in the samba cache path where they receive a unique GUID matched with the path to the python gp_ext file. Classes which inherit from the gp_ext class (as defined in gpclass.py) will be dynamically loaded. Signed-off-by: David Mulder <dmulder@suse.com> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'python/samba/gp_ext_loader.py')
-rw-r--r--python/samba/gp_ext_loader.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/python/samba/gp_ext_loader.py b/python/samba/gp_ext_loader.py
new file mode 100644
index 00000000000..d25b2837286
--- /dev/null
+++ b/python/samba/gp_ext_loader.py
@@ -0,0 +1,51 @@
+# Group Policy Client Side Extension Loader
+# Copyright (C) David Mulder <dmulder@suse.com> 2018
+#
+# 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/>.
+
+import os
+from samba.gpclass import list_gp_extensions
+from samba.gpclass import gp_ext
+
+try:
+ import importlib.util
+ def import_file(name, location):
+ spec = importlib.util.spec_from_file_location(name, location)
+ module = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(module)
+ return module
+except ImportError:
+ import imp
+ def import_file(name, location):
+ return imp.load_source(name, location)
+
+def get_gp_ext_from_module(name, mod):
+ if mod:
+ for k, v in vars(mod).items():
+ if k == name and issubclass(v, gp_ext):
+ return v
+ return None
+
+def get_gp_client_side_extensions(logger, smb_conf):
+ machine_exts = []
+ gp_exts = list_gp_extensions(smb_conf)
+ for gp_ext in gp_exts.values():
+ module = import_file(gp_ext['ProcessGroupPolicy'], gp_ext['DllName'])
+ ext = get_gp_ext_from_module(gp_ext['ProcessGroupPolicy'], module)
+ if ext and gp_ext['MachinePolicy']:
+ machine_exts.append(ext)
+ logger.info('Loaded machine extension from %s: %s'
+ % (gp_ext['DllName'], ext.__name__))
+ return machine_exts
+