[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Tue Oct 23 07:11:03 UTC 2018


The branch, master has been updated
       via  d357141 CI/Autobuild: Remove samba-none-env-py3 test
       via  8ba6bb5 Add new CI job for new purepy3-none-env autobuild task
       via  f8b5dd9 script: Add new (temporary) autobuild task for none-env tests.
       via  25b16fa python/samba/netcmd: PY3 fix CI error for samba.tests.samba_tool.help
       via  c11e90a python/samba/provision: PY3 PY3 port samba4.blackbox.provision-backend
       via  cf38a06 python/samba: PY3 port samba4.blackbox.provision-backend
       via  86e22c0 python/samba/provision: PY3 port samba4.blackbox.provision-backend
       via  2c0f7f0 python/samba/netcmd: PY3 make sure get_testparm_var returns 'str'
       via  a114ff2 python/samba/samba3: PY3 tdb.Tdb.get method expects bytes in PY3
       via  7aa4031 python/samba/netcmd: PY3 fix samba.tests.domain_backup_offline
       via  09f6b86 python/samba: PY3 port samba4.blackbox.functionalprep
       via  7562a55 python/samba/netcmd: PY3 Fix error in samba4.blackbox.schemaupgrade
       via  55f5147 selftest/filter: PY3 Make filter-subunit forgiving of decoding errors
       via  b142e28 python/samba: PY3 fix samba4.blackbox.upgradeprovision.release-4-0-0
       via  60e7aa8 s4/scripting/bin: blobs needs to be bytes
       via  c377bcd s4/scripting/bin: PY3 fix samba4.blackbox.upgradeprovision.alpha13
       via  1a4e95d s4/scripting/bin: PY3 make sure GUID result of format is string
       via  f94a813 s4/scripting: Py2/Py3 for samba4.blackbox.upgradeprovision.alpha13
       via  0febd00 s4/scripting: PY2/PY3 port for samba4.blackbox.upgradeprovision.current
       via  557ff7b python/samba: samba4.blackbox.dbcheck.release-4-1-0rc3
       via  370dcbb samba_tool: Enclose iterator with list
       via  e5cac2b python/samba: misc use of str for ldb.bytes
       via  17728c2 python/samba: ldb attribute string fix for wafsamba.tests
       via  8eae420 PY3: ensure StringIO usage is py2/py3 compatible
       via  ca12342 PY3: relative import fixes
       via  9ae5fd6 s4/scripting/bin: PY3 Fix exception tuple assignments.
       via  4287d11 PY3: port samba.tests.samba3sam
       via  72c5b27 python/samba: use PY3 version of ConfigParser
       via  04c118c python/samba/gp_parse: PY2/PY3 compat porting for gp_init.py
       via  600fde5 python/samba: add alias for ConfigParser for PY2/PY3 compatability
       via  8d7830b PY3: convert samba.tests.strings to Py2/Py3
       via  2323972 python: py_strcasecmp_m & py_strstr_m don't handle unicode properly
       via  95dbe11 python/samba/tests: PY2/PY3 port samba.tests.dcerpc.integer
       via  9ea6cb1 python/samba/netcmd: PY3 only possible to decode bytes
       via  ade47b3 PY3: Only decode when necessary
       via  ee595e9 s4/setup/tests: PY3 samba-tool needs to be called with correct python ver.
       via  15b2ab0 s4/scripting: PY3 Ensure python scripts are run with correct python ver.
       via  c751013 testprogs/blackbox: Use PYTHON env variable for calling python scripts
       via  c8403f3 python/samba/tests: make sure samba-tool is called with ${PYTHON}
       via  9f8a570f selftest/target: Make sure samba-tool is called with ${PYTHON}
       via  e538217 PY3: In a pure PY3 build filter-subunit was getting called without 'python'
       via  dcf787b s4/scripting: PY3 need to convert cmp funct to key func for sort.
       via  4120026 python/samba/gp_parse: PY3 fdeploy_sids needs to use key method for sort
       via  842f09a samba-tool: PY3 dict view doesn't have sort method,
       via  ff3f541 python/samba/tests: PY3 iterable has no sort method
       via  f5f8676 s4/scripting/bin: PY3 Make sure print statements are enclosed by '()'
       via  d114ca1 selftest: Add expected-value testing for userParameters
      from  fbea9d3 ctdb-daemon: Fix valgrind hit in event code

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d3571415469ece5341a330c8987139d0f5749e52
Author: Noel Power <noel.power at suse.com>
Date:   Thu Oct 18 09:49:24 2018 +0100

    CI/Autobuild: Remove samba-none-env-py3 test
    
    We now run a purepython3 none-env test, later when the whole
    build is running under python3 we will resurrect this job
    but as (samba-none-env-py2) for python2
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Tue Oct 23 09:10:22 CEST 2018 on sn-devel-144

commit 8ba6bb59c159bf1ac5aab4be1939e7d0657ae4cb
Author: Noel Power <noel.power at suse.com>
Date:   Tue Oct 16 19:39:41 2018 +0100

    Add new CI job for new purepy3-none-env autobuild task
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f8b5dd954460cccc7f482e9988b6f13e84a60e9c
Author: Noel Power <noel.power at suse.com>
Date:   Tue Oct 16 19:25:26 2018 +0100

    script: Add new (temporary) autobuild task for none-env tests.
    
    Ideally we want all the tests to run under python3 by default (no
    special task for this) and then convert the existing '-py3' tasks
    to run the python tests with python3.
    However at the moment the convertion process is not ready to do this,
    for a while we need to run separate autobuild tasks for this.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 25b16fa0649579f17789e4f06e40b840d77942aa
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 17 18:06:34 2018 +0100

    python/samba/netcmd: PY3 fix CI error for samba.tests.samba_tool.help
    
    Strangely the test was failing on CI only, looks like there is an
    issue with order of elements returned from dict.items() with python3.4
    (version of python in CI docker instance) and python3.6 (version on my
    development machine). Changed code to sort the keys so order of help
    printed out should be the same for each invocation.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c11e90a123fce5cf8d29d59ae96dfc84d5ce0d04
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 12:25:09 2018 +0100

    python/samba/provision: PY3 PY3 port samba4.blackbox.provision-backend
    
    Enclose filter with list as filter object has no 'len' method
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit cf38a067e8b1a3308c2c11dbecae8efbc7be02ba
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 12:21:10 2018 +0100

    python/samba: PY3 port samba4.blackbox.provision-backend
    
    convert ldif content to str when necessary
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 86e22c060655bde73b24223e790bd27c5fd4afe7
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 12:18:32 2018 +0100

    python/samba/provision: PY3 port samba4.blackbox.provision-backend
    
    Fix some attibrutes that need to be treated as str
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2c0f7f07c60209cd3e32b9f17737e72fcc02fdc9
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 11:18:13 2018 +0100

    python/samba/netcmd: PY3 make sure get_testparm_var returns 'str'
    
    part of PY3 port samba4.blackbox.upgrade.samba3-upgrade*
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a114ff2182a7de1a49416136b2b8e9280f7768da
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 11:16:40 2018 +0100

    python/samba/samba3: PY3 tdb.Tdb.get method expects bytes in PY3
    
    part of PY3 port samba4.blackbox.upgrade.samba3-upgrade*
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 7aa40311d737d6ac90503b835280af6dcd85e026
Author: Noel Power <noel.power at suse.com>
Date:   Tue Oct 9 21:16:08 2018 +0100

    python/samba/netcmd: PY3 fix samba.tests.domain_backup_offline
    
    Fix attributes that need to be treated as str not bytes
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 09f6b86403cdb8cee3d999dfac1455bb87a4bdac
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 8 15:21:45 2018 +0100

    python/samba: PY3 port samba4.blackbox.functionalprep
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 7562a5518fe8ea49991ca0af8b977f7b9940d014
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 8 12:27:56 2018 +0100

    python/samba/netcmd: PY3 Fix error in samba4.blackbox.schemaupgrade
    
    Getting Exception: must be str, not ldb.bytes error in scheme_upgrade
    phase of test
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 55f51476ac6ed9a653bd9e9695b1dc4783b32ce3
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 5 16:49:45 2018 +0100

    selftest/filter: PY3 Make filter-subunit forgiving of decoding errors
    
    samba4.local.ndr for one is a test that outputs string in an encoding
    that stdin.readline() guesses to be utf8 (but it isn't) filter subunit
    can afford to be forgiving of some random text that can't be decoded as
    utf8 so lets do that.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b142e28e35628fb815cdb16830b12c77d5142455
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 5 15:10:52 2018 +0100

    python/samba: PY3 fix samba4.blackbox.upgradeprovision.release-4-0-0
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 60e7aa86d8777a4f5d61f45686ec8cda3a59ea99
Author: Noel Power <noel.power at suse.com>
Date:   Thu Oct 4 18:29:37 2018 +0100

    s4/scripting/bin: blobs needs to be bytes
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c377bcd487c59555633041624683a3c958897dbc
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 3 15:19:09 2018 +0100

    s4/scripting/bin: PY3 fix samba4.blackbox.upgradeprovision.alpha13

commit 1a4e95da2b57c43c89a08aae18765ebf5a7f0f88
Author: Noel Power <noel.power at suse.com>
Date:   Tue Oct 2 14:45:53 2018 +0100

    s4/scripting/bin: PY3 make sure GUID result of format is string
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f94a81379666db7145ae0495bf16fb4f95c6cb31
Author: Noel Power <noel.power at suse.com>
Date:   Mon Aug 27 20:29:53 2018 +0100

    s4/scripting: Py2/Py3 for samba4.blackbox.upgradeprovision.alpha13
    
    fixup source4/scripting/bin/samba_upgradedns
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0febd003b5762339e491017afe65661b2709ef97
Author: Noel Power <noel.power at suse.com>
Date:   Mon Aug 27 13:08:26 2018 +0100

    s4/scripting: PY2/PY3 port for samba4.blackbox.upgradeprovision.current
    
    o Fix various ldb attribute that need to be converted to string
    o dict has no 'has_key' method
    o ndr_unpack needs bytes not string
    o b64encode needs bytes (so open file with binary mode)
    o StandardError was removed in python3 use Exception instead
    o fix octal literals
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 557ff7b7fffc86718b27fbdb3c3b34f894b5f593
Author: Noel Power <noel.power at suse.com>
Date:   Sat Aug 25 12:50:58 2018 +0100

    python/samba: samba4.blackbox.dbcheck.release-4-1-0rc3
    
    * Various string related fixed py2/py3
    * Fix strange double decode followed by encode code (see comments
      in change)
    * Added dump_attr_values, simply printing attribute values (from
      sequence) doesn't work (when using string '%s' format codes in
      existing string). We need to print out string from bytes in PY3
      and fallback to repr(which will print b'blah') if we get a decode error
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 370dcbb791153ff725bd1e254e610ce43dfcd7f1
Author: Noel Power <noel.power at suse.com>
Date:   Sat Aug 25 11:39:04 2018 +0100

    samba_tool: Enclose iterator with list
    
    Really strange bug caused by map being updated while being iterated.
    This caused keys to be skipped and inconsistent and incorrect
    results from ldapcmp.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e5cac2b843d18bc0d67562460366e0abf9484b3c
Author: Noel Power <noel.power at suse.com>
Date:   Thu Aug 23 17:59:12 2018 +0100

    python/samba: misc use of str for ldb.bytes
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 17728c2f53acbb2a128440152d8d2d954f85f67a
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 1 14:47:06 2018 +0100

    python/samba: ldb attribute string fix for wafsamba.tests

commit 8eae420fbc0377e7d64a16defe31b0f9e7976121
Author: Noel Power <noel.power at suse.com>
Date:   Mon Aug 6 13:39:15 2018 +0100

    PY3: ensure StringIO usage is py2/py3 compatible

commit ca12342b0a07ca707823cd35be12dc806fa46a89
Author: Noel Power <noel.power at suse.com>
Date:   Mon Aug 6 15:02:18 2018 +0100

    PY3: relative import fixes

commit 9ae5fd65a8cc5e08d318dff1773b04194115a039
Author: Noel Power <noel.power at suse.com>
Date:   Fri Sep 28 16:49:27 2018 +0100

    s4/scripting/bin: PY3 Fix exception tuple assignments.
    
    In Python3 to access the exception arguments you need to now use
    Exception.args, in Python2 you could access these direcly with the
    'except' declaration.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4287d119b02defb3ae5b18d1f1c44be098537cba
Author: Noel Power <noel.power at suse.com>
Date:   Sun Aug 5 21:08:33 2018 +0100

    PY3: port samba.tests.samba3sam

commit 72c5b270668a07d7591ea033e811ec09ebb3652d
Author: Noel Power <noel.power at suse.com>
Date:   Wed Sep 5 14:59:19 2018 +0100

    python/samba: use PY3 version of ConfigParser
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 04c118cf0eefebe5e25cdd687c0d970c7ba70b67
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 15 10:58:23 2018 +0100

    python/samba/gp_parse: PY2/PY3 compat porting for gp_init.py
    
    Fixes
    1) use compat versions of ConfigParser and StringIO
    2) open file needs to be opened in binary mode as write_pretty_xml
       routine uses BytesIO() object.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 600fde58ab616f7c786b43da23acb0b441bd6885
