[PATCHES] Miscellaneous Python fixes

Douglas Bagnall douglas.bagnall at catalyst.net.nz
Thu Oct 25 09:47:53 UTC 2018


These are mainly for Python 3 compatibility.

CI: https://gitlab.com/samba-team/devel/samba/pipelines/34246431
but again I have edited the series since that, because I noticed
I had sent one of the patches in an earlier batch.

Douglas
-------------- next part --------------
From d1b8d16cb16403ada32a62355daedd93888162ef Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 12:38:27 +1300
Subject: [PATCH 01/13] samba-tool gpo: replace file() with open() for py3

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 python/samba/netcmd/gpo.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/python/samba/netcmd/gpo.py b/python/samba/netcmd/gpo.py
index 6a7efe8add8..07c31f3a043 100644
--- a/python/samba/netcmd/gpo.py
+++ b/python/samba/netcmd/gpo.py
@@ -295,7 +295,7 @@ def backup_directory_remote_to_local(conn, remotedir, localdir):
                 os.mkdir(l_name)
             else:
                 data = conn.loadfile(r_name)
-                with file(l_name + SUFFIX, 'w') as f:
+                with open(l_name + SUFFIX, 'w') as f:
                     f.write(data)
 
                 parser = find_parser(e['name'])
-- 
2.11.0


From 920ac2250c2b421c316376240ed904eaf12ff10f Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 13:21:53 +1300
Subject: [PATCH 02/13] python/gp_parse/gp_csv: use compat.text_type instead of
 unicode (PY3)

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 python/samba/gp_parse/gp_csv.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/python/samba/gp_parse/gp_csv.py b/python/samba/gp_parse/gp_csv.py
index b19f84c56f7..d5cbcdc41af 100644
--- a/python/samba/gp_parse/gp_csv.py
+++ b/python/samba/gp_parse/gp_csv.py
@@ -25,6 +25,7 @@ from io import BytesIO
 from xml.etree.ElementTree import Element, SubElement
 
 from samba.gp_parse import GPParser
+from samba.compat import text_type
 
 # [MS-GPAC] Group Policy Audit Configuration
 class GPAuditCsvParser(GPParser):
@@ -135,7 +136,7 @@ class UnicodeReader:
 
     def next(self):
         row = next(self.reader)
-        return [unicode(s, "utf-8") for s in row]
+        return [text_type(s, "utf-8") for s in row]
 
     def __iter__(self):
         return self
-- 
2.11.0


From 9f0451a1f37b024aea0ffa3dd260c90c2c420bb5 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 17:22:48 +1300
Subject: [PATCH 03/13] s4/dsdb/pytest/sam: use compat.text_type, not unicode

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 source4/dsdb/tests/python/sam.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/source4/dsdb/tests/python/sam.py b/source4/dsdb/tests/python/sam.py
index 9a5e2535096..7bd477dc0e8 100755
--- a/source4/dsdb/tests/python/sam.py
+++ b/source4/dsdb/tests/python/sam.py
@@ -10,6 +10,7 @@ import time
 
 sys.path.insert(0, "bin/python")
 import samba
+from samba.compat import text_type
 from samba.tests.subunitrun import SubunitOptions, TestProgram
 
 import samba.getopt as options
@@ -1740,7 +1741,7 @@ class SamTests(samba.tests.TestCase):
 
         username = "ldaptestuser"
         password = "thatsAcomplPASS2"
