o
    B] U                     @   s   d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ G d	d
 d
eZdS )    N)null)PyAsn1Error)builderinstrum)errinderrorcache)verdec)PySnmpError)nextiddebugc                   @   st   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Z		dddZ	dd Z
dd Zdd Z	dddZdd ZdS )MsgAndPduDispatcherzSNMP engine PDU & message dispatcher. Exchanges SNMP PDU's with
       applications and serialized messages with transport level.
    Nc                 C   s\   |d u rt t | _n|| _| jjddddd t | _	i | _
td| _i | _d S )Nz
SNMPv2-MIBzSNMP-MPD-MIBzSNMP-COMMUNITY-MIBzSNMP-TARGET-MIBzSNMP-USER-BASED-SM-MIBi )r   ZMibInstrumControllerr   Z
MibBuildermibInstrumController
mibBuilderZloadModulesr   ZCache_MsgAndPduDispatcher__cache&_MsgAndPduDispatcher__appsRegistrationr   ZInteger#_MsgAndPduDispatcher__sendPduHandle#_MsgAndPduDispatcher__transportInfo)selfr    r   6/usr/lib/python3/dist-packages/pysnmp/proto/rfc3412.py__init__   s   

zMsgAndPduDispatcher.__init__c                 C   s"   || j v r
| j | S td| )NzNo data for stateReference %s)r   r   ProtocolError)r   stateReferencer   r   r   getTransportInfo0   s
   

