Skip to content

Commit

Permalink
Merge branch 'lextudio:main' into fixed_cache_leak
Browse files Browse the repository at this point in the history
  • Loading branch information
y-iwata-bl authored Dec 4, 2024
2 parents 3357df9 + e7b7f80 commit 85fcb17
Show file tree
Hide file tree
Showing 11 changed files with 126 additions and 20 deletions.
16 changes: 16 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}
]
}
5 changes: 5 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
Revision 7.1.14, released on Dec 03, 2024
-----------------------------------------

- Fixed shadow cloning issue.

Revision 7.1.13, released on Nov 07, 2024
-----------------------------------------

Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ We provide security updates for each version until its End-of-Life (EOL) date. B

| Version | Latest Release | End of Life | Notes |
| ------- | -------------- | ----------- | ---------------------------------- |
| 7.1 | 7.1.13 | TBD | EOL to be determined |
| 7.1 | 7.1.14 | TBD | EOL to be determined |
| 7.0 | 7.0.4 | 2025-03-11 | Supported for 6 months after 7.1.0 |
| 6.2 | 6.2.6 | 2025-08-22 | Supported for 1 year after 7.0.0 |
| 6.1 | 6.1.4 | 2025-01-12 | Supported for 6 months after 6.2.0 |
Expand Down
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
# built documents.
#
# The full version, including alpha/beta/rc tags.
release = "7.1.13"
release = "7.1.14"
# The short X.Y version.
version = ".".join(release.split(".")[:2])

Expand Down
2 changes: 1 addition & 1 deletion docs/source/development.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.. include:: /includes/_links.rst

Further development
Further Development
-------------------

Although PySNMP is already a mature software and it is being used at many
Expand Down
23 changes: 10 additions & 13 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,20 @@ and behavior of popular Net-SNMP snmpget/snmpset/snmpwalk utilities.
They may be useful in a cross-platform situations as well as a testing
and prototyping instrument for pysnmp users.

Quick Start
-----------
Quick Start and Samples
-----------------------

You already know something about SNMP and have no courage to dive into
this implementation? Try out quick start page!

We also have a collection of sample scripts to help you learn more about
every aspects of PySNMP.

.. toctree::
:maxdepth: 1

/quick-start
/examples/index

Documentation
-------------
Expand Down Expand Up @@ -71,26 +75,19 @@ Conceptual and API documentation are in the following section.

Documentation about the SNMP protocol can be found on `PySNMP Homepage`_.

Samples
-------

We have a collection of sample scripts to help you get started with PySNMP.

.. toctree::
:maxdepth: 2

/examples/index

Troubleshooting
---------------

If you are having trouble with PySNMP, please check the following section.
If you are having trouble with PySNMP, please check the following section
to learn troubleshooting tips, upgrade guides, and performance tuning
advice.

.. toctree::
:maxdepth: 1

/troubleshooting
/upgrade
/performance

Downloads
---------
Expand Down
50 changes: 50 additions & 0 deletions docs/source/performance.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
.. include:: /includes/_links.rst

Performance Tuning
==================

PySNMP is a highly optimized software. However, there are some knobs you
can turn to make it work even faster. Here are some tips:

Disabling MIB Support
---------------------

Loading MIB metadata into memory is a costly operation. If you are not
using MIBs in your application, you can disable MIB support by

TODO: Add a code snippet here.

Run Python Release Mode
-----------------------

Python interpreter can run in debug and release modes. Running in release
mode can make your Python code run faster. To run Python in release mode,
you can use the following command:

.. code-block:: bash
$ python -O myscript.py
Choosing the Right High-Level API
---------------------------------

PySNMP comes with two high-level APIs: v1 and v3.

If you are using SNMPv1 and SNMPv2c, and you are not using any security
features in your application, you should use the v1 API. The
``SnmpDispatcher`` based API is the fastest API in PySNMP, as it simply
sends SNMP packets and does not do any heavy processing on the packets.

