o
    Z                     @   s   d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ e jd  dkr;eZeZG d	d
 d
e
ZejZejZdS )    N)strptimestrftime	iskeyword)MibInfo)AbstractCodeGendorepr)error)debug   c                   @   s  e Zd ZdZdZddddddd	d
ddddZdddddddZdZdej	 Z	g dZ
i ddddddddd dd!d"d#d"d$d%d&d'd(d)d*d+d,d-d.dd/dd0d"d1d2d3d4d5d6iZg d7Zd8Zd9Zd:Zd;d< Zd=d> Zed?d@ ZddBdCZdDdE ZdFdG ZddHdIZddKdLZddNdOZdPdQ ZdRdS ZddTdUZddVdWZddXdYZddZd[Zdd\d]Z dd^d_Z!dd`daZ"ddbdcZ#ddddeZ$ddfdgZ%ddhdiZ&ddjdkZ'ddldmZ(ddndoZ)ddpdqZ*ddrdsZ+ddtduZ,ddvdwZ-ddxdyZ.ddzd{Z/dd|d}Z0dd~dZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@dddZAdddZBi dedededede de!de"de#de$de%de&de@de(de)de*de+de,i de-de.de/de0de1de2de3de4de5de6de9de7de8de9de;de<de=e>e?e@eAeBe9dĜZCddƄ ZDddȄ ZEdMS )PySnmpCodeGenzBuilds PySNMP-specific Python code representing MIB module supplied
       in form of an Abstract Syntax Tree on input.

       Instance of this class is supposed to be passed to *MibCompiler*,
       the rest is internal to *MibCompiler*.
    )zpysnmp.smi.mibsZpysnmp_mibs)ZModuleIdentity)	MibScalarMibTableMibTableRowMibTableColumn)ZNotificationType)ZTextualConvention)ZModuleCompliance)ZObjectGroup)ZNotificationGroup)ZAgentCapabilities)ZObjectIdentity)Bits)MODULE-IDENTITYOBJECT-TYPENOTIFICATION-TYPETEXTUAL-CONVENTIONMODULE-COMPLIANCEzOBJECT-GROUPNOTIFICATION-GROUPzAGENT-CAPABILITIESOBJECT-IDENTITYz	TRAP-TYPEBITS)IntegerOctetStringObjectIdentifier)ZNamedValues)ZConstraintsUnionZConstraintsIntersectionZSingleValueConstraintZValueRangeConstraintZValueSizeConstraint)isor   	Integer32	TimeTicks	Counter32	Counter64r   Gauge32r   r   r   
Unsigned32	IpAddressZMibIdentifier)ZDisplayStringr   )r   r   )ASN1ASN1-ENUMERATIONASN1-REFINEMENTz
SNMPv2-SMIz	SNMPv2-TCzSNMPv2-CONF)r%   r&   r'   )zPYSNMP-USM-MIBzSNMP-FRAMEWORK-MIBzSNMP-TARGET-MIBzTRANSPORT-ADDRESS-MIBzINET-ADDRESS-MIB)r   r   r   r   r   Z	COUNTER32r    Z	COUNTER64r!   ZGAUGE32r"   INTEGERr   Z	INTEGER32	IPADDRESSr$   NETWORKADDRESSzOBJECT IDENTIFIERr   OCTET STRINGr   ZOPAQUEZOpaqueZ	TIMETICKSr   Z
UNSIGNED32r#   CounterZGaugeZNetworkAddressZnullSpecificZzeroDotZeroZipRoutingTableZipRouteTableZsnmpEnableAuthTrapsZsnmpEnableAuthenTraps)r(   r+   r)   r*   zif mibBuilder.loadTexts: z    i  c                 C   sn   t | j | _| jd t  | _i | _t  | _t  | _i | _	i | _
d | _d | _dg| _ddi| _i | _d S )Nr   ZDUMMYtextT)settypeClassesvalues
_snmpTypesadd_rows_cols_exports	_seenSyms
_importMap_out_moduleIdentityOid_moduleRevision
moduleNamegenRulessymbolTableself r@   6/usr/lib/python3/dist-packages/pysmi/codegen/pysnmp.py__init__m   s   

zPySnmpCodeGen.__init__c                 C   s   || j v r
| j | S |fS )N)	symsTable)r?   symbolr@   r@   rA   symTrans|   s   

