class NotifyOut:
'''This class is used to handle notify logic for all zones(sending
notify message to its slaves). notify service can be started by
- calling dispatcher(), and it can be stoped by calling shutdown()
+ calling dispatcher(), and it can be stopped by calling shutdown()
in another thread. '''
- def __init__(self, datasrc_file, verbose=True):
+ def __init__(self, datasrc_file, counter_handler=None, verbose=True,
+ counter_notifyoutv4=None, counter_notifyoutv6=None):
self._notify_infos = {} # key is (zone_name, zone_class)
self._waiting_zones = []
self._notifying_zones = []
# Use nonblock event to eliminate busy loop
# If there are no notifying zones, clear the event bit and wait.
self._nonblock_event = threading.Event()
+ # Set counter handlers for counting notifies. An argument is
+ # required for zone name.
+ self._counter_notifyoutv4 = lambda x: None
+ if hasattr(counter_notifyoutv4, '__call__'):
+ self._counter_notifyoutv4 = counter_notifyoutv4
+ self._counter_notifyoutv6 = lambda x: None
+ if hasattr(counter_notifyoutv6, '__call__'):
+ self._counter_notifyoutv6 = counter_notifyoutv6
def _init_notify_out(self, datasrc_file):
'''Get all the zones name and its notify target's address.
try:
sock = zone_notify_info.create_socket(addrinfo[0])
sock.sendto(render.get_data(), 0, addrinfo)
+ # count notifying by IPv4 or IPv6 for statistics
+ if zone_notify_info.get_socket().family == socket.AF_INET:
+ self._counter_notifyoutv4(zone_notify_info.zone_name)
+ elif zone_notify_info.get_socket().family == socket.AF_INET6:
+ self._counter_notifyoutv6(zone_notify_info.zone_name)
logger.info(NOTIFY_OUT_SENDING_NOTIFY, addrinfo[0],
addrinfo[1])
except (socket.error, addr.InvalidAddress) as err: