o
    B]                     @   s   d dl Z d dlmZ d dlmZmZmZmZmZ d dl	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZ ejej ZG dd	 d	e
jZG d
d de
jZG dd de
jZG dd de
jZejejejej ej!ej"dZ#G dd deZ$dS )    N)AbstractMessageProcessingModel)rfc1905rfc3411apierrinderror)univ	namedtype
constraint)decodereoo)PyAsn1Error)debugc                	   @   s>   e Zd Zeede ede ede	 Z
dS )	ScopedPDUcontextEngineIdcontextNamedataN)__name__
__module____qualname__r	   
NamedTypes	NamedTyper   OctetStringr   ZPDUscomponentType r   r   </usr/lib/python3/dist-packages/pysnmp/proto/mpmod/rfc3412.pyr      s    r   c                   @   s.   e Zd Zeede ede Z	dS )ScopedPduDataZ	plaintextZencryptedPDUN)
r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r      s
    r   c                   @   s   e Zd Zeede je	
dddede je	
dddede je	ddded	e je	
d
ddZdS )
HeaderDatamsgIDr   ZsubtypeSpec
msgMaxSizei  msgFlags   ZmsgSecurityModel   N)r   r   r   r	   r   r   r   Integersubtyper
   ValueRangeConstraintr   ZValueSizeConstraintr   r   r   r   r   r   $   s    r   c                
   @   sX   e Zd Zeede je	
dddede ede ede ZdS )	SNMPv3Message
msgVersionr   r   r    ZmsgGlobalDataZmsgSecurityParametersZmsgDataN)r   r   r   r	   r   r   r   r%   r&   r
   r'   r   r   r   r   r   r   r   r   r(   3   s    r(   ))r#   r$      r#   r*   r$      r#   r#   r#   r   )r#   r$   r*   r#   r*   r$   r+   r#   r#      r   )r#   r$   r*   r#   r*   r$   r+   r#   r#   r$   r   )r#   r$   r*   r#   r*   r$   r+   r#   r#      r   )r#   r$   r*   r#   r*   r$   r+   r#   r#      r   )r#   r$   r*   r#   r*   r$   r+   r#   r#   r*   r   c                   @   s   e Zd ZedZeZedZ	ededededededd	Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd ZdS )SnmpV3MessageProcessingModelr$     )r   r#   r$   r-   r.      c                 C   s(   t |  t | _i | _i | _d| _d S )Nr   )r   __init__r   (_SnmpV3MessageProcessingModel__scopedPDU,_SnmpV3MessageProcessingModel__engineIdCache4_SnmpV3MessageProcessingModel__engineIdCacheExpQueue._SnmpV3MessageProcessingModel__expirationTimer)selfr   r   r   r8   Q   s
   

z%SnmpV3MessageProcessingModel.__init__c                 C   s>   ||f}|| j v r| j | d | j | d | j | d fS dS )NsecurityEngineIdr   r   )NNN)r:   )r=   transportDomaintransportAddresskr   r   r   getPeerEngineInfoX   s   
z.SnmpV3MessageProcessingModel.getPeerEngineInfoc                 C   s\  |j jjdd\}|j}| j }tjtj	@ otd|  ||f}|| j
v r.| j
| }nd }tjtj	@ o?td|||f  |d u rU|d u rK|}n
|d }|sU|d }|	sZ| j}	tjtj	@ ohtd||	f  | j}|d| |d	|	 |d
 |d
j|j|dddd | j}|jd| jdddd |d	d	}|jd|dddd |j jjdd\}|jd	|jdddd d}|d	krn|d
kr|d	O }n|dkr|dO }ntd| |jtjv r|dO }|jd
| j| dddd |dt| tjtj	@ otd| f  ||jv r|j| }ntjtjd|jtjv r-|}n|d u rAtjtj	@ o=td d }n|d }tjtj	@ oVtd||||f  ||| j||j|||||	\}}t ||jkrwtjtj!d|jtjv r| jj"|||||||||	||d |j#$|dt%||||||||	|d	 |j#&|d |||fS )N__SNMP-FRAMEWORK-MIBsnmpEngineIDz$prepareOutgoingMessage: new msgID %szMprepareOutgoingMessage: peer SNMP engine data %s for transport %s, address %sr   r>   z@prepareOutgoingMessage: using contextEngineId %r, contextName %rr   r#   r,   FZverifyConstraintsZ	matchTagsZmatchConstraintssnmpEngineMaxMessageSizer$   Unknown securityLevel %sr-   zprepareOutgoingMessage: %serrorIndicationz5prepareOutgoingMessage: peer SNMP engine is not knownz`prepareOutgoingMessage: securityModel %r, securityEngineId %r, securityName %r, securityLevel %r)
sendPduHandler   rD   securityModelsecurityNamesecurityLevelr   r   r?   r@   zrfc3412.prepareOutgoingMessage)	r?   r@   wholeMsgrK   rL   rM   r   r   pdu)'msgAndPduDspmibInstrumController
mibBuilderimportSymbolssyntax_cacheZnewMsgIDr   loggerflagMPr:   	_emptyStrr9   setComponentByPositiongetComponentByPositionsetComponentByTypetagSet_snmpMsgSpecmessageProcessingModelIDr   ProtocolErrorr   confirmedClassPDUs	_msgFlagsintprettyPrintsecurityModelsStatusInformationr   unsupportedSecurityModelunconfirmedClassPDUsZgenerateRequestMsglentooBigZpushByMsgIdobserverstoreExecutionContextdictclearExecutionContext)r=   
snmpEnginer?   r@   messageProcessingModelrK   rL   rM   r   r   
pduVersionrO   ZexpectResponserJ   rD   r   rA   ZpeerSnmpEngineData	scopedPDUmsg
headerDatarF   r"   	smHandlerr>   securityParametersrN   r   r   r   prepareOutgoingMessageb   s   







 



