diff --git a/CHANGES b/CHANGES
index 376033be50..284020e2b4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3757. [port] Enable Python tools (dnssec-coverage,
+ dnssec-checkds) to run on Windows. [RT #34355]
+
3756. [bug] GSSAPI Kerberos realm checking was broken in
check_config leading to spurious messages being
logged. [RT #35443]
diff --git a/bin/dnssec/win32/importkey.vcxproj.in b/bin/dnssec/win32/importkey.vcxproj.in
index 4ba5937556..810c7a3d8f 100644
--- a/bin/dnssec/win32/importkey.vcxproj.in
+++ b/bin/dnssec/win32/importkey.vcxproj.in
@@ -71,14 +71,6 @@
$(Configuration);..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);%(AdditionalLibraryDirectories)
dnssectool.lib;libisc.lib;libdns.lib;%(AdditionalDependencies)
-@IF PYTHON
-
- cd ..\..\python
-copy /Y dnssec-checkds.py ..\..\Build\$(Configuration)\dnssec-checkds.py
-copy /Y dnssec-coverage.py ..\..\Build\$(Configuration)\dnssec-coverage.py
-
-
-@END PYTHON
@@ -108,14 +100,6 @@ copy /Y dnssec-coverage.py ..\..\Build\$(Configuration)\dnssec-coverage.py
$(Configuration);..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);%(AdditionalLibraryDirectories)
dnssectool.lib;libisc.lib;libdns.lib;%(AdditionalDependencies)
-@IF PYTHON
-
- cd ..\..\python
-copy /Y dnssec-checkds.py ..\..\Build\$(Configuration)\dnssec-checkds.py
-copy /Y dnssec-coverage.py ..\..\Build\$(Configuration)\dnssec-coverage.py
-
-
-@END PYTHON
diff --git a/bin/python/dnssec-checkds.py.in b/bin/python/dnssec-checkds.py.in
index 8f1146821b..b923756191 100644
--- a/bin/python/dnssec-checkds.py.in
+++ b/bin/python/dnssec-checkds.py.in
@@ -15,15 +15,41 @@
# PERFORMANCE OF THIS SOFTWARE.
############################################################################
-# $Id$
-
import argparse
import pprint
import os
+prog='dnssec-checkds'
+
+# These routines permit platform-independent location of BIND 9 tools
+if os.name == 'nt':
+ import win32con
+ import win32api
+
+def prefix(bindir = ''):
+ if os.name != 'nt':
+ return os.path.join('@prefix@', bindir)
+
+ bind_subkey = "Software\\ISC\\BIND"
+ hKey = None
+ keyFound = True
+ try:
+ hKey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, bind_subkey)
+ except:
+ keyFound = False
+ if keyFound:
+ try:
+ (namedBase, _) = win32api.RegQueryValueEx(hKey, "InstallDir")
+ except:
+ keyFound = False
+ win32api.RegCloseKey(hKey)
+ if keyFound:
+ return os.path.join(namedBase, bindir)
+ return os.path.join(win32api.GetSystemDirectory(), bindir)
+
def shellquote(s):
if os.name == 'nt':
- return s
+ return '"' + s.replace('"', '"\\"') + '"'
return "'" + s.replace("'", "'\\''") + "'"
############################################################################
@@ -257,12 +283,13 @@ def checkdlv(zone, lookaside, masterfile = None):
############################################################################
def parse_args():
global args
+ parser = argparse.ArgumentParser(description=prog + ': checks DS coverage')
+
bindir = 'bin'
- if os.name != 'nt':
- sbindir = 'sbin'
- else:
+ if os.name == 'nt':
sbindir = 'bin'
- parser = argparse.ArgumentParser(description='checkds: checks DS coverage')
+ else:
+ sbindir = 'sbin'
parser.add_argument('zone', type=str, help='zone to check')
parser.add_argument('-f', '--file', dest='masterfile', type=str,
@@ -270,10 +297,10 @@ def parse_args():
parser.add_argument('-l', '--lookaside', dest='lookaside', type=str,
help='DLV lookaside zone')
parser.add_argument('-d', '--dig', dest='dig',
- default=os.path.join('@prefix@', bindir, 'dig'),
+ default=os.path.join(prefix(bindir), 'dig'),
type=str, help='path to \'dig\'')
parser.add_argument('-D', '--dsfromkey', dest='dsfromkey',
- default=os.path.join('@prefix@', sbindir,
+ default=os.path.join(prefix(sbindir),
'dnssec-dsfromkey'),
type=str, help='path to \'dig\'')
parser.add_argument('-v', '--version', action='version', version='9.9.1')
diff --git a/bin/python/dnssec-coverage.py.in b/bin/python/dnssec-coverage.py.in
index 1365471e04..6aded9ae19 100755
--- a/bin/python/dnssec-coverage.py.in
+++ b/bin/python/dnssec-coverage.py.in
@@ -15,10 +15,6 @@
# PERFORMANCE OF THIS SOFTWARE.
############################################################################
-# changes 2014-01-08, Peter Palfrader:
-# - support checking only X days into the future.
-# - support checking only KSK keys or only ZSK keys.
-
import argparse
import os
import glob
@@ -31,6 +27,32 @@ import pprint
prog='dnssec-coverage'
+# These routines permit platform-independent location of BIND 9 tools
+if os.name == 'nt':
+ import win32con
+ import win32api
+
+def prefix(bindir = ''):
+ if os.name != 'nt':
+ return os.path.join('@prefix@', bindir)
+
+ bind_subkey = "Software\\ISC\\BIND"
+ hKey = None
+ keyFound = True
+ try:
+ hKey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, bind_subkey)
+ except:
+ keyFound = False
+ if keyFound:
+ try:
+ (namedBase, _) = win32api.RegQueryValueEx(hKey, "InstallDir")
+ except:
+ keyFound = False
+ win32api.RegCloseKey(hKey)
+ if keyFound:
+ return os.path.join(namedBase, bindir)
+ return os.path.join(win32api.GetSystemDirectory(), bindir)
+
########################################################################
# Class Event
########################################################################
@@ -633,11 +655,8 @@ def set_path(command, default=None):
def parse_args():
"""Read command line arguments, set global 'args' structure"""
global args
- bindir = 'bin';
-
compilezone = set_path('named-compilezone',
- os.path.join('@prefix@', bindir,
- 'named-compilezone'))
+ os.path.join(prefix('bin'), 'named-compilezone'))
parser = argparse.ArgumentParser(description=prog + ': checks future ' +
'DNSKEY coverage for a zone')
diff --git a/bin/python/win32.py b/bin/python/win32.py
deleted file mode 100644
index b347370bba..0000000000
--- a/bin/python/win32.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!@PYTHON@
-############################################################################
-# Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC")
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
-# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
-# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-# PERFORMANCE OF THIS SOFTWARE.
-############################################################################
-
-# $Id$
-
-# ntpath rewrote in Python
-
-import win32con
-import win32api
-
-BIND_SUBKEY = "Software\\ISC\\BIND"
-
-def base():
- hKey = None
- keyFound = True
- try:
- hKey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, BIND_SUBKEY)
- except:
- keyFound = False
- if keyFound:
- try:
- (namedBase, _) = win32api.RegQueryValueEx(hKey, "InstallDir")
- except:
- keyFound = False
- win32api.RegCloseKey(hKey)
- if keyFound:
- return namedBase
- return win32api.GetSystemDirectory()
diff --git a/bin/tests/system/checkds/dig.pl b/bin/tests/system/checkds/dig.pl
new file mode 100644
index 0000000000..0470d5c5de
--- /dev/null
+++ b/bin/tests/system/checkds/dig.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+# $Id$
+
+my $arg;
+my $ext;
+my $file;
+
+foreach $arg (@ARGV) {
+ if ($arg =~ /^\+/) {
+ next;
+ }
+ if ($arg =~ /^-t/) {
+ next;
+ }
+ if ($arg =~ /^ds$/i) {
+ $ext = "ds";
+ next;
+ }
+ if ($arg =~ /^dlv$/i) {
+ $ext = "dlv";
+ next;
+ }
+ if ($arg =~ /^dnskey$/i) {
+ $ext = "dnskey";
+ next;
+ }
+ $file = $arg;
+ next;
+}
+
+open F, $file . "." . $ext . ".db" || die $!;
+while () {
+ print;
+}
+close F;
diff --git a/lib/isc/win32/libisc.vcxproj.in b/lib/isc/win32/libisc.vcxproj.in
index 83fc5c10e3..1e01ff2b41 100644
--- a/lib/isc/win32/libisc.vcxproj.in
+++ b/lib/isc/win32/libisc.vcxproj.in
@@ -192,6 +192,10 @@ copy ..\bin\dnssec\dnssec-settime.html ..\Build\Release
copy ..\bin\dnssec\dnssec-revoke.html ..\Build\Release
copy ..\bin\dnssec\dnssec-verify.html ..\Build\Release
copy ..\bin\dnssec\dnssec-importkey.html ..\Build\Release
+@IF PYTHON
+copy ..\bin\python\dnssec-checkds.html ..\Build\Release
+copy ..\bin\python\dnssec-coverage.html ..\Build\Release
+@END PYTHON
@IF PKCS11
copy ..\bin\pkcs11\pkcs11-keygen.html ..\Build\Release
copy ..\bin\pkcs11\pkcs11-list.html ..\Build\Release
diff --git a/win32utils/legacy/BuildSetup.bat.in b/win32utils/legacy/BuildSetup.bat.in
index c266b0eda3..0512e0b5d3 100644
--- a/win32utils/legacy/BuildSetup.bat.in
+++ b/win32utils/legacy/BuildSetup.bat.in
@@ -66,6 +66,10 @@ copy ..\..\bin\dnssec\dnssec-settime.html ..\..\Build\Release
copy ..\..\bin\dnssec\dnssec-revoke.html ..\..\Build\Release
copy ..\..\bin\dnssec\dnssec-verify.html ..\..\Build\Release
copy ..\..\bin\dnssec\dnssec-importkey.html ..\..\Build\Release
+@IF PYTHON
+copy ..\..\bin\python\dnssec-checkds.html ..\..\Build\Release
+copy ..\..\bin\python\dnssec-coverage.html ..\..\Build\Release
+@END PYTHON
@IF PKCS11
copy ..\..\bin\pkcs11\pkcs11-keygen.html ..\..\Build\Release
copy ..\..\bin\pkcs11\pkcs11-list.html ..\..\Build\Release