z$MsgAndPduDispatcher.getTransportInfoc                 C   s`   |D ]}||f}|| j v rtd||f || j |< qtjtj@ o-td||f  dS  dS )z$Register application with dispatcherzDuplicate registration %r/%sz7registerContextEngineId: contextEngineId %r pduTypes %sN)r   r   r   r   loggerflagDsp)r   contextEngineIdpduTypes
processPdupduTypekr   r   r   registerContextEngineId;   s   


z+MsgAndPduDispatcher.registerContextEngineIdc                 C   sf   |du r| j jdd\}|D ]}||f}|| jv r| j|= qtjtj@ o0td||f  dS  dS )z&Unregister application with dispatcherN__SNMP-FRAMEWORK-MIBZsnmpEngineIDz9unregisterContextEngineId: contextEngineId %r pduTypes %s)r   r   importSymbolsr   r   r   r   )r   r   r   r    r!   r   r   r   unregisterContextEngineIdN   s   


z-MsgAndPduDispatcher.unregisterContextEngineIdc                 C   s<   ||f}|| j v r| j | S t|f}|| j v r| j | S d S N)r   r   )r   r   r    r!   r   r   r   getRegisteredApp^   s   



z$MsgAndPduDispatcher.getRegisteredAppr   c                 C   s  t |}||jv r|j| }ntjtjdtjtj@ o&td||	 f  | 
 }|rS| jj|||||j  ||d tjtj@ oRtd|j |j f  tjtj@ obtd|||f  |}|}z!||||||||||	|
|||\}}}tjtj@ otd W n ty   |r| j| | |||  w |jdu r|r| j| td|j|d	t|||||||||	|d

 z
|j||| W n ty   |r| j|  w |j|d	 |r| jj||||||||	|
|d
 |S )zAPDU dispatcher -- prepare and serialize a request or notificationerrorIndicationz sendPdu: securityName %s, PDU
%s)messageProcessingModelsendPduHandletimeoutcbFuncbCtxz6sendPdu: current time %d ticks, one tick is %s secondsz9sendPdu: new sendPduHandle %s, timeout %s ticks, cbFun %szsendPdu: MP succeededNzTransport dispatcher not setzrfc3412.sendPdu
transportDomaintransportAddressoutgoingMessager*   securityModelsecurityNamesecurityLevelr   contextNamepdu)	r0   r1   r3   r4   r5   r   r6   
pduVersionPDU)intmessageProcessingSubsystemsr   StatusInformationr   unsupportedMsgProcessingModelr   r   r   prettyPrintr   r   addtransportDispatchergetTimerTicksZgetTimerResolutionZprepareOutgoingMessager
   popreleaseStateInformationobserverstoreExecutionContextdictsendMessageclearExecutionContextupdate)r   
snmpEnginer0   r1   r*   r3   r4   r5   r   r6   r8   r9   ZexpectResponser,   r-   r.   r!   	mpHandlerr+   ZorigTransportDomainZorigTransportAddressr2   r   r   r   sendPduj   s   
	

zMsgAndPduDispatcher.sendPduc                 C   sF  t |}||jv r|j| }ntjtjdtjtj@ o)td|	r%|		 p&df  z |
|||||||||	|
||\}}}tjtj@ oHtd W n	 tjyS    w | jjdd\}|jr~t||jkr~| jjdd\}| jd	7  _tjtjd|j|d
t||||||||||	d
 |j||| |j|d
 d S )Nr(   zreturnResponsePdu: PDU %sz<empty>zreturnResponsePdu: MP suceededr#   snmpEngineMaxMessageSize__SNMPv2-MIBsnmpSilentDrops   zrfc3412.returnResponsePdur/   )r:   r;   r   r<   r   r=   r   r   r   r>   prepareResponseMessager   r   r$   syntaxlenZtooBigrD   rE   rF   r@   rG   rH   )r   rJ   r*   r3   r4   r5   r   r6   r8   r9   maxSizeResponseScopedPDUr   statusInformationr!   rK   r0   r1   r2   rM   rO   r   r   r   returnResponsePdu   sp   

z%MsgAndPduDispatcher.returnResponsePduc                 C   s  | j jdd\}| jd7  _z	t}t|}W n tjy5   | j jdd\}| jd7  _t Y S w t	j
t	j@ oBt	
d|  |}	z	|jt|	 }
W n tyi   | j jdd\}| jd7  _| Y S w z"|
||||\}	}}}}}}}}}}}}t	j
t	j@ ot	
d W nw tjy   t d }d|v rt	j
t	j@ ot	
d	|  | |d | j|d || | Y S  ty   t	j
t	j@ ot	
d
t d f  |jj jdd\}| jd7  _| Y S  |jj jdd\}| jd7  _| Y S w t	j
t	j@ ot	
d|   |du rt	j
t	j@ o&t	
d|  | ||}|du r| j jdd\}| jd7  _tj|j|jd}t	j
t	j@ oVt	
d z|
||	||||||||||\}}}|j ||| W n! t!y   t	j
t	j@ ot	
dt d   Y |S  Y |S w t	j
t	j@ ot	
d |S |j"#|dt$||||	||||||d
 |dur||f| j%|< |||	||||||||| |j"&|d |dur| j%|= t	j
t	j@ ot	
d |S  |S | j|}|du r| j jdd\}| jd7  _|S t	j
t	j@ ot	
d|  |j"#|dt$||||	||||||d
 |d }|||	|||||||||d |d  |j"&|d t	j
t	j@ o^t	
d |S  |S )z3Message dispatcher -- de-serialize message into PDUrN   
snmpInPktsrP   snmpInASNParseErrsz*receiveMessage: msgVersion %s, msg decodedsnmpInBadVersionszreceiveMessage: MP succededr+   z@receiveMessage: MP failed, statusInformation %s, forcing a retryzreceiveMessage: %szreceiveMessage: PDU %sNzreceiveMessage: pduType %sz__SNMP-MPD-MIBsnmpUnknownPDUHandlers)r)   Zoidvalz"receiveMessage: unhandled PDU typez3receiveMessage: report failed, statusInformation %sz#receiveMessage: reporting succeededzrfc3412.receiveMessage:request)
r0   r1   wholeMsgr*   r3   r4   r5   r   r6   r7   z$receiveMessage: processPdu succeededz.receiveMessage: cache read by sendPduHandle %szrfc3412.receiveMessage:responser-   r.   z,receiveMessage: processResponsePdu succeeded)'r   r   r$   rR   r   r	   ZdecodeMessageVersionr   r   r   r   r   r;   r:   KeyErrorZprepareDataElementsr<   sysexc_info#_MsgAndPduDispatcher__expireRequestr   rB   r   ZflagMPZmsgAndPduDspr>   r'   r   ZunknownPDUHandlernamerQ   r@   rG   r
   rD   rE   rF   r   rH   )r   rJ   r0   r1   r\   rW   ZrestOfWholeMsgZ
msgVersionrX   r*   rK   rY   r3   r4   r5   r   r6   r8   r9   r    r+   rT   rU   r   r   rZ   ZdestTransportDomainZdestTransportAddressr2   cachedParamsprocessResponsePdur   r   r   receiveMessage  sj  
$







z"MsgAndPduDispatcher.receiveMessagec                 C   s6   t |}||jv r|j| }|| | j| d S r&   )r:   r;   rC   r   rB   )r   rJ   r+   r*   r!   rK   r   r   r   rC     s
   


z+MsgAndPduDispatcher.releaseStateInformationc                 C   s   |j  }|d }|d u r||k rd S |d }tjtj@ o#td|  |s-tjtjd}| 	||d |d  ||d d d d d d d d ||d |d  dS )	Nr,   r-   z$__expireRequest: req cachedParams %sr(   r+   r*   r.   T)
r@   rA   r   r   r   r   r<   r   ZrequestTimedOutrC   )r   ZcacheKeyrb   rJ   rU   timeNowZ	timeoutAtrc   r   r   r   Z__expireRequest  s*   
z#MsgAndPduDispatcher.__expireRequestc                 C   s   | j | j| d S r&   )r   Zexpirer`   )r   rJ   re   r   r   r   receiveTimerTick  s   z$MsgAndPduDispatcher.receiveTimerTickr&   )r   NN)__name__
__module____qualname____doc__r   r   r"   r%   r'   rL   rV   rd   rC   r`   rf   r   r   r   r   r      s"    

iD Z
r   )r^   Zpyasn1.compat.octetsr   Zpyasn1.errorr   Z
pysnmp.smir   r   Zpysnmp.protor   r   r   Zpysnmp.proto.apir	   Zpysnmp.errorr
   Zpysnmpr   r   objectr   r   r   r   r   <module>   s   