zPySnmpCodeGen.symTransc                 C   s   t | rd|  } | ddS )NZpysmi_-_)r   replace)rD   r@   r@   rA   
transOpers   s   zPySnmpCodeGen.transOpersFc              	   C   st   g }|D ]3}t |ts|| qt|dkr||d  q|| j|d  | | j|dd  |d|d q|S )N   r   	classmode)
isinstancetupleappendlenhandlersTableprepData)r?   ZpdatarL   dataelr@   r@   rA   rR      s   
(zPySnmpCodeGen.prepDatac           
         s  d}g }t |D ];  jv rC|  D ]/}|j  v rB| |f j  | D ]}|\}}||v r<|| | q*|g||< q*qq|D ]}||d  |d  qFjD ]  |v ri|   j  7  < qWj  | < qWt|D ]U d}	t|  D ]	}|	|7 }	q|	rʈj	fdd|	D  j
	 fdd|	D  |dfd	d|	D 7 }t|	d
k r|d7 }|dd f|	  7 }qu|tt|fS )N r   rJ   r@   c                       g | ]}  |qS r@   rI   .0sr>   r@   rA   
<listcomp>       z,PySnmpCodeGen.genImports.<locals>.<listcomp>c                    s   g | ]	} | fqS r@   rW   rX   moduler?   r@   rA   r[          , c                    rV   r@   rW   rX   r>   r@   rA   r[      r\   r   ,z" = mibBuilder.importSymbols("%s")
", ")listZconvertImportv2rO   removeconstImportssortedr.   rE   r6   updater7   joinrP   rN   )
r?   importsoutStrZtoDelrD   Z	newImportZ	newModuleZ	newSymboldsymbolsr@   r]   rA   
genImports   s@   

zPySnmpCodeGen.genImportsc              	   C   st   t | j}|s	dS t|d d }d}t|D ] }|d| jd  d 7 }|d|d| d|d   d 7 }q|S )	NrU      rJ   zmibBuilder.exportSymbols("r   ", r`   )
)rc   r5   rP   ranger;   rh   )r?   ZexportsnumFuncCallsrj   idxr@   r@   rA   
genExports   s   
(zPySnmpCodeGen.genExportsc                 C   s0   d|v st |r|rd| d pd| d S dS )NrF   z	label = "z"
z.setLabel("")rU   r   )r?   rD   rL   r@   r@   rA   genLabel   s   zPySnmpCodeGen.genLabelr   c                 C   s8   |r
| j d|  | j d||f  | j| d S )NzPYSNMP_MODULE_ID=%sz%s=%s)r5   r2   r6   )r?   rD   moduleIdentityr@   r@   rA   addToExports   s   zPySnmpCodeGen.addToExportsNc                 C   sn   || j v r|| jvrtd| | || || j|< |r5| jr&tdd|ddd | _d S d S )NzDuplicate symbol found: %szDuplicate module identity.r`   rJ   )	r6   r7   r	   PySmiSemanticErrorrx   r8   r9   rh   split)r?   rD   rj   oidStrrw   r@   r@   rA   regSym   s   

zPySnmpCodeGen.regSymc                 C   s   d}|D ]D}t |trC|\}}|dkr|d7 }q|| jvr$td| || j| vr4td||f || | j| | d 7 }q||f7 }q|S )Nr@   r   rJ   no module "%s" in symbolTableno symbol "%s" in module "%s"oid)rM   rN   r=   r	   r{   genNumericOid)r?   r   Z
numericOidpartparentr^   r@   r@   rA   r      s   

zPySnmpCodeGen.genNumericOidc                 C   s   || j vrtd| || j | vrtd||f | j | | dd\}}|d s4td| |d | jv r?||fS | j| \}}t|trZt|trX||7 }||fS |}||fS )Nr   r   syntax)rU   rU   rU   r   zunknown type for symbol "%s")r=   r	   r{   get	baseTypesgetBaseTyperM   rc   )r?   ZsymNamer^   ZsymTypeZ
symSubtypeZbaseSymTypeZbaseSymSubtyper@   r@   rA   r     s    