Author: Noel Power <noel.power at suse.com>
Date:   Fri Aug 24 09:55:08 2018 +0100

    python/samba: add alias for ConfigParser for PY2/PY3 compatability
    
    ConfigParser module changed name to configParser in PY3, additionally
    the behaviour regarding interpolation has changed. ConfigParser now
    has a default interpolation param whose behaviour demands that '%' is
    escaped. To maintain behaviour with the python2 version this default
    param needs to be changed. Add some alias(s) and 'shim' Configparser
    symbol in samba.compat to cater for this.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8d7830b6fc1b0cfb2f1dd9e9315aff67dbef3c93
Author: Noel Power <noel.power at suse.com>
Date:   Sat Aug 4 21:00:06 2018 +0100

    PY3: convert samba.tests.strings to Py2/Py3
    
    Previously the py2 api for strcasecmp_m/strstr_m required strings/unicode
     but couldn't actually handle unicode with anything other than the default
    encoding (e.g. ascii). The c-api as been fixed and the encoding steps
    (which were unnecessary and causing errors in PY3) have been removed

commit 23239727734bbc7f58dcba3d8e9f160849885276
Author: Noel Power <noel.power at suse.com>
Date:   Tue Aug 7 16:21:35 2018 +0100

    python: py_strcasecmp_m & py_strstr_m don't handle unicode properly
    
    py_strcasecmp_m & py_strstr_m use PyArg_ParseTuple() with 's' which
    in Py2 tries to decode string with the default (e.g. ascii) encoding
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 95dbe1177fd82e3a553ac98fd25ee06ca20f8776
Author: Noel Power <noel.power at suse.com>
Date:   Sat Aug 4 17:01:24 2018 +0100

    python/samba/tests: PY2/PY3 port samba.tests.dcerpc.integer
    
    Python3 no longer has a long type so the 'L' postfix is no
    longer valid. Additionally in python2 an int that exceeds will
    be transparently converted into a long when necessary

