[svn] commit: r3087 - in /branches/trac353/src/bin/xfrin: tests/xfrin_test.py xfrin.py.in
BIND 10 source code commits
bind10-changes at lists.isc.org
Thu Sep 30 14:30:10 UTC 2010
Author: vorner
Date: Thu Sep 30 14:30:10 2010
New Revision: 3087
Log:
xfrin uses isc.net.check
It uses it for validation
Long wrapper around socket.getaddrinfo replaced by a function that just
puts the values into a tuple, since the getaddrinfo was used just for
that anyway.
Modified:
branches/trac353/src/bin/xfrin/tests/xfrin_test.py
branches/trac353/src/bin/xfrin/xfrin.py.in
Modified: branches/trac353/src/bin/xfrin/tests/xfrin_test.py
==============================================================================
--- branches/trac353/src/bin/xfrin/tests/xfrin_test.py (original)
+++ branches/trac353/src/bin/xfrin/tests/xfrin_test.py Thu Sep 30 14:30:10 2010
@@ -421,21 +421,21 @@
name, rrclass = self._do_parse_zone_name_class()
master_addrinfo = self._do_parse_master_port()
db_file = self.args.get('db_file')
- self.assertEqual(master_addrinfo[4][1], int(TEST_MASTER_PORT))
+ self.assertEqual(master_addrinfo[2][1], int(TEST_MASTER_PORT))
self.assertEqual(name, TEST_ZONE_NAME)
self.assertEqual(rrclass, TEST_RRCLASS)
- self.assertEqual(master_addrinfo[4][0], TEST_MASTER_IPV4_ADDRESS)
+ self.assertEqual(master_addrinfo[2][0], TEST_MASTER_IPV4_ADDRESS)
self.assertEqual(db_file, TEST_DB_FILE)
def test_parse_cmd_params_default_port(self):
del self.args['port']
master_addrinfo = self._do_parse_master_port()
- self.assertEqual(master_addrinfo[4][1], 53)
+ self.assertEqual(master_addrinfo[2][1], 53)
def test_parse_cmd_params_ip6master(self):
self.args['master'] = TEST_MASTER_IPV6_ADDRESS
master_addrinfo = self._do_parse_master_port()
- self.assertEqual(master_addrinfo[4][0], TEST_MASTER_IPV6_ADDRESS)
+ self.assertEqual(master_addrinfo[2][0], TEST_MASTER_IPV6_ADDRESS)
def test_parse_cmd_params_chclass(self):
self.args['zone_class'] = 'CH'
@@ -454,7 +454,7 @@
# master address is mandatory.
del self.args['master']
master_addrinfo = self._do_parse_master_port()
- self.assertEqual(master_addrinfo[4][0], DEFAULT_MASTER)
+ self.assertEqual(master_addrinfo[2][0], DEFAULT_MASTER)
def test_parse_cmd_params_bad_ip4(self):
self.args['master'] = '3.3.3.3.3'
Modified: branches/trac353/src/bin/xfrin/xfrin.py.in
==============================================================================
--- branches/trac353/src/bin/xfrin/xfrin.py.in (original)
+++ branches/trac353/src/bin/xfrin/xfrin.py.in Thu Sep 30 14:30:10 2010
@@ -29,6 +29,7 @@
from optparse import OptionParser, OptionValueError
from isc.config.ccsession import *
from isc.notify import notify_out
+import isc.net.check
import isc.utils.process
try:
from pydnspp import *
@@ -93,7 +94,7 @@
self.setblocking(1)
self._shutdown_event = shutdown_event
self._verbose = verbose
- self._master_address = master_addrinfo[4]
+ self._master_address = master_addrinfo[2]
def connect_to_master(self):
'''Connect to master in TCP.'''
@@ -406,10 +407,11 @@
try:
addr = new_config.get('master_addr') or self._master_addr
port = new_config.get('master_port') or self._master_port
- check_addr_port(addr, port)
+ isc.net.check.addr_check(addr)
+ isc.net.check.port_check(port)
self._master_addr = addr
self._master_port = port
- except:
+ except ValueError:
errmsg = "bad format for zone's master: " + str(new_config)
log_error(errmsg)
return create_answer(1, errmsg)
@@ -438,7 +440,7 @@
# specify the notifyfrom address and port, according the RFC1996, zone
# transfer should starts first from the notifyfrom, but now, let 'TODO' it.
(zone_name, rrclass) = self._parse_zone_name_and_class(args)
- (master_addr) = check_addr_port(self._master_addr, self._master_port)
+ (master_addr) = build_addr_info(self._master_addr, self._master_port)
ret = self.xfrin_start(zone_name,
rrclass,
self._get_db_file(),
@@ -486,7 +488,7 @@
def _parse_master_and_port(self, args):
port = args.get('port') or self._master_port
master = args.get('master') or self._master_addr
- return check_addr_port(master, port)
+ return build_addr_info(master, port)
def _get_db_file(self):
#TODO, the db file path should be got in auth server's configuration
@@ -559,30 +561,19 @@
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
-def check_addr_port(addrstr, portstr):
- # XXX: Linux (glibc)'s getaddrinfo incorrectly accepts numeric port
- # string larger than 65535. So we need to explicit validate it separately.
+def build_addr_info(addrstr, portstr):
+ """
+ Return tuple (family, socktype, sockaddr) for given address and port.
+ IPv4 and IPv6 are the only supported addresses now, so sockaddr will be
+ (address, port). The socktype is socket.SOCK_STREAM for now.
+ """
try:
- portnum = int(portstr)
- if portnum < 0 or portnum > 65535:
- raise ValueError("invalid port number (out of range): " + portstr)
+ port = isc.net.check.port_check(portstr)
+ addr = isc.net.check.addr_check(addrstr)
+ return (addr.family, socket.SOCK_STREAM, (addrstr, port))
except ValueError as err:
raise XfrinException("failed to resolve master address/port=%s/%s: %s" %
(addrstr, portstr, str(err)))
-
- try:
- addrinfo = socket.getaddrinfo(addrstr, portstr, socket.AF_UNSPEC,
- socket.SOCK_STREAM, socket.IPPROTO_TCP,
- socket.AI_NUMERICHOST|
- socket.AI_NUMERICSERV)
- except socket.gaierror as err:
- raise XfrinException("failed to resolve master address/port=%s/%s: %s" %
- (addrstr, portstr, str(err)))
- if len(addrinfo) != 1:
- # with the parameters above the result must be uniquely determined.
- errmsg = "unexpected result for address/port resolution for %s:%s"
- raise XfrinException(errmsg % (addrstr, portstr))
- return addrinfo[0]
def set_cmd_options(parser):
parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
More information about the bind10-changes
mailing list