z3SnmpV3MessageProcessingModel.prepareOutgoingMessagec                  C   sD  |j jjdd\}|j}| j|}|d }|d }|d }|d }|d }|d }|d	 }|d
 }|d }|d }|d }tjtj	@ oKtd|  |d urd|v r|	d u r[d }n|	
d}|	j}|	d u ri|rr|d ury|tjvrytjtjdt }tj||d |d ff tj|d tj|d |	d u rtj|d ntj|| d|v r|d }nd}d|v r|d }n|}d|v r|d }nd}|}	tjtj	@ otd|  |s|}|s| j}tjtj	@ otd||f  | j}|d| |d| |d |
dj|	j|	dddd | j}|jd| jdddd |d
d}|jd|dddd |j jjdd\}|jd|jdddd d}|dkrSn|dkr]|dO }n|dkrg|dO }nt d| |	jtjv ry|dO }|jd| j!| dddd |jd|dddd tjtj	@ otd|" f  ||j#v r|j#| }ntjtj$dtjtj	@ otd||||f  z|%|| j||j||||||
\}}W n
 tjy    w tjtj	@ otd  t&|t'|j|krtjtj(d|j)*|d!t+|||||||||	d"	 |j),|d! |||fS )#NrC   rD   r   r   r   rK   rL   rM   securityStateReferencereportableFlagr!   r?   r@   z)prepareResponseMessage: stateReference %soidr   rH   valr#   r0   zCprepareResponseMessage: prepare report PDU for statusInformation %sz@prepareResponseMessage: using contextEngineId %r, contextName %rr,   FrE   rF   r$   rG   r-   zprepareResponseMessage: %sz`prepareResponseMessage: securityModel %r, securityEngineId %r, securityName %r, securityLevel %rz#prepareResponseMessage: SM finishedzrfc3412.prepareResponseMessage	r?   r@   rK   rL   rM   r   r   r>   rO   )-rP   rQ   rR   rS   rT   rU   ZpopByStateRefr   rV   rW   rZ   r\   r   r`   r   re   r   ZloopTerminatedr   Z	ReportPDUpModapiPDUZsetVarBindsZsetErrorStatusZsetErrorIndexZsetRequestIDrX   r9   rY   r[   r]   r^   r_   ra   rc   rd   rf   ZgenerateResponseMsgrh   minri   rj   rk   rl   rm   ) r=   rn   ro   rK   rL   rM   r   r   rp   rO   maxSizeResponseScopedPDUstateReferencestatusInformationrD   ZcachedParamsr   rw   rx   maxMessageSizer?   r@   pduTypeZ	requestIDZ	reportPDUrq   rr   rs   rF   r"   rt   ru   rN   r   r   r   prepareResponseMessage  s  













 