commit 9ea6cb187305877af33dc629a4cf894e572e6a13
Author: Noel Power <noel.power at suse.com>
Date:   Thu Sep 27 18:16:49 2018 +0100

    python/samba/netcmd: PY3 only possible to decode bytes
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ade47b3df0a173743ed4ff0633e8544f08774253
Author: Noel Power <noel.power at suse.com>
Date:   Sat Aug 4 14:23:28 2018 +0100

    PY3: Only decode when necessary

commit ee595e9b7cea888a978831076e9de3111afccd42
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 11:14:59 2018 +0100

    s4/setup/tests: PY3 samba-tool needs to be called with correct python ver.
    
    Ensure samba-tool python version defined by $PYTHON
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 15b2ab04b7a97fe948aec9169d5d49f22fdb8289
Author: Noel Power <noel.power at suse.com>
Date:   Wed Oct 10 10:15:31 2018 +0100

    s4/scripting: PY3 Ensure python scripts are run with correct python ver.
    
    As part of port samba4.blackbox.samba3dump to python2/3
    make sure test_samba3dump.sh runs samba3dump with $PYTHON which should
    define the correct python version.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c751013fa5a0b9ca3248f1177d107e05f5094393
Author: Noel Power <noel.power at suse.com>
Date:   Mon Aug 27 17:06:37 2018 +0100

    testprogs/blackbox: Use PYTHON env variable for calling python scripts
    
    Ensure samba-tool is called with correct python that is
    defined by $PYTHON
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c8403f3360ba0d028700d6186c604ca95bf04c0b
Author: Noel Power <noel.power at suse.com>
Date:   Thu Sep 27 16:08:34 2018 +0100

    python/samba/tests: make sure samba-tool is called with ${PYTHON}
    
    Ensure python scripts are called with the python version that
    is defined by $PYTHON
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9f8a570f906ca787ba4044c0f2fbe88b2c6afd5e
Author: Noel Power <noel.power at suse.com>
Date:   Thu Sep 27 09:30:40 2018 +0100

    selftest/target: Make sure samba-tool is called with ${PYTHON}
    
    Ensure python scripts are called with the python version that
    is defined by $PYTHON
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e53821793074691e92d71e49023dd4b61efd5f1c
Author: Noel Power <noel.power at suse.com>
Date:   Sat Aug 4 15:38:40 2018 +0100

    PY3: In a pure PY3 build filter-subunit was getting called without 'python'
    
    tests were getting called with "| ${src}/selftest/filter-subunit" which
    resulted in filter-subunit getting execve'd without a calling python. This
    resulted in /usr/bin/python (default python) getting called and subsequent
    imports failing.

