a
    kÄ#dÀž  ã                   @   sj  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZ ddlm  mZ ddl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
„ Z%e%ƒ �rdZ&dZ'dZ(ndZ&dZ'dZ(G dd„ dƒZ)dd„ Z*dd„ Z+G dd„ dƒZ,dd„ Z-G dd„ dƒZ.G dd„ dƒZ/G dd „ d ƒZ0G d!d"„ d"e0ƒZ1G d#d$„ d$ƒZ2G d%d&„ d&e2ƒZ3G d'd(„ d(e2ƒZ4G d)d*„ d*e2ƒZ5dqd,d-„Z6d.d/„ Z7d0d1„ Z8d2d3„ Z9ej:�rd4d5„ Z;d6d7„ Z<nd8d5„ Z;d9d7„ Z<d:d;„ Z=d<d=„ Z>d>d?„ Z?d@dA„ Z@dBdC„ ZAdDdE„ ZBdrdFdG„ZCdsdHdI„ZDdJdK„ ZEdtdMdN„ZFdOdP„ ZGdQdR„ ZHdSdT„ ZIdUdV„ ZJdWdX„ ZKdYdZ„ ZLd[d\„ ZMdud]d^„ZNd_d`„ ZOdvdadb„ZPdcdd„ ZQdwdedf„ZRdgdh„ ZSdidj„ ZTeUdkk�rfejV�rZejWdldm��:ZXe Y¡  e Zdn¡ e[doƒ eTƒ Z\eX�r.dpZ\W d  ƒ n1 �sD0    Y  e ]e\¡ ne ]eTƒ ¡ dS )xz'
Unit testing infrastructure for Scapy
é    )Úprint_functionN)ÚWINDOWSÚDARWIN)Úconf)Úbase64_bytesÚ	bytes_hexÚ	plain_str)ÚDefaultThemeÚBlackAndWhite)Ú
tex_escapec                   C   s>   z$t jrW dS tr tjjdkW S W dS  ty8   Y dS 0 dS )z,
    Check UTF-8 support for the output
    Fzutf-8TN)ÚsixÚPY2r   ÚsysÚstdoutÚencodingÚAttributeError© r   r   úJ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/tools/UTscapy.pyÚ_utf8_support(   s    r   u   â””u   â”�u   âœ“z->z--ÚOKc                   @   s   e Zd Zdd„ ZdS )ÚBunchc                 K   s   t | d|ƒS )NÚ__dict__)Úsetattr)ÚselfÚkwr   r   r   Ú<lambda>C   ó    zBunch.<lambda>N)Ú__name__Ú
__module__Ú__qualname__Ú__init__r   r   r   r   r   B   s   r   c              	   C   sn   d}t dƒD ]B}z
| ƒ }W n* tyD   t ¡ \}}}t d¡ Y q0 d} qPq|sbt |||¡ |sjJ ‚|S )z2Retries the passed function 3 times before failingFé   é   T)ÚrangeÚ	Exceptionr   Úexc_infoÚtimeÚsleepr   Úreraise)ÚfuncÚsuccessÚ_ÚresultÚtÚvÚtbr   r   r   Ú
retry_testF   s    
r0   c                 C   s6   |   d¡r| dd… } tj tj tj t¡d| ¡¡S )z/Resolves a path relative to scapy's root folderú/r"   Nz../../)Ú
startswithÚosÚpathÚabspathÚjoinÚdirnameÚ__file__)Úfnamer   r   r   Ú
scapy_pathX   s
    
