]> Frank Brehm's Git Trees - pixelpark/admin-tools.git/commitdiff
Collect IPs of masters
authorFrank Brehm <frank.brehm@pixelpark.com>
Mon, 11 Dec 2017 17:37:28 +0000 (18:37 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Mon, 11 Dec 2017 17:37:28 +0000 (18:37 +0100)
pp_lib/deploy_zones_from_pdns.py
pp_lib/pdns_app.py

index 560173544eb4eb2e8b4be9e909de8a30901dcc0c..84557f53f80ee6a0103bb39eda50f5c73ee4de0e 100644 (file)
@@ -44,7 +44,7 @@ from .pdns_record import compare_rrsets
 
 from .pidfile import PidFileError, InvalidPidFileError, PidFileInUseError, PidFile
 
-__version__ = '0.4.2'
+__version__ = '0.5.1'
 LOG = logging.getLogger(__name__)
 
 
@@ -106,6 +106,7 @@ class PpDeployZonesApp(PpPDNSApplication):
         self._show_simulate_opt = True
 
         self.is_internal = False
+        self.named_listen_on_v6 = False
         self.pidfile_name = self.default_pidfile
 
         # Configuration files and directories
@@ -242,6 +243,9 @@ class PpDeployZonesApp(PpPDNSApplication):
         self._check_path_config(section, section_name, 'base_dir', 'named_basedir', True)
         self._check_path_config(section, section_name, 'slave_dir', '_named_slavedir', False)
 
+        if 'listen_on_v6' in section and section['listen_on_v6'] is not None:
+            self.named_listen_on_v6 = to_bool(section['listen_on_v6'])
+
         if 'masters' in section:
             self._get_masters_from_cfg(section['masters'], section_name)
 
@@ -265,8 +269,15 @@ class PpDeployZonesApp(PpPDNSApplication):
             if m:
                 m = m.strip().lower()
                 try:
-                    addr_info = socket.getaddrinfo(
-                        m, 53, proto=socket.IPPROTO_TCP, family=socket.AF_INET)
+                    addr_infos = socket.getaddrinfo(
+                        m, 53, proto=socket.IPPROTO_TCP)
+                    for addr_info in addr_infos:
+                        if not self.named_listen_on_v6 and addr_info[0] == socket.AF_INET6:
+                            continue
+                        addr = addr_info[4][0]
+                        if addr not in masters and addr not in self.local_addresses:
+                            masters.append(addr)
+
                 except socket.gaierror as e:
                     msg = (
                         "Invalid hostname or address {!r} found in "
@@ -274,8 +285,6 @@ class PpDeployZonesApp(PpPDNSApplication):
                     LOG.error(msg)
                     self.config_has_errors = True
                     m = None
-            if m:
-                masters.append(m)
         if masters:
             if self.verbose > 2:
                 LOG.debug("Using configured masters: {}".format(pp(masters)))
index 8c98e1e672250ec9247c19160251d5ade87017f9..97e7107d1a8607df1874a5ec5b2cfa805f12f2cc 100644 (file)
@@ -15,10 +15,13 @@ import re
 import copy
 import json
 import os
+import ipaddress
+import socket
 
 # Third party modules
 import requests
 import six
+import psutil
 
 # Own modules
 from .common import pp, to_bool
@@ -26,7 +29,7 @@ from .common import pp, to_bool
 from .cfg_app import PpCfgAppError, PpConfigApplication
 from .pdns_zone import PdnsApiZone
 
-__version__ = '0.3.4'
+__version__ = '0.4.1'
 LOG = logging.getLogger(__name__)
 _LIBRARY_NAME = "pp-pdns-api-client"
 
@@ -115,6 +118,8 @@ class PpPDNSApplication(PpConfigApplication):
         self._user_agent = '{}/{}'.format(_LIBRARY_NAME, self.version)
         self._timeout = self.default_timeout
 
+        self.local_addresses = []
+
         self._environment = 'global'
         if environment != 'global':
             self.environment = environment
@@ -147,6 +152,13 @@ class PpPDNSApplication(PpConfigApplication):
             cfg_encoding=cfg_encoding, need_config_file=need_config_file,
         )
 
+        for interface, snics in psutil.net_if_addrs().items():
+            for snic in snics:
+                if snic.family == socket.AF_INET or snic.family == socket.AF_INET6:
+                    addr = str(ipaddress.ip_address(re.sub(r'%.*', '', snic.address)))
+                    if addr not in self.local_addresses:
+                        self.local_addresses.append(addr)
+
         self._user_agent = '{}/{}'.format(_LIBRARY_NAME, self.version)
 
     # -----------------------------------------------------------