<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</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 rt||	kr|	d7 }	||	 ||
< ntjd| i S |	d7 }	qW |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rd|
 }
|r|jd||
dj|f  q|jd	||
f  qW |j  tj	|j
}tjd
| j| jd|j
|jf  dg}t| j||j
d\}}tj dkryt|j
 W n tk
r`   Y nVX d}xNt|j
D ]@}tjd||f ddd |jdstjddd |d7 }qrW tj|j
 |dkrt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	