o
    B]                     @   s   d dl Z d dlT d dlT d dlT d dlT d dlT d dlT d dlmZ d dl	m
Z
 d dlmZ d dlmZ dgZe Ze Zdd ZdS )	    N)*)ntforg)reactor)Deferred)FailuresendNotificationc                 K   sv   dd }t | ||||j}dd }	t }
t | ||j|jt	| |||
dd|
f |dkr9td|	|
 |
S )	a  Sends SNMP notification.

    Based on passed parameters, prepares SNMP TRAP or INFORM message
    (:RFC:`1905#section-4.2.6`) and schedules its transmission by
    :mod:`twisted` I/O framework at a later point of time.

    Parameters
    ----------
    snmpEngine : :py:class:`~pysnmp.hlapi.SnmpEngine`
        Class instance representing SNMP engine.

    authData : :py:class:`~pysnmp.hlapi.CommunityData` or :py:class:`~pysnmp.hlapi.UsmUserData`
        Class instance representing SNMP credentials.

    transportTarget : :py:class:`~pysnmp.hlapi.twisted.UdpTransportTarget` or :py:class:`~pysnmp.hlapi.twisted.Udp6TransportTarget`
        Class instance representing transport type along with SNMP peer address.

    contextData : :py:class:`~pysnmp.hlapi.ContextData`
        Class instance representing SNMP ContextEngineId and ContextName values.

    notifyType : str
        Indicates type of notification to be sent. Recognized literal
        values are *trap* or *inform*.

    varBinds: tuple
        Single :py:class:`~pysnmp.smi.rfc1902.NotificationType` class instance
        representing a minimum sequence of MIB variables required for
        particular notification type.
        Alternatively, a sequence of :py:class:`~pysnmp.smi.rfc1902.ObjectType`
        objects could be passed instead. In the latter case it is up to
        the user to ensure proper Notification PDU contents.

    Other Parameters
    ----------------
    \*\*options :
        Request options:

            * `lookupMib` - load MIB and resolve response MIB variables at
              the cost of slightly reduced performance. Default is `True`.

    Returns
    -------
    deferred : :class:`~twisted.internet.defer.Deferred`
        Twisted Deferred object representing work-in-progress. User
        is expected to attach his own `success` and `error` callback
        functions to the Deferred object though
        :meth:`~twisted.internet.defer.Deferred.addCallbacks` method.

    Raises
    ------
    PySnmpError
        Or its derivative indicating that an error occurred while
        performing SNMP operation.

    Notes
    -----
    User `success` callback is called with the following tuple as
    its first argument:

    * errorStatus (str) : True value indicates SNMP PDU error.
    * errorIndex (int) : Non-zero value refers to `varBinds[errorIndex-1]`
    * varBinds (tuple) : A sequence of
      :class:`~pysnmp.smi.rfc1902.ObjectType` class instances representing
      MIB variables returned in SNMP response.

    User `error` callback is called with `errorIndication` object wrapped
    in :class:`~twisted.python.failure.Failure` object.

    Examples
    --------
    >>> from twisted.internet.task import react
    >>> from pysnmp.hlapi.twisted import *
    >>>
    >>> def success(args):
    ...     (errorStatus, errorIndex, varBinds) = args
    ...     print(errorStatus, errorIndex, varBind)
    ...
    >>> def failure(errorIndication):
    ...     print(errorIndication)
    ...
    >>> def run(reactor):
    ...     d = sendNotification(SnmpEngine(),
    ...                          CommunityData('public'),
    ...                          UdpTransportTarget(('demo.snmplabs.com', 162)),
    ...                          ContextData(),
    ...                          'trap',
    ...                          NotificationType(ObjectIdentity('IF-MIB', 'linkDown')))
    ...     d.addCallback(success).addErrback(failure)
    ...     return d
    ...
    >>> react(run)
    (0, 0, [])
    >>>

    c                 S   st   |\}}|r| t| d S z	t| ||}	W n ty/   t d }
| t|
 Y d S w ||||	f d S )N   )Zerrbackr   vbProcessorZunmakeVarBinds	Exceptionsysexc_infocallback)
snmpEngineZsendRequestHandleZerrorIndicationZerrorStatusZ
errorIndexvarBindsZcbCtx	lookupMibdeferredZvarBindsUnmadeex r   =/usr/lib/python3/dist-packages/pysnmp/hlapi/twisted/ntforg.py__cbFunz   s   z!sendNotification.<locals>.__cbFunc                 S   s   |  ddg f d S )Nr   )r   )r   r   r   r   	__trapFun   s   z#sendNotification.<locals>.__trapFunr   TZtrapr   )lcdZ	configureZcontextNamer   r   ZNotificationOriginatorZsendVarBindsZcontextEngineIdr	   ZmakeVarBindsgetr   Z	callLater)r   ZauthDataZtransportTargetZcontextDataZ
notifyTyper   optionsr   Z
notifyNamer   r   r   r   r   r      s$   a


)r   Zpysnmp.smi.rfc1902Zpysnmp.hlapi.authZpysnmp.hlapi.contextZpysnmp.hlapi.lcdZpysnmp.hlapi.varbindsZpysnmp.hlapi.twisted.transportZpysnmp.entity.rfc3413r   Ztwisted.internetr   Ztwisted.internet.deferr   Ztwisted.python.failurer   __all__ZNotificationOriginatorVarBindsr	   Z%NotificationOriginatorLcdConfiguratorr   r   r   r   r   r   <module>   s   