ÿr:   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Úno_debug_dissectorz3Context object used to disable conf.debug_dissectorc                 C   s   t j| _dt _d S ©NF)r   Údebug_dissectorÚold_dbg©r   r   r   r   Ú	__enter__c   s    zno_debug_dissector.__enter__c                 C   s   | j t_d S ©N)r>   r   r=   )r   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__g   s    zno_debug_dissector.__exit__N)r   r   r   Ú__doc__r@   rE   r   r   r   r   r;   a   s   r;   c                 C   sH   |   d¡r| d d… } ztj| dd�W S  tyB   t | ¡ Y S 0 d S )Nz.pyéýÿÿÿÚscapy)Úpackage)ÚendswithÚ	importlibÚimport_moduler$   )Únamer   r   r   rL   n   s    
rL   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚFilec                 C   s   || _ | d¡| _|| _d S ©NÚutf8)rM   ÚencodeÚlocalÚURL)r   rM   rS   rR   r   r   r   r    z   s    zFile.__init__c                 C   s   t  t| jƒ¡S rA   )Úbz2Ú
decompressr   rR   r?   r   r   r   Ú	get_local   s    zFile.get_localc                 C   s   | j S rA   )rS   r?   r   r   r   Úget_URL‚   s    zFile.get_URLc                 C   sN   |r|d7 }t || j dƒ�}| |  ¡ ¡ W d   ƒ n1 s@0    Y  d S )Nr1   Úwb)ÚopenrM   ÚwriterV   )r   ÚdirÚfdescr   r   r   rZ   …   s    z
File.writeN)r   r   r   r    rV   rW   rZ   r   r   r   r   rN   y   s   rN   c                   @   sD   e Zd ZedddƒZedddƒZdd„ ZeeƒZd	d
„ ZeeƒZdS )ÚExternal_Filesz
UTscapy.jsz*https://scapy.net/files/UTscapy/UTscapy.jsaE  QlpoOTFBWSZTWWVijKQAAXxfgERUYOvAChIhBAC
/79+qQAH8AFA0poANAMjQAAAGABo0NGEZNBo0
0BhgAaNDRhGTQaNNAYFURJinp
lGaKbRkJiekzSenqmpA0Gm1LFMpRUklVQlK9WUTZYpNFI1IiEWE
FT09Sfj5uO+
qO6S5DQwKIxM92+Zku94wL6V/1KTKan2c66Ug6SmVKy1ZIrgauxMVLF5xLH0lJRQ
u
KlqLF10iatlTzqvw7S9eS3+h4lu3GZyMgoOude3NJ1pQy8eo+X96IYZw+yneh
siPj73m0rnvQ3QX
Z9BJQiZQYQ5/uNcl2WOlC5vyQqV/BWsnr2NZYLYXQLDs/Bf
fk4ZfR4/SH6GfA5Xlek4xHNHqbSsR
bREOgueXo3kcYi94K6hSO3ldD2O/qJXOF
qJ8o3TE2aQahxtQpCVUKQMvODHwu2YkaORYZC6gihEa
llcHDIAtRPScBACAJnU
ggYhLDX6DEko7nC9GvAw5OcEkiyDUbLdiGCzDaXWMC2DuQ2Y6sGf6NcRu
ON7QS
bhHsPc4KKmZ/xdyRThQkGVijKQ=
zUTscapy.cssz+https://scapy.net/files/UTscapy/UTscapy.cssa¾  QlpoOTFBWSZTWbpATIwAAFpfgHwQSB//+Cpj2Q
C//9/6UAS5t7qcLut3NNDp0gxKMmpqaep6n6iP
1J+pPU0yAAaeoaDI0BJCTJqa
j1BoaGhoAAPSAAAJNSRqmmk8TQmj1DT1Hom1HkQABoNDmmJgATAB
MAAJgACYJI
hDQUzCR5Q0niRoaAGgGmZS+faw7LNbkliDG1Q52WJCd85cxRVVKegld8qCRISoto
GD
EGREFEYRW0CxAgTb13lodjuN7E1aCFgRFVhiEmZAZ/ek+XR0c8DWiAKpBgY2
LNpQ1rOvlnoUI1Al
0ySaP1w2MyFxoQqRicScCm6WnQOxDnufxk8s2deLLKlN+r
fvxyTTCGRAWZONkVGIxVQRZGZLeAwH
bpQXZcYj467i85knEOYWmLcokaqEGYGS
xMCpD+cOIaL7GCxEU/aNSlWFNCvQBvzb915huAgdIdD2
ya9ZQGoqrmtommfAxu
7FGTDBNBfir9UkAMmT1KRzxasJ0n2OE+mlgTZzJnhydbJaMtAk8DJzUuvv
Zpc3
CJLVyr8F3NmIQO5E3SJSY3SQnk1CQwlELqFutXjeWWzmiywo7xJk5rUcVOV9+Ro4
96WmXsUr
kKhNocbnFztqPhesccW5kja+KuNFmzdw4DVOBJ2JPhGOYSwCUiwUe2
kOshYBdULUmwYwToAGdgA9
5n3bSpG85LUFIE0Cw78EYVgY0ESnYW5UdfgBhj1w
PiiXDEG2vAtr38O9kdwg3tFU/0okilEjDYDa
EfkomkLUSokmE8g1fMYBqQyyaP
RWmySO3EtAuMVhQqIuMldOzLqWubl7k1MnhuBaELOgtB2TChcS
0k7jvgdBKIef
UkdAf3t2GO/LVSrDvkcb4l4TrwrI7JeCo8pBvXqZBqZJSqbsAziG7QDQVNqdtFGz

EvMKOvKvUQ6mJFigLxBnziGQGQDEMQPSGhlV2BwAN6rZEmLwgED0OrEiSxXDcB
MDskp36AV7IbKa
Cila/Wm1BKhBF+ZIqtiFyYpUhI1Q5+JK0zK7aVyLS9y7GaSr
NCRpr7uaa1UgapVKs6wKKQzYCWsV
8iCGrAkgWZEnDMJWCGUZOIpcmMle1UXSAl
d5OoUYXNo0L7WSOcxEkSGjCcRhjvMRP1pAUuBPRCRA
2lhC0ZgLYDAf5V2agMUa
ki1ZgOQDXQ7aIDTdjGRTgnzPML0V1X+tIoSSZmZhrxZbluMWGEkwwky6
0ObWIM
cEbX4cawPPBVc6m5UUPbEmBANyjtNvTKE2ri7oOmBVKIMLqQKm+4rlmisu2uGSxW
zTov5w
qQDp61FkHk40wzQUKk4YcBlbQT1l8VXeZJYAVFjSJIcC8JykBYZJ1yka
I4LDm5WP7s2NaRkhhV7A
FVSD5zA8V/DJzfTk0QHmCT2wRgwPKjP60EqqlDUaST
/i7kinChIXSAmRgA==
c                 C   s   dd„ t  | j¡D ƒS )Nc                 S   s"   i | ]\}}t |tƒr||j“qS r   )Ú
isinstancerN   rM   ©Ú.0ÚxÚyr   r   r   Ú
<dictcomp>µ   s   
ÿz1External_Files.get_local_dict.<locals>.<dictcomp>©r   Ú	iteritemsr   ©Úclsr   r   r   Úget_local_dict´   s    zExternal_Files.get_local_dictc                 C   s   dd„ t  | j¡D ƒS )Nc                 S   s"   i | ]\}}t |tƒr||j“qS r   )r^   rN   rS   r_   r   r   r   rc   º   s   
ÿz/External_Files.get_URL_dict.<locals>.<dictcomp>rd   rf   r   r   r   Úget_URL_dict¹   s    zExternal_Files.get_URL_dictN)	r   r   r   rN   Ú
UTscapy_jsÚUTscapy_cssrh   Úclassmethodri   r   r   r   r   r]   Ž   s   ÿÿr]   c                   @   s   e Zd Zdd„ ZeeƒZdS )Ú	EnumClassc                 C   s   | j | ¡  S rA   )r   Úupper)rg   ra   r   r   r   Úfrom_stringÂ   s    zEnumClass.from_stringN)r   r   r   ro   rl   r   r   r   r   rm   Á   s   rm   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )ÚFormatr"   é   r!   é   é   é   N)	r   r   r   ÚTEXTÚANSIÚHTMLÚLATEXÚXUNITÚLIVEr   r   r   r   rp   Ç   s   rp   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	TestClassc                 C   s
   t | |ƒS rA   )Úgetattr)r   Úitemr   r   r   Ú__getitem__Ó   s    zTestClass.__getitem__c              	   C   sp   t |tjƒr| ¡ g}|D ]P}| ¡ }| d¡r^z| j |dd … ¡ W qj tyZ   Y qj0 q| j |¡ qd S )Nú-r"   )	r^   r   Ústring_typesÚlowerr2   ÚkeywordsÚremoveÚKeyErrorÚadd)r   ÚkwsZkwdr   r   r   Úadd_keywordsÖ   s    