zPySnmpCodeGen.getBaseTypec                 C   s   |\}}}}}}|  |}	| |}|\}
}|d |
 d |	 d }|r.|dt||d 7 }|r:|dt||d 7 }| jd rL|rL|| j| | d 7 }| jd r[|r[||| d 7 }| |||
 |S )	Nz = AgentCapabilities()
zdif getattr(mibBuilder, 'version', (0, 0, 0)) > (4, 4, 0):
    %(name)s = %(name)s%(productRelease)s
)nameproductRelease\if getattr(mibBuilder, 'version', (0, 0, 0)) > (4, 4, 0):
    %(name)s = %(name)s%(status)s
r   statusr-   rv   rI   dictr<   	ifTextStrr~   )r?   rS   rL   r   r   r   description	referencer   labelr}   	parentOidrj   r@   r@   rA   genAgentCapabilities-  s&   



z"PySnmpCodeGen.genAgentCapabilitiesc                 C   s&  |\}}}}}}}	|  |}
| |}|	\}}|d | d |
 d }|rJ|\}}}|| _|r7||| d 7 }| jd rJ|rJ|dt| j||d 7 }|rW|| j| | d 7 }|rd|| j| | d 7 }| jd rv|rv|| j| | d 7 }| jd r|r|| j| | d 7 }| j|||dd |S )	Nz = ModuleIdentity(r   r   r-   ze
if getattr(mibBuilder, 'version', (0, 0, 0)) > (4, 4, 0):
    %(ifTextStr)s%(name)s%(descriptions)s
)r   r   descriptionsT)rw   )rv   rI   r:   r<   r   r   r~   )r?   rS   rL   r   ZlastUpdatedorganizationZcontactInfor   ZrevisionsAndDescrsr   r   r}   r   rj   Zlast_revision	revisionsr   r@   r@   rA   genModuleIdentityM  s0   


zPySnmpCodeGen.genModuleIdentityc                 C   s   |\}}}}}}|  |}	| |}|\}
}|d |
 d |	 }||d 7 }|r2|dt||d 7 }| jd rD|rD|| j| | d 7 }| jd rV|rV|| j| | d 7 }| |||
 |S )Nz = ModuleCompliance(r   r   r   r   r-   r   )r?   rS   rL   r   r   r   r   Zcompliancesr   r   r}   r   rj   r@   r@   rA   genModuleCompliancev  s    


z!PySnmpCodeGen.genModuleCompliancec                    sR  |\}}}}}}  |}	 |}|\}
}|d |
 d |	 }|ro fdd|D }t|d d }|dkrdg }t|D ]}|dd|d| d|d    d	  q=|d
t|d|d 7 }n|dd| d 7 }|d7 }|r|dt||d 7 } jd r|r| j| | d 7 } jd r|r||| d 7 } 	|||
 |S )Nz = NotificationGroup(r   c                    6   g | ]}d  j | jd  d  | d qS ("r   rb   ru   r7   r   r;   rI   rY   objr>   r@   rA   r[         .z6PySnmpCodeGen.genNotificationGroup.<locals>.<listcomp>   rJ   [r`   ]6  
for _%(name)s_obj in [%(objects)s]:
    if getattr(mibBuilder, 'version', 0) < (4, 4, 2):
        # WARNING: leading objects get lost here! Upgrade your pysnmp version!
        %(name)s = %(name)s.setObjects(*_%(name)s_obj)
    else:
        %(name)s = %(name)s.setObjects(*_%(name)s_obj, **dict(append=True))r   objects.setObjects(r   r   r   r-   
rv   rI   rP   rq   rO   rh   r   r<   r   r~   r?   rS   rL   r   r   r   r   r   r   r   r}   r   rj   rr   objStrPartsrs   r@   r>   rA   genNotificationGroup  s:   


.

z"PySnmpCodeGen.genNotificationGroupc                    sZ  |\}}}}}}  |}	 |}|\}
}|d |
 d |	 }|ro fdd|D }t|d d }|dkrdg }t|D ]}|dd|d| d|d    d	  q=|d
