o
    ô—Afƒ  ã                   @   sÚ   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	Z	e 
d¡Zde_e	jde	jde	jde	jdiZG d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZeeeedœZG dd„ deƒZdS )é    Né   )Ú_zlocation.exportZA1ZA2ZA3ZXDc                   @   sj   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
d„ Ze	dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚOutputWriterÚnetworksÚwNc                 C   st   || _ || _|| _|  ¡ | _|r|| _n| jr t| j| jƒ| _nd| jv r+t	 
¡ | _nt	 ¡ | _|  ¡  |  ¡  d S )NÚb)ÚnameÚfamilyÚ	directoryÚ	_make_tagÚtagÚfÚopenÚfilenameÚmodeÚioÚBytesIOÚStringIOÚinitÚ_write_header)Úselfr   r	   r
   r   © r   ú4/usr/lib/python3.10/site-packages/location/export.pyÚ__init__-   s   


zOutputWriter.__init__c                 C   ó   dS )z<
			To be overwritten by anything that inherits from this
		Nr   ©r   r   r   r   r   E   ó   zOutputWriter.initc                 C   s   d| j j| | jf S )Nz<%s %s f=%s>)Ú	__class__Ú__name__r   r   r   r   r   Ú__repr__K   ó   zOutputWriter.__repr__c                 C   s(   t jdt jdi}d| j| | jd¡f S )NÚ6Ú4z%sv%sú?)ÚsocketÚAF_INET6ZAF_INETr   Úgetr	   )r   Úfamiliesr   r   r   r   N   s   þzOutputWriter._make_tagc                 C   s&   | j rtj | j d| j| jf ¡S d S )Nz%s.%s)r
   ÚosÚpathÚjoinr   Úsuffixr   r   r   r   r   V   s   ÿzOutputWriter.filenamec                 C   r   )z
			The header of the file
		Nr   r   r   r   r   r   [   r   zOutputWriter._write_headerc                 C   r   )z
			The footer of the file
		Nr   r   r   r   r   Ú_write_footera   r   zOutputWriter._write_footerc                 C   ó   | j  d| ¡ d S )Nz%s
©r   Úwrite©r   Únetworkr   r   r   r/   g   r    zOutputWriter.writec                 C   s   |   ¡  | j ¡  dS )z,
			Called when all data has been written
		N)r,   r   Úflushr   r   r   r   Úfinishj   s   zOutputWriter.finishc                 C   sB   t | jtjƒrttdƒƒ‚| j d¡ | jD ]}tj 	|¡ qdS )z,
			Prints the entire output line by line
		z#Won't write binary output to stdoutr   N)
Ú
isinstancer   r   r   Ú	TypeErrorr   ÚseekÚsysÚstdoutr/   )r   Úliner   r   r   Úprints   s   
ÿzOutputWriter.print)NNN)r   Ú
__module__Ú__qualname__r+   r   r   r   r   r   Úpropertyr   r   r,   r/   r3   r:   r   r   r   r   r   )   s    

	r   c                   @   sH   e Zd ZdZdZdZdZdd„ Zedd„ ƒZ	d	d
„ Z
dd„ Zdd„ ZdS )ÚIpsetOutputWriterz
		For ipset
	Úipseté@   g      è?c                 C   s    d| _ | jstd| jj ƒ‚d S )Nr   z%s requires family being set)r   r	   Ú
ValueErrorr   r   r   r   r   r   r   ’   s   ÿzIpsetOutputWriter.initc                 C   s4   | j s| jS t | j | j d¡}tdt |¡ dƒS )z'
			Calculates an optimized hashsize
		é   r@   )r   ÚDEFAULT_HASHSIZEÚmathÚlogÚHASHSIZE_FACTORÚmaxZceil)r   Zexponentr   r   r   Úhashsizeš   s   zIpsetOutputWriter.hashsizec                 C   sN   | j  d| j| jtjkrdndf ¡ | j  d| j ¡ | j  d| j ¡ d S )Nz create %s hash:net family inet%sr!   Ú z% hashsize %8d maxelem 1048576 -exist
z	flush %s
)r   r/   r   r	   r$   r%   rH   r   r   r   r   r   ª   s   þzIpsetOutputWriter._write_headerc                 C   s(   | j  d| j|f ¡ |  jd7  _d S )Nz
add %s %s
r   )r   r/   r   r   r0   r   r   r   r/   ³   s   zIpsetOutputWriter.writec                 C   s4   z| j  d¡ W n tjy   Y d S w |  ¡  d S )Nr   )r   r6   r   ÚUnsupportedOperationr   r   r   r   r   r,   ¹   s   ÿzIpsetOutputWriter._write_footerN)r   r;   r<   Ú__doc__r+   rC   rF   r   r=   rH   r   r/   r,   r   r   r   r   r>   ‚   s    
	r>   c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚNftablesOutputWriterz
		For nftables
	Úsetc                 C   s   | j  d| j ¡ d S )Nzdefine %s = {
)r   r/   r   r   r   r   r   r   Ì   s   z"NftablesOutputWriter._write_headerc                 C   s   | j  d¡ d S )Nz}
r.   r   r   r   r   r,   Ï   s   z"NftablesOutputWriter._write_footerc                 C   r-   )Nz	%s,
r.   r0   r   r   r   r/   Ò   r    zNftablesOutputWriter.writeN)r   r;   r<   rK   r+   r   r,   r/   r   r   r   r   rL   Æ   s    rL   c                   @   s4   e Zd ZdZdZedd„ ƒZedd„ ƒZdd„ Zd	S )
ÚXTGeoIPOutputWriterzo
		Formats the output in that way, that it can be loaded by
		the xt_geoip kernel module from xtables-addons.
	Úwbc                 C   s   | j S ©N)r   r   r   r   r   r   Ý   s   zXTGeoIPOutputWriter.tagc                 C   s   d| j tjkr
d S d S )Nziv%sr!   r"   )r	   r$   r%   r   r   r   r   r+   á   s   zXTGeoIPOutputWriter.suffixc                 C   s    | j  |j¡ | j  |j¡ d S rP   )r   r/   Z_first_addressZ_last_addressr0   r   r   r   r/   å   s   zXTGeoIPOutputWriter.writeN)	r   r;   r<   rK   r   r=   r   r+   r/   r   r   r   r   rN   Ö   s    

rN   )r?   ÚlistZnftablesZxt_geoipc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚExporterc                 C   s   ||| _ | _d S rP   )ÚdbÚwriter)r   rS   rT   r   r   r   r   ò   s   zExporter.__init__c                 C   sN  |D ]¢}t  d| ¡ i }|D ]}| j|||d||< q|D ]}| jd| ||d||< qdd„ |D ƒ}	| jj||	|dd}
|
D ]K}z
||j  |¡ W n	 tyU   Y nw z
||j  |¡ W n	 tyi   Y nw t	D ]}| 
|¡rŠt	| }z	||  |¡ W ql ty‰   Y qlw qlq@| ¡ D ]}| ¡  q|s¤| ¡ D ]}| ¡  qqd S )NzExporting family %s)r	   r
   zAS%sc                 S   s   g | ]
}|t  ¡ vr|‘qS r   )ÚFLAGSÚvalues)Ú.0Úcountry_coder   r   r   Ú
<listcomp>  s    z#Exporter.export.<locals>.<listcomp>T)r	   Úcountry_codesÚasnsZflatten)rE   ÚdebugrT   rS   Zsearch_networksrX   r/   ÚKeyErrorÚasnrU   Zhas_flagrV   r3   r:   )r   r
   r'   Z	countriesr[   r	   ZwritersrX   r^   rZ   r   r1   ÚflagZcountryrT   r   r   r   Úexportõ   sR   ÿÿÿÿ
ÿúÿ

€ÊzExporter.exportN)r   r;   r<   r   r`   r   r   r   r   rR   ñ   s    rR   )r   Z	ipaddressZloggingrD   r(   r$   r7   Zi18nr   Z	_locationZ	getLoggerrE   Z	propagateZNETWORK_FLAG_ANONYMOUS_PROXYZNETWORK_FLAG_SATELLITE_PROVIDERZNETWORK_FLAG_ANYCASTZNETWORK_FLAG_DROPrU   Úobjectr   r>   rL   rN   ZformatsrR   r   r   r   r   Ú<module>   s4   
üYDü