From 91a3c85856ee43f4e0868b9eb30c5d41be853f13 Mon Sep 17 00:00:00 2001 From: Tim Beale Date: Wed, 16 Jan 2019 15:17:38 +1300 Subject: [PATCH 1/2] join: Fix TypeError when handling exception When we can't resolve a domain name, we were inadvertently throwing a TypeError whilst trying to output a helpful message. E.g. ERROR(): uncaught exception - 'NTSTATUSError' object does not support indexing Instead of indexing the object, we want to index the Exception.args so that we just display the string portion of the exception error. The same problem is also present for the domain trust commands. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13747 Signed-off-by: Tim Beale Reviewed-by: Rowland Penny Reviewed-by: Jeremy Allison (cherry picked from commit 3bb7808984c163a7bba66fb983411d1281589722 and modified to work for 4.8 - note that the NTSTATUSError exception wasn't even imported on 4.8) --- python/samba/join.py | 4 ++-- python/samba/netcmd/domain.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/samba/join.py b/python/samba/join.py index 9782f53..32fac68 100644 --- a/python/samba/join.py +++ b/python/samba/join.py @@ -35,7 +35,7 @@ from samba.provision.sambadns import setup_bind9_dns from samba import read_and_sub_file from samba import werror from base64 import b64encode -from samba import WERRORError +from samba import WERRORError, NTSTATUSError from samba.dnsserver import ARecord, AAAARecord, PTRRecord, CNameRecord, NSRecord, MXRecord, SOARecord, SRVRecord, TXTRecord from samba import sd_utils import logging @@ -338,7 +338,7 @@ class dc_join(object): ctx.cldap_ret = ctx.net.finddc(domain=domain, flags=nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) except NTSTATUSError as error: raise Exception("Failed to find a writeable DC for domain '%s': %s" % - (domain, error[1])) + (domain, error.args[1])) except Exception: raise Exception("Failed to find a writeable DC for domain '%s'" % domain) if ctx.cldap_ret.client_site is not None and ctx.cldap_ret.client_site != "": diff --git a/python/samba/netcmd/domain.py b/python/samba/netcmd/domain.py index 38c800c..2901605 100644 --- a/python/samba/netcmd/domain.py +++ b/python/samba/netcmd/domain.py @@ -1773,7 +1773,7 @@ class DomainTrustCommand(Command): remote_info = remote_net.finddc(flags=remote_flags, domain=domain, address=remote_server) except NTSTATUSError as error: raise CommandError("Failed to find a writeable DC for domain '%s': %s" % - (domain, error[1])) + (domain, error.args[1])) except Exception: raise CommandError("Failed to find a writeable DC for domain '%s'" % domain) flag_map = { -- 2.7.4 From 62396697a3232b984c3336de8fa134232203d3d5 Mon Sep 17 00:00:00 2001 From: Tim Beale Date: Wed, 16 Jan 2019 15:37:00 +1300 Subject: [PATCH 2/2] join: Throw CommandError instead of Exception for simple errors Throwing an exception here still dumps out the Python stack trace, which can be a little disconcerting for users. In this case, the stack trace isn't going to really help at all (the problem is pretty obvious), and it obscures the useful message explaining what went wrong. Throw a CommandError instead, which samba-tool will catch and display more nicely. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13747 Signed-off-by: Tim Beale Reviewed-by: Rowland Penny Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Wed Jan 16 22:11:04 CET 2019 on sn-devel-144 (cherry picked from commit 9e4b08f4c384b8cae5ad853a7be7cf03e2749be5) --- python/samba/join.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/samba/join.py b/python/samba/join.py index 32fac68..d577df0 100644 --- a/python/samba/join.py +++ b/python/samba/join.py @@ -42,6 +42,7 @@ import logging import talloc import random import time +from samba.netcmd import CommandError class DCJoinException(Exception): @@ -337,10 +338,10 @@ class dc_join(object): try: ctx.cldap_ret = ctx.net.finddc(domain=domain, flags=nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) except NTSTATUSError as error: - raise Exception("Failed to find a writeable DC for domain '%s': %s" % - (domain, error.args[1])) + raise CommandError("Failed to find a writeable DC for domain '%s': %s" % + (domain, error.args[1])) except Exception: - raise Exception("Failed to find a writeable DC for domain '%s'" % domain) + raise CommandError("Failed to find a writeable DC for domain '%s'" % domain) if ctx.cldap_ret.client_site is not None and ctx.cldap_ret.client_site != "": ctx.site = ctx.cldap_ret.client_site return ctx.cldap_ret.pdc_dns_name -- 2.7.4