t|d|d 7 }n|dd| d 7 }|d7 }|r| j| | d 7 } jd r|r| j| | d 7 } jd r|r| j| | d 7 } 	|||
 |S )N = NotificationType(r   c                    r   r   r   r   r>   r@   rA   r[     r   z5PySnmpCodeGen.genNotificationType.<locals>.<listcomp>r   rJ   r   r`   r   r   r   r   r   r-   )
rv   rI   rP   rq   rO   rh   r   r   r<   r~   r   r@   r>   rA   genNotificationType  s6   


.
z!PySnmpCodeGen.genNotificationTypec                    sX  |\}}}}}}  |}	 |}|\}
}|d |
 d |	 }|ro fdd|D }t|d d }|dkrdg }t|D ]}|dd|d| d|d    d	  q=|d
t|d|d 7 }n|dd| d 7 }|d7 }|r|dt||d 7 } jd r|r| j| | d 7 } jd r|r| j| | d 7 } 	|||
 |S )Nz = ObjectGroup(r   c                    r   r   r   r   r>   r@   rA   r[     r   z0PySnmpCodeGen.genObjectGroup.<locals>.<listcomp>r   rJ   r   r`   r   a  
for _%(name)s_obj in [%(objects)s]:
    if getattr(mibBuilder, 'version', 0) < (4, 4, 2):
        # WARNING: leading objects get lost here!
        %(name)s = %(name)s.setObjects(*_%(name)s_obj)
    else:
        %(name)s = %(name)s.setObjects(*_%(name)s_obj, **dict(append=True))r   r   r   r   r   r-   r   r   r@   r>   rA   genObjectGroup  s:   


.

zPySnmpCodeGen.genObjectGroupc                 C   s   |\}}}}}|  |}| |}|\}	}
|d |	 d | d }|r.|| j| | d 7 }| jd r@|r@|| j| | d 7 }| jd rR|rR|| j| | d 7 }| |||	 |S )Nz = ObjectIdentity(r   r   r-   )rv   rI   r   r<   r~   )r?   rS   rL   r   r   r   r   r   r   r}   r   rj   r@   r@   rA   genObjectIdentity-  s   

zPySnmpCodeGen.genObjectIdentityc                 C   s  |\}}}}}}}	}
}}}|  |}| |}|\}}|p!ddg f\}}}|d dkr1d|d  p4|d }| j|d |d }| |}|d dkrMdpN|}|| j| jd  d v r]dp^|}| j||d	}|d
 | d | d | |pvd d | }||pd7 }||pd7 }||pd7 }|d7 }| jd r|	r|| j| |	 d 7 }|
r| |
}
||
d | j	|| jd  d | d 7 }||d |
 d 7 }|r|| j| | d 7 }| jd r|r|| j| | d 7 }| 
||| |r
t|D ]\}}|| | }| 
||| q|S )NrU   r   r   zBits()rJ   r   Z_symtable_colsr   )objnamez = (r`   r   r   r-   z.registerAugmentions(("rb   z"))
z.setIndexNames(*z.getIndexNames())
)rv   rI   r/   r   r=   r;   	genDefValr<   r   r7   r~   	enumerate)r?   rS   rL   r   r   unitsZ	maxaccessr   r   r   Z
augmentionindexdefvalr   r   r}   r   ZindexStrfakeStrlistfakeSymssubtypeZ	classtyperj   rs   ZfakeSymZ
fakeOutStrr@   r@   rA   genObjectTypeD  s@   

 
 ,
,zPySnmpCodeGen.genObjectTypec                    sL  |\}}}}}}  |}	 |}|\}
}|d |
 d t| d |	 }|ru fdd|D }t|d d }|dkrjg }t|D ]}|dd	|d| d|d    d
  qC|dt|d	|d 7 }n|dd	| d 7 }|d7 } jd r|r| j	| | d 7 } jd r|r| j	| | d 7 } 
|||
 |S )Nr   z + (0,))c                    r   r   r   r   r>   r@   rA   r[     r   z-PySnmpCodeGen.genTrapType.<locals>.<listcomp>r   rJ   r   r`   r   r   r   r   r   r   r-   )rv   rI   strrP   rq   rO   rh   r   r<   r   r~   )r?   rS   rL   r   