zTestClass.add_keywordsN)r   r   r   r~   r‡   r   r   r   r   r{   Ò   s   r{   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestCampaignc                 C   sN   || _ d | _d| _g | _tƒ | _d | _d | _d | _d | _	d| _
d| _d| _d S )NÚ r   Fg        )ÚtitleÚfilenameÚheadcommentsÚcampaignÚsetr‚   ÚcrcÚshaÚpreexecÚpreexec_outputÚend_posÚinterruptedÚduration)r   rŠ   r   r   r   r    å   s    zTestCampaign.__init__c                 C   s   | j  |¡ |j | j¡ d S rA   )r�   Úappendr‚   Úupdate)r   Útestsetr   r   r   Úadd_testsetó   s    zTestCampaign.add_testsetc                 C   s   | j d |… | _ d S rA   ©r�   ©r   Úindexr   r   r   Útrunc÷   s    zTestCampaign.truncc                 C   s,   | D ]}|D ]}||_ |d7 }qq|| _d S )Nr"   )Únumr“   )r   ZbeginposÚtsr-   r   r   r   ÚstartNumú   s
    zTestCampaign.startNumc                 C   s
   | j  ¡ S rA   )r�   Ú__iter__r?   r   r   r   r¡     s    zTestCampaign.__iter__c                 c   s   | D ]}|D ]
}|V  qqd S rA   r   )r   rŸ   r-   r   r   r   Ú	all_tests  s    zTestCampaign.all_testsN)	r   r   r   r    r™   r�   r    r¡   r¢   r   r   r   r   rˆ   ä   s   rˆ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestSetc                 C   s*   || _ g | _d| _tƒ | _d | _d| _d S )Nr‰   r"   )rM   ÚtestsÚcommentsrŽ   r‚   r�   Úexpand©r   rM   r   r   r   r      s    zTestSet.__init__c                 C   s   | j  |¡ |j | j¡ d S rA   )r¤   r–   r‚   r—   )r   Útestr   r   r   Úadd_test  s    zTestSet.add_testc                 C   s   | j d |… | _ d S rA   ©r¤   r›   r   r   r   r�     s    zTestSet.truncc                 C   s
   | j  ¡ S rA   )r¤   r¡   r?   r   r   r   r¡     s    zTestSet.__iter__N)r   r   r   r    r©   r�   r¡   r   r   r   r   r£   
  s   r£   c                   @   s(   e Zd Zdd„ Zdd„ Zdd„ ZeZdS )ÚUnitTestc                 C   sH   || _ d| _d| _d| _d| _d| _d| _d| _tƒ | _	d | _
d| _d S )Nr‰   Úpassedr   éÿÿÿÿr"   )rM   r¨   r¥   r,   Úfresultr•   Úoutputrž   rŽ   r‚   r�   r¦   r§   r   r   r   r      s    zUnitTest.__init__c                 C   sr   t jrF| j dd¡| _| j dd¡| _| j dd¡| _| j dd¡| _| jdkr`| | j¡| _n| 	| j¡| _d S )NrP   Úignorer¬   )
r   r   r¨   Údecoder¯   r¥   r,   r*   r®   Úfail)r   Úthemer   r   r   Úprepare-  s    
zUnitTest.preparec                 C   s
   | j dkS )Nr¬   )r,   r?   r   r   r   Ú__nonzero__8  s    zUnitTest.__nonzero__N)r   r   r   r    r´   rµ   Ú__bool__r   r   r   r   r«     s   r«   r!   c                    sæ   t | ƒ�0}t |¡‰ |dkr*tdt | ƒ W d  ƒ n1 s>0    Y  ‡ fdd„}t|dg ƒ|ddƒ|d	g ƒ|d
dƒ|ddƒ|ddƒ|ddƒ|ddƒ|di ƒ|ddƒ|dtjƒ|ddƒ|ddƒ|dg ƒ|dg ƒ|dg ƒ|ddƒd�S )aª  Parse provided json to get configuration
    Empty default json:
    {
      "testfiles": [],
      "breakfailed": true,
      "onlyfailed": false,
      "verb": 3,
      "dump": 0,
      "docs": 0,
      "crc": true,
      "preexec": {},
      "global_preexec": "",
      "outputfile": null,
      "local": true,
      "format": "ansi",
      "num": null,
      "modules": [],
      "kw_ok": [],
      "kw_ko": []
    }

    rq   z %s Loaded config fileNc                    s   | ˆ v rˆ |  S |S rA   r   )ÚkeyÚdefault©Údatar   r   Úget_if_exist[  s    z'parse_config_file.<locals>.get_if_existÚ	testfilesÚbreakfailedTÚremove_testfilesÚ
onlyfailedFÚverbr!   Údumpr   r�   r"   Údocsr‘   Úglobal_preexecr‰   Z
outputfilerR   rž   ÚmodulesÚkw_okÚkw_koÚformatÚansi)r¼   r½   r¾   r¿   rÀ   rÁ   r�   rÂ   r‘   rÃ   ÚoutfilerR   rž   rÄ   rÅ   rÆ   rÇ   )rY   ÚjsonÚloadÚprintÚarrowr   r   r   )Zconfig_pathrÀ   Úconfig_filer»   r   r¹   r   Úparse_config_file?  s,    

,

