[SCM] Samba Shared Repository - branch master updated

Douglas Bagnall dbagnall at samba.org
Tue Sep 6 22:08:01 UTC 2022


The branch, master has been updated
       via  84002281410 samba-tool domain: use string_to_level helper()
       via  8b17b2a5077 samba-tool domain: add string_to_level() helper
       via  5af823a7097 samba-tool domain: expand string_version_to_constant range
       via  bcc9f7f35e9 samba-tool domain show: report level 2016
       via  0363879d1fc samba-tool domain show: use level_to_string()
       via  6d4015265a1 samba-tool domain: helper function for domain level names
       via  2cdafb94312 samba-tool ldapcmp: use CommandError on auth failure
       via  960ae819ade samba-tool ldapcmp: use CommandError, not assertion
       via  b13c121fcba samba-tool ldapcmp: do not assume common attributes
       via  c26a8f6a41b samba-tool ldapcmp: use shorter names in cmp_attrs
       via  4959d07b965 samba-tool ldapcmp: use ValueError, not Exception
       via  fbd815c1113 samba-tool dns: catch werror.WERR_ACCESS_DENIED
       via  2aa5b56b791 samba-tool dns: use DnsconnWrapper in zonecreate
       via  ca82806f68a samba-tool dns: update_record uses DnsConnWrapper
       via  99d48c857f4 samba-tool dns: delete uses DnsConnWrapper messages
       via  38ccbf460dc samba-tool dns: add uses DnsConnWrapper messages
       via  bee727a559a samba-tool dns: query uses DnsConnWrapper messages
       via  633872c7d25 samba-tool dns: zonedelete uses DnsConnWrapper messages
       via  36241042dd6 samba-tool dns: NAME_DOES_NOT_EXIST errors; add docstring
       via  1ae4738a8ca samba-tool dns: RECORD_DOES_NOT_EXIST errors as CommandErrors
       via  47684f5739b samba-tool dns: catch ZONE_ALREADY_EXISTS errors as CommandErrors
       via  9e774fc14ac samba-tool dns: catch DS_UNAVAILABLE errors as CommandErrors
       via  e931104d1d9 samba-tool dns: use DnsConnWrapper widely
       via  26b86bc57e8 samba-tool dns: add a wrapper for better error messages
       via  c824ad8dcb9 samba-tool domain: fix error string for account lockout duration
       via  6b1b5eade2f samba-tool dbcheck: improve --help for --reset-well-known-acls
       via  98e85fc611b samba-tool domain provision: better message if tdbbackup missing
       via  f580c8b0427 samba-tool: do not force a traceback on CommandError
       via  90780936202 samba-tool: avoid traceback for NT_STATUS_NETWORK_UNREACHABLE
       via  1137647460c py/getopt: allow --option arguments to contain '='
       via  c2178d87c2f py/getopt: improve messages for bad --realm
       via  604832b8ffd py/getopt: improve messages for bad --debug arg
       via  ca7535912b1 samba-tool: avoid traceback for options errors
       via  62fe118e99e samba-tool: reduce repetitious jargon on credentials failure
       via  c61e8cdefca s4/tests/samba-tool drs showrepl: test NO_COLOR and --color variants
       via  7d178ab95bc s4/tests/samba-tool drs showrepl: use vars for common strings
       via  eefc0304586 samba-tool: respect NO_COLOR env variable and --color options
       via  ade31017583 py/samba/logger: respect NO_COLOR env variable
       via  a45c76b5cd9 python/colour: helper functions to read all signs
       via  37f92c6cc69 samba-tool visualise: expand set of --color switches
       via  664653b8d14 pytest/samba-tool visualize: test '--color' aliases
       via  6160e956b59 samba-tool visualize: remove py2 compat for colour calculations
       via  6ced3d21513 samba-tool visualize: respect $NO_COLOR
       via  e7d78400bdd pytest samba-tool visualize: extend colour tests for $NO_COLOR
       via  d9443fadba2 pytest/samba-tool visualize: fix docstring
       via  98f5332b46f pytest: SambaToolCmdTest allows easier StringIO replacement
       via  0a5298f0c19 pytests: move ValidNetbiosNameTests to samba.tests.netbios
       via  24f7d714167 pytest/samba_tool_drs_no_dns: use TestCaseInTempDir.rm_files/.rm_dirs
       via  3f0aab45c81 pytest/samba_tool_drs: use TestCaseInTempDir.rm_files/.rm_dirs
       via  251360d6e58 pytest/samdb: use TestCaseInTempDir.rm_files/.rm_dirs
       via  7455c53fa4f pytest/join: use TestCaseInTempDir.rm_files/dirs
       via  4e3dabad0be pytest/samdb_api: use TestCaseInTempDir.rm_files
       via  85bc1552e39 pytest/downgradedatabase: use TestCaseInTempDir.rm_files
       via  2359741b285 pytest: add file removal helpers for TestCaseInTempDir
      from  aa9f3a2da97 nsswitch:libwbclient - fix leak in wbcCtxPingDc2

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


- Log -----------------------------------------------------------------
commit 84002281410d0ce67d301aeadead63c909f1a6d2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 14:40:46 2022 +1200

    samba-tool domain: use string_to_level helper()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Douglas Bagnall <dbagnall at samba.org>
    Autobuild-Date(master): Tue Sep  6 22:07:23 UTC 2022 on sn-devel-184

commit 8b17b2a50771387bb267efb4dbd098e83fb64735
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 13:47:45 2022 +1200

    samba-tool domain: add string_to_level() helper
    
    Reverse transform of level_to_string(), obviously.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 5af823a709738c343354dd20251025530bbb28bb
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 13:35:57 2022 +1200

    samba-tool domain: expand string_version_to_constant range
    
    This won't actually have any effect yet -- the new values are
    inaccessible in the place it is used because the range is limited by
    the --function-level option config.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit bcc9f7f35e96b64b7947651f8dcd5e397388ba77
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 13:13:20 2022 +1200

    samba-tool domain show: report level 2016
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0363879d1fc1c76ec717467e98f2f15f5e902b09
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 13:28:50 2022 +1200

    samba-tool domain show: use level_to_string()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6d4015265a1df57a79fe6172ab7bbf6c0c992ce3
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 13:12:06 2022 +1200

    samba-tool domain: helper function for domain level names
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2cdafb943121db8df843c0ca1b12e87f2058cbf2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 11:53:29 2022 +1200

    samba-tool ldapcmp: use CommandError on auth failure
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 960ae819ade522a72e3b8677fccd8ccd557f9a43
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 11:52:54 2022 +1200

    samba-tool ldapcmp: use CommandError, not assertion
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b13c121fcbafc9b84e29e438715727e3e780ff92
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 11:38:35 2022 +1200

    samba-tool ldapcmp: do not assume common attributes
    
    This has caused numerous reports of
    
    ERROR(<class 'KeyError'>): uncaught exception - 'serverReferenceBL'
      File /usr/lib/python3/dist-packages/samba/netcmd/__init__.py, line 185, in _run
        return self.run(*args, **kwargs)
      File /usr/lib/python3/dist-packages/samba/netcmd/ldapcmp.py, line 957, in run
        if b1.diff(b2):
      File /usr/lib/python3/dist-packages/samba/netcmd/ldapcmp.py, line 781, in diff
        if object1 == object2:
      File /usr/lib/python3/dist-packages/samba/netcmd/ldapcmp.py, line 549, in __eq__
        return self.cmp_attrs(other)
      File /usr/lib/python3/dist-packages/samba/netcmd/ldapcmp.py, line 590, in cmp_attrs
        if isinstance(self.attributes[x], list) and isinstance(other.attributes[x], list):
    
    because other does not have attribute 'x'.
    
    It is better to assume other.attributes[x] is None, which will compare
    as unequal to whatever self.attributes[x] is, showing up as a diff
    rather than a crash.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c26a8f6a41bceba071147b101ce66bf54f098042
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 11:34:53 2022 +1200

    samba-tool ldapcmp: use shorter names in cmp_attrs
    
    This simplifies a fix in the next commit.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4959d07b965b5567f486405c987af8f251ea4c19
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 11:32:25 2022 +1200

    samba-tool ldapcmp: use ValueError, not Exception
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit fbd815c111317568cf9001d9b68099276d42c1a2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 10:58:54 2022 +1200

    samba-tool dns: catch werror.WERR_ACCESS_DENIED
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2aa5b56b7919ceedef7937c7f3ea17bd2e8ccde2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sat Aug 13 12:55:01 2022 +1200

    samba-tool dns: use DnsconnWrapper in zonecreate
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ca82806f68ac86c842717d634407632bf0fd8127
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 18 09:21:39 2022 +1200

    samba-tool dns: update_record uses DnsConnWrapper
    
    The special thing about this one is the dns_conn is also used in the
    dns_record_match() library function, which wants a real dns
    connection.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 99d48c857f41f01a722b86720893b6827171dad8
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 12 17:17:16 2022 +1200

    samba-tool dns: delete uses DnsConnWrapper messages
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 38ccbf460dc7d687f0bf4bc4dbea53d982ec6c9b
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 12 16:51:25 2022 +1200

    samba-tool dns: add uses DnsConnWrapper messages
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit bee727a559a827c1e15a3b382fd9363c5bf285c0
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 12 16:46:03 2022 +1200

    samba-tool dns: query uses DnsConnWrapper messages
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 633872c7d25e59c65f0f23c2f8f87535a171bfec
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 12 16:44:31 2022 +1200

    samba-tool dns: zonedelete uses DnsConnWrapper messages
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 36241042dd6ef241e9a674c92131f17e317f78f4
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 17:59:50 2022 +1200

    samba-tool dns: NAME_DOES_NOT_EXIST errors; add docstring
    
    In practice, these always refer to zones.
    
    We're adding the docstring now, because it made no sense when
    default_messages was empty.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 1ae4738a8ca0bdd22f1766bd39876456f7cba389
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 17:58:50 2022 +1200

    samba-tool dns: RECORD_DOES_NOT_EXIST errors as CommandErrors
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 47684f5739b253ea55b28bbfeb07c63dd62bd6f2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 17:58:03 2022 +1200

    samba-tool dns: catch ZONE_ALREADY_EXISTS errors as CommandErrors
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9e774fc14ace6f27f479511b7c780aa4e8941159
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 17:57:16 2022 +1200

    samba-tool dns: catch DS_UNAVAILABLE errors as CommandErrors
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e931104d1d9476c63b32dea58e45889b1af642e6
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 12 16:40:03 2022 +1200

    samba-tool dns: use DnsConnWrapper widely
    
    This covers all the cases where there are no existing CommandError
    messages, and no other uses of the dns_conn (i.e., not cmd_update).
    
    Forthcoming commits will introduce default messages for these.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 26b86bc57e85280a9fc9aba26a49a16859c91b78
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 12 16:38:59 2022 +1200

    samba-tool dns: add a wrapper for better error messages
    
    This will help turn simple common errors into CommandError messages.
    
    At this stage, no messages are intercepted.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c824ad8dcb9222a75c7bdf756f605b840fb68a00
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Oct 28 09:51:06 2020 +1300

    samba-tool domain: fix error string for account lockout duration
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6b1b5eade2ff32200ad4c543dfb1543d5bd897ef
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 11 15:18:02 2022 +1200

    samba-tool dbcheck: improve --help for --reset-well-known-acls
    
    This option is for updating from pre-4.0.4 when something went wrong
    with ACLs.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=9872
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 98e85fc611bc7ba64ef56b3cb03b60213af1b79b
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Mon Aug 22 11:48:53 2022 +1200

    samba-tool domain provision: better message if tdbbackup missing
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12893
    
    Reported-by: Jeff Sadowski <jeff.sadowski at gmail.com>
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f580c8b0427d5aa4f63b5c6704d9c7819a0c61c4
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Sep 1 01:16:53 2022 +0000

    samba-tool: do not force a traceback on CommandError
    
    When a CommandError has an 'inner exception', we have been printing
    drowning out the error message with a long traceback of the exception
    we tried to catch.
    
    People who really want to see tracebacks can use -d3.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 90780936202c3233e33fc6e2a8fac53680cdf63b
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 19 17:06:48 2022 +1200

    samba-tool: avoid traceback for NT_STATUS_NETWORK_UNREACHABLE
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 1137647460cc143509eae598708bb9f1529463f6
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 19 16:53:40 2022 +1200

    py/getopt: allow --option arguments to contain '='
    
    smb.conf lines can have = on the right hand side. For example, in
    st/ad_dc/etc/smb.conf we have 3 examples, including:
    
     gpo update command = python3 source4/scripting/bin/samba-gpupdate [...] --target=Computer
    
    If we tried to provide the same line via --option, it would split on
    both '=', and the set value would end at '--target'.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c2178d87c2fe524913d2ae059be2b3622ad7bd08
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 19 16:50:54 2022 +1200

    py/getopt: improve messages for bad --realm
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 604832b8ffd242025d613fb5e35707a5185e8855
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 19 16:49:24 2022 +1200

    py/getopt: improve messages for bad --debug arg
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ca7535912b1d0564654a612deed4f002a2382da8
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Sep 1 15:32:07 2022 +1200

    samba-tool: avoid traceback for options errors
    
    What option? None yet, but see the next two commits.
    
    We use a local reference to optparse.OptionValueError, to save typing
    and make the eventual switch to argparse easier.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 62fe118e99e6f0f2c9c09101ec0f79283a342171
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 19 10:12:07 2022 +1200

    samba-tool: reduce repetitious jargon on credentials failure
    
    We already print the following due to DBG_ERR()s:
    
      cli_credentials_failed_kerberos_login: krb5_cc_get_principal failed: No such file or directory
      Failed to bind - LDAP error 49 LDAP_INVALID_CREDENTIALS -  <8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 52e, v1db1> <>
      Failed to connect to 'ldap://10.53.57.30' with backend 'ldap': LDAP error 49 LDAP_INVALID_CREDENTIALS -  <8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 52e, v1db1> <>
    
    We don't *really* need to follow that with:
    
      ERROR(ldb): LDAP connection to ldap://10.53.57.30 failed  - LDAP error 49 LDAP_INVALID_CREDENTIALS -  <8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 52e, v1db1> <>
    
    rather we can say:
    
      Bad username or password.
    
    Also, we don't really need to print a traceback, which we seem to do
    for some commands and not others.
    
    Maybe *sometimes* "bad username or password" might be technically
    incorrect (e.g. --simple-bind-dn), but in those cases the user is
    already behaving strangely, and they will still see the
    LDAP_INVALID_CREDENTIALS twice. Kerberos failures don't come this way.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=9608
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c61e8cdefcae917f65ae83cfe89d6e284df6b687
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 14:28:15 2022 +1200

    s4/tests/samba-tool drs showrepl: test NO_COLOR and --color variants
    
    "--color variants" meaning --color=always instead of --color=yes, etc.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 7d178ab95bc5b7017e46041cdbe7174590e21ea9
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 14:26:29 2022 +1200

    s4/tests/samba-tool drs showrepl: use vars for common strings
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit eefc030458674b5bb5b8338f7a3b9c1df48ad8ef
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jul 7 10:43:59 2021 +1200

    samba-tool: respect NO_COLOR env variable and --color options
    
    This allows the NO_COLOR environment variable and --color=never to
    work for samba-tool commands that use this method. So far that means
    some parts of drs showrepl.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit ade31017583542aae13aabf819cb9f4fd7bea7b7
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jul 7 10:43:17 2021 +1200

    py/samba/logger: respect NO_COLOR env variable
    
    As per https://no-color.org/
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit a45c76b5cd95ada77905ed5cfc979c5523c84160
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Jan 20 12:32:48 2022 +1300

    python/colour: helper functions to read all signs
    
    The accepted hints are presumably arguments to --color.
    We follow the behaviour of `ls` in what we accept.
    
    `git` is stricter, accepting only {always,never,auto}.
    `grep` is looser accepting mixed case variants.
    historically we have used {yes,no,auto}.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 37f92c6cc69b220439aef0c687c92a8e6baeb211
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 13:15:15 2022 +1200

    samba-tool visualise: expand set of --color switches
    
    To match convention, and elsewhere.
    
    We can't easily use colour.is_colour_wanted() because we could (via
    --output) be intending to write to a file that isn't open yet, so we
    have no .isatty() to query.
    
    Also, because --color-scheme implies --color (as documented in
    --help), it trumps most 'auto' checks, but not NO_COLOR.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 664653b8d14cbe21c954d248b2bb5ef0d2d60043
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 11:50:55 2022 +1200

    pytest/samba-tool visualize: test '--color' aliases
    
    By convention, 'tty' is a common alias for 'auto', 'always' and
    'force' mean 'yes', and 'never' means no. It seems 'never; and
    'always' are more common than 'yes' and 'no'.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 6160e956b5931a2cbeb98e042c2fe71981115ba0
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 11:57:00 2022 +1200

    samba-tool visualize: remove py2 compat for colour calculations
    
    io.StringIO has .isatty(); the old cStringIO did not,
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 6ced3d21513907dee7da6c0f7a4bd345120b439d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 11:51:40 2022 +1200

    samba-tool visualize: respect $NO_COLOR
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit e7d78400bdd66e53dea1f7317bc48b9fc0fd82b1
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Aug 16 14:04:57 2022 +1200

    pytest samba-tool visualize: extend colour tests for $NO_COLOR
    
    As described at https://no-color.org/, the NO_COLOR environment
    variable is a widely used defacto-ish standard for asking for no
    colour. If someone goes
    
                    NO_COLOR=whatever samba-tool ...
    
    we want to assume they want no ANSI colour codes, as if they had used
    --color=no. But first we want to test that, so here we are.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit d9443fadba2f09871fe14caac1c00b8c753223d3
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 11:48:58 2022 +1200

    pytest/samba-tool visualize: fix docstring
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 98f5332b46fbddd44366ccaa2b11346a1d2bc10d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sun Aug 14 12:08:16 2022 +1200

    pytest: SambaToolCmdTest allows easier StringIO replacement
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Joseph Sutton <josephsutton at catalyst.net.nz>

commit 0a5298f0c191c1a6d5451b45ee1fc37c960f4166
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Jun 9 15:16:44 2022 +1200

    pytests: move ValidNetbiosNameTests to samba.tests.netbios
    
    These were the only tests in __init__.py.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 24f7d71416753b792d6fe029da6f366adb10383e
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jun 15 13:23:32 2022 +1200

    pytest/samba_tool_drs_no_dns: use TestCaseInTempDir.rm_files/.rm_dirs
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 3f0aab45c81c9f9b6b87eb68bc785902619dc10d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jun 8 19:53:57 2022 +1200

    pytest/samba_tool_drs: use TestCaseInTempDir.rm_files/.rm_dirs
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 251360d6e58986dd53f0317319544e930dc61444
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jun 15 13:22:24 2022 +1200

    pytest/samdb: use TestCaseInTempDir.rm_files/.rm_dirs
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 7455c53fa4f7871b3980f820d22b0fd411195704
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jun 15 13:21:16 2022 +1200

    pytest/join: use TestCaseInTempDir.rm_files/dirs
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 4e3dabad0be0900a203896c2c2acb270d31b0a42
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jun 15 13:20:41 2022 +1200

    pytest/samdb_api: use TestCaseInTempDir.rm_files
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 85bc1552e3919d049d39a065824172a24933d38b
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jun 15 13:19:28 2022 +1200

    pytest/downgradedatabase: use TestCaseInTempDir.rm_files
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 2359741b2854a8de9d151fe189be80a4bd087ff9
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Jun 9 13:16:31 2022 +1200

    pytest: add file removal helpers for TestCaseInTempDir
    
    In several places we end a test by deleting a number of files and
    directories, but we do it rather haphazardly with unintentionally
    differing error handling. For example, in some tests we currently have
    something like:
    
            try:
                shutil.rmtree(os.path.join(self.tempdir, "a"))
                os.remove(os.path.join(self.tempdir, "b"))
                shutil.rmtree(os.path.join(self.tempdir, "c"))
            except Exception:
                pass
    
    where if, for example, the removal of "b" fails, the removal of "c" will
    not be attempted. That will result in the tearDown method raising an
    exception, and we're no better off. If the above code is replaced with
    
            self.rm_files('b')
            self.rm_dirs('a', 'c')
    
    the failure to remove 'b' will cause a test error, *unless* the failure
    was due to a FileNotFoundError (a.k.a. an OSError with errno ENOENT),
    in which case we ignore it, as was probably the original intention.
    
    If on the other hand, we have
    
            self.rm_files('b', must_exist=True)
            self.rm_dirs('a', 'c')
    
    then the FileNotFoundError causes a failure (not an error).
    
    We take a little bit of care to stay within self.tempdir, to protect
    test authors who accidentally write something like `self.rm_dirs('/')`.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

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