If you are using SNMPv3, you have to use the v3 API with USM and VACM to
handle security and access control. The v3 API is significantly slower than
the v1 API because it builds up a local secure engine and has to do more
processing on the packets in order to be compliant with SNMPv3 standards.

Using the right API, and using the right features in the API can make your
application run reasonably fast.

Don't trust blindly other Python SNMP libraries claiming to be faster. They
either lack of essential features that make the comparison pointless or
they bind to native libraries that become your nightmare to maintain and
deploy. In the end the performance is limited by the Python interpreter and
the SNMP protocol itself.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "pysnmp"
version = "7.1.13"
version = "7.1.14"
description = "A Python library for SNMP"
authors = ["Ilya Etingof <etingof@gmail.com>", "LeXtudio Inc. <support@lextudio.com>"]
license = "BSD-2-Clause"
Expand Down
2 changes: 1 addition & 1 deletion pysnmp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
- For backward compatibility, if the version string contains "beta", the string part is removed before converting to a tuple.
"""
# http://www.python.org/dev/peps/pep-0396/
__version__ = "7.1.13"
__version__ = "7.1.14"
# another variable is required to prevent semantic release from updating version in more than one place
main_version = __version__
# backward compatibility
Expand Down
8 changes: 6 additions & 2 deletions pysnmp/smi/rfc1902.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from typing import TYPE_CHECKING

from pyasn1.error import PyAsn1Error
from pyasn1.type.base import AbstractSimpleAsn1Item, SimpleAsn1Type
from pyasn1.type.base import AbstractSimpleAsn1Item, SimpleAsn1Type, NoValue
from pysnmp import debug
from pysnmp.proto import rfc1902, rfc1905
from pysnmp.proto.api import v2c
Expand Down Expand Up @@ -1065,7 +1065,11 @@ class instance representing MIB browsing functionality.
keep_old_value = isinstance(self.__args[1], SimpleAsn1Type)
if keep_old_value:
old_value = self.__args[1]._value
self.__args[1] = object_identity.get_mib_node().getSyntax().clone()
self.__args[1] = (
object_identity.get_mib_node()
.getSyntax()
.clone(NoValue(), tagSet=self.__args[1].getTagSet())
)
self.__args[1]._value = old_value # force to keep the original value
else:
self.__args[1] = (
Expand Down
34 changes: 34 additions & 0 deletions tests/hlapi/v1arch/asyncio/manager/cmdgen/test_v1arch_v1_get.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,3 +269,37 @@ async def test_v1_get_scaled_unsigned_object():
assert (
varBinds[0][1].prettyPrint() == "0.5" # GitHub issue #139
) # IMPORTANT: test display hint "d-1".


@pytest.mark.asyncio
async def test_v1_get_multiple_objects():
async with AgentContextManager(enable_custom_objects=True):
snmpDispatcher = SnmpDispatcher()
# # Step 1: Set up MIB builder and add custom MIB directory
# mibBuilder = builder.MibBuilder()
# compiler.addMibCompiler(mibBuilder)
# mibViewController = view.MibViewController(mibBuilder)

# # Load the custom MIB
# mibBuilder.loadModules("LEXTUDIO-TEST-MIB")
# snmpDispatcher.cache["mibViewController"] = mibViewController

netiftable = [
ObjectIdentity("IF-MIB", "ifDescr", 1),
ObjectIdentity("IF-MIB", "ifDescr", 2),
]

errorIndication, errorStatus, errorIndex, varBinds = await get_cmd(
snmpDispatcher,
CommunityData("public", mpModel=0),
await UdpTransportTarget.create(
("demo.pysnmp.com", 161), timeout=1, retries=0
),
*[ObjectType(x) for x in netiftable]
)
assert errorIndication is None
assert errorIndication is None
assert errorStatus == 0
assert errorIndex == 0
assert len(varBinds) == 2
assert varBinds[0][1].prettyPrint() != varBinds[1][1].prettyPrint()

0 comments on commit 85fcb17

Please sign in to comment.