diff --git a/CHANGELOG.md b/CHANGELOG.md index ed911e4138c1f2aaf0cde0740056343d249b087d..6310e2664c5fa6b9aa6f54eadcf0880b988dc568 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ changed functionality, fixed bugs). - Fixed parsing of `--config` CLI param on Python 3.5 - Added `--debug` CLI parameter to easily enable debug logging without having to edit `flamenco-worker.cfg`. +- Only fail UPnP/SSDP discovery when it fails to send on both IPv4 and IPv6. ## Version 2.0.7 (released 2017-07-04) diff --git a/flamenco_worker/ssdp_discover.py b/flamenco_worker/ssdp_discover.py index 7407d384b321de259d9b44aff25fe9617f0c26c9..a8a6d862a765bb7affe9a94d561efaefc83b6b2d 100644 --- a/flamenco_worker/ssdp_discover.py +++ b/flamenco_worker/ssdp_discover.py @@ -57,6 +57,8 @@ def find_flamenco_manager(timeout=1, retries=5): families_and_addresses = list(unique(interface_addresses())) for _ in range(retries): + failed_families = 0 + for family, addr in families_and_addresses: try: dest = DESTINATIONS[family] @@ -64,17 +66,23 @@ def find_flamenco_manager(timeout=1, retries=5): log.warning('Unknown address family %s, skipping', family) continue - log.debug('Sending to %s %s, dest=%s' % (family, addr, dest)) + log.debug('Sending to %s %s, dest=%s', family, addr, dest) sock = socket.socket(family, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) sock.bind((addr, 0)) - for _ in range(2): - # sending it more than once will - # decrease the probability of a timeout - sock.sendto(DISCOVERY_MSG, (dest, 1900)) + try: + for _ in range(2): + # sending it more than once will + # decrease the probability of a timeout + sock.sendto(DISCOVERY_MSG, (dest, 1900)) + except PermissionError: + log.info('Failed sending UPnP/SSDP discovery message to %s %s, dest=%s', + family, addr, dest) + failed_families += 1 + continue try: data = sock.recv(1024) @@ -84,6 +92,11 @@ def find_flamenco_manager(timeout=1, retries=5): response = Response(data) return response.getheader('Location') + if failed_families >= len(families_and_addresses): + log.error('Failed to send UPnP/SSDP discovery message ' + 'to every address family (IPv4/IPv6)') + break + raise DiscoveryFailed('Unable to find Flamenco Manager after %i tries' % retries)