z3SnmpV3MessageProcessingModel.prepareResponseMessagec           (      C   s  t j|| jd\}}tjtj@ otd| f  tj	|r't
jtjd|d}|d }}	|d}
|d \}|d}|d}|d}tjtj@ o^td||
|f  ||jvr||jjjd	d
\}| jd7  _t
jtjd|d@ dkrd}n*|d@ dkrd}n!|d@ dkrd}n|jjjd	d\}| jd7  _t
jtjd|d@ rd}nd}|j| }z|||	||||||\}}}}}tjtj@ otd W n t
jy   t dd \}}tjtj@ otd|  |j|dt||||||d |j|d d|v rd|v r|d }|d }|d }d|v r9|d }|d }nd }|d }d }| j ! }| j j"||	|
|||||||||||d z|j#|d|||||d|||| W n t
jyx   Y nw tjtj@ otd tj$d dkr|z|%|~w w ||f}|| j&vr|d }|d }|d } |  }|j't(j)v r|||d| j&|< t*| j+d|j,-   }!|!| j.vrg | j.|!< | j.|! /| tjtj@ otd|||f  |jjjdd\}"|"j}"|d }|d }|d }| }t0j1}#|j'}$|$t(j2v s!|$t(j)v rDz| j 3|
}%W n t
j4y>   |5| t
jtj6dw |%d }&nd }&tjtj@ oUtd |&|
f  |$t(j)v rt7j89|}'|'rt
jt:;|'d d t<|'d d  |'d d |'d d |&d!}nt
j|&d"}|j|d#t|||||||||d$	 |j|d# |5| |d }|$t(j2v r||%d% ks||%d& ks||%d' ks||%d ks||%d kr|5| t
jtj6d|j|d(t|||||||||d$	 |j|d( |5| d }|	||||||#||$|&|||fS |$t(j=v r||"kr-|5| t
jtj>d| j ! }| j j"||	|
|||||||||||d tjtj@ o}td)|  |j|d*t|||||||||d$	 |j|d* |	||||||#||$|&|||fS  |j|d*t|||||||||d$	 |j|d* |	||||||#||$|&|||fS |$t(j?v r| j ! }|j|d+t|||||||||d$	 |j|d+ |5| |	||||||#||$|&|||fS |5| t
jtj@d),N)Zasn1SpeczprepareDataElements: %srH   r#   r   r,   r$   zEprepareDataElements: msg data msgVersion %s msgID %s securityModel %sz__SNMP-MPD-MIBsnmpUnknownSecurityModelssnmpInvalidMsgsr-   z!prepareDataElements: SM succeededz4prepareDataElements: SM failed, statusInformation %sz&rfc3412.prepareDataElements:sm-failure)r?   r@   rK   rM   ru   r   rI   ry   rw   r   r   rq   r   )r)   r   r   r   rK   rL   rM   rw   rx   r!   r   r?   r@   z#prepareDataElements: error reported)r>   r   r   i,  z8prepareDataElements: cache securityEngineId %r for %r %rrC   rD   rJ   z8prepareDataElements: using sendPduHandle %s for msgID %s)rI   ry   rz   rJ   )rJ   z$rfc3412.prepareDataElements:internalr{   rK   rL   rM   z$rfc3412.prepareDataElements:responsez*prepareDataElements: new stateReference %sz%rfc3412.prepareDataElements:confirmedz'rfc3412.prepareDataElements:unconfirmed)Ar   decoder]   r   rV   rW   rc   r   ZendOfOctetsZisSameTypeWithr   re   r   Z
parseErrorrZ   Z	asNumbersrd   rP   rQ   rR   rS   rT   rf   Z
invalidMsgZprocessIncomingMsgsysexc_inforj   rk   rl   rm   ZgetComponentrU   ZnewStateReferenceZpushByStateRefZreturnResponsePduversion_infowith_tracebackr:   r\   r   ZinternalClassPDUsrb   r<   ZtransportDispatcherZgetTimerResolutionr;   appendr   protoVersion2cZresponseClassPDUsZ
popByMsgIdr_   ZreleaseStateInformationZdataMismatchr|   r}   ZgetVarBinds_snmpErrorsgetZReportPduReceivedr`   ZengineIDMismatchrg   ZunsupportedPDUtype)(r=   rn   r?   r@   rN   rr   ZrestOfwholeMsgrs   r)   ro   r   r"   r   rK   ru   r   rM   r   rx   rt   r>   rL   rq   r   rw   r   ZorigTracebackr   r   rO   r   rA   ZpdusZexpireAtrD   rp   r   ZcachedReqParamsrJ   ZvarBindsr   r   r   prepareDataElements  s|  







	




J



$












z0SnmpV3MessageProcessingModel.prepareDataElementsc                 C   s^   | j | jv r&| j| j  D ]}| j|= tjtj@ otd|f  q| j| j = |  j d7  _ d S )Nz __expireEnginesInfo: expiring %rr#   )r<   r;   r:   r   rV   rW   )r=   Z	engineKeyr   r   r   Z__expireEnginesInfo3  s   
z0SnmpV3MessageProcessingModel.__expireEnginesInfoc                 C   s   |    t| || d S )N)0_SnmpV3MessageProcessingModel__expireEnginesInfor   receiveTimerTick)r=   rn   ZtimeNowr   r   r   r   ;  s   z-SnmpV3MessageProcessingModel.receiveTimerTickN)r   r   r   r   r%   r^   r(   ZsnmpMsgSpecr   rX   ra   r8   rB   rv   r   r   r   r   r   r   r   r   r/   F   s,    


 ' @  nr/   )%r   Zpysnmp.proto.mpmod.baser   Zpysnmp.protor   r   r   r   r   Zpyasn1.typer   r	   r
   Zpyasn1.codec.berr   r   Zpyasn1.errorr   Zpysnmpr   ZprotoModulesr   r|   Sequencer   ZChoicer   r   r(   ZunsupportedSecurityLevelZnotInTimeWindowZunknownUserNameZunknownEngineIDZwrongDigestZdecryptionErrorr   r/   r   r   r   r   <module>   s(   