enterpriser   r   r   valuer   ZenterpriseStrr   rj   rr   r   rs   r@   r>   rA   genTrapTypet  s2   

 
.
zPySnmpCodeGen.genTrapTypec                 C   sR   d}|\}}|r'|\}}|r'|  |}d| d | d | d }| || |S )NrU   zclass r   z):
r   )rI   r~   )r?   rS   rL   rj   r   Zdeclaration
parentTypeattrsr@   r@   rA   genTypeDeclaration  s   
z PySnmpCodeGen.genTypeDeclarationc           	      C   sN   |\}}|  |}| |}|\}}|d | d | d }| ||| |S )Nz = MibIdentifier(r   r   )rv   rI   r~   )	r?   rS   rL   r   r   r   r}   r   rj   r@   r@   rA   genValueDeclaration  s   

z!PySnmpCodeGen.genValueDeclarationc                 C      |d }|S Nr   r@   r?   rS   rL   namesr@   r@   rA   ftNames     zPySnmpCodeGen.ftNamesc                 C   r   r   r@   r   r@   r@   rA   genBitNames  r   zPySnmpCodeGen.genBitNamesc           	   
   C   s   |d }dd |D }t |d d }d}t|D ]}|dd|d| d|d    d	 7 }q|d d
 }|rB| jd | d pGd| d }d|fS )Nr   c                 S   s,   g | ]}d |d  d t |d  d qS )r   r   ro   rJ   r   r   )rY   bitr@   r@   rA   r[     s   , z)PySnmpCodeGen.genBits.<locals>.<listcomp>r   rJ   rU   zNamedValues(r`   z) + znamedValues = r   z.clone(namedValues=r   r   )rP   rq   rh   indent)	r?   rS   rL   bitsZnamedvalrr   	funcCallsrs   rj   r@   r@   rA   genBits  s   ,"zPySnmpCodeGen.genBitsc           	         s   |d sdS g }|d D ]}|d pj d  | fdd|d D 7 }qd}t|d d }|dkrbg }t|D ]}|dd|d| d|d    d	  q:|d
t d|d 7 }|S |dd| d 7 }|S )Nr   rU   c                    s&   g | ]}d   d  | d qS )r   rb   ru   rW   )rY   Zcomplr   r?   r@   rA   r[     s   & z0PySnmpCodeGen.genCompliances.<locals>.<listcomp>rJ   r   r   r`   r   a8  
for _%(name)s_obj in [%(objects)s]:
    if getattr(mibBuilder, 'version', 0) < (4, 4, 2):
        # WARNING: leading objects get lost here! Upgrade your pysnmp version!
        %(name)s = %(name)s.setObjects(*_%(name)s_obj)
    else:
        %(name)s = %(name)s.setObjects(*_%(name)s_obj, **dict(append=True))

r   r   rp   )r;   rP   rq   rO   rh   r   )	r?   rS   rL   r   ZcomplianceModulerj   rr   r   rs   r@   r   rA   genCompliances  s$   .zPySnmpCodeGen.genCompliancesc                 C   sD   |d }|d r |d dd  dkr |d d d }| j | dS )Nr   rJ   ())r   rU   )r3   r2   r?   rS   rL   rowr@   r@   rA   genConceptualTable   s
   z PySnmpCodeGen.genConceptualTablec                 C       |  d|d }dt| d S )Nzcontact-infor   z.setContactInfo(r   
textFilterr   r?   rS   rL   r-   r@   r@   rA   genContactInfo	     zPySnmpCodeGen.genContactInfoc                 C   s   | j d t|d  d S )NzdisplayHint = r   r   r   r   r?   rS   rL   r@   r@   rA   genDisplayHint  s   zPySnmpCodeGen.genDisplayHintc                    s  |sdS |s|S |d }|  || jd  t|ttfr"t|}n>| |rH d d dv r<tt|dd d}n$d|dd  d }n| |r{|dd } d d dv rett|p`d	d
}n|rrtt|d
d
d  psd}d| d }n|d |d kr|d dkr|dd dkr dkrdS t	|dd }n d d dkr|| j
| jd  v s|| jv r| j|| jd }zt| | j
| | d }W n   td||f  d d dv rt d trt|tr fdd|D }|rt	|d p	d}nU|t d v rt	|}nGd}nD d d dkrVg }	t d }
|D ]}|
|d }|d urE|	||f q/td||f | |	gd S td ||f d| d S )NrU   r   )r   r   rJ   r      z
hexValue=""0r   rz   r   Fr   r   r   c                    s    g | ]}|t  d  v r|qS r   )r   )rY   ZdvZ
defvalTyper@   rA   r[   B  s     z+PySnmpCodeGen.genDefVal.<locals>.<listcomp>r   z#no such bit as "%s" for symbol "%s"z0unknown type "%s" for defval "%s" of symbol "%s"z.clone(r   )r   r;   rM   intlongr   ZisHexZisBinaryhexr   r=   r7   r   r   r	   r{   rc   r   rO   r   )r?   rS   rL   r   r   valZbinvalZhexvalr^   Z
defvalBitsr   r   ZbitValuer@   r   rA   r     sh   

 "

zPySnmpCodeGen.genDefValc                 C   :   |  d|d }|r| jd t| d pdt| d S )Nr   r   zdescription = r   z.setDescription(r   r   r   r   r   r@   r@   rA   genDescription]     *zPySnmpCodeGen.genDescriptionc                 C   r   )Nr   r   zreference = r   z.setReference(r   r   r   r@   r@   rA   genReferenceb  r   zPySnmpCodeGen.genReferencec                 C   2   |d }|r| j d t| d pdt| d S )Nr   z	status = r   z.setStatus(r   r   r   r@   r@   rA   	genStatusg     *zPySnmpCodeGen.genStatusc                 C   r   )Nr   zproductRelease = r   z.setProductRelease(r   r   r   r@   r@   rA   genProductReleasel  r   zPySnmpCodeGen.genProductReleasec           
   
   C   s   |d }dd |D }|r| j d pd}t|d d }|dk}d}|| r(d	p)d7 }tt|D ]}	|r9|d