Summary of changes:
 python/samba/colour.py                             |  38 ++++
 python/samba/getopt.py                             |  15 +-
 python/samba/logger.py                             |   4 +-
 python/samba/netcmd/__init__.py                    |  42 ++--
 python/samba/netcmd/dbcheck.py                     |   6 +-
 python/samba/netcmd/dns.py                         | 223 ++++++++++++++-------
 python/samba/netcmd/domain.py                      | 108 ++++------
 python/samba/netcmd/domain_backup.py               |   6 +
 python/samba/netcmd/ldapcmp.py                     |  50 +++--
 python/samba/netcmd/visualize.py                   |  15 +-
 python/samba/tdb_util.py                           |   4 +
 python/samba/tests/__init__.py                     |  47 +++--
 python/samba/tests/blackbox/downgradedatabase.py   |  14 +-
 python/samba/tests/join.py                         |   6 +-
 python/samba/tests/netbios.py                      |  12 ++
 python/samba/tests/samba_tool/base.py              |  15 +-
 python/samba/tests/samba_tool/visualize.py         |  89 +++++++-
 python/samba/tests/samdb.py                        |   8 +-
 python/samba/tests/samdb_api.py                    |  10 +-
 source4/torture/drs/python/samba_tool_drs.py       |  13 +-
 .../torture/drs/python/samba_tool_drs_no_dns.py    |  14 +-
 .../torture/drs/python/samba_tool_drs_showrepl.py  |  43 +++-
 22 files changed, 517 insertions(+), 265 deletions(-)


