From: David Mulder Date: Tue, 10 Jan 2023 00:19:44 +0000 (-0700) Subject: gp: Ensure MOTD policy preforms proper cleanup X-Git-Tag: tevent-0.16.0~1312 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a330ad7b2cc163f34eb2d379e6ef98e7e449d477;p=thirdparty%2Fsamba.git gp: Ensure MOTD policy preforms proper cleanup Signed-off-by: David Mulder Reviewed-by: Douglas Bagnall Reviewed-by: Andrew Bartlett --- diff --git a/python/samba/gp/vgp_motd_ext.py b/python/samba/gp/vgp_motd_ext.py index 8a5f8a6458b..4aff6ec5db0 100644 --- a/python/samba/gp/vgp_motd_ext.py +++ b/python/samba/gp/vgp_motd_ext.py @@ -15,30 +15,46 @@ # along with this program. If not, see . import os -from samba.gp.gpclass import gp_xml_ext +from samba.gp.gpclass import gp_xml_ext, gp_misc_applier + +class vgp_motd_ext(gp_xml_ext, gp_misc_applier): + def unapply(self, guid, motd, attribute, value): + if attribute != 'motd': + raise ValueError('"%s" is not a message attribute' % attribute) + msg = value + data = self.parse_value(value) + current = open(motd, 'r').read() if os.path.exists(motd) else '' + # Only overwrite the msg if it hasn't been modified. It may have been + # modified by another GPO. + if 'new_val' not in data or current.strip() == data['new_val'].strip(): + msg = data['old_val'] + with open(motd, 'w') as w: + if msg: + w.write(msg) + else: + w.truncate() + self.cache_remove_attribute(guid, attribute) + + def apply(self, guid, motd, text): + current = open(motd, 'r').read() if os.path.exists(motd) else '' + if current != text.text: + with open(motd, 'w') as w: + w.write(text.text) + data = self.generate_value(old_val=current, new_val=text.text) + self.cache_add_attribute(guid, 'motd', data) -class vgp_motd_ext(gp_xml_ext): def __str__(self): return 'Unix Settings/Message of the Day' def process_group_policy(self, deleted_gpo_list, changed_gpo_list, motd='/etc/motd'): for guid, settings in deleted_gpo_list: - self.gp_db.set_guid(guid) if str(self) in settings: for attribute, msg in settings[str(self)].items(): - if attribute == 'motd': - with open(motd, 'w') as w: - if msg: - w.write(msg) - else: - w.truncate() - self.gp_db.delete(str(self), attribute) - self.gp_db.commit() + self.unapply(guid, motd, attribute, msg) for gpo in changed_gpo_list: if gpo.file_sys_path: - self.gp_db.set_guid(gpo.name) xml = 'MACHINE/VGP/VTLA/Unix/MOTD/manifest.xml' path = os.path.join(gpo.file_sys_path, xml) xml_conf = self.parse(path) @@ -47,12 +63,7 @@ class vgp_motd_ext(gp_xml_ext): policy = xml_conf.find('policysetting') data = policy.find('data') text = data.find('text') - current = open(motd, 'r').read() if os.path.exists(motd) else '' - if current != text.text: - with open(motd, 'w') as w: - w.write(text.text) - self.gp_db.store(str(self), 'motd', current) - self.gp_db.commit() + self.apply(gpo.name, motd, text) def rsop(self, gpo): output = {} diff --git a/selftest/knownfail.d/gpo b/selftest/knownfail.d/gpo index 3d08aa883a4..ac660223d0d 100644 --- a/selftest/knownfail.d/gpo +++ b/selftest/knownfail.d/gpo @@ -1,4 +1,3 @@ -^samba.tests.gpo.samba.tests.gpo.GPOTests.test_vgp_motd ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_smb_conf_ext ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_gp_user_scripts_ext ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_gp_user_centrify_crontab_ext