ñrÏ   c                 C   sª  t dƒ}| j|_d }d }d}|  ¡ D �]~}|d dkr8q$|d dkrd|pN|pN| |dd …  ¡ ¡ q$|d dkr„|dd …  ¡ |_q$|d dkr´t|dd …  ¡ ƒ}| 	|¡ d }q$|d dk�rt
|dd …  ¡ ƒ}||_|d7 }|d u rúd	}t |¡‚| |¡ q$|d d
k�rp|d u�r6| j|dd … 7  _n8|d u�rX| j|dd … 7  _n| j|dd … 7  _q$|d u �r–| ¡ �r¤td| ¡  ƒ‚q$| j|7  _q$|S )NzTest campaignr   ú#ú~r"   ú%ú+ú=z,Please create a test set (i.e. '+' section).Ú*zUnknown content [%s])rˆ   rM   r‹   Ú	readlinesr‡   ÚsplitÚstriprŠ   r£   r™   r«   rž   ÚgetoptÚGetoptErrorr©   r¥   rŒ   Ú
ValueErrorr¨   )Zcampaign_fileÚtest_campaignr˜   r¨   ZtestnbÚlineÚerror_mr   r   r   Úparse_campaign_fileq  sF     





rß   c              
   C   sJ  t dt| jƒd  ƒ t d|  ƒ t dt| jƒd  ƒ | jrP| jrPt d|  ƒ t d|  ƒ t ƒ  | D ]Þ}|jr t d|jdtdd	t|jƒ d
 ƒ |jf ƒ n*t d|jdtdd	t|jƒ d ƒ f ƒ |jrät dd |j¡ ƒ |D ]Z}t d| ƒ d }}|j�rdd |j¡ }|j�r(d| }|�s2|rèt d||f ƒ qèqfd S )NrÐ   rt   z## %(title)s ##zCRC=[%(crc)s] SHA=[%(sha)s]zfrom file %(filename)sz+--[%s]%s(%s)--r   rq   éP   é   z	+--[%s]%sz  kw=%sú,z%(num)03i %(name)sr‰   zkw=%sz
[%(crc)s] z    %s%s)	rÌ   ÚlenrŠ   r�   r�   rM   Úmaxr‚   r6   )rÜ   rŸ   r-   ÚcÚkr   r   r   Údump_campaign›  s,    0*
rç   c                 C   s>  t d|  ƒ t dt| jƒ ƒ t ƒ  t| jƒrNt d| j ¡  dd¡ ƒ t ƒ  | D ]æ}t d|j ƒ t dt|jƒ ƒ t ƒ  t|jƒr¦t d|j ¡  dd¡ ƒ t ƒ  |D ]Œ}t d|j ƒ t dt|jƒ ƒ t ƒ  t|jƒrþt d|j ¡  dd¡ ƒ t ƒ  t dƒ |j 	d¡D ]"}| 
¡  d	¡�st d
| ƒ �qqªqRd S )Nz	%(title)srÔ   ú%sÚ
r‰   r   ú^zUsage example::z	# no_docsz	%s)rÌ   rã   rŠ   rŒ   rØ   ÚreplacerM   r¥   r¨   r×   ÚrstriprJ   )rÜ   rŸ   r-   rÝ   r   r   r   Údocs_campaignµ  s0    


rí   c                 C   s   ddt  | ¡@  S )Nú%08Xì   ÿÿ )ÚzlibÚcrc32©ra   r   r   r   rñ   Ò  s    rñ   c                 C   s   t  | ¡ ¡  ¡ S rA   )ÚhashlibÚsha1Ú	hexdigestrn   rò   r   r   r   rô   Õ  s    rô   c                 C   s   ddt  t| dƒ¡@  S )Nrî   rï   rP   )rð   rñ   Ú	bytearrayrò   r   r   r   rñ   Ø  s    c                 C   s   t  |  d¡¡ ¡  ¡ S rO   )ró   rô   rQ   rõ   rn   rò   r   r   r   rô   Û  s    c                 C   s˜   d}| D ]H}d}|D ]$}|j  ¡ }t|ƒ|_|d| 7 }qt|ƒ|_|d| 7 }qt|ƒ| _t| jƒ�}t| ¡ ƒ| _W d   ƒ n1 sŠ0    Y  d S )Nr‰   ú z )	r¨   rØ   rñ   r�   rY   r‹   rô   Úreadr�   )rÜ   ZdcrŸ   Údtsr-   Údtr\   r   r   r   Úcompute_campaign_digestsß  s    



rû   c                    s:   ˆ r6| D ]}‡ fdd„|j D ƒ|_ qdd„ | jD ƒ| _d S )Nc                    s   g | ]}|j ˆ v r|‘qS r   ©rž   ©r`   r-   rü   r   r   Ú
<listcomp>ó  r   z+filter_tests_on_numbers.<locals>.<listcomp>c                 S   s   g | ]}|j r|‘qS r   rª   ©r`   rŸ   r   r   r   rþ   ô  s   ÿ)r¤   r�   )rÜ   rž   rŸ   r   rü   r   Úfilter_tests_on_numbersð  s    r   c                    sR   dd„ ‰ˆrNˆ  ¡ ‰|r"dd„ ‰ ndd„ ‰ | D ]}‡ ‡‡fdd„|jD ƒ|_q.d S )Nc                    s   t ‡ fdd„| D ƒƒS )Nc                 3   s   | ]}ˆ |kr|V  qd S rA   r   )r`   ræ   ©r   r   r   Ú	<genexpr>ú  r   z5_filter_tests_kw.<locals>.kw_match.<locals>.<genexpr>)Úany)Úlstr   r   r  r   Úkw_matchù  s    z"_filter_tests_kw.<locals>.kw_matchc                 S   s   | S rA   r   rò   r   r   r   r   ÿ  r   z"_filter_tests_kw.<locals>.<lambda>c                 S   s   |  S rA   r   rò   r   r   r   r     r   c                    s    g | ]}ˆ ˆ|j ˆƒƒr|‘qS r   )r‚   rý   ©Zcondr   r  r   r   rþ     r   z$_filter_tests_kw.<locals>.<listcomp>)r�   r¤   )rÜ   r   ZkeeprŸ   r   r  r   Ú_filter_tests_kwø  s    
r  c                 C   s   t | |dƒS )NT©r  ©rÜ   r   r   r   r   Úfilter_tests_keep_on_keywords  s    r
  c                 C   s   t | |dƒS r<   r  r	  r   r   r   Úfilter_tests_remove_on_keywords
  s    r  c                 C   s   dd„ | j D ƒ| _ d S )Nc                 S   s   g | ]}|j r|‘qS r   rª   rÿ   r   r   r   rþ     r   z)remove_empty_testsets.<locals>.<listcomp>rš   )rÜ   r   r   r   Úremove_empty_testsets  s    r  c                 C   s8   ddl m} z|| d||d�W S  |y2   Y dS 0 dS )zRun a test with timeoutr   )ÚStopAutorunTimeouti,  )ÚtimeoutrÀ   Ú