commit dcf787b26354d133a26dcad74cc62fe62b59a87d
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 15 10:36:19 2018 +0100

    s4/scripting: PY3 need to convert cmp funct to key func for sort.
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 412002629eb849638d929668f96d5e2dab50f1cc
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 15 16:04:25 2018 +0100

    python/samba/gp_parse: PY3 fdeploy_sids needs to use key method for sort
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 842f09aaa7b5f0210d3250facbdf745feedd6ef2
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 15 16:23:07 2018 +0100

    samba-tool: PY3 dict view doesn't have sort method,
    
    Can't sort a dict view, create a list from view then use list.sort
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ff3f5411fa15080c5f0c6b9f3112ab1e0e58525a
Author: Noel Power <noel.power at suse.com>
Date:   Wed Sep 26 17:22:16 2018 +0100

    python/samba/tests: PY3 iterable has no sort method
    
    map in python3 returns an iterable, in python2 it returned
    a list. Iterable has no sort method, use sort function instead or
    construct a list from the iterable so you can use list.sort
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f5f8676b630e595532e188a559448478c0702ec7
Author: Noel Power <noel.power at suse.com>
Date:   Thu Sep 27 18:15:49 2018 +0100

    s4/scripting/bin: PY3 Make sure print statements are enclosed by '()'
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d114ca1e64cd811b6d7a893dfc26a6dca49c1d2c
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Oct 23 16:27:29 2018 +1300

    selftest: Add expected-value testing for userParameters
    
    This does not means that bugs like https://bugzilla.samba.org/show_bug.cgi?id=11881
    are fixed, however we do not wish to cause further issues
    without noticing it, eg during python3 fixes for dbcheck.
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>

-----------------------------------------------------------------------

Summary of changes:
 .gitlab-ci.yml                                     | 11 ++-
 buildtools/wafsamba/samba_abi.py                   |  2 +-
 buildtools/wafsamba/samba_bundled.py               |  4 +-
 buildtools/wafsamba/tests/test_abi.py              |  2 +-
 python/pyglue.c                                    | 14 ++--
 python/samba/compat.py                             |  4 +
 python/samba/dbchecker.py                          | 73 ++++++++++++-----
 python/samba/forest_update.py                      |  2 +-
 python/samba/gp_parse/gp_ini.py                    |  8 +-
 python/samba/gpclass.py                            |  2 +-
 python/samba/ms_forest_updates_markdown.py         |  3 +-
 python/samba/netcmd/__init__.py                    |  5 +-
 python/samba/netcmd/domain.py                      |  9 ++-
 python/samba/netcmd/domain_backup.py               | 10 +--
 python/samba/netcmd/ldapcmp.py                     |  6 +-
 python/samba/provision/__init__.py                 | 18 ++---
 python/samba/provision/backend.py                  |  6 +-
 python/samba/samba3/__init__.py                    | 30 +++----
 python/samba/schema.py                             |  4 +-
 python/samba/tests/__init__.py                     |  3 +
 python/samba/tests/dcerpc/integer.py               | 10 +--
 python/samba/tests/docs.py                         | 18 ++++-
 python/samba/tests/samba3sam.py                    |  8 +-
 python/samba/tests/strings.py                      | 18 ++---
 script/autobuild.py                                | 14 +++-
 selftest/filter-subunit                            |  8 +-
 selftest/selftesthelpers.py                        |  2 +-
 selftest/subunithelper.py                          |  7 +-
 selftest/target/Samba.pm                           | 15 +++-
 selftest/target/Samba4.pm                          | 21 +++--
 source4/scripting/bin/samba3dump                   | 92 +++++++++++-----------
 source4/scripting/bin/samba_dnsupdate              | 81 +++++++++----------
 source4/scripting/bin/samba_kcc                    |  7 +-
 source4/scripting/bin/samba_spnupdate              |  8 +-
 source4/scripting/bin/samba_upgradedns             |  7 +-
 source4/scripting/bin/samba_upgradeprovision       | 53 +++++++------
 .../expected-userParameters-after-dbcheck.ldif     | 48 +++++++++++
 source4/selftest/test_samba3dump.sh                |  2 +-
 source4/setup/tests/blackbox_group.sh              | 56 ++++++-------
 source4/setup/tests/blackbox_newuser.sh            | 20 ++---
 source4/setup/tests/blackbox_s3upgrade.sh          |  6 +-
 source4/setup/tests/blackbox_setpassword.sh        | 10 +--
 testprogs/blackbox/dbcheck-oldrelease.sh           | 13 +++
 testprogs/blackbox/functionalprep.sh               | 10 +--
 testprogs/blackbox/renamedc.sh                     |  4 +-
 testprogs/blackbox/schemaupgrade.sh                |  4 +-
 testprogs/blackbox/upgradeprovision-oldrelease.sh  | 18 ++---
 47 files changed, 473 insertions(+), 303 deletions(-)
 create mode 100644 source4/selftest/provisions/release-4-1-0rc3/expected-userParameters-after-dbcheck.ldif


Changeset truncated at 500 lines:

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 010608b..ec1c362 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -29,12 +29,6 @@ build_samba_none_env:
     # this one takes about 1 hours to finish
     - python script/autobuild.py samba-none-env    --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
 
-build_samba_none_env_py3:
-  <<: *shared_template
-  script:
-    # this one takes about 1 hours to finish
-    - python script/autobuild.py samba-none-env-py3 --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
-
 build_samba_nopython:
   <<: *shared_template
   script:
@@ -106,3 +100,8 @@ build_samba_buildpy3_only:
   <<: *shared_template
   script:
     - python3 script/autobuild.py samba-buildpy3-only             --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
