<!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j%                 @   sf   d Z dgZddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ G dd deZd	S )
zipset backendFirewallIPSet    )log)remove_default_create_optionsnormalize_ipset_entrycheck_entry_overlaps_existingcheck_for_overlapping_entries)IPSet)errors)FirewallErrorc               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	d4ddZ
dd Zdd Zd5ddZdd Zdd Zdd Zd6dd Zd!d" Zd#d$ Zd%d& Zd7d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3S )8r   c             C   s   || _ i | _d S )N)_fw_ipsets)selffw r   /usr/lib/python3.6/fw_ipset.py__init__#   s    zFirewallIPSet.__init__c             C   s   d| j | jf S )Nz%s(%r))	__class__r   )r   r   r   r   __repr__'   s    zFirewallIPSet.__repr__c             C   s   | j j  d S )N)r   clear)r   r   r   r   cleanup,   s    zFirewallIPSet.cleanupc             C   s   || j  krttj|d S )N)
get_ipsetsr
   r	   ZINVALID_IPSET)r   namer   r   r   check_ipset/   s    zFirewallIPSet.check_ipsetc             C   s   || j  kS )N)r   )r   r   r   r   r   query_ipset3   s    zFirewallIPSet.query_ipsetc             C   s   t | jj S )N)sortedr   keys)r   r   r   r   r   6   s    zFirewallIPSet.get_ipsetsc             C   s   t | jdkS )Nr   )lenr   )r   r   r   r   
has_ipsets9   s    zFirewallIPSet.has_ipsetsFc             C   s&   | j | | j| }|r"| j| |S )N)r   r   check_applied_obj)r   r   appliedobjr   r   r   	get_ipset<   s
    


zFirewallIPSet.get_ipsetc             C   s4   g }| j jr|j| j j | j jr0|j| j j |S )N)r   Znftables_enabledappendZnftables_backendZipset_enabledZipset_backend)r   backendsr   r   r   r#   C   s    zFirewallIPSet.backendsc             C   s0   |j | jjkr ttjd|j  || j|j< d S )Nz'%s' is not supported by ipset.)typer   Zipset_supported_typesr
   r	   ZINVALID_TYPEr   r   )r   r    r   r   r   	add_ipsetK   s    zFirewallIPSet.add_ipsetc             C   s   | j | }|jrh| rhy x| j D ]}|j| q"W W qt tk
rd } zttj|W Y d d }~X qtX ntj	d| | j |= d S )Nz,Keeping ipset '%s' because of timeout option)
r   r   r#   set_destroy	Exceptionr
   r	   COMMAND_FAILEDr   debug1)r   r   Zkeepr    backendmsgr   r   r   remove_ipsetQ   s    
 zFirewallIPSet.remove_ipsetc          <   C   s$  | j | }x| j D ]}|jdkr|j }||krd|jksv|jd dksv|j|| d ksvt|j|| d kry|j| W n. tk
r } zt	t
j|W Y d d }~X nX | jjry|j|j|j|j W n0 tk
r } zt	t
j|W Y d d }~X n&X d|_d|jkr,|jd dkr,qy|j|j W n0 tk
rl } zt	t
j|W Y d d }~X nX x|jD ]J}y|j|j| W n0 tk
r } zt	t
j|W Y d d }~X nX qvW qy|j|j|j|j|jd  W n0 tk
r } zt	t
j|W Y d d }~X qX d|_qW d S )Nipsettimeout0r      T)r   r#   r   Zset_get_active_terseoptionsr$   rm_def_cr_optsr&   r'   r
   r	   r(   r   _individual_callsZ
set_creater   	set_flushentriesset_addset_restore)r   r   r    r*   Zactiver+   entryr   r   r   apply_ipset]   sL    


&
zFirewallIPSet.apply_ipsetc             C   s>   x8| j  D ],}| j| }d|_tjd|  | j| q
W d S )NFzApplying ipset '%s')r   r   r   r   r)   r9   )r   r   r    r   r   r   apply_ipsets   s
    