my_globals)z-- Test timed out ! --FN)Zscapy.autorunr  )r¨   Úget_interactive_sessionrÀ   r  r  r   r   r   Ú_run_test_timeout  s    ýr  c           
      C   sì  t   ¡ }t| j ¡ |||d�\| _}d| _�zz,|du s<|rBd| _| j d¡rXd| _t‚W nV ty°   |  jd7  _|  jd 	t
 t ¡ d	 t ¡ d
 t ¡ d ¡¡7  _Y n0 W t   ¡ | | _| jdk�rd	dlm} |j�r|j\}}	|  jd|jtt|	ƒƒf 7  _d|_|  |¡ |dk�r4td|  ƒ n|d
k�rätd|  ƒ n˜t   ¡ | | _| jdk�rªd	dlm} |j�rª|j\}}	|  jd|jtt|	ƒƒf 7  _d|_|  |¡ |dk�rÌtd|  ƒ n|d
k�râtd|  ƒ 0 t| ƒS )z1An internal UTScapy function to run a single test©rÀ   r  ÚfailedNr¬   zKeyboardInterrupt
r”   z-UTscapy: Error during result interpretation:
r‰   r   r"   rq   )Údebugz3

PACKET DISSECTION FAILED ON:
 %s(hex_bytes('%s'))z/%(fresult)6s %(crc)s %(duration)06.2fs %(name)sz%(fresult)6s %(crc)s %(name)s)r&   r  r¨   rØ   r¯   r,   rJ   ÚKeyboardInterruptr$   r6   rD   Úformat_exceptionr   r%   r•   Zscapy.sendrecvr  Z
crashed_onr   r   r   r´   rÌ   Úbool)
r¨   r  r³   rÀ   r  Ú
start_timeÚresr  rg   Úvalr   r   r   Úrun_test   sJ    >
 


ô
 


r  c                 C   sf   t | d< t| d< t| d< t| d< trbddlm} |ƒ  tj| d _tj	j
| d j	_
tjj
| d j_
dS )	z(Adds UTScapy tools directly to a sessionr   r0   r:   r;   r   )Ú_route_add_loopbackr   N)r   r0   r:   r;   r   Zscapy.arch.windowsr  r   ZifacesZrouteZroutesZroute6)Zsesr  r   r   r   Úimport_UTscapy_toolsC  s    r  Fc              	      sf  d }}| j r&|| j  ¡ |d�d | _‡ fdd„}zht| ƒD ]Z\}	}
t|
ƒD ]H\}‰ tˆ ||||d�rp|d7 }n|d7 }|r„||ƒ |  jˆ j7  _qLq<W nT tyî   |d7 }|
 |d ¡ |  |	d ¡ d| _|rêt	dƒ |rê||ƒ Y n0 || _
|| _|j|jgt|ƒ }|d	k�r<t	d
|  ƒ t	|d||f ƒƒ n&|�rbt	d|  ƒ t	|d||f ƒƒ |S )Nr   )r  c                    s   t jdˆ j | d� d S )NznTest '%s' failed. exit() to stop, Ctrl-D to leave this interpreter and continue with the current test campaign)ZbannerrR   )ÚcodeZinteractrM   )Ú	scapy_ses©r-   r   r   Údrop\  s
    üüzrun_campaign.<locals>.dropr  r"   TzCampaign interrupted!rq   z5Campaign CRC=%(crc)s in %(duration)06.2fs SHA=%(sha)szPASSED=%i FAILED=%iz!Campaign CRC=%(crc)s  SHA=%(sha)s)r‘   rØ   r’   Ú	enumerater  r•   r  r�   r”   rÌ   r¬   r  r*   r²   r  )rÜ   r  r³   Údrop_to_interpreterrÀ   r  r¬   r  r!  Úir˜   ÚjÚstyler   r   r   Úrun_campaignQ  sN    þýÿ

r'  c                 C   sh   | j }| j}|dkr"| |d¡}n|dkr6| |d¡}|d u rPdt d¡|f S dt d¡||f S d S )Né
   zbg_red+whiters   ÚredzRun at %s by UTscapy in %sz%H:%M:%Sz$Run at %s from [%s] by UTscapy in %s)r‹   r•   rÇ   r&   Ústrftime)rÜ   r³   r‹   r•   r   r   r   Ú	info_line†  s     þýr+  c                 C   s.   | j }|d u rdt ¡  S dt ¡ |f S d S )NzKRun %s by <a href="http://www.secdev.org/projects/UTscapy/">UTscapy</a><br>zURun %s from [%s] by <a href="http://www.secdev.org/projects/UTscapy/">UTscapy</a><br>)r‹   r&   Úctime©rÜ   r‹   r   r   r   Úhtml_info_lineš  s    r.  c                 C   s:   | j }|d u rddt ¡  fS dt|ƒ dt ¡  fS d S )Nz
by UTscapyrè   zfrom %s by UTscapy)r‹   r&   r,  r   r-  r   r   r   Úlatex_info_line¢  s    r/  c                 C   sÜ   dd„ |j gt| jƒ }dd„ |jgt| jƒ }| d|  ¡}|td t| |ƒ d 7 }||dt d|   ƒ7 }||dt d|   ƒ7 }|d	|  7 }| D ]>}t	d
d„ |D ƒƒr˜|d| 7 }|D ]}|j
r¾|d| 7 }q¾q˜|S )Nc                 S   s   | S rA   r   rò   r   r   r   r   ­  r   z"campaign_to_TEXT.<locals>.<lambda>c                 S   s   | S rA   r   rò   r   r   r   r   ®  r   z
%(title)s
ú ré   z Passed=%(passed)i
z Failed=%(failed)i
z%(headcomments)s
c                 s   s   | ]}|j V  qd S rA   )r¦   rý   r   r   r   r  ·  r   z#campaign_to_TEXT.<locals>.<genexpr>z(######
## %(name)s
######
%(comments)s