+
+build_samba_purepy3-none_env:
+  <<: *shared_template
+  script:
+    - python3 script/autobuild.py samba-purepy3-none-env           --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
diff --git a/buildtools/wafsamba/samba_abi.py b/buildtools/wafsamba/samba_abi.py
index b5c6da4..80db7f8 100644
--- a/buildtools/wafsamba/samba_abi.py
+++ b/buildtools/wafsamba/samba_abi.py
@@ -7,7 +7,7 @@ import fnmatch
 
 from waflib import Options, Utils, Logs, Task, Build, Errors
 from waflib.TaskGen import feature, before, after
-import samba_utils
+from wafsamba import samba_utils
 
 # these type maps cope with platform specific names for common types
 # please add new type mappings into the list below
diff --git a/buildtools/wafsamba/samba_bundled.py b/buildtools/wafsamba/samba_bundled.py
index fea4cb2..60ce7da 100644
--- a/buildtools/wafsamba/samba_bundled.py
+++ b/buildtools/wafsamba/samba_bundled.py
@@ -3,7 +3,7 @@
 import sys
 from waflib import Build, Options, Logs
 from waflib.Configure import conf
-from samba_utils import TO_LIST
+from wafsamba import samba_utils
 
 def PRIVATE_NAME(bld, name, private_extension, private_library):
     '''possibly rename a library to include a bundled extension'''
