Browse Source

[trac811] some small improvements

Jelte Jansen 14 years ago
parent
commit
76039741c1
3 changed files with 41 additions and 17 deletions
  1. 14 0
      src/bin/xfrin/tests/xfrin_test.py
  2. 24 15
      src/bin/xfrin/xfrin.py.in
  3. 3 2
      src/bin/xfrout/xfrout.spec.pre.in

+ 14 - 0
src/bin/xfrin/tests/xfrin_test.py

@@ -607,6 +607,20 @@ class TestXfrin(unittest.TestCase):
         self.assertEqual(self.xfr.command_handler("notify",
         self.assertEqual(self.xfr.command_handler("notify",
                                                   self.args)['result'][0], 1)
                                                   self.args)['result'][0], 1)
 
 
+    def test_command_handler_notify_known_zone(self):
+        # try it with a known zone
+        self.args['master'] = TEST_MASTER_IPV6_ADDRESS
+
+        zones = { 'zones': [
+                  { 'name': TEST_ZONE_NAME,
+                    'master_addr': TEST_MASTER_IPV4_ADDRESS,
+                    'master_port': TEST_MASTER_PORT
+                  }
+                ]}
+        self.xfr.config_handler(zones)
+        self.assertEqual(self.xfr.command_handler("notify",
+                                                  self.args)['result'][0], 0)
+
     def test_command_handler_unknown(self):
     def test_command_handler_unknown(self):
         self.assertEqual(self.xfr.command_handler("xxx", None)['result'][0], 1)
         self.assertEqual(self.xfr.command_handler("xxx", None)['result'][0], 1)
 
 

+ 24 - 15
src/bin/xfrin/xfrin.py.in

@@ -386,6 +386,8 @@ class ZoneInfo:
         """Creates a zone_info with the config data element as
         """Creates a zone_info with the config data element as
            specified by the 'zones' list in xfrin.spec"""
            specified by the 'zones' list in xfrin.spec"""
         self.name = config_data.get('name')
         self.name = config_data.get('name')
