]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
gp: Ensure MOTD policy preforms proper cleanup
authorDavid Mulder <dmulder@samba.org>
Tue, 10 Jan 2023 00:19:44 +0000 (17:19 -0700)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 31 Jul 2023 09:58:30 +0000 (09:58 +0000)
Signed-off-by: David Mulder <dmulder@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/gp/vgp_motd_ext.py
selftest/knownfail.d/gpo

index 8a5f8a6458b02e273dedfb401e30798ae399787a..4aff6ec5db03f5646b9f8dcbe7513e1dde957e36 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 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 = {}
index 3d08aa883a41e39cd5b1248871e965f3bf0f073d..ac660223d0db7630a53c73f1248b15a0d9801973 100644 (file)
@@ -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