a
    Ó#d<  ã                   @   s*  d dl mZmZmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZ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mZ d d	l T d dl!Z!ee"ƒZ#d
e#j$d< e
ƒ Z%dd„ Z&dd„ Z'dd„ Z(dHdd„Z)dd„ Z*dIdd„Z+e#j,ddgd�dd„ ƒZ-e#j,ddgd�dd „ ƒZ.e# ,d!¡d"d#„ ƒZ/e#j,d$dgd�d%d&„ ƒZ0e# ,d'¡d(d)„ ƒZ1d*d+gZ2e# ,d,¡d-d.„ ƒZ3e# ,d/¡d0d1„ ƒZ4e# ,d2¡d3d4„ ƒZ5d5d6„ Z6d7d8„ Z7e# ,d9¡d:d;„ ƒZ8e# ,d<¡d=d>„ ƒZ9e# ,d?¡d@dA„ ƒZ:e# ,dB¡dCdD„ ƒZ;e"dEk�r&e#j<dFddG� dS )Jé    )ÚFlaskÚrender_templateÚjsonifyÚrequestÚredirectÚurl_for)Úresource)ÚClient)Ú	setdiff1d)Úsession)ÚfindallÚsearchÚ	MULTILINEN)Úsecure_filename)Ú*z/var/www/html/gsl.tools/publicÚUPLOAD_FOLDERc              	   C   sÜ   g }g }d}|D ]J}z2t  | ¡ ¡}|jdkr:| |¡ n
| |¡ W q tyX   Y q0 qdd„ |D ƒ}dd„ |D ƒ}|  ¡ } t  |¡D ] }	|d|	j ¡ › d| › d� }qŠt  |¡D ] }
|d|
j ¡ › d| › d� }q¶|S )	NÚ é   c                 S   s   g | ]}t  |d ¡‘qS ©F)Ú	ipaddressZIPv4Network©Ú.0Ú_© r   ú/var/www/html/gsl.tools/main.pyÚ
<listcomp>&   ó    z subnet_crush.<locals>.<listcomp>c                 S   s   g | ]}t  |d ¡‘qS r   )r   ZIPv6Networkr   r   r   r   r   '   r   ú"z","z",
)r   Z
ip_networkÚstripÚversionÚappendÚ
ValueErrorZcollapse_addressesZwith_prefixlen)ÚdescriptionZ
input_listZsubnets6Zsubnets4Z	to_returnÚnetÚnZipv4sZipv6sZipv4Zipv6r   r   r   Úsubnet_crush   s&    
r%   c                 C   sf   | sdS zBt | ƒ} | dkr(d| d  W S | dkr>d| d  W S d|  W S W n ty`   |  Y S 0 d S )Nr   i@B z%d Tiè  z%d Gz%d M)Úintr!   )Úvaluer   r   r   Úpretty_speed3   s    r(   c                 C   sR   | j j| j| jd� ¡ }|s6| j j| jd� d¡ ¡ }|sN| j  ¡  d¡ ¡ }|S )N)ÚstatusÚid)r)   r*   )Z	ixlan_setÚfilterr)   r*   ÚfirstZorder_byÚall)ÚixÚixlanr   r   r   Úget_primary_ixlanA   s    r0   Tc                 C   sž   |r"t  tj| ¡}t|ƒj ¡ }nt  tj| ¡}|j ¡ }i }|D ]F}|rR|j}n|j	j
}||v rz|| d  |j7  < qBd|ji||< qB|t| ¡ ƒ|jfS )NÚspeed)ÚpdbÚgetr   ÚInternetExchanger0   Znetixlan_setr-   ÚNetworkZnet_idr/   r*   r1   ÚlistÚkeysÚname)r*   r.   ÚfieldÚmembersZnetworksÚmemberZ	cmp_fieldr   r   r   Úget_membersK   s    
r<   c                 C   s    | |v rt ||  d ƒS dS d S )Nr1   r   )r(   )Z	member_idr.   r   r   r   Ú	member_on`   s    r=   c                 C   s(   |rt  tj| ¡jS t  tj| ¡jS d S )N)r2   r3   r   r5   r8   r4   )r*   r.   r   r   r   Ú
id_to_namef   s    r>   z/pcap-upÚPOST)Úmethodsc               
   C   sz  d} dt jvrd} t jd }|jdkr*d} |�rjtj tjd d¡}tj tjd d¡}tt j	d	 ƒ}| 