@@ -139,7 +139,7 @@ def CHECK_BUNDLED_SYSTEM(conf, libname, minversion='0.0.0',
     # We always do a logic validation of 'onlyif' first
     missing = []
     if onlyif:
-        for l in TO_LIST(onlyif):
+        for l in samba_utils.TO_LIST(onlyif):
             f = 'FOUND_SYSTEMLIB_%s' % l
             if not f in conf.env:
                 Logs.error('ERROR: CHECK_BUNDLED_SYSTEM(%s) - ' % (libname) +
diff --git a/buildtools/wafsamba/tests/test_abi.py b/buildtools/wafsamba/tests/test_abi.py
index 7489214..d6bdb04 100644
--- a/buildtools/wafsamba/tests/test_abi.py
+++ b/buildtools/wafsamba/tests/test_abi.py
@@ -21,7 +21,7 @@ from wafsamba.samba_abi import (
     normalise_signature,
     )
 
-from cStringIO import StringIO
+from samba.compat import StringIO
 
 
 class NormaliseSignatureTests(TestCase):
diff --git a/python/pyglue.c b/python/pyglue.c
index 1b11186..04efa14 100644
--- a/python/pyglue.c
+++ b/python/pyglue.c
@@ -297,26 +297,30 @@ static PyObject *py_interface_ips(PyObject *self, PyObject *args)
 
 static PyObject *py_strcasecmp_m(PyObject *self, PyObject *args)
 {
-	char *s1, *s2;
+	const char *s1 = NULL;
+	const char *s2 = NULL;
 
-	if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
+	if (!PyArg_ParseTuple(args, "eses", "utf8", &s1, "utf8", &s2)) {
 		return NULL;
+	}
 
 	return PyInt_FromLong(strcasecmp_m(s1, s2));
 }
 
 static PyObject *py_strstr_m(PyObject *self, PyObject *args)
 {
-	char *s1, *s2, *ret;
+	const char *s1 = NULL;
+	const char *s2 = NULL;
+	char *ret = NULL;
 
-	if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
+	if (!PyArg_ParseTuple(args, "eses", "utf8", &s1, "utf8", &s2))
 		return NULL;
 
 	ret = strstr_m(s1, s2);
 	if (!ret) {
 		Py_RETURN_NONE;
 	}
-	return PyStr_FromString(ret);
+	return PyUnicode_FromString(ret);
 }
 
 static PyMethodDef py_misc_methods[] = {
diff --git a/python/samba/compat.py b/python/samba/compat.py
index 0c1869a..ff5f3c2 100644
--- a/python/samba/compat.py
+++ b/python/samba/compat.py
@@ -83,6 +83,9 @@ if PY3:
     # alias
     import io
     StringIO = io.StringIO
+    def ConfigParser(defaults=None, dict_type=None, allow_no_value=None):
+        from configparser import ConfigParser
+        return ConfigParser(defaults, dict_type, allow_no_value, interpolation=None)
 else:
     # Helper function to return bytes.
     # if 'unicode' is passed in then it is decoded using 'utf8' and
@@ -158,4 +161,5 @@ else:
     # alias
     import cStringIO
     StringIO = cStringIO.StringIO
+    from ConfigParser import ConfigParser
     cmp_fn = cmp
diff --git a/python/samba/dbchecker.py b/python/samba/dbchecker.py
index d1251a2..dcdbb893 100644
--- a/python/samba/dbchecker.py
+++ b/python/samba/dbchecker.py
@@ -35,6 +35,25 @@ from samba.auth import system_session, admin_session
 from samba.netcmd import CommandError
 from samba.netcmd.fsmo import get_fsmo_roleowner
 
+# vals is a sequence of ldb.bytes objects which are a subclass
+# of 'byte' type in python3 and just a str type in python2, to
+# display as string these need to be converted to string via (str)
+# function in python3 but that may generate a UnicodeDecode error,
+# if so use repr instead.  We need to at least try to get the 'str'
+# value if possible to allow some tests which check the strings
+# outputted to pass, these tests compare attr values logged to stdout
+# against those in various results files.
+
+def dump_attr_values(vals):
+    result = ""
+    for value in vals:
+        if len(result):
+           result = "," + result
+        try:
+           result = result + str(value)
+        except UnicodeDecode:
+           result = result + repr(value)
+    return result
 
 class dbcheck(object):
     """check a SAM database for errors"""
@@ -493,7 +512,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
     def err_duplicate_values(self, dn, attrname, dup_values, values):
         '''fix attribute normalisation errors'''
         self.report("ERROR: Duplicate values for attribute '%s' in '%s'" % (attrname, dn))
-        self.report("Values contain a duplicate: [%s]/[%s]!" % (','.join(dup_values), ','.join(values)))
+        self.report("Values contain a duplicate: [%s]/[%s]!" % (','.join(dump_attr_values(dup_values)), ','.join(dump_attr_values(values))))
         if not self.confirm_all("Fix duplicates for '%s' from '%s'?" % (attrname, dn), 'fix_all_duplicates'):
             self.report("Not fixing attribute '%s'" % attrname)
             return
@@ -779,7 +798,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
         res = self.samdb.search("",
                                 scope=ldb.SCOPE_BASE, attrs=["dsServiceName"])
         assert len(res) == 1
-        serviceName = res[0]["dsServiceName"][0]
+        serviceName = str(res[0]["dsServiceName"][0])
         if not self.confirm_all('Sieze role %s onto current DC by adding fSMORoleOwner=%s' % (obj.dn, serviceName), 'seize_fsmo_role'):
             self.report("Not Siezing role %s onto current DC by adding fSMORoleOwner=%s" % (obj.dn, serviceName))
             return
@@ -902,8 +921,19 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
 
         m = ldb.Message()
         m.dn = obj.dn
-        m['value'] = ldb.MessageElement(obj[attrname][0].decode('utf-16-le').decode('utf-16-le').encode('utf-16-le'),
+        # m['value'] = ldb.MessageElement(obj[attrname][0].decode('utf-16-le').decode('utf-16-le').encode('utf-16-le'),
+        # hmm the above old python2 code doesn't make sense to me and cannot
+        # work in python3 because a string doesn't have a decode method.
+        # However in python2 for some unknown reason this double decode
+        # followed by encode seems to result in what looks like utf8.
+        # In python2 just .decode('utf-16-le').encode('utf-16-le') does nothing
+        # but trigger the 'double UTF16 encoded' condition again :/
+        #
+        # In python2 and python3 value.decode('utf-16-le').encode('utf8') seems
+        # to do the trick and work as expected.
+        m['value'] = ldb.MessageElement(obj[attrname][0].decode('utf-16-le').encode('utf8'),
                                         ldb.FLAG_MOD_REPLACE, 'userParameters')
+
         if self.do_modify(m, [],
                           "Failed to correct doubled-UTF16 encoded userParameters on %s by converting" % (obj.dn)):
             self.report("Corrected doubled-UTF16 encoded userParameters on %s by converting" % (obj.dn))
@@ -1223,14 +1253,14 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
                 dsdb_dn.prefix = "B:8:%08X:" % int(res[0]['instanceType'][0])
                 dsdb_dn.binary = "%08X" % int(res[0]['instanceType'][0])
 
-                if str(dsdb_dn) != val:
+                if str(dsdb_dn) != str(val):
                     error_count += 1
                     self.err_incorrect_binary_dn(obj.dn, attrname, val, dsdb_dn, "incorrect instanceType part of Binary DN")
                     continue
 
             # now we have two cases - the source object might or might not be deleted
-            is_deleted = 'isDeleted' in obj and obj['isDeleted'][0].upper() == 'TRUE'
-            target_is_deleted = 'isDeleted' in res[0] and res[0]['isDeleted'][0].upper() == 'TRUE'
+            is_deleted = 'isDeleted' in obj and str(obj['isDeleted'][0]).upper() == 'TRUE'
+            target_is_deleted = 'isDeleted' in res[0] and str(res[0]['isDeleted'][0]).upper() == 'TRUE'
 
             if is_deleted and obj.dn not in self.deleted_objects_containers and linkID:
                 # A fully deleted object should not have any linked
@@ -1503,7 +1533,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
 
         sd = ndr_unpack(security.descriptor, sd_val[0])
 
-        is_deleted = 'isDeleted' in obj and obj['isDeleted'][0].upper() == 'TRUE'
+        is_deleted = 'isDeleted' in obj and str(obj['isDeleted'][0]).upper() == 'TRUE'
         if is_deleted:
             # we don't fix deleted objects
             return (sd, None)
@@ -1587,7 +1617,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
                                     attrs=["isDeleted", "objectClass"],
                                     controls=["show_recycled:1"])
             o = res[0]
-            is_deleted = 'isDeleted' in o and o['isDeleted'][0].upper() == 'TRUE'
+            is_deleted = 'isDeleted' in o and str(o['isDeleted'][0]).upper() == 'TRUE'
             if is_deleted:
                 # we don't fix deleted objects
                 return (sd, None)
@@ -1841,27 +1871,27 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
         if "description" not in obj:
             self.report("ERROR: description not present on Deleted Objects container %s" % obj.dn)
             faulty = True
-        if "showInAdvancedViewOnly" not in obj or obj['showInAdvancedViewOnly'][0].upper() == 'FALSE':
+        if "showInAdvancedViewOnly" not in obj or str(obj['showInAdvancedViewOnly'][0]).upper() == 'FALSE':
             self.report("ERROR: showInAdvancedViewOnly not present on Deleted Objects container %s" % obj.dn)
             faulty = True
         if "objectCategory" not in obj:
             self.report("ERROR: objectCategory not present on Deleted Objects container %s" % obj.dn)
             faulty = True
-        if "isCriticalSystemObject" not in obj or obj['isCriticalSystemObject'][0].upper() == 'FALSE':
+        if "isCriticalSystemObject" not in obj or str(obj['isCriticalSystemObject'][0]).upper() == 'FALSE':
             self.report("ERROR: isCriticalSystemObject not present on Deleted Objects container %s" % obj.dn)
             faulty = True
         if "isRecycled" in obj:
             self.report("ERROR: isRecycled present on Deleted Objects container %s" % obj.dn)
             faulty = True
-        if "isDeleted" in obj and obj['isDeleted'][0].upper() == 'FALSE':
+        if "isDeleted" in obj and str(obj['isDeleted'][0]).upper() == 'FALSE':
             self.report("ERROR: isDeleted not set on Deleted Objects container %s" % obj.dn)
             faulty = True
         if "objectClass" not in obj or (len(obj['objectClass']) != 2 or
-                                        obj['objectClass'][0] != 'top' or
-                                        obj['objectClass'][1] != 'container'):
+                                        str(obj['objectClass'][0]) != 'top' or
+                                        str(obj['objectClass'][1]) != 'container'):
             self.report("ERROR: objectClass incorrectly set on Deleted Objects container %s" % obj.dn)
             faulty = True
-        if "systemFlags" not in obj or obj['systemFlags'][0] != '-1946157056':
+        if "systemFlags" not in obj or str(obj['systemFlags'][0]) != '-1946157056':
             self.report("ERROR: systemFlags incorrectly set on Deleted Objects container %s" % obj.dn)
             faulty = True
         return faulty
@@ -2148,22 +2178,23 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
                 continue
 
             if str(attrname).lower() == 'userparameters':
-                if len(obj[attrname][0]) == 1 and obj[attrname][0][0] == '\x20':
+                if len(obj[attrname][0]) == 1 and obj[attrname][0][0] == b'\x20'[0]:
                     error_count += 1
                     self.err_short_userParameters(obj, attrname, obj[attrname])
                     continue
 
-                elif obj[attrname][0][:16] == '\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00':
+                elif obj[attrname][0][:16] == b'\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00':
                     # This is the correct, normal prefix
                     continue
 
-                elif obj[attrname][0][:20] == 'IAAgACAAIAAgACAAIAAg':
+                elif obj[attrname][0][:20] == b'IAAgACAAIAAgACAAIAAg':
                     # this is the typical prefix from a windows migration
                     error_count += 1
                     self.err_base64_userParameters(obj, attrname, obj[attrname])
                     continue
 
-                elif obj[attrname][0][1] != '\x00' and obj[attrname][0][3] != '\x00' and obj[attrname][0][5] != '\x00' and obj[attrname][0][7] != '\x00' and obj[attrname][0][9] != '\x00':
+                #43:00:00:00:74:00:00:00:78
+                elif obj[attrname][0][1] != b'\x00'[0] and obj[attrname][0][3] != b'\x00'[0] and obj[attrname][0][5] != b'\x00'[0] and obj[attrname][0][7] != b'\x00'[0] and obj[attrname][0][9] != b'\x00'[0]:
                     # This is a prefix that is not in UTF-16 format for the space or munged dialback prefix
                     error_count += 1
                     self.err_utf8_userParameters(obj, attrname, obj[attrname])
@@ -2175,7 +2206,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
                     self.err_odd_userParameters(obj, attrname, obj[attrname])
                     continue
 
-                elif obj[attrname][0][1] == '\x00' and obj[attrname][0][2] == '\x00' and obj[attrname][0][3] == '\x00' and obj[attrname][0][4] != '\x00' and obj[attrname][0][5] == '\x00':
+                elif obj[attrname][0][1] == b'\x00'[0] and obj[attrname][0][2] == b'\x00'[0] and obj[attrname][0][3] == b'\x00'[0] and obj[attrname][0][4] != b'\x00'[0] and obj[attrname][0][5] == b'\x00'[0]:
                     # This is a prefix that would happen if a SAMR-written value was replicated from a Samba 4.1 server to a working server
                     error_count += 1
                     self.err_doubled_userParameters(obj, attrname, obj[attrname])
@@ -2339,7 +2370,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
 
                 found = False
                 for loc in msg[location]:
-                    if loc == self.samdb.get_dsServiceName():
+                    if str(loc) == self.samdb.get_dsServiceName():
                         found = True
                 if not found:
                     # This DC is not in the replica locations
@@ -2473,7 +2504,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
             self.report('ERROR: dsServiceName missing in @ROOTDSE')
             return error_count + 1
 
-        if not obj['dsServiceName'][0].startswith('<GUID='):
+        if not str(obj['dsServiceName'][0]).startswith('<GUID='):
             self.report('ERROR: dsServiceName not in GUID form in @ROOTDSE')
             error_count += 1
             if not self.confirm('Change dsServiceName to GUID form?'):
diff --git a/python/samba/forest_update.py b/python/samba/forest_update.py
index ba6f859..985e9f9 100644
--- a/python/samba/forest_update.py
+++ b/python/samba/forest_update.py
@@ -346,7 +346,7 @@ objectClass: container
                                 controls=["search_options:1:2"])
 
         assert len(msg) == 1
-        existing_sddl = msg[0][attr][0]
+        existing_sddl = str(msg[0][attr][0])
         index = existing_sddl.rfind("S:")
         if index != -1:
             new_sddl = existing_sddl[:index] + ace + existing_sddl[index:]
diff --git a/python/samba/gp_parse/gp_ini.py b/python/samba/gp_parse/gp_ini.py
index 6c3d939..58aee88 100644
--- a/python/samba/gp_parse/gp_ini.py
+++ b/python/samba/gp_parse/gp_ini.py
@@ -21,9 +21,9 @@ import codecs
 import collections
 import re
 
-from ConfigParser import ConfigParser
 from xml.etree.ElementTree import Element, SubElement
-from StringIO import StringIO
+from samba.compat import ConfigParser
+from samba.compat import StringIO
 
 from samba.gp_parse import GPParser, ENTITY_USER_ID
 
@@ -70,7 +70,7 @@ class GPIniParser(GPParser):
         return section_name
 
     def write_xml(self, filename):
-        with file(filename, 'w') as f:
+        with open(filename, 'wb') as f:
             root = Element('IniFile')
 
             for sec_ini in self.ini_conf.sections():
@@ -199,7 +199,7 @@ class GPFDeploy1IniParser(GPIniParser):
     def custom_entities(self, root, global_entities):
         entities = []
         fdeploy_sids = root.findall('.//Section[@fdeploy_SID]')
-        fdeploy_sids.sort()
+        fdeploy_sids.sort(key = lambda x: x.tag)
 
         for sid in fdeploy_sids:
             old_attrib = sid.attrib['fdeploy_SID']
diff --git a/python/samba/gpclass.py b/python/samba/gpclass.py
index b7c53eb..41ff3e9 100644
--- a/python/samba/gpclass.py
+++ b/python/samba/gpclass.py
@@ -21,7 +21,7 @@ import errno
 import tdb
 sys.path.insert(0, "bin/python")
 from samba import NTSTATUSError
-from ConfigParser import ConfigParser
+from samba.compat import ConfigParser
 from samba.compat import StringIO
 from abc import ABCMeta, abstractmethod
 import xml.etree.ElementTree as etree
diff --git a/python/samba/ms_forest_updates_markdown.py b/python/samba/ms_forest_updates_markdown.py
index 3afe2ec..26cc3fd 100644
--- a/python/samba/ms_forest_updates_markdown.py
+++ b/python/samba/ms_forest_updates_markdown.py
@@ -27,6 +27,7 @@ import re
 import os
 import markdown
 import xml.etree.ElementTree as ET
+from samba.compat import get_string
 
 
 # Display specifier updates or otherwise (ignored in forest_update.py)
@@ -217,7 +218,7 @@ def read_ms_markdown(in_file, out_folder=None, out_dict={}):
         if node.text and node.text.startswith('|Operation'):
             # Strip first and last |
             updates = [x[1:len(x) - 1].split('|') for x in
-                       ET.tostring(node, method='text').splitlines()]
+                       get_string(ET.tostring(node, method='text')).splitlines()]
             for update in updates[2:]:
                 output = re.match('Operation (\d+): {(.*)}', update[0])
                 if output:
diff --git a/python/samba/netcmd/__init__.py b/python/samba/netcmd/__init__.py
index 0687016..57436c7 100644
--- a/python/samba/netcmd/__init__.py
+++ b/python/samba/netcmd/__init__.py
@@ -138,7 +138,8 @@ class Command(object):
             prog=prog, epilog=epilog)
         parser.add_options(self.takes_options)
         optiongroups = {}
-        for name, optiongroup in self.takes_optiongroups.items():
+        for name in sorted(self.takes_optiongroups.keys()):
+            optiongroup = self.takes_optiongroups[name]
             optiongroups[name] = optiongroup(parser)
             parser.add_option_group(optiongroups[name])
         return parser, optiongroups
@@ -247,7 +248,7 @@ class SuperCommand(Command):
             subcommand = '--help'
 
         epilog = "\nAvailable subcommands:\n"
-        subcmds = self.subcommands.keys()
+        subcmds = list(self.subcommands.keys())
         subcmds.sort()
         max_length = max([len(c) for c in subcmds])
         for cmd_name in subcmds:
diff --git a/python/samba/netcmd/domain.py b/python/samba/netcmd/domain.py
index f022e37..c671a76 100644
--- a/python/samba/netcmd/domain.py
+++ b/python/samba/netcmd/domain.py
@@ -103,6 +103,7 @@ from samba.netcmd.pso import cmd_domain_passwordsettings_pso
 from samba.netcmd.domain_backup import cmd_domain_backup
 
 from samba.compat import binary_type