-        utf16pw = unicode('"' + password.encode('utf-8') + '"', 'utf-8').encode('utf-16-le')
+        utf16pw = text_type('"' + password.encode('utf-8') + '"', 'utf-8').encode('utf-16-le')
 
         ldb.add({
             "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
-- 
2.11.0


From 9a2ebc78c0cdaaeaca35887d9ea932b0ff015b3c Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 12:40:09 +1300
Subject: [PATCH 04/13] samba-tool ldapcmp: use ValueError, not obsolete
 StandardError

The error is in the value, and StandardError is not in Python 3

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 python/samba/netcmd/ldapcmp.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/python/samba/netcmd/ldapcmp.py b/python/samba/netcmd/ldapcmp.py
index 6508a8fe5db..312c8ecba0a 100644
--- a/python/samba/netcmd/ldapcmp.py
+++ b/python/samba/netcmd/ldapcmp.py
@@ -854,7 +854,7 @@ class LDAPBundel(object):
         elif self.search_scope == "ONE":
             self.search_scope = SCOPE_ONELEVEL
         else:
-            raise StandardError("Wrong 'scope' given. Choose from: SUB, ONE, BASE")
+            raise ValueError("Wrong 'scope' given. Choose from: SUB, ONE, BASE")
         try:
             res = self.con.ldb.search(base=self.search_base, scope=self.search_scope, attrs=["dn"])
         except LdbError as e3:
-- 
2.11.0


From 8996627b5d85228f4d567894800e024345da5cc1 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 12:52:09 +1300
Subject: [PATCH 05/13] python/samba/common: py3 compat raw_input

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 python/samba/common.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/python/samba/common.py b/python/samba/common.py
index fabbcea13df..76d00e35fb5 100644
--- a/python/samba/common.py
+++ b/python/samba/common.py
@@ -31,6 +31,8 @@ if PY3:
     def cmp(a, b):
         return (a > b) - (a < b)
 
+    raw_input = input
+
 
 def confirm(msg, forced=False, allow_all=False):
     """confirm an action with the user
-- 
2.11.0


From 26211ad5a66c5cf23bfab589c5a5b2285585e123 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 13:07:30 +1300
Subject: [PATCH 06/13] python/remove_dc: use a local variable in
 offline_remove_server

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 python/samba/remove_dc.py | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/python/samba/remove_dc.py b/python/samba/remove_dc.py
index a6062703f24..e6b1b7bdc04 100644
--- a/python/samba/remove_dc.py
+++ b/python/samba/remove_dc.py
@@ -229,15 +229,15 @@ def offline_remove_server(samdb, logger,
                         scope=ldb.SCOPE_BASE,
                         expression="(objectClass=server)")
     msg = msgs[0]
-    dc_name = str(msgs[0]["cn"][0])
+    dc_name = str(msg["cn"][0])
 
     try:
-        computer_dn = ldb.Dn(samdb, msgs[0]["serverReference"][0].decode('utf8'))
+        computer_dn = ldb.Dn(samdb, msg["serverReference"][0].decode('utf8'))
     except KeyError:
         computer_dn = None
 
     try:
-        dnsHostName = str(msgs[0]["dnsHostName"][0])
+        dnsHostName = str(msg["dnsHostName"][0])
     except KeyError:
         dnsHostName = None
 
@@ -267,8 +267,8 @@ def offline_remove_server(samdb, logger,
             logger.info("Removing computer account: %s (and any child objects)" % computer_dn)
             samdb.delete(computer_dn, ["tree_delete:0"])
 
-        if "dnsHostName" in msgs[0]:
-            dnsHostName = str(msgs[0]["dnsHostName"][0])
+        if "dnsHostName" in msg:
+            dnsHostName = str(msg["dnsHostName"][0])
 
     if remove_dns_account:
         res = samdb.search(expression="(&(objectclass=user)(cn=dns-%s)(servicePrincipalName=DNS/%s))" %
-- 
2.11.0


From 826b1a7c58e0d404428062b726d31b8d648f45f1 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 13:37:28 +1300
Subject: [PATCH 07/13] python/kcc: use compat.cmp_fn (PY3)

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 python/samba/kcc/__init__.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/python/samba/kcc/__init__.py b/python/samba/kcc/__init__.py
index 5e1762d5b6f..6c6c202fa2c 100644
--- a/python/samba/kcc/__init__.py
+++ b/python/samba/kcc/__init__.py
@@ -44,7 +44,7 @@ from samba.kcc.graph import Vertex
 
 from samba.kcc.debug import DEBUG, DEBUG_FN, logger
 from samba.kcc import debug
-from samba.compat import text_type
+from samba.compat import cmp_fn
 
 
 def sort_dsa_by_gc_and_guid(dsa1, dsa2):
@@ -61,7 +61,7 @@ def sort_dsa_by_gc_and_guid(dsa1, dsa2):
         return -1
     if not dsa1.is_gc() and dsa2.is_gc():
         return +1
-    return cmp(ndr_pack(dsa1.dsa_guid), ndr_pack(dsa2.dsa_guid))
+    return cmp_fn(ndr_pack(dsa1.dsa_guid), ndr_pack(dsa2.dsa_guid))
 
 
 def is_smtp_replication_available():
-- 
2.11.0


From 7fb6476904d9e2a98520abebe5d045188efcb057 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 16:04:38 +1300
Subject: [PATCH 08/13] script/show_test_time: approach python 3 compatibility

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 script/show_test_time | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/script/show_test_time b/script/show_test_time
index 81bb7932a4a..a35e2154275 100755
--- a/script/show_test_time
+++ b/script/show_test_time
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-
+from __future__ import print_function
 import optparse
 import os.path
 import subprocess
@@ -23,10 +23,10 @@ for l in p.stdout:
     durations[name] = float(duration)
 
 if opts.limit:
-    print "Top %d tests by run time:" % opts.limit
+    print("Top %d tests by run time:" % opts.limit)
 
 for i, (name, length) in enumerate(sorted(
     durations.items(), cmp=lambda (k1,v1), (k2, v2): cmp(v1, v2), reverse=True)):
     if opts.limit and i == opts.limit:
         break
-    print "%d: %s -> %ds" % (i+1, name, length)
+    print("%d: %s -> %ds" % (i+1, name, length))
-- 
2.11.0


From c90629f7ab93cea74c083cc279dd284448e59438 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 16:52:14 +1300
Subject: [PATCH 09/13] s4/dsdb/pytests: Py3 compatitble except clauses

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 source4/dsdb/tests/python/ad_dc_medley_performance.py | 3 ++-
 source4/dsdb/tests/python/passwords.py                | 9 ++++++---
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/source4/dsdb/tests/python/ad_dc_medley_performance.py b/source4/dsdb/tests/python/ad_dc_medley_performance.py
index f484cae9e08..1101ca0e160 100644
--- a/source4/dsdb/tests/python/ad_dc_medley_performance.py
+++ b/source4/dsdb/tests/python/ad_dc_medley_performance.py
@@ -234,7 +234,8 @@ class UserTests(samba.tests.TestCase):
                 self.ldb.search(pattern % i,
                                 scope=SCOPE_BASE,
                                 attrs=['cn'])
-            except LdbError as (num, msg):
+            except LdbError as e:
+                (num, msg) = e
                 if num != ERR_NO_SUCH_OBJECT:
                     raise
 
diff --git a/source4/dsdb/tests/python/passwords.py b/source4/dsdb/tests/python/passwords.py
index 0f73cf31928..b68637242be 100755
--- a/source4/dsdb/tests/python/passwords.py
+++ b/source4/dsdb/tests/python/passwords.py
@@ -1088,7 +1088,8 @@ delete: userPassword
 add: userPassword
 userPassword: thatsAcomplPASS1
 """)
-        except LdbError, (num, msg):
+        except LdbError as e:
+            (num, msg) = e
             self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
         else:
             self.fail()
@@ -1104,7 +1105,8 @@ delete: clearTextPassword
 add: clearTextPassword
 clearTextPassword: thatsAcomplPASS2
 """)
-        except LdbError, (num, msg):
+        except LdbError as e:
+            (num, msg) = e
             self.assertTrue(num == ERR_CONSTRAINT_VIOLATION or
                             num == ERR_NO_SUCH_ATTRIBUTE)  # for Windows
         else:
@@ -1121,7 +1123,8 @@ delete: unicodePwd
 add: unicodePwd
 unicodePwd:: """ + base64.b64encode("\"thatsAcomplPASS3\"".encode('utf-16-le')).decode('utf8') + """
 """)