|¡ d }zÂt|dd
��Š}d}d}t |¡}	|	D ]b}
d }ztt |
d ¡ƒ}|d7 }W n   |d7 }Y qšY n0 t||dd� |dkrš||krš qþqšW d   ƒ n1 �s0    Y  tddd|jdd�d�W S  t�yh } zdt|ƒ } W Y d }~n
d }~0 0 tddd| d�S )NzUnknown failure has happenedÚfilezNo file partr   zNo selected filer   z
upload.csvzfiltered.pcapÚlimit)Únewliner   Zpdué   T)r    zoutput.htmlzLast PDUzBringing you the latest in PDUs)Údump)ÚtitleÚsubtitlerE   z-Your honour, my client pleads oopsie daisy - )r   ÚfilesÚfilenameÚosÚpathÚjoinÚappÚconfigr&   ÚformÚsaveÚopenÚcsvZ
DictReaderZEtherÚbytesÚfromhexZwrpcapr   ZshowÚ	ExceptionÚstr)ZfailurerA   Zsrc_fileZtmp_filerB   ÚpacketZcsvfileZparsed_counterZfailed_counterZ
pdu_readerÚrowÚer   r   r   Úpcap_upl   s>    





6"rZ   z
/ip-lookupc               	   C   sÒ   t jd } t d¡}g }d}td| tƒD ]Ž}| |¡}i }|d u rdd|d< d|d< d|d< d|d	< n0|d
 |d< |d |d< |d |d< |d |d	< |d7 }||d< ||d< | |¡ q(tdddg d¢|ddd�S )NÚinputzipnetdb_prefix_latest.mmdbr   z/(?:(?:25[0-5]|(?:2[0-4]|1\d|[1-9]|)\d)\.?\b){4}ZUNKNOWNú	AS EntityÚASÚOriginÚPrefixZ	as_entityÚasZprefix_originsÚprefixrD   ÚIPÚRankúgeneric.htmlz	IP LookupzPowered by Leakage)r_   rb   rc   r\   r]   r^   )rF   rG   r7   ÚrowsZcanvas_count_1Zcanvas_count_2)	r   rO   Ú	maxminddbZopen_databaseÚ
re_findallÚre_multiliner3   r    r   )r'   Úreaderre   ZrankÚipZip_dataÚdatar   r   r   Úip_lookup_htmlŸ   s*    



rl   z/eyeballc            
      C   s>  g } g }i }i }i }t ddƒ�}t |¡}W d   ƒ n1 s>0    Y  t ddƒ�}t |¡}W d   ƒ n1 sr0    Y  t ddƒ�}t |¡}W d   ƒ n1 s¦0    Y  t| ¡ ƒt| ¡ t| ¡ ƒ ƒ }|D �]L}i }| t|ƒ¡}| t|ƒ¡}	zà|| |d< ||d< |	d u �r@d|d< d|d	< d|d
< d|d< n8|	 d¡|d< |	 d¡|d	< |	 d¡|d
< |	 d¡|d< |d u �r¤d|d< d|d< d|d< d|d< n8| d¡|d< | d¡|d< | d¡|d< | d¡|d< W n<   d|d< d|d< d|d< d|d	< d|d
< d|d< Y n0 |  |¡ qØt	dddg d¢| d�S )Nzau-rankings.jsonÚrzus-rankings.jsonzasn-lookup.jsonÚNameÚASNú-úAU Eyeball SamplesúAU Peer CountúAU CONE SizeúAU Domains HostedÚesZpcÚcsZdhúUS Eyeball SamplesúUS Peer CountúUS CONE SizeúUS Domains HostedzERROR OCCURREDrd   zRanking DatazPowered by Memes)
rn   ro   rq   rr   rs   rt   rw   rx   ry   rz   )rF   rG   r7   re   )
rQ   ÚjsonÚloadr6   r7   Úsetr3   rV   r    r   )
re   r7   Zau_rankings_jsonZus_rankings_jsonZasn_lookup_jsonZJSONÚkeyrk   ÚusZaur   r   r   Úeyeball_html¾   s\    ((($




r€   z/subnet-crushc                  C   s6   t jd } t jd  ¡ }t| |ƒ}tdd|t|ƒd�S )Nr"   Ú	addresseszsubnet-crush.htmlzSubnet Crusher)rF   Úcrushedre   )r   rO   Ú
splitlinesr%   r   Úlen)r"   r�   r‚   r   r   r   Úsubnet_crush_displayû   s    