zFirewallIPSet.apply_ipsetsc             C   s   xz| j  D ]n}|jdkrq
x\| j D ]P}y| j| |j| W q$ tk
rr } z|jtjkrb|W Y d d }~X q$X q$W q
W d S )NZnftables)	r#   r   r   check_appliedr&   r
   coder	   NOT_APPLIED)r   r*   r-   r+   r   r   r   flush   s    

zFirewallIPSet.flushTc             C   s   | j ||djS )N)r   )r!   r$   )r   r   r   r   r   r   get_type   s    zFirewallIPSet.get_typec             C   s   t | j|ddjjdS )NT)r   ,)r   r!   r$   split)r   r   r   r   r   get_dimension   s    zFirewallIPSet.get_dimensionc             C   s   | j |}| j| d S )N)r!   r   )r   r   r    r   r   r   r;      s    
zFirewallIPSet.check_appliedc             C   s   |j sttj|jd S )N)r   r
   r	   r=   r   )r   r    r   r   r   r      s    zFirewallIPSet.check_applied_objc             C   s.   | j ||d}d|jkr*|jd dkr*dS dS )N)r   ZfamilyZinet6Zipv6Zipv4)r!   r1   )r   r   r   r    r   r   r   
get_family   s
    
zFirewallIPSet.get_familyc             C   s   | j |dd}t|}tj||j|j ||jkrFttj	d||f t
||j y$x| j D ]}|j|j| q^W W n. tk
r } zttj|W Y d d }~X n&X d|jks|jd dkr|jj| d S )NT)r   z'%s' already is in '%s'r.   r/   )r!   r   r   check_entryr1   r$   r5   r
   r	   ZALREADY_ENABLEDr   r#   r6   r   r'   r(   r"   )r   r   r8   r    r*   r+   r   r   r   	add_entry   s    
zFirewallIPSet.add_entryc             C   s   | j |dd}t|}||jkr4ttjd||f y$x| j D ]}|j|j| q@W W n. t	k
r } zttj
|W Y d d }~X n&X d|jks|jd dkr|jj| d S )NT)r   z'%s' not in '%s'r.   r/   )r!   r   r5   r
   r	   ZNOT_ENABLEDr#   Z
set_deleter   r'   r(   r1   remove)r   r   r8   r    r*   r+   r   r   r   remove_entry   s    
zFirewallIPSet.remove_entryc             C   sD   | j |dd}t|}d|jkr:|jd dkr:ttj|||jkS )NT)r   r.   r/   )r!   r   r1   r
   r	   ZIPSET_WITH_TIMEOUTr5   )r   r   r8   r    r   r   r   query_entry   s
    zFirewallIPSet.query_entryc             C   s   | j |dd}|jS )NT)r   )r!   r5   )r   r   r    r   r   r   get_entries   s    zFirewallIPSet.get_entriesc             C   s@  | j |dd}t| x|D ]}tj||j|j qW d|jksN|jd dkrT||_y"x| j D ]}|j|j	 q`W W n. t
k
r } zttj|W Y d d }~X nX d|_yXxR| j D ]F}| jjrx8|jD ]}|j|j	| qW q|j|j	|j|j|jd  qW W n0 t
k
r4 } zttj|W Y d d }~X nX d|_d S )NT)r   r.   r/   )r!   r   r   rD   r1   r$   r5   r#   r4   r   r'   r
   r	   r(   r   r   r3   r6   r7   )r   r   r5   r    r8   r*   r+   r   r   r   set_entries   s.    
zFirewallIPSet.set_entriesN)F)F)T)T)__name__
__module____qualname__r   r   r   r   r   r   r   r!   r#   r%   r,   r9   r:   r>   r?   rB   r;   r   rC   rE   rG   rH   rI   rJ   r   r   r   r   r   "   s0   

1

		N)__doc____all__Zfirewall.core.loggerr   Zfirewall.core.ipsetr   r2   r   r   r   Zfirewall.core.io.ipsetr   Zfirewallr	   Zfirewall.errorsr
   objectr   r   r   r   r   <module>   s   