Changeset truncated at 500 lines:

diff --git a/python/samba/colour.py b/python/samba/colour.py
index 92af2fdef80..448b456b465 100644
--- a/python/samba/colour.py
+++ b/python/samba/colour.py
@@ -88,3 +88,41 @@ def xterm_256_colour(n, bg=False, bold=False):
     target = '48' if bg else '38'
 
     return "\033[%s%s;5;%dm" % (weight, target, int(n))
+
+
+def is_colour_wanted(stream, hint='auto'):
+    """The hint is presumably a --color argument.
+
+    We follow the behaviour of GNU `ls` in what we accept.
+    * `git` is stricter, accepting only {always,never,auto}.
+    * `grep` is looser, accepting mixed case variants.
+    * historically we have used {yes,no,auto}.
+    * {always,never,auto} appears the commonest convention.
+    * if the caller tries to opt out of choosing and sets hint to None
+      or '', we assume 'auto'.
+    """
+    if hint in ('no', 'never', 'none'):
+        return False
+
+    if hint in ('yes', 'always', 'force'):
+        return True
+
+    if hint not in ('auto', 'tty', 'if-tty', None, ''):
+        raise ValueError("unexpected colour hint: {hint}; "
+                         "try always|never|auto")
+
+    from os import environ
+    if environ.get('NO_COLOR'):
+        # Note: per spec, we treat the empty string as if unset.
+        return False
+
+    if (hasattr(stream, 'isatty') and stream.isatty()):
+        return True
+    return False
+
+
+def colour_if_wanted(stream, hint='auto'):
+    if is_colour_wanted(stream, hint):
+        switch_colour_on()
+    else:
+        switch_colour_off()
diff --git a/python/samba/getopt.py b/python/samba/getopt.py
index a271cd8a736..9e35273381f 100644
--- a/python/samba/getopt.py
+++ b/python/samba/getopt.py
@@ -31,6 +31,9 @@ from samba.credentials import (
 import sys
 
 
+OptionError = optparse.OptionValueError
+
+
 class SambaOptions(optparse.OptionGroup):
     """General Samba-related command line options."""
 
@@ -64,18 +67,24 @@ class SambaOptions(optparse.OptionGroup):
         self._configfile = arg
 
     def _set_debuglevel(self, option, opt_str, arg, parser):
-        self._lp.set('debug level', arg)
+        try:
+            self._lp.set('debug level', arg)
+        except RuntimeError:
+            raise OptionError(f"invalid -d/--debug value: '{arg}'")
         parser.values.debuglevel = arg
 
     def _set_realm(self, option, opt_str, arg, parser):
-        self._lp.set('realm', arg)
+        try:
+            self._lp.set('realm', arg)
+        except RuntimeError:
+            raise OptionError(f"invalid --realm value: '{arg}'")
         self.realm = arg
 
     def _set_option(self, option, opt_str, arg, parser):
         if arg.find('=') == -1:
             raise optparse.OptionValueError(
                 "--option option takes a 'a=b' argument")
-        a = arg.split('=')
+        a = arg.split('=', 1)
         try:
             self._lp.set(a[0], a[1])
         except Exception as e:
diff --git a/python/samba/logger.py b/python/samba/logger.py
index 667c6487a51..7fb2199e031 100644
--- a/python/samba/logger.py
+++ b/python/samba/logger.py
@@ -19,6 +19,7 @@
 import sys
 import logging
 from samba.colour import GREY, YELLOW, GREEN, RED, DARK_RED, C_NORMAL
+from samba.colour import is_colour_wanted
 
 LEVEL_COLORS = {
     logging.CRITICAL: DARK_RED,
@@ -55,8 +56,7 @@ def get_samba_logger(
                  (quiet and logging.WARNING) or logging.INFO)
 
     logger.setLevel(level)
-
-    if (hasattr(stream, 'isatty') and stream.isatty()):
+    if is_colour_wanted(stream):
         Formatter = ColoredFormatter
     else:
         Formatter = logging.Formatter
diff --git a/python/samba/netcmd/__init__.py b/python/samba/netcmd/__init__.py
index bb70f72449e..73292489268 100644
--- a/python/samba/netcmd/__init__.py
+++ b/python/samba/netcmd/__init__.py
@@ -19,9 +19,9 @@
 import optparse
 import samba
 from samba import colour
-from samba.getopt import SambaOption
+from samba.getopt import SambaOption, OptionError
 from samba.logger import get_samba_logger
-from ldb import LdbError
+from ldb import LdbError, ERR_INVALID_CREDENTIALS
 import sys
 import traceback
 import textwrap
@@ -110,9 +110,21 @@ class Command(object):
             message = "uncaught exception"
             force_traceback = True
 
-        if isinstance(inner_exception, LdbError):
+        if isinstance(e, OptionError):
+            print(evalue, file=self.errf)
+            self.usage()
+            force_traceback = False
+
+        elif isinstance(inner_exception, LdbError):
             (ldb_ecode, ldb_emsg) = inner_exception.args
-            self.errf.write("ERROR(ldb): %s - %s\n" % (message, ldb_emsg))
+            if ldb_ecode == ERR_INVALID_CREDENTIALS:
+                print("Invalid username or password", file=self.errf)
+                force_traceback = False
+            elif ldb_emsg == 'LDAP client internal error: NT_STATUS_NETWORK_UNREACHABLE':
+                print("Could not reach remote server", file=self.errf)
+                force_traceback = False
+            else:
+                self.errf.write("ERROR(ldb): %s - %s\n" % (message, ldb_emsg))
         elif isinstance(inner_exception, AssertionError):
             self.errf.write("ERROR(assert): %s\n" % message)
             force_traceback = True
@@ -125,7 +137,6 @@ class Command(object):
             self.errf.write("ERROR: %s\n" % (message))
         else:
             self.errf.write("ERROR(%s): %s - %s\n" % (str(etype), message, evalue))
-            force_traceback = True
 
         if force_traceback or samba.get_debug_level() >= 3:
             traceback.print_tb(etraceback, file=self.errf)
@@ -204,22 +215,11 @@ class Command(object):
         "constants" in the colour module to be either real colours or empty
         strings.
         """
-        requested = requested.lower()
-        if requested == 'no':
-            colour.switch_colour_off()
-
-        elif requested == 'yes':
-            colour.switch_colour_on()
-
-        elif requested == 'auto':
-            if (hasattr(self.outf, 'isatty') and self.outf.isatty()):
-                colour.switch_colour_on()
-            else:
-                colour.switch_colour_off()
-
-        else:
-            raise CommandError("Unknown --color option: %s "
-                               "please choose from yes, no, auto")
+        try:
+            colour.colour_if_wanted(self.outf, requested)
+        except ValueError as e:
+            raise CommandError(f"Unknown --color option: {requested} "
+                               "please choose from always|never|auto")
 
 
 class SuperCommand(Command):
diff --git a/python/samba/netcmd/dbcheck.py b/python/samba/netcmd/dbcheck.py
index f0dd85282e3..8827ee35d63 100644
--- a/python/samba/netcmd/dbcheck.py
+++ b/python/samba/netcmd/dbcheck.py
@@ -71,7 +71,11 @@ class cmd_dbcheck(Command):
         Option("--attrs", dest="attrs", default=None, help="list of attributes to check (space separated)"),
         Option("--reindex", dest="reindex", default=False, action="store_true", help="force database re-index"),
         Option("--force-modules", dest="force_modules", default=False, action="store_true", help="force loading of Samba modules and ignore the @MODULES record (for very old databases)"),
-        Option("--reset-well-known-acls", dest="reset_well_known_acls", default=False, action="store_true", help="reset ACLs on objects with well known default ACL values to the default"),
+        Option("--reset-well-known-acls",
+               dest="reset_well_known_acls",
+               default=False, action="store_true",
+               help=("reset ACLs on objects with well known default values"
+                     " (for updating from early 4.0.x)")),
         Option("--quick-membership-checks", dest="quick_membership_checks",
                help=("Skips missing/orphaned memberOf backlinks checks, "
                      "but speeds up dbcheck dramatically for domains with "
diff --git a/python/samba/netcmd/dns.py b/python/samba/netcmd/dns.py
index 7c4d3f9bc6a..22c961baaf3 100644
--- a/python/samba/netcmd/dns.py
+++ b/python/samba/netcmd/dns.py
@@ -56,6 +56,78 @@ def dns_connect(server, lp, creds):
     return dns_conn
 
 
+class DnsConnWrapper:
+    """A wrapper around a dnsserver.dnsserver connection that makes it
+    harder not to report friendly messages.
+
+    If, rather than
+
+        dns_conn = dns_connect(server, lp, creds)
+
+    you use
+
+        dns_conn = DnsConnWrapper(server, lp, creds)
+
+    then various common errors (for example, mispelled zones) on
+    common operations will raise CommandErrors that turn into
+    relatively nice messages (when compared to tracebacks).
+
+    In addition, if you provide a messages keyword argument, it will
+    override the defaults. Note that providing None will turn off the
+    default, letting the original exception shine through.
+
+        messages = {
+            werror.WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST: (
+                f'Zone {zone} does not exist and so could not be deleted.'),
+            werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST: None
+        }
+        res = dns_conn.DnssrvOperation2( # ...
+                                        messages=messages)
+
+    This example changes the message for ZONE_DOES_NOT_EXIST and
+    avoids catching NAME_DOES_NOT_EXIST.
+
+    Only WERRORErrors are intercepted.
+    """
+
+    default_messages = {
+        werror.WERR_DNS_ERROR_DS_UNAVAILABLE: "Could not contact RPC server",
+        werror.WERR_DNS_ERROR_ZONE_ALREADY_EXISTS: 'Zone already exists',
+        werror.WERR_DNS_ERROR_RECORD_DOES_NOT_EXIST: 'The record does not exist',
+        werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:  'The zone does not exist',
+        werror.WERR_ACCESS_DENIED: 'Insufficient permissions',
+    }
+
+    def __init__(self, server, lp, creds):
+        self.dns_conn = dns_connect(server, lp, creds)
+
+    def __getattr__(self, name):
+        attr = getattr(self.dns_conn, name)
+        if name not in {
+                "DnssrvComplexOperation2",
+                "DnssrvEnumRecords2",
+                "DnssrvOperation2",
+                "DnssrvQuery2",
+                "DnssrvUpdateRecord2"}:
+            return attr
+
+        def f(*args, messages={}):
+            try:
+                return attr(*args)
+            except WERRORError as e:
+                werr, errstr = e.args
+                if werr in messages:
+                    if werr is None:
+                        # None overrides a default message, leaving the bare exception
+                        raise
+                    raise CommandError(f"{messages[werr]} [{errstr}]", e)
+                if werr in self.default_messages:
+                    raise CommandError(f"{self.default_messages[werr]} [{errstr}]", e)
+                raise
+
+        return f
+
+
 def bool_string(flag):
     if flag == 0:
         ret = 'FALSE'
@@ -418,7 +490,7 @@ class cmd_serverinfo(Command):
             versionopts=None):
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         client_version = dns_client_version(cli_ver)
 
@@ -495,7 +567,7 @@ class cmd_zoneoptions(Command):
             **kwargs):
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         client_version = dns_client_version(cli_ver)
         nap_type = dnsserver.DNSSRV_TYPEID_NAME_AND_PARAM
@@ -734,7 +806,7 @@ class cmd_zoneinfo(Command):
             versionopts=None):
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         client_version = dns_client_version(cli_ver)
 
@@ -805,7 +877,7 @@ class cmd_zonelist(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         client_version = dns_client_version(cli_ver)
 
@@ -846,7 +918,7 @@ class cmd_zonecreate(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         zone = zone.lower()
 
@@ -887,14 +959,14 @@ class cmd_zonecreate(Command):
         name_and_param.pszNodeName = 'AllowUpdate'
         name_and_param.dwParam = dnsp.DNS_ZONE_UPDATE_SECURE
 
-        try:
-            dns_conn.DnssrvOperation2(client_version, 0, server, zone,
-                                      0, 'ResetDwordProperty', typeid,
-                                      name_and_param)
-        except WERRORError as e:
-            if e.args[0] == werror.WERR_DNS_ERROR_ZONE_ALREADY_EXISTS:
-                self.outf.write('Zone already exists.')
-            raise e
+        messages = {
+            werror.WERR_DNS_ERROR_ZONE_ALREADY_EXISTS: (
+                f'Zone "{zone}" already exists.')
+        }
+
+        dns_conn.DnssrvOperation2(client_version, 0, server, zone,
+                                  0, 'ResetDwordProperty', typeid,
+                                  name_and_param, messages=messages)
 
         self.outf.write('Zone %s created successfully\n' % zone)
 
@@ -917,18 +989,18 @@ class cmd_zonedelete(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         zone = zone.lower()
-        try:
-            res = dns_conn.DnssrvOperation2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
-                                            0, server, zone, 0, 'DeleteZoneFromDs',
-                                            dnsserver.DNSSRV_TYPEID_NULL,
-                                            None)
-        except WERRORError as e:
-            if e.args[0] == werror.WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST:
-                raise CommandError('Zone does not exist and so could not be deleted.')
-            raise e
+
+        messages = {
+            werror.WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST: (
+                f'Zone {zone} does not exist and so could not be deleted.'),
+        }
+        res = dns_conn.DnssrvOperation2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
+                                        0, server, zone, 0, 'DeleteZoneFromDs',
+                                        dnsserver.DNSSRV_TYPEID_NULL,
+                                        None, messages=messages)
 
         self.outf.write('Zone %s deleted successfully\n' % zone)
 
@@ -1000,16 +1072,16 @@ class cmd_query(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
-        try:
-            buflen, res = dns_conn.DnssrvEnumRecords2(
-                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, server, zone, name,
-                None, record_type, select_flags, None, None)
-        except WERRORError as e:
-            if e.args[0] == werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
-                raise CommandError('Record or zone does not exist.')
-            raise e
+        messages = {
+            werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST: (
+                'Record or zone does not exist.')
+        }
+        buflen, res = dns_conn.DnssrvEnumRecords2(
+            dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, server, zone, name,
+            None, record_type, select_flags, None, None,
+            messages=messages)
 
         print_dnsrecords(self.outf, res)
 
@@ -1035,7 +1107,7 @@ class cmd_roothints(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         buflen, res = dns_conn.DnssrvEnumRecords2(
             dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, server, '..RootHints',
@@ -1078,20 +1150,22 @@ class cmd_add_record(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
         add_rec_buf.rec = rec
 
-        try:
-            dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
-                                         0, server, zone, name, add_rec_buf, None)
-        except WERRORError as e:
-            if e.args[0] == werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
-                raise CommandError('Zone does not exist; record could not be added. zone[%s] name[%s]' % (zone, name))
-            if e.args[0] == werror.WERR_DNS_ERROR_RECORD_ALREADY_EXISTS:
-                raise CommandError('Record already exists; record could not be added. zone[%s] name[%s]' % (zone, name))
-            raise e
+        messages = {
+            werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST: (
+                'Zone does not exist; record could not be added. '
+                f'zone[{zone}] name[{name}'),
+            werror.WERR_DNS_ERROR_RECORD_ALREADY_EXISTS: (
+                'Record already exists; record could not be added. '
+                f'zone[{zone}] name[{name}]')
+        }
+        dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
+                                     0, server, zone, name, add_rec_buf, None,
+                                     messages=messages)
 
         self.outf.write('Record added successfully\n')
 
@@ -1141,11 +1215,11 @@ class cmd_update_record(Command):
 
         self.lp = sambaopts.get_loadparm()
         self.creds = credopts.get_credentials(self.lp)
-        dns_conn = dns_connect(server, self.lp, self.creds)
+        dns_conn = DnsConnWrapper(server, self.lp, self.creds)
 
         try:
-            rec_match = dns_record_match(dns_conn, server, zone, name, record_type,
-                                         olddata)
+            rec_match = dns_record_match(dns_conn.dns_conn, server, zone,
+                                         name, record_type, olddata)
         except DNSParseError as e:
             raise CommandError(*e.args) from None
 
@@ -1164,18 +1238,19 @@ class cmd_update_record(Command):
         del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
         del_rec_buf.rec = rec_match
 
-        try:
-            dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
-                                         0,
-                                         server,
-                                         zone,
-                                         name,
-                                         add_rec_buf,
-                                         del_rec_buf)
-        except WERRORError as e:
-            if e.args[0] == werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
-                raise CommandError('Zone does not exist; record could not be updated.')
-            raise e
+        messages = {
+            werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST: (
+                f'Zone {zone} does not exist; record could not be updated.'),
+        }
+
+        dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
+                                     0,
+                                     server,
+                                     zone,
+                                     name,
+                                     add_rec_buf,
+                                     del_rec_buf,
+                                     messages=messages)
 
         self.outf.write('Record updated successfully\n')
 
@@ -1214,25 +1289,27 @@ class cmd_delete_record(Command):
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list