r…   z/ix/nbn/<loc_id>c                 C   sh   t d| ƒsdS tƒ }|j dddœ¡ | d| › d�¡}|jsBdS | ¡ }tdd	i |d
 ¥|d ¥d�S )Nz^LOC\d{12}$)r   i�  zNMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0z*https://www.nbnco.com.au/learn/rollout-map)z
User-AgentZRefererz.https://places.nbnco.net.au/places/v2/details/z?source=website_rollout_mapznbn.htmlZNBNZservingAreaZaddressDetail)rF   Úloc_data)Ú	re_searchr   ÚheadersÚupdater3   Úokr{   r   )Zloc_idZnbn_sessionZloc_responser†   r   r   r   Únbn_display_html  s    
þr‹   r#   r.   zK/ix/cmp4/<int:ix_id_a>/<int:ix_id_b>/<int:ix_id_c>/<int:ix_id_d>/<int:mode>c                 C   sŽ  |dkrpt  tj¡j| d� ¡ j} t  tj¡j|d� ¡ j}t  tj¡j|d� ¡ j}t  tj¡j|d� ¡ j}t| |dkƒ}t||dkƒ}t||dkƒ}t||dkƒ}t|d |d  |d  |d  ƒ}	t|d ƒt|d ƒ@ t|d ƒ@ t|d ƒ@ }
g }t|	ƒD ]V}| 	|t
||dkƒ||
v t||d ƒt||d ƒt||d ƒt||d ƒdœ¡ �qtdd|d |d |d |d g|t| d�S )	NrD   ©Úasnr   )r*   r8   r-   ÚaÚbÚcÚdzix4.htmlÚHomeé   ©rF   Ú	out_namesÚout_allÚtype©r2   r-   r   r5   r+   r,   r*   r<   r}   r    r>   r=   r   ÚTYPES)Úix_id_aÚix_id_bÚix_id_cZix_id_dÚmodeÚix_aÚix_bÚix_cZix_dÚix_allÚ	ix_on_allr–   r*   r   r   r   Úfactors4_display_raw_html  s    $0Tr£   z=/ix/cmp3/<int:ix_id_a>/<int:ix_id_b>/<int:ix_id_c>/<int:mode>c                 C   s>  |dkrVt  tj¡j| d� ¡ j} t  tj¡j|d� ¡ j}t  tj¡j|d� ¡ j}t| |dkƒ}t||dkƒ}t||dkƒ}t|d |d  |d  ƒ}t|d ƒt|d ƒ@ t|d ƒ@ }g }	t|ƒD ]H}
|	 	|
t
|
|dkƒ|
|v t|
|d ƒt|
|d ƒt|
|d ƒdœ¡ qÌtdd|d |d |d g|	t| d�S )	NrD   rŒ   r   )r*   r8   r-   rŽ   r�   r�   zix3.htmlr’   r“   r”   r˜   )rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r–   r*   r   r   r   Úfactors3_display_raw_html/  s    $Fr¤   z//ix/cmp2/<int:ix_id_a>/<int:ix_id_b>/<int:mode>c           	      C   sð   |dkr<t  tj¡j| d� ¡ j} t  tj¡j|d� ¡ j}t| |dkƒ}t||dkƒ}t|d |d  ƒ}t|d ƒt|d ƒ@ }g }t|ƒD ]<}| 	|t
||dkƒ||v t||d ƒt||d ƒdœ¡ q�tdd|d |d g|t| d�S )	NrD   rŒ   r   )r*   r8   r-   rŽ   r�   zix2.htmlr’   r“   r”   r˜   )	rš   r›   r�   rž   rŸ   r¡   r¢   r–   r*   r   r   r   Úfactors2_display_raw_htmlC  s    :r¥   c                 C   sÄ   i }t  d| › d�¡�š}| ¡ D ]€}zP|d d d d d |d d d d d  |d d d d d  d	 }W n   d}Y n0 t|d
 ƒ}t|d	ƒ||< q W d   ƒ n1 s¶0    Y  |S )Nz+https://atlas.ripe.net/api/v2/measurements/z/results/?format=jsonÚresultéÿÿÿÿr   ZrttrD   r“   é   Zprb_id)Úrequestsr3   r{   r&   Úround)Z	result_idr¦   ÚreqZprobeZpingZxxxr   r   r   Úget_atlas_timesU  s    P
.r¬   c                 C   s   dS 1 s
0    Y  d S )N)rD   r“   z%https://atlas.ripe.net/api/v2/probes/z/?format=jsonZasn_v4Zcountry_code)r©   r3   r{   )Zprobe_idr«   Zdetailr   r   r   Úget_probe_detailsf  s      r­   z8/ix/atlas/cmp3/<int:ix_id_a>/<int:ix_id_b>/<int:ix_id_c>c           	      C   sŒ   t | ƒ}t |ƒ}t |ƒ}g }t| ¡ ƒD ]L}t|ƒ}z2| ||d |d ||| || || dœ¡ W q(   Y q(0 q(tdd| ||g|d�S )NrD   r   )r*   Zcountryr�   r8   rŽ   r�   r�   zatlas3.htmlr’   )rF   r•   r–   )r¬   Úsortedr7   r­   r    r   )	rš   r›   rœ   rž   rŸ   r    r–   r*   Zprobe_detailr   r   r   Úatlas_display_raw_htmll  s    2r¯   z/ix/mapc                  C   sZ   t jddddd�} | jt jjd�}g }| d¡ | ¡ D ]}| |d ¡ q8tdd	|d
�S )NÚlatancyÚxxú10.100.17.89©ÚuserÚpasswordÚhostZdatabase©Zcursor_factoryz0select distinct host from ping order by host ascr¶   zmap.htmlr’   )rF   Z
collectors)	Úpsycopg2ÚconnectÚcursorÚextrasÚ
DictCursorÚexecuteÚfetchallr    r   )Ú
connectionrº   ÚoutÚxr   r   r   Úmap_display}  s    
rÂ   z/ix/map/data/<collector>c              	   C   s–   t jddddd�}|jt jjd�}| d| f¡ | ¡ d }| d| |f¡ g }| ¡ D ].}| |d	 |d
 |d |d |d dœ¡ qXt	||dœƒS )Nr°   r±   r²   r³   r·   zbselect date_trunc('minute', time) as t_time from ping where host = %s order by t_time DESC LIMIT 1r   a%  select ping.url as metric,CONCAT('AS', network) as asn,latitude,longitude,minimum_response_ms AS average_response_ms from ping left join ping_points ON (ping.url = ping_points.url) where host = %s and minimum_response_ms is not null and latitude is not null and date_trunc('minute', time) = %sÚmetricr�   ÚlatitudeÚ	longitudeZaverage_response_ms)Úurlr�   rÄ   rÅ   Úms)ÚtimeZpoints)
r¸   r¹   rº   r»   r¼   r½   Zfetchoner¾   r    r   )Z	collectorr¿   rº   Z
fetch_timerÀ   rÁ   r   r   r   Úmap_data‰  s    ,rÉ   ú/c                   C   s   t dƒS )Nz
index.html)r   r   r   r   r   Ú
index_pageš  s    rË   Ú__main__z0.0.0.0)r¶   Údebug)T)T)=Zflaskr   r   r   r   r   r   Z	peeringdbr   Zpeeringdb.clientr	   Znumpyr
   r©   r   Úrer   rg   r   r‡   r   rh   Zsqlite3Zgeoip2.databaseZgeoip2r¸   Zpsycopg2.extrasr{   r   rf   Zwerkzeug.utilsr   Z	scapy.allrR   Ú__name__rM   rN   r2   r%   r(   r0   r<   r=   r>   ZrouterZ   rl   r€   r…   r‹   r™   r£   r¤   r¥   r¬   r­   r¯   rÂ   rÉ   rË   Úrunr   r   r   r   Ú<module>   sf    




2

<









