From: David Mulder Date: Thu, 21 Jan 2021 13:54:05 +0000 (-0700) Subject: gpo: Apply Group Policy Symlink Policy from VGP X-Git-Tag: tevent-0.11.0~1975 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ac29c8eeb98b0d2dc51b58d375fb38c4366255e;p=thirdparty%2Fsamba.git gpo: Apply Group Policy Symlink Policy from VGP This adds a Group Policy extension which applies symlink policies set by Vintela Group Policy in the SYSVOL. Signed-off-by: David Mulder Reviewed-by: Jeremy Allison --- diff --git a/python/samba/vgp_symlink_ext.py b/python/samba/vgp_symlink_ext.py index 0d1a617d017..20323a5d5ec 100644 --- a/python/samba/vgp_symlink_ext.py +++ b/python/samba/vgp_symlink_ext.py @@ -14,11 +14,63 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +import os from samba.gpclass import gp_xml_ext +from tempfile import NamedTemporaryFile +from subprocess import Popen, PIPE class vgp_symlink_ext(gp_xml_ext): + def __str__(self): + return 'VGP/Unix Settings/Symbolic Links' + def process_group_policy(self, deleted_gpo_list, changed_gpo_list): - pass + for guid, settings in deleted_gpo_list: + self.gp_db.set_guid(guid) + if str(self) in settings: + for attribute, symlink in settings[str(self)].items(): + if os.path.exists(symlink): + os.unlink(symlink) + self.gp_db.delete(str(self), attribute) + self.gp_db.commit() + + for gpo in changed_gpo_list: + if gpo.file_sys_path: + self.gp_db.set_guid(gpo.name) + xml = 'MACHINE/VGP/VTLA/Unix/Symlink/manifest.xml' + path = os.path.join(gpo.file_sys_path, xml) + xml_conf = self.parse(path) + if not xml_conf: + continue + policy = xml_conf.find('policysetting') + data = policy.find('data') + for entry in data.findall('file_properties'): + source = entry.find('source').text + target = entry.find('target').text + attribute = '%s:%s' % (source, target) + old_val = self.gp_db.retrieve(str(self), attribute) + if not old_val: + if not os.path.exists(target): + os.symlink(source, target) + self.gp_db.store(str(self), attribute, target) + else: + self.logger.warn('Symlink destination "%s" exists' + % target) + self.gp_db.commit() def rsop(self, gpo): - return {} + output = {} + xml = 'MACHINE/VGP/VTLA/Unix/Symlink/manifest.xml' + if gpo.file_sys_path: + path = os.path.join(gpo.file_sys_path, xml) + xml_conf = self.parse(path) + if not xml_conf: + return output + policy = xml_conf.find('policysetting') + data = policy.find('data') + for entry in data.findall('file_properties'): + source = entry.find('source').text + target = entry.find('target').text + if str(self) not in output.keys(): + output[str(self)] = [] + output[str(self)].append('ln -s %s %s' % (source, target)) + return output diff --git a/selftest/knownfail.d/gpo b/selftest/knownfail.d/gpo deleted file mode 100644 index e999efabd48..00000000000 --- a/selftest/knownfail.d/gpo +++ /dev/null @@ -1 +0,0 @@ -^samba.tests.gpo.samba.tests.gpo.GPOTests.test_vgp_symlink diff --git a/source4/scripting/bin/samba-gpupdate b/source4/scripting/bin/samba-gpupdate index 85300e15655..d9b8f421961 100755 --- a/source4/scripting/bin/samba-gpupdate +++ b/source4/scripting/bin/samba-gpupdate @@ -37,6 +37,7 @@ from samba.gp_sudoers_ext import gp_sudoers_ext from samba.vgp_sudoers_ext import vgp_sudoers_ext from samba.gp_smb_conf_ext import gp_smb_conf_ext from samba.gp_msgs_ext import gp_msgs_ext +from samba.vgp_symlink_ext import vgp_symlink_ext import logging if __name__ == "__main__": @@ -93,6 +94,7 @@ if __name__ == "__main__": gp_extensions.append(vgp_sudoers_ext) gp_extensions.append(gp_smb_conf_ext) gp_extensions.append(gp_msgs_ext) + gp_extensions.append(vgp_symlink_ext) gp_extensions.extend(machine_exts) elif opts.target == 'User': gp_extensions.extend(user_exts)