From 1ee36f7d637bbd12bae77db967ce5c39df722b48 Mon Sep 17 00:00:00 2001 From: Joe Guo Date: Wed, 6 Jun 2018 10:37:20 +1200 Subject: [PATCH 1/3] netcmd/domain: fix a typo in message Signed-off-by: Joe Guo --- python/samba/netcmd/domain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/samba/netcmd/domain.py b/python/samba/netcmd/domain.py index 5438537ab1d..6a78a6b630b 100644 --- a/python/samba/netcmd/domain.py +++ b/python/samba/netcmd/domain.py @@ -798,7 +798,7 @@ def run(self, sambaopts=None, credopts=None, raise CommandError("Unable to search for servers") if (len(res) == 1): - raise CommandError("You are the latest server in the domain") + raise CommandError("You are the last server in the domain") server = None for e in res: From abc88393c5604b6185ac23cec1daa609262f2dee Mon Sep 17 00:00:00 2001 From: Joe Guo Date: Wed, 6 Jun 2018 10:38:11 +1200 Subject: [PATCH 2/3] netcmd/domain: remove dns records after DC demote Call `remove_dc.remove_dns_references()` at the end of demote cmd. Signed-off-by: Joe Guo --- python/samba/netcmd/domain.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/samba/netcmd/domain.py b/python/samba/netcmd/domain.py index 6a78a6b630b..3dbe2fba9e9 100644 --- a/python/samba/netcmd/domain.py +++ b/python/samba/netcmd/domain.py @@ -1028,6 +1028,10 @@ def run(self, sambaopts=None, credopts=None, except ldb.LdbError as l: pass + # get dns host name for target server to demote, remove dns references + remove_dc.remove_dns_references(remote_samdb, logger, samdb.host_dns_name(), + ignore_no_name=True) + self.errf.write("Demote successful\n") From ec3973605446d09a985a38836005456e27be0ef6 Mon Sep 17 00:00:00 2001 From: Joe Guo Date: Wed, 6 Jun 2018 15:01:28 +1200 Subject: [PATCH 3/3] tests/demote: replace demote test bash script to python Convert bash script to python and add demote and dns remove test on top. Signed-off-by: Joe Guo --- python/samba/tests/samba_tool/demote.py | 105 ++++++++++++++++++++++++++++++++ source4/selftest/tests.py | 10 ++- source4/utils/tests/test_demote.sh | 38 ------------ 3 files changed, 113 insertions(+), 40 deletions(-) create mode 100644 python/samba/tests/samba_tool/demote.py delete mode 100755 source4/utils/tests/test_demote.sh diff --git a/python/samba/tests/samba_tool/demote.py b/python/samba/tests/samba_tool/demote.py new file mode 100644 index 00000000000..13694b6c2d7 --- /dev/null +++ b/python/samba/tests/samba_tool/demote.py @@ -0,0 +1,105 @@ +# Unix SMB/CIFS implementation. +# Copyright (C) Joe Guo 2016 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import os +from samba.tests.samba_tool.base import SambaToolCmdTest + + +class DemoteCmdTestCase(SambaToolCmdTest): + """Test for samba-tool domain demote subcommand""" + + def setUp(self): + super(DemoteCmdTestCase, self).setUp() + self.creds_string = "-U{}%{}".format( + os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"]) + + self.dc_server = os.environ['DC_SERVER'] + self.dburl = "ldap://%s" % os.environ["DC_SERVER"] + self.samdb = self.getSamDB("-H", self.dburl, self.creds_string) + + def test_demote_and_remove_dns(self): + """ + Test domain demote command will also remove dns references + """ + + server = os.environ['SERVER'] # the server to demote + zone = os.environ['REALM'].lower() + + # make sure zone exist + result, out, err = self.runsubcmd( + "dns", "zoneinfo", server, zone, self.creds_string) + self.assertCmdSuccess(result, out, err) + + # add a A record for the server to demote + result, out, err = self.runsubcmd( + "dns", "add", self.dc_server, zone, + server, "A", "192.168.0.193", self.creds_string) + self.assertCmdSuccess(result, out, err) + + # make sure above A record exist + result, out, err = self.runsubcmd( + "dns", "query", self.dc_server, zone, + server, 'A', self.creds_string) + self.assertCmdSuccess(result, out, err) + + # the above A record points to this host + dnshostname = '{}.{}'.format(server, zone) + + # add a SRV record points to above host + srv_record = "{} 65530 65530 65530".format(dnshostname) + self.runsubcmd( + "dns", "add", self.dc_server, zone, 'testrecord', "SRV", + srv_record, self.creds_string) + + # make sure above SRV record exist + result, out, err = self.runsubcmd( + "dns", "query", self.dc_server, zone, + "testrecord", 'SRV', self.creds_string) + self.assertCmdSuccess(result, out, err) + + for type_ in ['CNAME', 'NS', 'PTR']: + # create record + self.runsubcmd( + "dns", "add", self.dc_server, zone, + 'testrecord', type_, dnshostname, + self.creds_string) + self.assertCmdSuccess(result, out, err) + + # check exist + result, out, err = self.runsubcmd( + "dns", "query", self.dc_server, zone, + "testrecord", 'SRV', self.creds_string) + self.assertCmdSuccess(result, out, err) + + # now demote + result, out, err = self.runsubcmd( + "domain", "demote", + "--server", self.dc_server, + "--configfile", os.environ["CONFIGFILE"], + "--workgroup", os.environ["DOMAIN"], + self.creds_string) + self.assertCmdSuccess(result, out, err) + + result, out, err = self.runsubcmd( + "dns", "query", self.dc_server, zone, + server, 'ALL', self.creds_string) + self.assertCmdFail(result) + + result, out, err = self.runsubcmd( + "dns", "query", self.dc_server, zone, + "testrecord", 'ALL', self.creds_string) + self.assertCmdFail(result) diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py index 535931663b8..069128b2e84 100755 --- a/source4/selftest/tests.py +++ b/source4/selftest/tests.py @@ -1053,8 +1053,14 @@ def planoldpythontestsuite(env, module, name=None, extra_path=[], environ={}, ex # Demote the vampire DC, it must be the last test each DC, before the dbcheck for env in ['vampire_dc', 'promoted_dc', 'rodc']: - plantestsuite("samba4.blackbox.samba_tool_demote(%s)" % env, env, [os.path.join(samba4srcdir, "utils/tests/test_demote.sh"), '$SERVER', '$SERVER_IP', '$USERNAME', '$PASSWORD', '$DOMAIN', '$DC_SERVER', '$PREFIX/%s' % env, smbclient4]) - + planoldpythontestsuite(env, "samba.tests.samba_tool.demote", + name="samba.tests.samba_tool.demote", + environ={ + 'CONFIGFILE': '$PREFIX/%s/etc/smb.conf' % env + }, + extra_args=['-U"$USERNAME%$PASSWORD"'], + extra_path=[os.path.join(srcdir(), "samba/python")] + ) # TODO: Verifying the databases really should be a part of the # environment teardown. # check the databases are all OK. PLEASE LEAVE THIS AS THE LAST TEST diff --git a/source4/utils/tests/test_demote.sh b/source4/utils/tests/test_demote.sh deleted file mode 100755 index 0c2c03c98b6..00000000000 --- a/source4/utils/tests/test_demote.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh -# Blackbox tests for samba-tool - -SERVER=$1 -SERVER_IP=$2 -USERNAME=$3 -PASSWORD=$4 -DOMAIN=$5 -DC=$6 -PROV=$7 -smbclient=$8 -shift 8 - -failed=0 - -samba4bindir="$BINDIR" -samba_tool="$samba4bindir/samba-tool" - -testit() { - name="$1" - shift - cmdline="$*" - echo "test: $name" - $cmdline - status=$? - if [ x$status = x0 ]; then - echo "success: $name" - else - echo "failure: $name" - failed=`expr $failed + 1` - fi - return $status -} - - -testit "demote" $VALGRIND $samba_tool domain demote --server $DC -s $PROV/etc/smb.conf -W "$DOMAIN" -U"$USERNAME%$PASSWORD" - -exit $failed