-        except LdbError, (num, msg):
+        except LdbError as e:
+            (num, msg) = e
             self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
         else:
             self.fail()
-- 
2.11.0


From 5ce34e3786aa9129fd2f8a81b2821e2e382fab93 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 17:06:32 +1300
Subject: [PATCH 10/13] s4/dsdb/pytest/ad_dc_medley: do not use xrange

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 source4/dsdb/tests/python/ad_dc_medley_performance.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source4/dsdb/tests/python/ad_dc_medley_performance.py b/source4/dsdb/tests/python/ad_dc_medley_performance.py
index 1101ca0e160..0636210d1e3 100644
--- a/source4/dsdb/tests/python/ad_dc_medley_performance.py
+++ b/source4/dsdb/tests/python/ad_dc_medley_performance.py
@@ -422,7 +422,7 @@ class UserTests(samba.tests.TestCase):
         lines = ["dn: CN=g%d,%s" % (g, self.ou_groups),
                  "objectclass: group"]
 
-        for i in xrange(self.state.next_user_id):
+        for i in range(self.state.next_user_id):
             if random.random() <= link_chance:
                 lines.append("member: cn=u%d,%s" % (i, self.ou_users))
                 self.state.active_links.add((i, g))
-- 
2.11.0


From 3398a9d3d0bdc48a39bd0352796cc794258eb1d9 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 17:23:54 +1300
Subject: [PATCH 11/13] s4/dsdb/pytest/sort: use compat.cmp_fn instead of cmp

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 source4/dsdb/tests/python/sort.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/source4/dsdb/tests/python/sort.py b/source4/dsdb/tests/python/sort.py
index f1247be9e1f..ac989bd4356 100644
--- a/source4/dsdb/tests/python/sort.py
+++ b/source4/dsdb/tests/python/sort.py
@@ -14,7 +14,7 @@ import re
 sys.path.insert(0, "bin/python")
 import samba
 from samba.tests.subunitrun import SubunitOptions, TestProgram
