summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2013-06-21 06:34:22 +0000
committerelie <elie>2013-06-21 06:34:22 +0000
commit20a21e04fdb09ff2e36822ac539c24ad80628e6c (patch)
treee477171f68edc73f5a59e1391806bc61efae3d5a
parent42a93341a465b3905dee0cbcb342fc1eb4f1b483 (diff)
downloadpysnmp-20a21e04fdb09ff2e36822ac539c24ad80628e6c.tar.gz
disptacher vs transport compatibiilty verification moved into
base transport class
-rw-r--r--pysnmp/carrier/asynsock/base.py3
-rw-r--r--pysnmp/carrier/base.py7
-rw-r--r--pysnmp/carrier/twisted/base.py3
-rw-r--r--pysnmp/entity/config.py3
-rw-r--r--pysnmp/entity/rfc3413/oneliner/cmdgen.py1
-rw-r--r--pysnmp/entity/rfc3413/oneliner/target.py4
6 files changed, 17 insertions, 4 deletions
diff --git a/pysnmp/carrier/asynsock/base.py b/pysnmp/carrier/asynsock/base.py
index 30d9137..83de36c 100644
--- a/pysnmp/carrier/asynsock/base.py
+++ b/pysnmp/carrier/asynsock/base.py
@@ -2,10 +2,11 @@
import socket, sys
import asyncore
from pysnmp.carrier import error
+from pysnmp.carrier.base import AbstractTransport
from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp import debug
-class AbstractSocketTransport(asyncore.dispatcher):
+class AbstractSocketTransport(asyncore.dispatcher, AbstractTransport):
protoTransportDispatcher = AsynsockDispatcher
sockFamily = sockType = None
retryCount = 0; retryInterval = 0
diff --git a/pysnmp/carrier/base.py b/pysnmp/carrier/base.py
index bb2424e..238da25 100644
--- a/pysnmp/carrier/base.py
+++ b/pysnmp/carrier/base.py
@@ -156,3 +156,10 @@ class AbstractTransportDispatcher:
self.unregisterTransport(tDomain)
self.unregisterRecvCbFun()
self.unregisterTimerCbFun()
+
+
+class AbstractTransport:
+ protoTransportDispatcher = None
+ @classmethod
+ def isCompatibleWithDispatcher(cls, transportDispatcher):
+ return isinstance(transportDispatcher, cls.protoTransportDispatcher)
diff --git a/pysnmp/carrier/twisted/base.py b/pysnmp/carrier/twisted/base.py
index fba21da..fa1da90 100644
--- a/pysnmp/carrier/twisted/base.py
+++ b/pysnmp/carrier/twisted/base.py
@@ -9,8 +9,9 @@
# Description: twisted DatagramProtocol UDP transport
#
from pysnmp.carrier.twisted.dispatch import TwistedDispatcher
+from pysnmp.carrier.base import AbstractTransport
-class AbstractTwistedTransport:
+class AbstractTwistedTransport(AbstractTransport):
protoTransportDispatcher = TwistedDispatcher
"""Base Twisted Transport, to be used with TwistedDispatcher"""
def __init__(self):
diff --git a/pysnmp/entity/config.py b/pysnmp/entity/config.py
index b433583..55e0e67 100644
--- a/pysnmp/entity/config.py
+++ b/pysnmp/entity/config.py
@@ -309,8 +309,7 @@ def delTargetAddr(snmpEngine, addrName):
def addTransport(snmpEngine, transportDomain, transport):
if snmpEngine.transportDispatcher:
- if not isinstance(snmpEngine.transportDispatcher,
- transport.protoTransportDispatcher):
+ if not transport.isCompatibleWithDispatcher(snmpEngine.transportDispatcher):
raise error.PySnmpError('Transport %r is not compatible with dispatcher %r' % (transport, snmpEngine.transportDispatcher))
else:
snmpEngine.registerTransportDispatcher(
diff --git a/pysnmp/entity/rfc3413/oneliner/cmdgen.py b/pysnmp/entity/rfc3413/oneliner/cmdgen.py
index c3565ed..829312a 100644
--- a/pysnmp/entity/rfc3413/oneliner/cmdgen.py
+++ b/pysnmp/entity/rfc3413/oneliner/cmdgen.py
@@ -85,6 +85,7 @@ class AsynCommandGenerator:
self.__knownParams[paramsKey] = paramsName, 1
if transportTarget.transportDomain in self.__knownTransports:
+ transportTarget.verifyDispatcherCompatibility(self.snmpEngine)
transport, useCount = self.__knownTransports[transportTarget.transportDomain]
self.__knownTransports[transportTarget.transportDomain] = transport, useCount + 1
else:
diff --git a/pysnmp/entity/rfc3413/oneliner/target.py b/pysnmp/entity/rfc3413/oneliner/target.py
index 04d268a..3273dfc 100644
--- a/pysnmp/entity/rfc3413/oneliner/target.py
+++ b/pysnmp/entity/rfc3413/oneliner/target.py
@@ -25,6 +25,10 @@ class _AbstractTransportTarget:
self.transport = self.protoTransport().openClientMode()
return self.transport
+ def verifyDispatcherCompatibility(self, snmpEngine):
+ if not self.protoTransport.isCompatibleWithDispatcher(snmpEngine.transportDispatcher):
+ raise error.PySnmpError('Transport %r is not compatible with dispatcher %r' % (self.protoTransport, snmpEngine.transportDispatcher))
+
def _resolveAddr(self, transportAddr): raise NotImplementedError()
class UdpTransportTarget(_AbstractTransportTarget):