7 }|dd
|d|	 d|	d    d 7 }q1||7 }|| r]|r[dpcdpc| rbdpcd7 }|| j||dd 7 }|S )Nr   c                 S   s   g | ]}t |d  qS r   r   )rY   itemr@   r@   rA   r[   r  s    z-PySnmpCodeGen.genEnumSpec.<locals>.<listcomp>subtypeSpec = %s.subtypeSpec + .subtype(subtypeSpec=r   rJ   rU   ConstraintsUnion(r`   zSingleValueConstraint(r   rp   r   r   rK   )r   rP   rq   r   rh   r   )
r?   rS   rL   itemsZ	singlevalrj   rr   Z
singleCallr   rs   r@   r@   rA   genEnumSpecp  s   ,$zPySnmpCodeGen.genEnumSpecc              	      s    fdd}|d }g g g }}}|D ]C}|d }	|	 j v r:|	}
| j|
\}}	|| ||	   jd7  _|dt|d  d  j|	 jd  d |	 d  qd	d
| d ||fS )Nc                    s@   d|  } j ||} |}|d t|  d | d |fS )NzpysmiFakeCol%sz = MibTableColumn(%s + (z, ), z())
)r/   r   rI   r   )fakeidxidxTypeZfakeSymNameobjTyper>   r@   rA   genFakeSyms  s   
z0PySnmpCodeGen.genTableIndex.<locals>.genFakeSymsr   rJ   r   z, "rb   ru   z.setIndexNames(r`   r   )smiv1IdxTypesr   rO   r   r7   r   r;   rh   )r?   rS   rL   r  ZindexesZ
idxStrlistr   r   rs   ZidxNamer   Z
fakeSymStrr@   r>   rA   genTableIndex  s*   



zPySnmpCodeGen.genTableIndexc                 C   s   t |d dk}|r| jd pd}|| rdpd7 }|d D ]6}t |dkr.|d |d fp/|\}}t| |t| |}}|d| d | d	 | rPdpQd 7 }q|| r_|r]d	ped
pe| rdd	ped7 }|S )Nr   rJ   r   r   r   rU   zValueRangeConstraint(r`   r   r   r   rP   r   r   Zstr2intr?   rS   rL   ZsingleRangerj   rngZvminZvmaxr@   r@   rA   genIntegerSubType  s   $($zPySnmpCodeGen.genIntegerSubTypec                 C   s(   |d  dd}|dkrd| d pdS )Nr   rF   rU   Znotaccessiblez.setMaxAccess("ru   )rH   )r?   rS   rL   accessr@   r@   rA   genMaxAccess  s   zPySnmpCodeGen.genMaxAccessc                 C   s  t |d dk}|r| jd pd}|| rdpd7 }|d D ]6}t |dkr.|d |d fp/|\}}t| |t| |}}|d| d | d	 | rPdpQd 7 }q|| r_|r]d	ped
pe| rdd	ped7 }|d r||r||kr|r}| jd | d pd| d	 pd7 }|S )Nr   rJ   r   r   r   rU   zValueSizeConstraint(r`   r   r   r   zfixedLength = z.setFixedLength(r  r  r@   r@   rA   genOctetStringSubType  s&   $$ z#PySnmpCodeGen.genOctetStringSubTypec                 C   s   d}d}|d D ]>}t |ttfr&| |}||| j|| jd ff7 }qt |ttfr3||f7 }qt |t	r@||d f7 }qt
d| t| ||fS )Nr@   rU   r   rJ   zunknown datatype for OID: %s)rM   r   unicoderI   r7   r   r;   r   r   rN   r	   r{   r   )r?   rS   rL   outr   rT   r@   r@   rA   genOid  s   
 
