diff --git a/_service b/_service index e7f7cad..7727931 100644 --- a/_service +++ b/_service @@ -2,8 +2,8 @@ https://github.com/jstasiak/python-zeroconf git - 87ba2a3960576cfcf4207ea74a711b2c0cc584a7 - 0.31.0 + 4281221b668123b770c6d6b0835dd876d1d2f22d + 0.35.1 diff --git a/disable-tests.patch b/disable-tests.patch deleted file mode 100644 index f1f2a3e..0000000 --- a/disable-tests.patch +++ /dev/null @@ -1,20 +0,0 @@ -Index: python-zeroconf-0.31.0/zeroconf/test.py -=================================================================== ---- python-zeroconf-0.31.0.orig/zeroconf/test.py -+++ python-zeroconf-0.31.0/zeroconf/test.py -@@ -570,6 +570,7 @@ class Framework(unittest.TestCase): - rv = r.Zeroconf(interfaces=r.InterfaceChoice.Default, unicast=True) - rv.close() - -+ @unittest.skip('Fails in obs') - def test_close_multiple_times(self): - rv = r.Zeroconf(interfaces=r.InterfaceChoice.Default) - rv.close() -@@ -1886,6 +1887,7 @@ class TestServiceInfo(unittest.TestCase) - zc.close() - - -+@unittest.skip('Fails in obs') - class TestServiceBrowserMultipleTypes(unittest.TestCase): - def test_update_record(self): - diff --git a/python-zeroconf-0.31.0.tar.xz b/python-zeroconf-0.31.0.tar.xz deleted file mode 100644 index 422b252..0000000 --- a/python-zeroconf-0.31.0.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7128b83f8f02fbecaca408d34c01a3ad55444ea7bbae3c02f0d4d87bec5f3ad -size 54676 diff --git a/python-zeroconf-0.35.1.tar.xz b/python-zeroconf-0.35.1.tar.xz new file mode 100644 index 0000000..dd2a67e --- /dev/null +++ b/python-zeroconf-0.35.1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9ba325464d40404d39b56db1853b96b3cfc98b06ce788119b14a7b9564d96b8 +size 98000 diff --git a/python-zeroconf.changes b/python-zeroconf.changes index 5004221..20da9e8 100644 --- a/python-zeroconf.changes +++ b/python-zeroconf.changes @@ -1,3 +1,373 @@ +------------------------------------------------------------------- +Mon Aug 16 01:39:16 UTC 2021 - Fusion Future + +- Update to 0.35.1: + * Only reschedule types if the send next time changes (#958) + @bdraco + * When the PTR response was seen again, the timer was being + canceled and rescheduled even if the timer was for the same + time. While this did not cause any breakage, it is quite + inefficient. + * Cache DNS record and question hashes (#960) @bdraco + * The hash was being recalculated every time the object was + being used in a set or dict. Since the hashes are effectively + immutable, we only calculate them once now. +- Changes from 0.35.0: + * Reduced chance of accidental synchronization of ServiceInfo + requests (#955) @bdraco + * Sort aggregated responses to increase chance of name compression + (#954) @bdraco + Technically backwards incompatible: + * Send unicast replies on the same socket the query was received + (#952) @bdraco + * When replying to a QU question, we do not know if the sending + host is reachable from all of the sending sockets. We now + avoid this problem by replying via the receiving socket. This + was the existing behavior when InterfaceChoice.Default is set. + * This change extends the unicast relay behavior to used with + InterfaceChoice.Default to apply when InterfaceChoice.All + or interfaces are explicitly passed when instantiating a + Zeroconf instance. + * Fixes #951 +- Changes from 0.34.3: + * Fix sending immediate multicast responses (#949) @bdraco +- Changes from 0.34.2: + * Coalesce aggregated multicast answers (#945) @bdraco + * When the random delay is shorter than the last scheduled + response, answers are now added to the same outgoing time group. + * This reduces traffic when we already know we will be sending + a group of answers inside the random delay window described + in datatracker.ietf.org/doc/html/rfc6762#section-6.3 + * Ensure ServiceInfo requests can be answered inside the default + timeout with network protection (#946) @bdraco + * Adjust the time windows to ensure responses that have triggered + the protection against against excessive packet flooding due to + software bugs or malicious attack described in RFC6762 section + 6 can respond in under 1350ms to ensure ServiceInfo can ask + two questions within the default timeout of 3000ms +- Changes from 0.34.1: + * Ensure multicast aggregation sends responses within 620ms + (#942) @bdraco + * Responses that trigger the protection against against + excessive packet flooding due to software bugs or malicious + attack described in RFC6762 section 6 could cause the multicast + aggregation response to be delayed longer than 620ms (The maximum + random delay of 120ms and 500ms additional for aggregation). + * Only responses that trigger the protection are delayed longer + than 620ms +- Changes from 0.34.0: + * Implemented Multicast Response Aggregation (#940) @bdraco + * Responses are now aggregated when possible per rules in RFC6762 + section 6.4 + * Responses that trigger the protection against against + excessive packet flooding due to software bugs or malicious + attack described in RFC6762 section 6 are delayed instead of + discarding as it was causing responders that implement Passive + Observation Of Failures (POOF) to evict the records. + * Probe responses are now always sent immediately as there were + cases where they would fail to be answered in time to defend + a name. +- Changes from 0.33.4: + * Ensure zeroconf can be loaded when the system disables IPv6 + (#933) @che0 +- Changes from 0.33.3: + * Added support for forward dns compression pointers (#934) @bdraco + * Provide sockname when logging a protocol error (#935) @bdraco +- Changes from 0.33.2: + * Handle duplicate goodbye answers in the same packet (#928) + @bdraco + * Solves an exception being thrown when we tried to remove the + known answer from the cache when the second goodbye answer in + the same packet was processed + * Fixed #926 + * Skip ipv6 interfaces that return ENODEV (#930) @bdraco +- Changes from 0.33.1: + * Version number change only with less restrictive directory + permissions + * Fixed #923 +- Changes from 0.33.0: + This release eliminates all threading locks as all non-threadsafe + operations now happen in the event loop. + * Let connection_lost close the underlying socket (#918) @bdraco + * The socket was closed during shutdown before asyncio's + connection_lost handler had a chance to close it which resulted + in a traceback on windows. + * Fixed #917 + Technically backwards incompatible: + * Removed duplicate unregister_all_services code (#910) @bdraco + * Calling Zeroconf.close from same asyncio event loop zeroconf + is running in will now skip unregister_all_services and log + a warning as this a blocking operation and is not async safe + and never has been. + * Use AsyncZeroconf instead, or for legacy code call + async_unregister_all_services before Zeroconf.close +- Changes from 0.32.1: + * Increased timeout in ServiceInfo.request to handle loaded systems + (#895) @bdraco + * It can take a few seconds for a loaded system to run the + async_request coroutine when the event loop is busy, or the + system is CPU bound (example being Home Assistant startup). We + now add an additional _LOADED_SYSTEM_TIMEOUT (10s) to the + run_coroutine_threadsafe calls to ensure the coroutine has + the total amount of time to run up to its internal timeout + (default of 3000ms). + * Ten seconds is a bit large of a timeout; however, it is only + used in cases where we wrap other timeouts. We now expect the + only instance the run_coroutine_threadsafe result timeout will + happen in a production circumstance is when someone is running + a ServiceInfo.request() in a thread and another thread calls + Zeroconf.close() at just the right moment that the future + is never completed unless the system is so loaded that it is + nearly unresponsive. + * The timeout for run_coroutine_threadsafe is the maximum time + a thread can cleanly shut down when zeroconf is closed out in + another thread, which should always be longer than the underlying + thread operation. +- Changes from 0.32.0: + This release offers 100% line and branch coverage. + * Made ServiceInfo first question QU (#852) @bdraco + * We want an immediate response when requesting with ServiceInfo + by asking a QU question; most responders will not delay the + response and respond right away to our question. This also + improves compatibility with split networks as we may not have + been able to see the response otherwise. If the responder has + not multicast the record recently, it may still choose to do + so in addition to responding via unicast + * Reduces traffic when there are multiple zeroconf instances + running on the network running ServiceBrowsers + * If we don't get an answer on the first try, we ask a QM question + in the event, we can't receive a unicast response for some reason + * This change puts ServiceInfo inline with ServiceBrowser which + also asks the first question as QU since ServiceInfo is commonly + called from ServiceBrowser callbacks + * Limited duplicate packet suppression to 1s intervals (#841) + @bdraco + * Only suppress duplicate packets that happen within the same + second. Legitimate queriers will retry the question if they + are suppressed. The limit was reduced to one second to be in + line with rfc6762 + * Made multipacket known answer suppression per interface (#836) + @bdraco + * The suppression was happening per instance of Zeroconf instead + of per interface. Since the same network can be seen on multiple + interfaces (usually and wifi and ethernet), this would confuse + the multi-packet known answer supression since it was not + expecting to get the same data more than once + * New ServiceBrowsers now request QU in the first outgoing when + unspecified (#812) @bdraco + * https://datatracker.ietf.org/doc/html/rfc6762#section-5.4 When + we start a ServiceBrowser and zeroconf has just started up, + the known answer list will be small. By asking a QU question + first, it is likely that we have a large known answer list + by the time we ask the QM question a second later (current + default which is likely too low but would be a breaking change + to increase). This reduces the amount of traffic on the network, + and has the secondary advantage that most responders will answer + a QU question without the typical delay answering QM questions. + * IPv6 link-local addresses are now qualified with scope_id + (#343) @ibygrave + * When a service is advertised on an IPv6 address where the scope + is link local, i.e. fe80::/64 (see RFC 4007) the resolved IPv6 + address must be extended with the scope_id that identifies + through the "%" symbol the local interface to be used when + routing to that address. A new API parsed_scoped_addresses() + is provided to return qualified addresses to avoid breaking + compatibility on the existing parsed_addresses(). + * Network adapters that are disconnected are now skipped (#327) + @ZLJasonG + * Fixed listeners missing initial packets if Engine starts too + quickly (#387) @bdraco + * When manually creating a zeroconf.Engine object, it is no longer + started automatically. It must manually be started by calling + .start() on the created object. + * The Engine thread is now started after all the listeners have + been added to avoid a race condition where packets could be + missed at startup. + * Fixed answering matching PTR queries with the ANY query (#618) + @bdraco + * Fixed lookup of uppercase names in the registry (#597) @bdraco + * If the ServiceInfo was registered with an uppercase name and + the query was for a lowercase name, it would not be found + and vice-versa. + * Fixed unicast responses from any source port (#598) @bdraco + * Unicast responses were only being sent if the source port was + 53, this prevented responses when testing with dig: + dig -p 5353 @224.0.0.251 media-12.local + The above query will now see a response + * Fixed queries for AAAA records not being answered (#616) @bdraco + * Removed second level caching from ServiceBrowsers (#737) @bdraco + * The ServiceBrowser had its own cache of the last time it saw + a service that was reimplementing the DNSCache and presenting + a source of truth problem that lead to unexpected queries when + the two disagreed. + * Fixed server cache not being case-insensitive (#731) @bdraco + * If the server name had uppercase chars and any of the matching + records were lowercase, and the server would not be found + * Fixed cache handling of records with different TTLs (#729) + @bdraco + * There should only be one unique record in the cache at a time as + having multiple unique records will different TTLs in the cache + can result in unexpected behavior since some functions returned + all matching records and some fetched from the right side of + the list to return the newest record. Instead we now store + the records in a dict to ensure that the newest record always + replaces the same unique record, and we never have a source of + truth problem determining the TTL of a record from the cache. + * Fixed ServiceInfo with multiple A records (#725) @bdraco + * If there were multiple A records for the host, ServiceInfo would + always return the last one that was in the incoming packet, + which was usually not the one that was wanted. + * Fixed stale unique records expiring too quickly (#706) @bdraco + * Records now expire 1s in the future instead of instant removal. + tools.ietf.org/html/rfc6762#section-10.2 Queriers receiving a + Multicast DNS response with a TTL of zero SHOULD NOT immediately + delete the record from the cache, but instead record a TTL of + 1 and then delete the record one second later. In the case of + multiple Multicast DNS responders on the network described in + Section 6.6 above, if one of the responders shuts down and + incorrectly sends goodbye packets for its records, it gives + the other cooperating responders one second to send out their + own response to "rescue" the records before they expire and + are deleted. + * Fixed exception when unregistering a service multiple times + (#679) @bdraco + * Added an AsyncZeroconfServiceTypes to mirror ZeroconfServiceTypes + to zeroconf.asyncio (#658) @bdraco + * Fixed interface_index_to_ip6_address not skiping ipv4 adapters + (#651) @bdraco + * Added async_unregister_all_services to AsyncZeroconf (#649) + @bdraco + * Fixed services not being removed from the registry when calling + unregister_all_services (#644) @bdraco + * There was a race condition where a query could be answered for + a service in the registry, while goodbye packets which could + result in a fresh record being broadcast after the goodbye if + a query came in at just the right time. To avoid this, we now + remove the services from the registry right after we generate + the goodbye packet + * Fixed zeroconf exception on load when the system disables IPv6 + (#624) @bdraco + * Fixed the QU bit missing from for probe queries (#609) @bdraco + * The bit should be set per + datatracker.ietf.org/doc/html/rfc6762#section-8.1 + * Fixed the TC bit missing for query packets where the known + answers span multiple packets (#494) @bdraco + * Fixed packets not being properly separated when exceeding + maximum size (#498) @bdraco + * Ensure that questions that exceed the max packet size + are moved to the next packet. This fixes DNSQuestions + being sent in multiple packets in violation of: + datatracker.ietf.org/doc/html/rfc6762#section-7.2 + * Ensure only one resource record is sent when a record exceeds + _MAX_MSG_TYPICAL datatracker.ietf.org/doc/html/rfc6762#section-17 + * Fixed PTR questions asked in uppercase not being answered + (#465) @bdraco + * Added Support for context managers in Zeroconf and AsyncZeroconf + (#284) @shenek + * Implemented an AsyncServiceBrowser to compliment the sync + ServiceBrowser (#429) @bdraco + * Added async_get_service_info to AsyncZeroconf and async_request + to AsyncServiceInfo (#408) @bdraco + * Implemented allowing passing in a sync Zeroconf instance to + AsyncZeroconf (#406) @bdraco + * Fixed IPv6 setup under MacOS when binding to "" (#392) @bdraco + * Fixed ZeroconfServiceTypes.find not always cancels the + ServiceBrowser (#389) @bdraco + * There was a short window where the ServiceBrowser thread could + be left running after Zeroconf is closed because the .join() + was never waited for when a new Zeroconf object was created + * Fixed duplicate packets triggering duplicate updates (#376) + @bdraco + * If TXT or SRV records update was already processed and then + received again, it was possible for a second update to be called + back in the ServiceBrowser + * Fixed ServiceStateChange.Updated event happening for IPs that + already existed (#375) @bdraco + * Fixed RFC6762 Section 10.2 paragraph 2 compliance (#374) @bdraco + * Reduced length of ServiceBrowser thread name with many types + (#373) @bdraco + * Fixed empty answers being added in ServiceInfo.request (#367) + @bdraco + * Fixed ServiceInfo not populating all AAAA records (#366) @bdraco + * Use get_all_by_details to ensure all records are loaded into + addresses. + * Only load A/AAAA records from the cache once in load_from_cache + if there is a SRV record present + * Move duplicate code that checked if the ServiceInfo was complete + into its own function + * Fixed a case where the cache list can change during iteration + (#363) @bdraco + * Return task objects created by AsyncZeroconf (#360) @nocarryr + Traffic Reduction: + * Added support for handling QU questions (#621) @bdraco + * Implements RFC 6762 sec 5.4: Questions Requesting Unicast + Responses datatracker.ietf.org/doc/html/rfc6762#section-5.4 + * Implemented protect the network against excessive packet + flooding (#619) @bdraco + * Additionals are now suppressed when they are already in the + answers section (#617) @bdraco + * Additionals are no longer included when the answer is + suppressed by known-answer suppression (#614) @bdraco + * Implemented multi-packet known answer supression (#687) @bdraco + * Implements datatracker.ietf.org/doc/html/rfc6762#section-7.2 + * Implemented efficient bucketing of queries with known answers + (#698) @bdraco + * Implemented duplicate question suppression (#770) @bdraco + http://datatracker.ietf.org/doc/html/rfc6762#section-7.3 + Technically backwards incompatible: + * Update internal version check to match docs (3.6+) (#491) + @bdraco + * Python version earlier then 3.6 were likely broken with + zeroconf already, however, the version is now explicitly + checked. + * Update python compatibility as PyPy3 7.2 is required (#523) + @bdraco + Backwards incompatible: + * Drop oversize packets before processing them (#826) @bdraco + * Oversized packets can quickly overwhelm the system and deny + service to legitimate queriers. In practice, this is usually + due to broken mDNS implementations rather than malicious + actors. + * Guard against excessive ServiceBrowser queries from PTR + records significantly lowerthan recommended (#824) @bdraco + * We now enforce a minimum TTL for PTR records to avoid + ServiceBrowsers generating excessive queries refresh + queries. Apple uses a 15s minimum TTL, however, we do not + have the same level of rate limit and safeguards, so we use + 1/4 of the recommended value. + * RecordUpdateListener now uses async_update_records instead + of update_record (#419, #726) @bdraco + This allows the listener to receive all the records that + have been updated in a single transaction such as a packet + or cache expiry. + * update_record has been deprecated in favor of + async_update_records A compatibility shim exists to ensure + classes that use RecordUpdateListener as a base class continue + to have update_record called, however, they should be updated + as soon as possible. + * A new method async_update_records_complete is now called on + each listener when all listeners have completed processing + updates and the cache has been updated. This allows + ServiceBrowsers to delay calling handlers until they are sure + the cache has been updated as its a common pattern to call + for ServiceInfo when a ServiceBrowser handler fires. + * The async_ prefix was chosen to make it clear that these + functions run in the eventloop and should never do blocking + I/O. Before 0.32+ these functions ran in a select() loop and + should not have been doing any blocking I/O, but it was not + clear to implementors that I/O would block the loop. + * Pass both the new and old records to async_update_records + (#792) @bdraco + * Pass the old_record (cached) as the value and the new_record + (wire) to async_update_records instead of forcing each consumer + to check the cache since we will always have the old_record + when generating the async_update_records call. This avoids + the overhead of multiple cache lookups for each listener. +- Remove fix version command as upstream has fixed the version number. +- Move skipped tests to spec file, drop disable-tests.patch. +- Relocate tests to tests directory. (gh#jstasiak/python-zeroconf#526) +- Add test_close_multiple_times to skipped test list. + ------------------------------------------------------------------- Fri Jun 4 17:16:48 UTC 2021 - Antonio Larrosa diff --git a/python-zeroconf.spec b/python-zeroconf.spec index f72c856..75ce483 100644 --- a/python-zeroconf.spec +++ b/python-zeroconf.spec @@ -19,14 +19,13 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-zeroconf -Version: 0.31.0 +Version: 0.35.1 Release: 0 Summary: Pure Python Multicast DNS Service Discovery Library (Bonjour/Avahi compatible) License: LGPL-2.0-only Group: Development/Languages/Python URL: https://github.com/jstasiak/python-zeroconf Source: %{name}-%{version}.tar.xz -Patch0: disable-tests.patch BuildRequires: %{python_module ifaddr >= 0.1.7} BuildRequires: %{python_module pytest-asyncio} BuildRequires: %{python_module pytest} @@ -46,7 +45,6 @@ does not force you to use a particular event loop or python-twisted. %prep %autosetup -p1 -sed -i -e "s/__version__ = '0.29.0'/__version__ = '%{version}'/" zeroconf/__init__.py %build %python_build @@ -57,7 +55,7 @@ sed -i -e "s/__version__ = '0.29.0'/__version__ = '%{version}'/" zeroconf/__init %python_expand %fdupes %{buildroot}%{$python_sitelib} %check -%pytest zeroconf/test.py -k 'not (test_integration_with_listener_ipv6 or test_launch)' +%pytest tests -k 'not (test_integration_with_listener_ipv6 or test_launch or test_close_multiple_times)' %files %{python_files} %doc README.rst