+        self.class_str = config_data.get('class') or 'IN'
+
         if self.name is None:
         if self.name is None:
             raise XfrinConfigException("Configuration zones list "
             raise XfrinConfigException("Configuration zones list "
                                        "element does not contain "
                                        "element does not contain "
@@ -394,14 +396,11 @@ class ZoneInfo:
         # add the root dot if the user forgot
         # add the root dot if the user forgot
         if len(self.name) > 0 and self.name[-1] != '.':
         if len(self.name) > 0 and self.name[-1] != '.':
             self.name += '.'
             self.name += '.'
-        self.master_addr = config_data.get('master_addr') or DEFAULT_MASTER
+        self.master_addr_str = config_data.get('master_addr') or DEFAULT_MASTER
+        self.master_port_str = config_data.get('master_port') or DEFAULT_MASTER_PORT
         try:
         try:
-            addr = config_data.get('master_addr') or DEFAULT_MASTER
-            port = config_data.get('master_port') or DEFAULT_MASTER_PORT
-            isc.net.parse.addr_parse(addr)
-            isc.net.parse.port_parse(port)
-            self.master_addr = addr
-            self.master_port = port
+            self.master_addr = isc.net.parse.addr_parse(self.master_addr_str)
+            self.master_port = isc.net.parse.port_parse(self.master_port_str)
         except ValueError:
         except ValueError:
             errmsg = "bad format for zone's master: " + str(config_data)
             errmsg = "bad format for zone's master: " + str(config_data)
             log_error(errmsg)
             log_error(errmsg)
@@ -409,6 +408,10 @@ class ZoneInfo:
 
 
         self.tsig_key_str = config_data.get('tsig_key') or None
         self.tsig_key_str = config_data.get('tsig_key') or None
 
 
+    def get_master_addr_info(self):
+        return (self.master_addr.family, socket.SOCK_STREAM,
+                (self.master_addr_str, self.master_port))
+
 class Xfrin:
 class Xfrin:
     def __init__(self, verbose = False):
     def __init__(self, verbose = False):
         self._max_transfers_in = 10
         self._max_transfers_in = 10
@@ -439,26 +442,32 @@ class Xfrin:
         of unit tests.'''
         of unit tests.'''
         self._module_cc.check_command(False)
         self._module_cc.check_command(False)
 
 
-    def _get_zone_info(self, name):
+    def _get_zone_info(self, name, class_str = "IN"):
         """Returns the ZoneInfo object containing the configured data
         """Returns the ZoneInfo object containing the configured data
            for the given zone name. If the zone name did not have any
            for the given zone name. If the zone name did not have any
            data, returns None"""
            data, returns None"""
         # add the root dot if the user forgot
         # add the root dot if the user forgot
         if len(name) > 0 and name[-1] != '.':
         if len(name) > 0 and name[-1] != '.':
             name += '.'
             name += '.'
-        if name in self._zones:
-            return self._zones[name]
+        if (name, class_str) in self._zones:
+            return self._zones[(name, class_str)]
         else:
         else:
             return None
             return None
 
 
+    def _clear_zone_info(self):
+        self._zones = {}
+
+    def _add_zone_info(self, zone_info):
+        self._zones[(zone_info.name, zone_info.class_str)] = zone_info
+
     def config_handler(self, new_config):
     def config_handler(self, new_config):
         self._max_transfers_in = new_config.get("transfers_in") or self._max_transfers_in
         self._max_transfers_in = new_config.get("transfers_in") or self._max_transfers_in
         if 'zones' in new_config:
         if 'zones' in new_config:
-            self._zones = {}
+            self._clear_zone_info()
             for zone_config in new_config.get('zones'):
             for zone_config in new_config.get('zones'):
                 try:
                 try:
                     zone_info = ZoneInfo(zone_config)
                     zone_info = ZoneInfo(zone_config)
-                    self._zones[zone_info.name] = zone_info
+                    self._add_zone_info(zone_info)
                 except XfrinConfigException as xce:
                 except XfrinConfigException as xce:
                     return create_answer(1, str(xce))
                     return create_answer(1, str(xce))
 
 
@@ -493,7 +502,7 @@ class Xfrin:
                     log_error(errmsg)
                     log_error(errmsg)
                     answer = create_answer(1, errmsg)
                     answer = create_answer(1, errmsg)
                 else:
                 else:
-                    (master_addr) = build_addr_info(zone_info.master_addr, zone_info.master_port)
+                    master_addr = zone_info.get_master_addr_info()
                     ret = self.xfrin_start(zone_name,
                     ret = self.xfrin_start(zone_name,
                                            rrclass,
                                            rrclass,
                                            self._get_db_file(),
                                            self._get_db_file(),
@@ -552,14 +561,14 @@ class Xfrin:
         port = args.get('port')
         port = args.get('port')
         if port is None:
         if port is None:
             if zone_info is not None:
             if zone_info is not None:
-                port = zone_info.master_port
+                port = zone_info.master_port_str
             else:
             else:
                 port = DEFAULT_MASTER_PORT
                 port = DEFAULT_MASTER_PORT
 
 
         master = args.get('master')
         master = args.get('master')
         if master is None:
         if master is None:
             if zone_info is not None:
             if zone_info is not None:
-                master = zone_info.master_addr
+                master = zone_info.master_addr_str
             else:
             else:
                 master = DEFAULT_MASTER
                 master = DEFAULT_MASTER
 
 

+ 3 - 2
src/bin/xfrout/xfrout.spec.pre.in

@@ -41,7 +41,7 @@
        {
        {
          "item_name": "zones",
          "item_name": "zones",
          "item_type": "list",
          "item_type": "list",
-         "item_optional": "false",
+         "item_optional": false,
          "item_default": [],
          "item_default": [],
          "list_item_spec":
          "list_item_spec":
          { "item_name": "zone_info",
          { "item_name": "zone_info",
@@ -51,7 +51,8 @@
            "map_item_spec": [
            "map_item_spec": [
            { "item_name": "name",
            { "item_name": "name",
              "item_type": "string",
              "item_type": "string",
-             "item_optional": false
+             "item_optional": false,
+             "item_default": ""
            },
            },
            { "item_name": "tsig_key",
            { "item_name": "tsig_key",
              "item_type": "string",
              "item_type": "string",