-
+from samba.compat import cmp_fn
 import samba.getopt as options
 
 from samba.auth import system_session
@@ -286,10 +286,10 @@ class BaseSortTests(samba.tests.TestCase):
             return locale.strcoll(a[0], b[0])
 
         def cmp_binary(a, b):
-            return cmp(a[0], b[0])
+            return cmp_fn(a[0], b[0])
 
         def cmp_numeric(a, b):
-            return cmp(int(a[0]), int(b[0]))
+            return cmp_fn(int(a[0]), int(b[0]))
 
         # For testing simplicity, the attributes in here need to be
         # unique for each user. Otherwise there are multiple possible
-- 
2.11.0


From a3e7f0311e188589032a5362c5c4385a76048428 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 18:32:52 +1300
Subject: [PATCH 12/13] s4/scripting: py3 style 0o123 octal, not 0123

this works with py2.6+ too.

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 source4/scripting/devel/config_base | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source4/scripting/devel/config_base b/source4/scripting/devel/config_base
index e48d3a6ce14..0d495c5091b 100755
--- a/source4/scripting/devel/config_base
+++ b/source4/scripting/devel/config_base
@@ -26,7 +26,7 @@ config_dir  = prefix + "/etc"
 config_file = config_dir + "/smb.conf"
 
 if not os.path.isdir(config_dir):
-    os.makedirs(config_dir, mode=0755)
+    os.makedirs(config_dir, mode=0o755)
 if not os.path.isfile(config_file):
     open(config_file, mode='w').close()
 
-- 
2.11.0


From b85f93902d26598e28fc575063d4aca00d914345 Mon Sep 17 00:00:00 2001
From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date: Thu, 11 Oct 2018 18:33:48 +1300
Subject: [PATCH 13/13] s4/scripting/demodirsync: fix syntax error

Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
---
 source4/scripting/devel/demodirsync.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source4/scripting/devel/demodirsync.py b/source4/scripting/devel/demodirsync.py
index 248cfec7101..260104cc198 100755
--- a/source4/scripting/devel/demodirsync.py
+++ b/source4/scripting/devel/demodirsync.py
@@ -138,7 +138,7 @@ cookie.blob.highwatermark.tmp_highest_usn = usn - 2
 if cookie.blob.extra_length > 0:
     cookie.blob.extra.ctr.cursors[0].source_dsa_invocation_id = misc.GUID("128a99bf-e2df-4832-ac0a-1fb625e530db")
     cookie.blob.extra.ctr.cursors[0].highest_usn = bigusn - 1
-controls = ["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie)).decode('utf8'))
+controls = ["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie)).decode('utf8')]
 (msgs, ctrls) = remote_ldb.searchex(expression="(objectclass=*)", base=base, controls=controls)
 if (len(ctrls)):
     for ctl in ctrls:
-- 
2.11.0



More information about the samba-technical mailing list