Hello community, here is the log from the commit of package python-pysnmp for openSUSE:Factory checked in at 2018-11-29 23:00:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pysnmp (Old) and /work/SRC/openSUSE:Factory/.python-pysnmp.new.19453 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pysnmp" Thu Nov 29 23:00:40 2018 rev:9 rq:652439 version:4.4.6 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pysnmp/python-pysnmp.changes 2018-11-02 10:52:07.274271797 +0100 +++ /work/SRC/openSUSE:Factory/.python-pysnmp.new.19453/python-pysnmp.changes 2018-11-29 23:00:44.659480980 +0100 @@ -1,0 +2,19 @@ +Thu Nov 27 17:56:55 UTC 2018 - [email protected] + +- Update to version 4.4.6 + * Improved package build and dependency tracking + * Fixed missing LICENSE from the tarball distribution + * Fixed CommandGeneratorLcdConfigurator.unconfigure() to fully + clean up internal caches, otherwise repetitive attempts to + configure the target would fail. + * Fix to tolerate possible duplicate enumerations in Bits and + IntegerSMI types. + * Fix to tolerate non-initialised entries in SNMP community table. + Once a bad entry sneaked into the SNMP community table, all + the subsequent SNMP v1/v2c operations failed. The fix ignores + incomplete SNMP community table entries in the course of + building indices. + +This is a bug fix release addressing a handful of accumulated bugs. + +------------------------------------------------------------------- Old: ---- pysnmp-4.4.5.tar.gz New: ---- pysnmp-4.4.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pysnmp.spec ++++++ --- /var/tmp/diff_new_pack.9mYZmT/_old 2018-11-29 23:00:46.227479048 +0100 +++ /var/tmp/diff_new_pack.9mYZmT/_new 2018-11-29 23:00:46.263479003 +0100 @@ -12,13 +12,13 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# Please submit bugfixes or comments via http://bugs.opensuse.org/ # %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-pysnmp -Version: 4.4.5 +Version: 4.4.6 Release: 0 Summary: A pure-Python SNMPv1/v2c/v3 library License: BSD-2-Clause ++++++ pysnmp-4.4.5.tar.gz -> pysnmp-4.4.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/CHANGES.txt new/pysnmp-4.4.6/CHANGES.txt --- old/pysnmp-4.4.5/CHANGES.txt 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/CHANGES.txt 2018-09-13 23:47:22.000000000 +0200 @@ -1,4 +1,19 @@ +Revision 4.4.6, released 2018-09-13 +----------------------------------- + +- Improved package build and dependency tracking +- Fixed missing LICENSE from the tarball distribution +- Fixed `CommandGeneratorLcdConfigurator.unconfigure()` to fully clean up + internal caches, otherwise repetitive attempts to configure the target + would fail. +- Fix to tolerate possible duplicate enumerations in `Bits` and `Integer` + SMI types. +- Fix to tolerate non-initialised entries in SNMP community table. Once a + bad entry sneaked into the SNMP community table, all the subsequent + SNMP v1/v2c operations failed. The fix ignores incomplete SNMP community + table entries in the course of building indices. + Revision 4.4.5, released 2018-08-05 ----------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/MANIFEST.in new/pysnmp-4.4.6/MANIFEST.in --- old/pysnmp-4.4.5/MANIFEST.in 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/MANIFEST.in 2018-09-13 23:47:22.000000000 +0200 @@ -1,4 +1,4 @@ -include *.txt *.md *.sh +include *.rst *.txt *.md *.sh recursive-include examples *.py recursive-include docs/source *.rst *.svg *.py recursive-include docs/mibs *.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/pysnmp/__init__.py new/pysnmp-4.4.6/pysnmp/__init__.py --- old/pysnmp-4.4.5/pysnmp/__init__.py 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/pysnmp/__init__.py 2018-09-13 23:47:22.000000000 +0200 @@ -1,5 +1,5 @@ # http://www.python.org/dev/peps/pep-0396/ -__version__ = '4.4.5' +__version__ = '4.4.6' # backward compatibility version = tuple([int(x) for x in __version__.split('.')]) majorVersionId = version[0] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/pysnmp/hlapi/lcd.py new/pysnmp-4.4.6/pysnmp/hlapi/lcd.py --- old/pysnmp-4.4.5/pysnmp/hlapi/lcd.py 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/pysnmp/hlapi/lcd.py 2018-09-13 23:47:22.000000000 +0200 @@ -175,7 +175,7 @@ cache['addr'][addrKey] = addrName, useCount else: config.delTargetAddr(snmpEngine, addrName) - + del cache['addr'][addrKey] addrNames.add(addrKey) if addrKey[1] in cache['tran']: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/pysnmp/proto/rfc1902.py new/pysnmp-4.4.6/pysnmp/proto/rfc1902.py --- old/pysnmp-4.4.5/pysnmp/proto/rfc1902.py 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/pysnmp/proto/rfc1902.py 2018-09-13 23:47:22.000000000 +0200 @@ -128,12 +128,17 @@ @classmethod def withNamedValues(cls, **values): - """Creates a subclass with discreet named values constraint. + """Create a subclass with discreet named values constraint. + + Reduce fully duplicate enumerations along the way. """ + enums = set(cls.namedValues.items()) + enums.update(values.items()) class X(cls): - namedValues = cls.namedValues + namedval.NamedValues(*values.items()) - subtypeSpec = cls.subtypeSpec + constraint.SingleValueConstraint(*values.values()) + namedValues = namedval.NamedValues(*enums) + subtypeSpec = cls.subtypeSpec + constraint.SingleValueConstraint( + *values.values()) X.__name__ = cls.__name__ return X @@ -600,7 +605,7 @@ def __new__(cls, *args, **kwargs): if 'namedValues' in kwargs: - Bits = cls.withNamedBits(**kwargs.pop('namedValues')) + Bits = cls.withNamedBits(**dict(kwargs.pop('namedValues'))) return Bits(*args, **kwargs) return OctetString.__new__(cls) @@ -637,10 +642,14 @@ @classmethod def withNamedBits(cls, **values): """Creates a subclass with discreet named bits constraint. + + Reduce fully duplicate enumerations along the way. """ + enums = set(cls.namedValues.items()) + enums.update(values.items()) class X(cls): - namedValues = cls.namedValues + namedval.NamedValues(*values.items()) + namedValues = namedval.NamedValues(*enums) X.__name__ = cls.__name__ return X diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/pysnmp/proto/secmod/rfc2576.py new/pysnmp-4.4.6/pysnmp/proto/secmod/rfc2576.py --- old/pysnmp-4.4.5/pysnmp/proto/secmod/rfc2576.py 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/pysnmp/proto/secmod/rfc2576.py 2018-09-13 23:47:22.000000000 +0200 @@ -38,7 +38,7 @@ nextMibNode = snmpTargetParamsSecurityName - while 1: + while True: try: nextMibNode = snmpTargetParamsSecurityName.getNextNode(nextMibNode.name) @@ -49,10 +49,18 @@ mibNode = snmpTargetParamsSecurityModel.getNode(snmpTargetParamsSecurityModel.name + instId) - if mibNode.syntax not in self.__nameToModelMap: - self.__nameToModelMap[nextMibNode.syntax] = set() + try: + if mibNode.syntax not in self.__nameToModelMap: + self.__nameToModelMap[nextMibNode.syntax] = set() + + self.__nameToModelMap[nextMibNode.syntax].add(mibNode.syntax) - self.__nameToModelMap[nextMibNode.syntax].add(mibNode.syntax) + except PyAsn1Error: + debug.logger & debug.flagSM and debug.logger( + '_sec2com: table entries %r/%r hashing failed' % ( + nextMibNode.syntax, mibNode.syntax) + ) + continue self.__paramsBranchId = snmpTargetParamsSecurityName.branchVersionId @@ -72,7 +80,8 @@ self.__securityMap = {} nextMibNode = snmpCommunityName - while 1: + + while True: try: nextMibNode = snmpCommunityName.getNextNode(nextMibNode.name) @@ -88,9 +97,17 @@ _contextName = snmpCommunityContextName.getNode(snmpCommunityContextName.name + instId).syntax - self.__securityMap[(_securityName, - _contextEngineId, - _contextName)] = nextMibNode.syntax + try: + self.__securityMap[(_securityName, + _contextEngineId, + _contextName)] = nextMibNode.syntax + + except PyAsn1Error: + debug.logger & debug.flagSM and debug.logger( + '_sec2com: table entries %r/%r/%r hashing failed' % ( + _securityName, _contextEngineId, _contextName) + ) + continue self.__securityBranchId = snmpCommunityName.branchVersionId @@ -123,11 +140,14 @@ self.__transportToTagMap = {} nextMibNode = snmpTargetAddrTagList + while True: try: nextMibNode = snmpTargetAddrTagList.getNextNode(nextMibNode.name) + except NoSuchInstanceError: break + instId = nextMibNode.name[len(snmpTargetAddrTagList.name):] targetAddrTDomain = snmpTargetAddrTDomain.getNode(snmpTargetAddrTDomain.name + instId).syntax targetAddrTAddress = snmpTargetAddrTAddress.getNode(snmpTargetAddrTAddress.name + instId).syntax @@ -144,17 +164,29 @@ targetAddrTAddress = tuple(TransportAddressIPv6(targetAddrTAddress)) elif targetAddrTDomain[:len(unix.snmpLocalDomain)] == unix.snmpLocalDomain: targetAddrTAddress = str(targetAddrTAddress) + targetAddr = targetAddrTDomain, targetAddrTAddress targetAddrTagList = snmpTargetAddrTagList.getNode(snmpTargetAddrTagList.name + instId).syntax + if targetAddr not in self.__transportToTagMap: self.__transportToTagMap[targetAddr] = set() - if targetAddrTagList: - self.__transportToTagMap[targetAddr].update( - [SnmpTagValue(x) - for x in targetAddrTagList.asOctets().split()] + + try: + if targetAddrTagList: + self.__transportToTagMap[targetAddr].update( + [SnmpTagValue(x) + for x in targetAddrTagList.asOctets().split()] + ) + + else: + self.__transportToTagMap[targetAddr].add(self.__emptyTag) + + except PyAsn1Error: + debug.logger & debug.flagSM and debug.logger( + '_com2sec: table entries %r/%r hashing failed' % ( + targetAddr, targetAddrTagList) ) - else: - self.__transportToTagMap[targetAddr].add(self.__emptyTag) + continue self.__transportBranchId = snmpTargetAddrTAddress.branchVersionId @@ -163,6 +195,7 @@ snmpTargetParamsSecurityName, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols( 'SNMP-TARGET-MIB', 'snmpTargetParamsSecurityName') + if self.__paramsBranchId != snmpTargetParamsSecurityName.branchVersionId: snmpTargetParamsSecurityModel, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols( 'SNMP-TARGET-MIB', 'snmpTargetParamsSecurityModel') @@ -182,10 +215,18 @@ mibNode = snmpTargetParamsSecurityModel.getNode(snmpTargetParamsSecurityModel.name + instId) - if nextMibNode.syntax not in self.__nameToModelMap: - self.__nameToModelMap[nextMibNode.syntax] = set() + try: + if nextMibNode.syntax not in self.__nameToModelMap: + self.__nameToModelMap[nextMibNode.syntax] = set() + + self.__nameToModelMap[nextMibNode.syntax].add(mibNode.syntax) - self.__nameToModelMap[nextMibNode.syntax].add(mibNode.syntax) + except PyAsn1Error: + debug.logger & debug.flagSM and debug.logger( + '_com2sec: table entries %r/%r hashing failed' % ( + nextMibNode.syntax, mibNode.syntax) + ) + continue self.__paramsBranchId = snmpTargetParamsSecurityName.branchVersionId @@ -211,6 +252,7 @@ self.__tagAndCommunityToSecurityMap = {} nextMibNode = snmpCommunityName + while True: try: nextMibNode = snmpCommunityName.getNextNode(nextMibNode.name) @@ -231,17 +273,25 @@ _tagAndCommunity = transportTag, nextMibNode.syntax - if _tagAndCommunity not in self.__tagAndCommunityToSecurityMap: - self.__tagAndCommunityToSecurityMap[_tagAndCommunity] = set() + try: + if _tagAndCommunity not in self.__tagAndCommunityToSecurityMap: + self.__tagAndCommunityToSecurityMap[_tagAndCommunity] = set() + + self.__tagAndCommunityToSecurityMap[_tagAndCommunity].add( + (securityName, contextEngineId, contextName) + ) - self.__tagAndCommunityToSecurityMap[_tagAndCommunity].add( - (securityName, contextEngineId, contextName) - ) + if nextMibNode.syntax not in self.__communityToTagMap: + self.__communityToTagMap[nextMibNode.syntax] = set() - if nextMibNode.syntax not in self.__communityToTagMap: - self.__communityToTagMap[nextMibNode.syntax] = set() + self.__communityToTagMap[nextMibNode.syntax].add(transportTag) - self.__communityToTagMap[nextMibNode.syntax].add(transportTag) + except PyAsn1Error: + debug.logger & debug.flagSM and debug.logger( + '_com2sec: table entries %r/%r hashing failed' % ( + _tagAndCommunity, nextMibNode.syntax) + ) + continue self.__communityBranchId = snmpCommunityName.branchVersionId diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pysnmp-4.4.5/setup.py new/pysnmp-4.4.6/setup.py --- old/pysnmp-4.4.5/setup.py 2018-08-05 22:47:36.000000000 +0200 +++ new/pysnmp-4.4.6/setup.py 2018-09-13 23:47:22.000000000 +0200 @@ -1,12 +1,13 @@ #!/usr/bin/env python """SNMP library for Python - SNMP v1/v2c/v3 engine and apps written in pure-Python. - Supports Manager/Agent/Proxy roles, scriptable MIBs, - asynchronous operation and multiple transports. +SNMP v1/v2c/v3 engine and Standard Applications suite written in pure-Python. +Supports Manager/Agent/Proxy roles, Manager/Agent-side MIBs, asynchronous +operation and multiple network transports. """ import sys import os +import re classifiers = """\ Development Status :: 5 - Production/Stable @@ -55,33 +56,52 @@ print("ERROR: this package requires Python 2.4 or later!") sys.exit(1) +requires = [ln.strip() for ln in open('requirements.txt').readlines()] + try: - from setuptools import setup + import setuptools + + setup, Command = setuptools.setup, setuptools.Command + + observed_version = [int(x) for x in setuptools.__version__.split('.')] + required_version = [36, 2, 0] + + # NOTE(etingof): require fresh setuptools to build proper wheels + # See also: https://hynek.me/articles/conditional-python-dependencies/ + if ('bdist_wheel' in sys.argv and + observed_version < required_version): + print("ERROR: your wheels won't come out round with setuptools %s! " + "Upgrade to %s and try again." % ( + '.'.join([str(x) for x in observed_version]), + '.'.join([str(x) for x in required_version]))) + sys.exit(1) params = { - 'install_requires': ['pyasn1>=0.2.3', 'pysmi', 'pycryptodomex'], + 'install_requires': requires, 'zip_safe': True } except ImportError: - for arg in sys.argv: - if 'egg' in arg: - howto_install_setuptools() - sys.exit(1) + if 'bdist_wheel' in sys.argv or 'bdist_egg' in sys.argv: + howto_install_setuptools() + sys.exit(1) from distutils.core import setup params = {} + if sys.version_info[:2] > (2, 4): - params['requires'] = ['pyasn1(>=0.2.3)', 'pysmi', 'pycryptodomex'] + params['requires'] = [ + re.sub(r'(.*?)([<>=!~]+)(.*)', r'\g<1>\g<2>(\g<3>)', r) for r in requires + ] -doclines = [x.strip() for x in (__doc__ or '').split('\n') if x] +doclines = [x.strip() for x in (__doc__ or '').split('\n')] params.update({ 'name': 'pysnmp', 'version': open(os.path.join('pysnmp', '__init__.py')).read().split('\'')[1], 'description': doclines[0], - 'long_description': ' '.join(doclines[1:]), + 'long_description': '\n'.join(doclines[1:]), 'maintainer': 'Ilya Etingof <[email protected]>', 'author': 'Ilya Etingof', 'author_email': '[email protected]',