+from samba.compat import get_string
 
 string_version_to_constant = {
     "2008_R2": DS_DOMAIN_FUNCTION_2008_R2,
@@ -153,9 +154,9 @@ def get_testparm_var(testparm, smbconf, varname):
                          stdout=subprocess.PIPE, stderr=errfile)
     (out, err) = p.communicate()
     errfile.close()
-    lines = out.split('\n')
+    lines = out.split(b'\n')
     if lines:
-        return lines[0].strip()
+        return get_string(lines[0]).strip()
     return ""
 
 
@@ -1848,7 +1849,7 @@ class DomainTrustCommand(Command):
         objectAttr = lsa.ObjectAttribute()
         objectAttr.sec_qos = lsa.QosInfo()
 
-        policy = conn.OpenPolicy2(''.decode('utf-8'),
+        policy = conn.OpenPolicy2(b''.decode('utf-8'),
                                   objectAttr, policy_access)
 
         info = conn.QueryInfoPolicy2(policy, lsa.LSA_POLICY_INFO_DNS)
@@ -4092,7 +4093,7 @@ class cmd_domain_schema_upgrade(Command):
                     if len(res) != 1:
                         ldif_op.unknown_oid = value
                     else:
-                        display_name = res[0]['ldapDisplayName'][0]
+                        display_name = str(res[0]['ldapDisplayName'][0])
                         line = line.replace(value, ' ' + display_name)
 
             # Microsoft has marked objects as defunct that Samba doesn't know about
diff --git a/python/samba/netcmd/domain_backup.py b/python/samba/netcmd/domain_backup.py
index 683e7d2..9f4486b 100644
--- a/python/samba/netcmd/domain_backup.py
+++ b/python/samba/netcmd/domain_backup.py
@@ -61,11 +61,11 @@ def get_sid_for_restore(samdb):
     # Find the DN of the RID set of the server
     res = samdb.search(base=ldb.Dn(samdb, samdb.get_serverName()),
                        scope=ldb.SCOPE_BASE, attrs=["serverReference"])
-    server_ref_dn = ldb.Dn(samdb, res[0]['serverReference'][0])
+    server_ref_dn = ldb.Dn(samdb, str(res[0]['serverReference'][0]))
     res = samdb.search(base=server_ref_dn,
                        scope=ldb.SCOPE_BASE,
                        attrs=['rIDSetReferences'])
-    rid_set_dn = ldb.Dn(samdb, res[0]['rIDSetReferences'][0])
+    rid_set_dn = ldb.Dn(samdb, str(res[0]['rIDSetReferences'][0]))
 
     # Get the alloc pools and next RID of the RID set
     res = samdb.search(base=rid_set_dn,
@@ -460,7 +460,7 @@ class cmd_domain_backup_restore(cmd_fsmo_seize):
         is_rename = True if 'backupRename' in res[0] else False
         sid = res[0].get('sidForRestore')[0]
         logger.info('Creating account with SID: ' + str(sid))
-        ctx.join_add_objects(specified_sid=dom_sid(sid))
+        ctx.join_add_objects(specified_sid=dom_sid(str(sid)))
 
         m = ldb.Message()


-- 
Samba Shared Repository



More information about the samba-cvs mailing list