z>###(%(num)03i)=[%(result)s] %(name)s
%(comments)s
%(output)s

)r*   r  r¬   r²   r  ÚgreenÚdashr+  rÍ   r  r¦   )rÜ   r³   ZpthemeZfthemer¯   r˜   r-   r   r   r   Úcampaign_to_TEXT¬  s    r3  c                 C   s
   t | |ƒS rA   )r3  )rÜ   r³   r   r   r   Úcampaign_to_ANSIÀ  s    r4  c                 C   st   d}| D ]^}|D ]T}|d|j  dd¡ 7 }|d|j  dd¡ 7 }|d| 7 }|s\|d| 7 }|d7 }qq|d	7 }|S )
Nz4<?xml version="1.0" encoding="UTF-8" ?>
<testsuite>
z <testcase classname="%s"
ú"r0  z           name="%s"
z           duration="0">
z&<error><![CDATA[%(output)s]]></error>
z</testcase>
z</testsuite>)rM   rë   ©rÜ   r¯   r˜   r-   r   r   r   Úcampaign_to_xUNITÄ  s    r7  c                 C   s$  d|  }| j d ur(| jd ur(|d|  7 }|dt| ƒ d 7 }|d | jdd|  | jrXdndd	g¡7 }| D ]¶}|d
| 7 }|j d urŽ|d| 7 }|d| 7 }|D ]v}|d| 7 }|jdkrÆ|d| 7 }n|d| 7 }|j d urè|d| 7 }|d| 7 }|jdk �r|d7 }|d| 7 }qž|d7 }qh|S )Nz
<h1>%(title)s</h1>

<p>
zICRC=<span class=crc>%(crc)s</span> SHA=<span class=crc>%(sha)s</span><br>z<small><em>z</em></small>r‰   z
<p>z#PASSED=%(passed)i FAILED=%(failed)iz1 <span class=warn_interrupted>INTERRUPTED!</span>z<p>

z<h2>z<span class=crc>%(crc)s</span> z %(name)s</h2>
%(comments)s
<ul>
z'<li class=%(result)s id="tst%(num)il">
rq   zñ
<span id="tst%(num)i+" class="button%(result)s" onClick="show('tst%(num)i')" style="POSITION: absolute; VISIBILITY: hidden;">+%(num)03i+</span>
<span id="tst%(num)i-" class="button%(result)s" onClick="hide('tst%(num)i')">-%(num)03i-</span>
zñ
<span id="tst%(num)i+" class="button%(result)s" onClick="show('tst%(num)i')">+%(num)03i+</span>
<span id="tst%(num)i-" class="button%(result)s" onClick="hide('tst%(num)i')" style="POSITION: absolute; VISIBILITY: hidden;">-%(num)03i-</span>
z<span class=crc>%(crc)s</span>
z:%(name)s
<span class="comment %(result)s" id="tst%(num)i" z1 style="POSITION: absolute; VISIBILITY: hidden;" z0><br>%(comments)s
<pre>
%(output)s</pre></span>
z
</ul>

)r�   r�   r.  r6   rŒ   r”   r¦   r6  r   r   r   Úcampaign_to_HTMLÒ  sJ    üû

ýý
ý
r8  c           
      C   sœ   d}| D ]$}|D ]}|D ]}|d| 7 }qqq|d7 }||r@|nddœ}|r‚t j |j¡}	tj |	¡ tj |	¡ | t 	¡ ¡ n| t 
¡ ¡ ||; }|S )Nam  
<html>
<head>
<title>%(title)s</title>
<h1>UTScapy tests</h1>

<span class=control_button onClick="hide_all('tst')">Shrink All</span>
<span class=control_button onClick="show_all('tst')">Expand All</span>
<span class=control_button onClick="show_passed('tst')">Expand Passed</span>
<span class=control_button onClick="show_failed('tst')">Expand Failed</span>

<p>
zO<span class=button%(result)s onClick="goto_id('tst%(num)il')">%(num)03i</span>
zÁ</p>


<link rel="stylesheet" href="%(UTscapy_css)s" type="text/css">
<script language="JavaScript" src="%(UTscapy_js)s" type="text/javascript"></script>
</head>
<body>
%(data)s
</body></html>
úUTScapy tests©rº   rŠ   )r3   r4   r7   Úoutput_filer]   rj   rZ   rk   r—   rh   ri   )
Úrunned_campaignsrº   rR   rŠ   r¯   rÜ   rŸ   r-   Úout_dictr7   r   r   r   Úpack_html_campaigns  s    r>  c                 C   sV   d|  }|t | ƒ; }| D ]8}|d| 7 }|D ]"}t|jƒ|_|jr,|d| 7 }q,q|S )Nz˜
\chapter{%(title)s}
Run %%s on \date{%%s}
\begin{description}
\item[Passed:] %(passed)i
\item[Failed:] %(failed)i
\end{description}

%(headcomments)s

z"\section{%(name)s}

%(comments)s

zt\subsection{%(name)s}

Test result: \textbf{%(result)s}\newline

%(comments)s
\begin{alltt}
%(output)s
\end{alltt}

)r/  r   r¥   r¦   r6  r   r   r   Úcampaign_to_LATEX*  s    
ö	÷
r?  c                 C   s"   d}||r|nddœ}||; }|S )NzÅ
\documentclass{report}
\usepackage{alltt}
\usepackage{xcolor}
\usepackage{a4wide}
\usepackage{hyperref}

\title{%(title)s}

\begin{document}
\maketitle
\tableofcontents

%(data)s
\end{document}\n
r9  r:  r   )r<  rº   rR   rŠ   r¯   r=  r   r   r   Úpack_latex_campaignsK  s    r@  c                   C   s   t dƒ t‚d S )Nap  Usage: UTscapy [-m module] [-f {text|ansi|HTML|LaTeX|xUnit|live}] [-o output_file]
               [-t testfile] [-T testfile] [-k keywords [-k ...]] [-K keywords [-K ...]]
               [-l] [-b] [-d|-D] [-F] [-q[q]] [-i] [-P preexecute_python_code]
               [-c configfile]
-t		: provide test files (can be used many times)
-T		: if -t is used with *, remove a specific file (can be used many times)
-l		: generate local .js and .css files
-F		: expand only failed tests
-b		: don't stop at the first failed campaign
-d		: dump campaign
-D		: dump campaign and stop
-R		: dump campaign as reStructuredText
-C		: don't calculate CRC and SHA
-c		: load a .utsc config file
-i		: drop into Python interpreter if test failed
-q		: quiet mode
-qq		: [silent mode]
-x		: use pyannotate
-n <testnum>	: only tests whose numbers are given (eg. 1,3-7,12)
-N		: force non root
-m <module>	: additional module to put in the namespace
-k <kw1>,<kw2>,...	: include only tests with one of those keywords (can be used many times)
-K <kw1>,<kw2>,...	: remove tests with one of those keywords (can be used many times)
-P <preexecute_python_code>
)rÌ   Ú
SystemExitr   r   r   r   Úusagee  s    rB  c              
   C   s¶  zt | ƒ}W nF tyR } z.t| d| j|f ¡ƒ t d¡ W Y d }~n
d }~0 0 |r^||_|rjt|ƒ t	||ƒ |D ]}t
||ƒ qx|D ]}t||ƒ qŒt|ƒ |rÀt|ƒ |dkrÀt ¡  |rÔt|ƒ t ¡  ||_t||| |||	|d�}|
�r| ¡ D ]}|�rd|_nd|_�q |tjk�r4t||ƒ}nt|tjk�rLt||ƒ}n\|tjk�rl| |¡ t|ƒ}n<|tjk�r‚t|ƒ}n&|tjk�r˜t|ƒ}n|tjk�r¨d}||dk|fS )NzError while parsing '%s': '%s'r"   )r#  rÀ   r  r   rq   r‰   ) rß   rÛ   rÌ   r)  rM   r   Úexitr‘   rû   r   r
  r  r  rç   rí   r;  r'  r¢   r¦   rp   ru   r3  rv   r4  rw   r    r8  rx   r?  ry   r7  rz   )ÚTESTFILEÚ
OUTPUTFILEÚPREEXECÚNUMÚKW_OKÚKW_KOÚDUMPÚDOCSÚFORMATÚVERBÚ
ONLYFAILEDÚCRCÚINTERPRETERÚautorun_funcr³   Ú	pos_beginr  rÜ   Úexræ   r,   r-   r¯   r   r   r   Úexecute_campaign„  sd    ÿ 

ü




rT  c                 C   s<   | d d … D ]*}d|v r|   |¡ |  tt |¡ƒ¡ q| S )NrÕ   )rƒ   ÚextendÚsortedÚglob)Ú	TESTFILESZtfiler   r   r   Úresolve_testfilesÐ  s
    
rY  c            :      C   s¾	  t jdd … } t d¡}| t ¡ ¡ dd l}ttd|j	t j
 d¡d f  ƒ tj}t j}d}d }d}g }g }	d}
d}d}d}d}d}d	}i }g }g }d}d}�z t | d
¡}|d D �]„\}}|dkrÒtƒ  q¸|dkràd}q¸|dkrîd}q¸|dk�r|d8 }q¸|dk�rd}
q¸|dk�r"d}q¸|dk�r2d}
q¸|dk�rBd}q¸|dk�rRd}q¸|dk�rbd}q¸|dk�rz|d| 7 }q¸|dk�rÊzt |¡}W n4 t�yÆ } zt d| ¡‚W Y d }~n
d }~0 0 q¸|dk�rè| |¡ t|ƒ}q¸|dk�rþ| |¡ q¸|dk�rt||ƒ}|j}|j}|j}|j}
|j}|j}|j}|j}|j }|j!�rTdnd}|j"}|j#}| $|j%¡ |	 $|j&¡ zt |j'¡}W n4 t�yÀ } zt d| ¡‚W Y d }~n
d }~0 0 t|ƒ}t|j(ƒD ]<}z| |¡ W n& t)�y   d| }t |¡‚Y n0 �qÔq¸|dk�rR|}t* +t*j, -t*j, .|¡¡t*j/¡�s>t d| ¡‚q¸|d k�rbd}q¸|d!k�räg }d"d#„ | d$¡D ƒD ]\}z| t0|ƒ¡ W nB t)�yÜ   d%d&„ | d'd¡D ƒ\}}| $t1||d ƒ¡ Y n0 �q„q¸|d(k�rôd}q¸|d)k�r
| |¡ q¸|d*k�r&| $| d$¡¡ q¸|d+kr¸|	 $| d$¡¡ q¸W n6 tj�yx } ztd,|ƒ t2‚W Y d }~n
d }~0 0 |tj3tjfv �r”t4ƒ } nt5ƒ } t6j7�rÆ|	 d-¡ |dk�rÆtdt8 d. ƒ z<|�sÜt* 9¡ dk�r |	 d/¡ |dk�r tdt8 d0 ƒ W n t:�y   Y n0 t;j<�s&t=�rJ|	 d1¡ |dk�rJtdt8 d2 ƒ |	 d3¡ t6j7�rlt>�rl|	 d4¡ |�r°zdd5l?m@}! W n tA�yž   tAd6ƒ‚Y n0 |! B¡  |! C¡  |dk�rÊtdt8 d7 ƒ zdd8lmD} W nD tE�y }" z*td9|" ƒ tF G¡  t  Hd¡ W Y d }"~"n
d }"~"0 0 |D ]^}#ztI|#ƒ}$t6jJjKjL M|$jL¡ W n8 tA�y~ }" zt d:|#|"f ¡‚W Y d }"~"n
d }"~"0 0 �q$tjN|jOtj|jPtjQ|jRtjS|jTtjU|jOtj3|jVi}%|dk�rÒtdt8 d; ƒ d	}&d}'d }(tW|ƒdk})t6 XtY Y|¡¡D ]\}*d<|*v �rú||* }+||*= tZ [|*¡D ]2},|+ \d=t*j, ]t*j, |,¡d ¡d ¡}-|-||,< �q �qúd}.g }/dd>l^m_}0 |0ƒ }1t`|1ƒ |D ]Ö}2|dk�r¢t|  atd?|2  ¡ƒ |2|v �r´||2 n|}3tb|2ƒ�F}tc|||3|||	|
|||||||%| |.tY Y|1¡d@�\}4}5}6W d   ƒ n1 �s0    Y  |/ |6¡ |6jd}.|)�r4|6je}(|&|47 }&|5�s~d}'|�r~ �qV�q~|dk�rlttfdA ƒ |�r„|! g¡  |! hdB¡ |tjQk�ržti|/|&||(ƒ}&|tjSk�r¸tj|/|&||(ƒ}&|t jk�rÒt|&|dC� nVtb|dDƒ�:}7|7 kdE|7jlv �söt6j7�	r|& mdFdG¡n|&¡ W d   ƒ n1 �	s0    Y  |dk�	r^|'dk�	rLt|  adH¡ƒ nt|  ndI|' ¡ƒ |dk�	r°to p¡ dk�	rŠtdJƒ tto q¡ ƒ dd lr}8|8 s¡ }9|9�	r°tdKƒ t|9ƒ t j t¡  |'S )LNr"   rH   r   z UTScapy - Scapy %s - %sr0  FTr!   r‰   z"o:t:T:c:f:hbln:m:k:K:DRdCiFqNP:s:xz-hz-bz-Fz-qz-Drq   z-Rz-dz-Cz-iz-xz-Pré   z-fzUnknown output format %sz-tz-Tz-cz Cannot remove %s from test filesz-ozCannot write to file %sz-lz-nc                 s   s   | ]}|  ¡ V  qd S rA   )rØ   )r`   ra   r   r   r   r  =  r   zmain.<locals>.<genexpr>râ   c                 S   s   g | ]}t |ƒ‘qS r   )Úint)r`   Úer   r   r   rþ   A  r   zmain.<locals>.<listcomp>r   z-Nz-mz-kz-KzERROR:Zpython3_onlyz Python 2 modeZ
needs_rootz Non-root modeZnot_libpcapz libpcap modeÚdisabledZlibpcap)Úcollect_typeszPlease install pyannotate !z Booting scapy...)Úallz#[CRITICAL]: Cannot import Scapy: %szcannot import [%s]: %sz Discovering tests files...rÕ   z%name%)Ú_scapy_builtinsz Loading: %s)rR  r  z* All campaigns executed. Writing output...Zpyannotate_results)ÚfilerX   ÚbrP   r°   zUTscapy ended successfullyz UTscapy ended with error code %sz
WARNING: UNFINISHED THREADSz
WARNING: UNFINISHED PROCESSES)ur   ÚargvÚloggingÚ	getLoggerÚ
addHandlerÚStreamHandlerrH   rÌ   r2  Ú__version__Úversionr×   rp   rv   r   rÙ   rB  ro   r„   rÚ   r–   rY  rƒ   rÏ   r½   r¿   rÀ   rÁ   r�   r‘   rÃ   rÉ   r¼   rR   rž   rÄ   rU  rÅ   rÆ   rÇ   r¾   rÛ   r3   Úaccessr4   r7   r5   ÚW_OKrZ  r#   rA  rz   r	   r
   r   r   rÍ   Úgetuidr   r   Zuse_pcapr   r   Zpyannotate_runtimer]  ÚImportErrorZinit_types_collectionÚstartr^  r$   rD   Ú	print_excrC  rL   ÚmovesÚbuiltinsr   r—   ru   Z$autorun_get_text_interactive_sessionZ$autorun_get_ansi_interactive_sessionrw   Z$autorun_get_html_interactive_sessionrx   Z%autorun_get_latex_interactive_sessionry   Z$autorun_get_live_interactive_sessionrã   ÚiterkeysÚcopyrW  Úiglobrë   ÚsplitextZ
scapy.mainr_  r  r1  rY   rT  r“   rŠ   Ú	checkmarkÚstopZ
dump_statsr>  r@  rZ   ÚmoderQ   r)  Ú	threadingÚactive_countr"  ÚmultiprocessingÚactive_childrenÚflush):rb  ÚloggerrH   rL  rE  ZLOCALrG  ZNON_ROOTrH  rI  rJ  rK  rO  ZBREAKFAILEDrN  rM  ZGLOB_PREEXECZPREEXEC_DICTZMODULESrX  ZANNOTATIONS_MODErP  ÚoptsÚoptÚoptargÚmsgrº   ZtestfilerÞ   r.   Úv1Úv2r³   r]  r[  ÚmÚmodrQ  Zglob_outputZglob_resultZ
glob_titleZUNIQUEZprexZpycodeÚglZ_pycoderR  r<  r_  r  rD  rF  r¯   r,   r�   Úfrz  Z	processesr   r   r   ÚmainØ  sÚ   
ÿ










&





$
 

 












 ,ú	

$


û,


ÿ
ÿÿÿ$



rˆ  Ú__main__T)ÚrecordÚerrorz### Warning mode enabled ###r"   )r!   )r!   N)r!   N)Fr!   N)FN)FN)r   N)^rF   Ú
__future__r   rT   rr  r  rÙ   rW  ró   rK   rÊ   rc  r3   Úos.pathr   rx  r&   rD   Úwarningsrð   Zscapy.constsr   r   Zscapy.libs.sixZlibsr   Zscapy.configr   Zscapy.compatr   r   r   Zscapy.themesr	   r
   Zscapy.utilsr   r   rÍ   r2  ru  r   r0   r:   r;   rL   rN   r]   rm   rp   r{   rˆ   r£   r«   rÏ   rß   rç   rí   r   rñ   rô   rû   r   r  r
  r  r  r  r  r  r'  r+  r.  r/  r3  r4  r7  r8  r>  r?  r@  rB  rT  rY  rˆ  r   ÚwarnoptionsÚcatch_warningsZcwÚresetwarningsÚsimplefilterrÌ   r  rC  r   r   r   r   Ú<module>   sÂ   	3&!
2*

  ÿ
#  þ
5
0
(!
!  ý
L  

$