Merging upstream version 2.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
fd9ef39dd3
commit
f11086fc50
9 changed files with 77 additions and 25 deletions
|
@ -71,6 +71,29 @@ def fmt_service_str(interface, protocol, name, stype, domain, flags): # pylint:
|
|||
)
|
||||
|
||||
|
||||
class ValueRange:
|
||||
'''Implement a range of values with ceiling. Once the ceiling has been
|
||||
reached, then any further request for a new value will return the
|
||||
ceiling (i.e last value).'''
|
||||
|
||||
def __init__(self, values: list):
|
||||
self._values = values
|
||||
self._index = 0
|
||||
|
||||
def get_next(self):
|
||||
'''Get the next value (or last value if ceiling was reached)'''
|
||||
value = self._values[self._index]
|
||||
if self._index >= 0:
|
||||
self._index += 1
|
||||
if self._index >= len(self._values):
|
||||
self._index = -1
|
||||
return value
|
||||
|
||||
def reset(self):
|
||||
'''Reset the range to start from the beginning'''
|
||||
self._index = 0
|
||||
|
||||
|
||||
# ******************************************************************************
|
||||
class Service: # pylint: disable=too-many-instance-attributes
|
||||
'''Object used to keep track of the services discovered from the avahi-daemon'''
|
||||
|
@ -109,6 +132,11 @@ class Service: # pylint: disable=too-many-instance-attributes
|
|||
self._interface_id, self._protocol_id, self._name, self._stype, self._domain, self._flags
|
||||
)
|
||||
|
||||
self._connect_check_retry_tmo = ValueRange([2, 5, 10, 30, 60, 300, 600])
|
||||
self._connect_check_retry_tmr = gutil.GTimer(
|
||||
self._connect_check_retry_tmo.get_next(), self._on_connect_check_retry
|
||||
)
|
||||
|
||||
self._ip = None
|
||||
self._resolver = None
|
||||
self._data = {}
|
||||
|
@ -151,8 +179,17 @@ class Service: # pylint: disable=too-many-instance-attributes
|
|||
self._identified_cback()
|
||||
return
|
||||
|
||||
self._connect_check(verbose=True) # Enable verbosity on first attempt
|
||||
|
||||
def _connect_check(self, verbose=False):
|
||||
self._reachable = False
|
||||
connect_checker = gutil.TcpChecker(traddr, trsvcid, host_iface, self._tcp_connect_check_cback)
|
||||
connect_checker = gutil.TcpChecker(
|
||||
self._data['traddr'],
|
||||
self._data['trsvcid'],
|
||||
self._data['host-iface'],
|
||||
verbose,
|
||||
self._tcp_connect_check_cback,
|
||||
)
|
||||
|
||||
try:
|
||||
connect_checker.connect()
|
||||
|
@ -168,7 +205,16 @@ class Service: # pylint: disable=too-many-instance-attributes
|
|||
self._connect_checker.close()
|
||||
self._connect_checker = None
|
||||
self._reachable = connected
|
||||
self._identified_cback()
|
||||
|
||||
if self._reachable:
|
||||
self._identified_cback()
|
||||
else:
|
||||
# Restart the timer but with incremented timeout
|
||||
self._connect_check_retry_tmr.start(self._connect_check_retry_tmo.get_next())
|
||||
|
||||
def _on_connect_check_retry(self):
|
||||
self._connect_check()
|
||||
return GLib.SOURCE_REMOVE
|
||||
|
||||
def set_resolver(self, resolver):
|
||||
'''Set the resolver object'''
|
||||
|
|
|
@ -423,7 +423,9 @@ class Deferred:
|
|||
class TcpChecker: # pylint: disable=too-many-instance-attributes
|
||||
'''@brief Verify that a TCP connection can be established with an enpoint'''
|
||||
|
||||
def __init__(self, traddr, trsvcid, host_iface, user_cback, *user_data):
|
||||
def __init__(
|
||||
self, traddr, trsvcid, host_iface, verbose, user_cback, *user_data
|
||||
): # pylint: disable=too-many-arguments
|
||||
self._user_cback = user_cback
|
||||
self._host_iface = host_iface
|
||||
self._user_data = user_data
|
||||
|
@ -432,6 +434,7 @@ class TcpChecker: # pylint: disable=too-many-instance-attributes
|
|||
self._cancellable = None
|
||||
self._gio_sock = None
|
||||
self._native_sock = None
|
||||
self._verbose = verbose
|
||||
|
||||
def connect(self):
|
||||
'''Attempt to connect'''
|
||||
|
@ -502,13 +505,14 @@ class TcpChecker: # pylint: disable=too-many-instance-attributes
|
|||
if err.matches(Gio.io_error_quark(), Gio.IOErrorEnum.CANCELLED):
|
||||
logging.debug('TcpChecker._connect_async_cback() - %s', err.message) # pylint: disable=no-member
|
||||
else:
|
||||
logging.info(
|
||||
'Unable to verify TCP connectivity - (%-10s %-14s %s): %s',
|
||||
self._host_iface + ',',
|
||||
self._traddr.compressed + ',',
|
||||
self._trsvcid,
|
||||
err.message, # pylint: disable=no-member
|
||||
)
|
||||
if self._verbose:
|
||||
logging.info(
|
||||
'Unable to verify TCP connectivity - (%-10s %-14s %s): %s',
|
||||
self._host_iface + ',',
|
||||
self._traddr.compressed + ',',
|
||||
self._trsvcid,
|
||||
err.message, # pylint: disable=no-member
|
||||
)
|
||||
|
||||
self.close()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue