
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
³Y„jq2  ã               @   sÞ   d Z dddgZddlZddl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 ddlmZ dZdddddddddddgZdddddœZddddœZG d d„ deƒZd!d„ Zd"d„ Zd#d$„ Zd%d&„ Zd'd(„ ZdS ))zThe ipset command wrapperÚipsetÚcheck_ipset_nameÚremove_default_create_optionsé    N)Úerrors)ÚFirewallError)ÚrunProg)Úlog)ÚtempFileÚreadfile)ÚCOMMANDSé    zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netzhash:net,portzhash:net,port,netzhash:net,ifacezhash:macz
inet|inet6Úvaluezvalue in secs)ÚfamilyÚhashsizeÚmaxelemÚtimeoutZinetZ1024Z65536)r   r   r   c               @   sª   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zd'dd„Z	dd„ Z
dd„ Zdd„ Zd(dd„Zd)dd„Zdd„ Zd*dd„Zd+dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS ),r   zipset command wrapper classc             C   s   t d | _d| _d S )Nr   )r   Ú_commandÚname)Úself© r   ú/usr/lib/python3.6/ipset.pyÚ__init__K   s    
zipset.__init__c             C   s^   dd„ |D ƒ}t jd| j| jdj|ƒƒ t| j|ƒ\}}|dkrZtd| jdj|ƒ|f ƒ‚|S )zCall ipset with argsc             S   s   g | ]}d | ‘qS )z%sr   )Ú.0Úitemr   r   r   ú
<listcomp>R   s    zipset.__run.<locals>.<listcomp>z	%s: %s %sú r   z'%s %s' failed: %s)r   Údebug2Ú	__class__r   Újoinr   Ú
ValueError)r   ÚargsZ_argsÚstatusÚretr   r   r   Z__runO   s    zipset.__runc             C   s    t |ƒtkrttjd| ƒ‚dS )zCheck ipset namezipset name '%s' is not validN)ÚlenÚIPSET_MAXNAMELENr   r   ZINVALID_NAME)r   r   r   r   r   Ú
check_nameZ   s    zipset.check_namec             C   s°   g }d}y| j dgƒ}W n0 tk
rH } ztjd| ƒ W Y dd}~X nX |jƒ }d}xT|D ]L}|rš|jƒ jddƒ}|d |krš|d tkrš|j|d ƒ |j	dƒr\d	}q\W |S )
z?Return types that are supported by the ipset command and kernelÚ z--helpzipset error: %sNFé   r   zSupported set types:T)
Ú_ipset__runr   r   Zdebug1Ú
splitlinesÚstripÚsplitÚIPSET_TYPESÚappendÚ
startswith)r   r"   ÚoutputZexÚlinesZin_typesÚlineÚsplitsr   r   r   Úset_supported_types`   s      

zipset.set_supported_typesc             C   s(   t |ƒtks|tkr$ttjd| ƒ‚dS )zCheck ipset typez!ipset type name '%s' is not validN)r#   r$   r,   r   r   ZINVALID_TYPE)r   Ú	type_namer   r   r   Ú
check_typeu   s    zipset.check_typeNc             C   sd   | j |ƒ | j|ƒ d||g}t|tƒrZx0|jƒ D ]$\}}|j|ƒ |dkr2|j|ƒ q2W | j|ƒS )z+Create an ipset with name, type and optionsÚcreater&   )r%   r5   Ú
isinstanceÚdictÚitemsr-   r(   )r   Úset_namer4   Úoptionsr    ÚkeyÚvalr   r   r   Ú
set_create{   s    




zipset.set_createc             C   s   | j |ƒ | jd|gƒS )NZdestroy)r%   r(   )r   r:   r   r   r   Úset_destroyˆ   s    
zipset.set_destroyc             C   s   d||g}| j |ƒS )NÚadd)r(   )r   r:   Úentryr    r   r   r   Úset_addŒ   s    
zipset.set_addc             C   s   d||g}| j |ƒS )NÚdel)r(   )r   r:   rA   r    r   r   r   Ú
set_delete�   s    
zipset.set_deletec             C   s,   d||g}|r"|j ddj|ƒ ƒ | j|ƒS )NÚtestz%sr   )r-   r   r(   )r   r:   rA   r;   r    r   r   r   rE   ”   s    
z
ipset.testc             C   s2   dg}|r|j |ƒ |r"|j|ƒ | j|ƒjdƒS )NÚlistÚ
)r-   Úextendr(   r+   )r   r:   r;   r    r   r   r   Úset_listš   s    

zipset.set_listc             C   s<  | j dgd�}i }d }}i }�x|D �]}t|ƒdk r:q&dd„ |jddƒD ƒ}t|ƒdkr`q&q&|d	 d
krv|d }q&|d	 dkrŒ|d }q&|d	 dkr&|d jƒ }d	}	x^|	t|ƒk �r||	 }
|
dk� rüt|ƒ|	krì|	d7 }	||	 ||
< ntjd|ƒ i S |	d7 }	qªW |�r$|�r$|t|ƒf||< d }}|jƒ  q&W |S )z" Get active ipsets (only headers) z-terse)r;   Né   c             S   s   g | ]}|j ƒ ‘qS r   )r*   )r   Úxr   r   r   r   ¬   s    z.ipset.set_get_active_terse.<locals>.<listcomp>ú:r'   r   ÚNameZTypeZHeaderr   r   r   r   Únetmaskz&Malformed ipset list -terse output: %s)r   r   r   r   rN   )rI   r#   r+   r   Úerrorr   Úclear)r   r0   r"   Ú_nameZ_typeÚ_optionsr1   Zpairr2   ÚiÚoptr   r   r   Úset_get_active_terse¢   sD    

zipset.set_get_active_tersec             C   s   dg}|r|j |ƒ | j|ƒS )NÚsave)r-   r(   )r   r:   r    r   r   r   rV   É   s    
z
ipset.savec             C   sê  | j |ƒ | j|ƒ tƒ }d|kr*d| }d||dg}|rlx0|jƒ D ]$\}}	|j|ƒ |	dkrD|j|	ƒ qDW |jddj|ƒ ƒ |jd| ƒ xN|D ]F}
d|
kr¨d|
 }
|rÈ|jd||
dj|ƒf ƒ q”|jd	||
f ƒ q”W |jƒ  tj	|j
ƒ}tjd
| j| jd|j
|jf ƒ dg}t| j||j
d�\}}tjƒ dk�r¶yt|j
ƒ W n tk
�r`   Y nVX d}xNt|j
ƒD ]@}tjd||f ddd� |jdƒ�s¨tjddd� |d7 }�qrW tj|j
ƒ |dk�rætd| jdj|ƒ|f ƒ‚|S )Nr   z'%s'r6   z-existr&   z%s
z	flush %s
zadd %s %s %s
z
add %s %s
z%s: %s restore %sz%s: %dZrestore)Ústdinr'   rJ   z%8d: %sr   )ÚnofmtÚnlrG   )rX   z'%s %s' failed: %s)r%   r5   r	   r9   r-   Úwriter   ÚcloseÚosÚstatr   r   r   r   r   Úst_sizer   ZgetDebugLogLevelr
   Ú	ExceptionZdebug3ÚendswithÚunlinkr   )r   r:   r4   ÚentriesZcreate_optionsZentry_optionsZ	temp_filer    r<   r=   rA   r]   r!   r"   rS   r1   r   r   r   Úset_restoreÏ   sV    




zipset.set_restorec             C   s   dg}|r|j |ƒ | j|ƒS )NÚflush)r-   r(   )r   r:   r    r   r   r   Ú	set_flush  s    
zipset.set_flushc             C   s   | j d||gƒS )NÚrename)r(   )r   Zold_set_nameZnew_set_namer   r   r   rf     s    zipset.renamec             C   s   | j d||gƒS )NÚswap)r(   )r   Z
set_name_1Z
set_name_2r   r   r   rg     s    z
ipset.swapc             C   s   | j dgƒS )NÚversion)r(   )r   r   r   r   rh     s    zipset.version)N)N)NN)N)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   r%   r3   r5   r>   r?   rB   rD   rE   rI   rU   rV   rc   re   rf   rg   rh   r   r   r   r   r   H   s&   


'

7c             C   s   t | ƒtkrdS dS )z"Return true if ipset name is validFT)r#   r$   )r   r   r   r   r     s    c             C   s8   | j ƒ }x*tD ]"}||krt| || kr||= qW |S )z( Return only non default create options )ÚcopyÚIPSET_DEFAULT_CREATE_OPTIONS)r;   rR   rT   r   r   r   r     s    

c             C   sh   g }xX| j dƒD ]J}y&|jdƒ |jttj|dd�ƒƒ W q tk
rX   |j|ƒ Y qX qW dj|ƒS )z! Normalize IP addresses in entry ú,ú/F)Ústrict)r+   Úindexr-   ÚstrÚ	ipaddressÚ
ip_networkr   r   )rA   Z_entryZ_partr   r   r   Únormalize_ipset_entry&  s    
rv   c             C   sx   t | jdƒƒdkrdS ytj| dd�}W n tk
r<   dS X x4|D ],}|jtj|dd�ƒrDttjdj	| |ƒƒ‚qDW dS )z: Check if entry overlaps any entry in the list of entries ro   rJ   NF)rq   z,Entry '{}' overlaps with existing entry '{}')
r#   r+   rt   ru   r   Úoverlapsr   r   ÚINVALID_ENTRYÚformat)rA   rb   Zentry_networkZitrr   r   r   Úcheck_entry_overlaps_existing2  s    
rz   c             C   s~   ydd„ | D ƒ} W n t k
r&   dS X t| ƒdkr8dS | jƒ  | jdƒ}x.| D ]&}|j|ƒrrttjdj||ƒƒ‚|}qPW dS )z> Check if any entry overlaps any entry in the list of entries c             S   s   g | ]}t j|d d�‘qS )F)rq   )rt   ru   )r   rK   r   r   r   r   E  s    z1check_for_overlapping_entries.<locals>.<listcomp>Nr   zEntry '{}' overlaps entry '{}')	r   r#   ÚsortÚpoprw   r   r   rx   ry   )rb   Zprev_networkZcurrent_networkr   r   r   Úcheck_for_overlapping_entriesB  s    2


r}   )rl   Ú__all__Zos.pathr\   rt   Zfirewallr   Zfirewall.errorsr   Zfirewall.core.progr   Zfirewall.core.loggerr   Zfirewall.functionsr	   r
   Zfirewall.configr   r$   r,   ZIPSET_CREATE_OPTIONSrn   Úobjectr   r   r   rv   rz   r}   r   r   r   r   Ú<module>   sF   
 P	