zPySnmpCodeGen.genOidc                    s"   |d r fdd|d D S g S )Nr   c                    rV   r@   rW   r   r>   r@   rA   r[     r\   z,PySnmpCodeGen.genObjects.<locals>.<listcomp>r@   r   r@   r>   rA   
genObjects  s   zPySnmpCodeGen.genObjectsc                 C   sl   g }|D ]/}t |dkrd| }z|tdt|d W q ty3   d}|tdt|d Y qw |S )N   Z19z%Y-%m-%d %H:%Mz%Y%m%d%H%MZZ197001010000Z)rP   rO   r   r   
ValueError)r?   rS   rL   timesZtimeStrr@   r@   rA   genTime  s   zPySnmpCodeGen.genTimec                 C   s   |d }dt | d S )Nr   z.setLastUpdated(r   r   r   r@   r@   rA   genLastUpdated  s   zPySnmpCodeGen.genLastUpdatedc                 C   r   )Nr   r   z.setOrganization(r   r   r   r@   r@   rA   genOrganization  r   zPySnmpCodeGen.genOrganizationc                    sn     dd |d D }dd |D }dd| }dd fdd|d D  }|d d d }|||fS )	Nc                 S   s   g | ]}|d  qS r   r@   rY   xr@   r@   rA   r[         z.PySnmpCodeGen.genRevisions.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r@   r  r  r@   r@   rA   r[     r  z.setRevisions((%s,))r`   z .setRevisionsDescriptions((%s,))c                    s$   g | ]}t  d |d d qS )r   rJ   r   r   r  r>   r@   rA   r[     s   $ )r  rh   )r?   rS   rL   r  r   r   ZlastRevisionr@   r>   rA   genRevisions  s   
zPySnmpCodeGen.genRevisionsc                 C   s<   |d }|  |}|| j| jd  d v rdp| j||dS )Nr   Z_symtable_rows)r   rU   rK   )rI   r=   r;   genSimpleSyntaxr   r@   r@   rA   genRow  s
   
zPySnmpCodeGen.genRowc                 C   s   |d }| j | dS )Nr   r   )r4   rg   )r?   rS   rL   Zcolsr@   r@   rA   genSequence  s   zPySnmpCodeGen.genSequencec                 C   sl   |d }| j ||}| |}t|dkr|d pd}|r,d|v r&|| p'|}||fS |d | }d|fS )Nr   r   rJ   rU   z%sr   r   )r/   r   rI   rP   )r?   rS   rL   r   r   rj   r@   r@   rA   r     s   
zPySnmpCodeGen.genSimpleSyntaxc           
      C   s   t |dkr|d \}}n1|\}}}}}	|	\}}|| jv r!d| }|r'|| }|r-|| }| jd r8|r8|| }|r>|| }|pD| jd }||fS )NrJ   r   zTextualConvention, r-   zpass
)rP   r1   r<   r   )
r?   rS   rL   r   r   Zdisplayr   r   r   r   r@   r@   rA   genTypeDeclarationRHS0  s    
z#PySnmpCodeGen.genTypeDeclarationRHSc                 C   s    |d }dt | d| d S )Nr   z
.setUnits(r   r   r  r   r@   r@   rA   genUnitsM  s   zPySnmpCodeGen.genUnitsZagentCapabilitiesClauseZmoduleIdentityClauseZmoduleComplianceClauseZnotificationGroupClauseZnotificationTypeClauseZobjectGroupClauseZobjectIdentityClauseZobjectTypeClauseZtrapTypeClausetypeDeclarationZvalueDeclarationZApplicationSyntaxZBitNamesr   ZComplianceModulesZconceptualTablezCONTACT-INFOzDISPLAY-HINTZDEFVALZDESCRIPTIONZ	REFERENCEZStatuszPRODUCT-RELEASEZenumSpecZINDEXZintegerSubTypeZMaxAccessPartZNotificationsZoctetStringSubTypeZobjectIdentifierZObjectszLAST-UPDATEDZORGANIZATIONZ	Revisions)r   ZSEQUENCEZSimpleSyntaxZtypeDeclarationRHSZUNITSZVarTypesc                    s  | dd jd< | dpdd  _| _ j   j   j   j   j	   j
  d  _|\ jd< }}} |pEi \}}|pLg D ]}	|	rl|	d }
|
dk} j|	d    |	d	d  || qM j jd  d
 D ]}| j
vrtd| | j
| 7 }qw|  7 }d|v rddd |d D d | }d jd  | }tjtj@ otd jd |d|pdt|f  t| j jd  jg d g t fdd|D d|fS  t| j jd  jg d g t fdd|D d|fS )NZgenTextsFr-   r   c                 S   s   t dd|S )Nz\s+ )resub)rD   r-   r@   r@   rA   <lambda>  s    z'PySnmpCodeGen.genCode.<locals>.<lambda>r   r!  rJ   Z_symtable_orderzNo generated code for symbol %scommentsrU   c                 S      g | ]}d | qS z# %s
r@   r  r@   r@   rA   r[     r  z)PySnmpCodeGen.genCode.<locals>.<listcomp>#
z5#
# PySNMP MIB module %s (http://snmplabs.com/pysmi)
zIcanonical MIB name %s (%s), imported MIB(s) %s, Python code size %s bytesra   z<none>c                    s   g | ]	}| j vr|qS r@   )fakeMibsr  r>   r@   rA   r[     r_   )r   identityr   ZrevisionZoidsr   Z
complianceZimported)r   r<   r   r=   r3   clearr4   r5   r6   r7   r8   r9   r;   rm   rQ   rR   r	   ZPySmiCodegenErrorrt   rh   r
   loggerflagCodegenrP   r   r:   rN   )r?   astr=   kwargsZ	moduleOidri   Zdeclarationsr  ZimportedModulesZdeclrZ
clausetyperL   Zsymr@   r>   rA   genCode~  sl   





&
 zPySnmpCodeGen.genCodec                 K   s   d}d}|  D ]\}}t|dd }|r |d||f 7 }|d7 }q|d7 }d|v r=dd	d
 |d D d | }d| }tjtj@ oPtd|t|f  |S  |S )Nz>
from pysnmp.proto.rfc1902 import ObjectName

oidToMibMap = {
r   r   zObjectName("%s"): "%s",
rJ   z}
r&  rU   c                 S   r'  r(  r@   r  r@   r@   rA   r[     r  z*PySnmpCodeGen.genIndex.<locals>.<listcomp>r)  z3#
# PySNMP MIB indices (http://snmplabs.com/pysmi)
z*OID->MIB index built, %s entries, %s bytes)r   getattrrh   r
   r-  r.  rP   )r?   Z	processedr0  r  countr^   r   r   r@   r@   rA   genIndex  s$    zPySnmpCodeGen.genIndex)Fr  )NF)FN)F__name__
__module____qualname____doc__ZdefaultMibPackagesrC   re   r*  r   baseMibsr   r/   r  r   r   r   rB   rE   staticmethodrI   rR   rm   rt   rv   rx   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   rQ   r1  r4  r@   r@   r@   rA   r      s   
	


2




 
)

5
2
5

0
/





$
	


K


















	
 !"#$--r   )sysr#  timer   r   keywordr   Zpysmi.mibinfor   Zpysmi.codegen.baser   r   Zpysmir	   r
   version_infor   r  r   r   r   r9  r*  r@   r@   r@   rA   <module>   s.            0
