<!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öW  ã               @   sn   d g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	 ddl
mZ ddlmZ G d	d „ d eƒZd
S )ÚFirewallDirecté    )ÚLastUpdatedOrderedDict)Ú	ipXtables)Úebtables)ÚFirewallTransaction)Úlog)Úerrors)ÚFirewallErrorc               @   sL  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	dd„ Z
dNdd„Zdd„ Zdd„ ZdOdd„Zdd„ Zdd„ Zdd„ Zd d!„ ZdPd"d#„ZdQd$d%„Zd&d'„ Zd(d)„ Zd*d+„ ZdRd,d-„ZdSd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ ZdTd<d=„Z dUd>d?„Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dS )Vr   c             C   s   || _ | jƒ  d S )N)Ú_fwÚ_FirewallDirect__init_vars)ÚselfÚfw© r   ú/usr/lib/python3.6/fw_direct.pyÚ__init__'   s    zFirewallDirect.__init__c             C   s   d| j | j| j| jf S )Nz%s(%r, %r, %r))Ú	__class__Ú_chainsÚ_rulesÚ_rule_priority_positions)r   r   r   r   Ú__repr__+   s    zFirewallDirect.__repr__c             C   s"   i | _ i | _i | _i | _d | _d S )N)r   r   r   Ú_passthroughsÚ_obj)r   r   r   r   Z__init_vars/   s
    zFirewallDirect.__init_varsc             C   s   | j ƒ  d S )N)r   )r   r   r   r   Úcleanup6   s    zFirewallDirect.cleanupc             C   s
   t | jƒS )N)r   r
   )r   r   r   r   Únew_transaction;   s    zFirewallDirect.new_transactionc             C   s
   || _ d S )N)r   )r   Úobjr   r   r   Úset_permanent_config@   s    z#FirewallDirect.set_permanent_configc             C   s*   t | jƒt | jƒ t | jƒ dkr&dS dS )Nr   TF)Úlenr   r   r   )r   r   r   r   Úhas_runtime_configurationC   s    "z(FirewallDirect.has_runtime_configurationc             C   sB   | j ƒ rdS t| jjƒ ƒt| jjƒ ƒ t| jjƒ ƒ dkr>dS dS )NTr   F)r   r   r   Úget_all_chainsÚget_all_rulesÚget_all_passthroughs)r   r   r   r   Úhas_configurationH   s    z FirewallDirect.has_configurationNc             C   sP   |d kr| j ƒ }n|}| j| jjƒ | jjƒ | jjƒ f|ƒ |d krL|jdƒ d S )NT)r   Ú
set_configr   r   r   r    Úexecute)r   Úuse_transactionÚtransactionr   r   r   Úapply_directQ   s    

zFirewallDirect.apply_directc             C   s  i }i }i }xL| j D ]B}|\}}x4| j | D ]&}| jj|||ƒs,|j|g ƒj|ƒ q,W qW xf| jD ]\}|\}}}xL| j| D ]>\}	}
| jj||||	|
ƒs|||krªtƒ ||< |	|| |	|
f< q|W qbW xP| jD ]F}x@| j| D ]2}
| jj	||
ƒsÚ||k rþg ||< || j|
ƒ qÚW qÊW |||fS )N)
r   r   Úquery_chainÚ
setdefaultÚappendr   Ú
query_ruler   r   Úquery_passthrough)r   ZchainsÚrulesZpassthroughsÚtable_idÚipvÚtableÚchainÚchain_idÚpriorityÚargsr   r   r   Úget_runtime_configb   s,    


z!FirewallDirect.get_runtime_configc             C   s   | j | j| jfS )N)r   r   r   )r   r   r   r   Ú
get_config   s    zFirewallDirect.get_configc             C   s¾  |d kr| j ƒ }n|}|\}}}x||D ]t}|\}}	xf|| D ]Z}
| j||	|
ƒs<y| j||	|
|d W q< tk
r” } ztjt|ƒƒ W Y d d }~X q<X q<W q&W xŒ|D ]„}|\}}	}
xt|| D ]h\}}| j||	|
||ƒs¼y| j||	|
|||d W q¼ tk
r" } ztjt|ƒƒ W Y d d }~X q¼X q¼W q¤W xx|D ]p}xh|| D ]\}| j	||ƒs@y| j
|||d W n2 tk
r˜ } ztjt|ƒƒ W Y d d }~X nX q@W q2W |d krº|jdƒ d S )N)r$   T)r   r'   Ú	add_chainr	   r   ZwarningÚstrr*   Úadd_ruler+   Úadd_passthroughr#   )r   Zconfr$   r%   r   r   r   r-   r.   r/   r0   Úerrorr1   r2   r3   r   r   r   r"   „   s@    



(

(
,
zFirewallDirect.set_configc             C   s*   dddg}||kr&t tjd||f ƒ‚d S )NÚipv4Úipv6Zebz'%s' not in '%s')r	   r   ZINVALID_IPV)r   r.   Zipvsr   r   r   Ú
_check_ipv«   s    
zFirewallDirect._check_ipvc             C   sF   | j |ƒ |dkrtjjƒ ntjjƒ }||krBttjd||f ƒ‚d S )Nr;   r<   z'%s' not in '%s')r;   r<   )r=   r   ÚBUILT_IN_CHAINSÚkeysr   r	   r   ZINVALID_TABLE)r   r.   r/   Ztablesr   r   r   Ú_check_ipv_table±   s    

zFirewallDirect._check_ipv_tablec             C   s¦   |dkr4t j| }| jjr i }qH| jj|ƒj| }ntj| }tj| }||kr`tt	j
d| ƒ‚||krxtt	j
d| ƒ‚|dkr¢| jjj|ƒd k	r¢tt	jd| ƒ‚d S )Nr;   r<   zchain '%s' is built-in chainzchain '%s' is reservedzChain '%s' is reserved)r;   r<   )r;   r<   )r   r>   r
   Únftables_enabledÚget_direct_backend_by_ipvÚ
our_chainsr   Z
OUR_CHAINSr	   r   ZBUILTIN_CHAINÚzoneZzone_from_chainZINVALID_CHAIN)r   r.   r/   r0   Zbuilt_in_chainsrC   r   r   r   Ú_check_builtin_chainº   s"    




z#FirewallDirect._check_builtin_chainc             C   sH   |r| j j|g ƒj|ƒ n*| j | j|ƒ t| j | ƒdkrD| j |= d S )Nr   )r   r(   r)   Úremover   )r   r-   r0   Úaddr   r   r   Ú_register_chainÐ   s
    zFirewallDirect._register_chainc             C   sV   |d kr| j ƒ }n|}| jjƒ r.|j| jjƒ | jd||||ƒ |d krR|jdƒ d S )NT)r   r
   Úmay_skip_flush_direct_backendsÚadd_preÚflush_direct_backendsÚ_chainr#   )r   r.   r/   r0   r$   r%   r   r   r   r6   Ø   s    

zFirewallDirect.add_chainc             C   s>   |d kr| j ƒ }n|}| jd||||ƒ |d kr:|jdƒ d S )NFT)r   rL   r#   )r   r.   r/   r0   r$   r%   r   r   r   Úremove_chainç   s    
zFirewallDirect.remove_chainc             C   s:   | j ||ƒ | j|||ƒ ||f}|| jko8|| j| kS )N)r@   rE   r   )r   r.   r/   r0   r-   r   r   r   r'   ò   s
    
zFirewallDirect.query_chainc             C   s,   | j ||ƒ ||f}|| jkr(| j| S g S )N)r@   r   )r   r.   r/   r-   r   r   r   Ú
get_chainsù   s
    

zFirewallDirect.get_chainsc             C   sD   g }x:| j D ]0}|\}}x"| j | D ]}|j|||fƒ q$W qW |S )N)r   r)   )r   ÚrÚkeyr.   r/   r0   r   r   r   r      s    zFirewallDirect.get_all_chainsc             C   sZ   |d kr| j ƒ }n|}| jjƒ r.|j| jjƒ | jd||||||ƒ |d krV|jdƒ d S )NT)r   r
   rI   rJ   rK   Ú_ruler#   )r   r.   r/   r0   r2   r3   r$   r%   r   r   r   r8   	  s    

zFirewallDirect.add_rulec             C   sB   |d kr| j ƒ }n|}| jd||||||ƒ |d kr>|jdƒ d S )NFT)r   rQ   r#   )r   r.   r/   r0   r2   r3   r$   r%   r   r   r   Úremove_rule  s    
zFirewallDirect.remove_rulec             C   s2   | j ||ƒ |||f}|| jko0||f| j| kS )N)r@   r   )r   r.   r/   r0   r2   r3   r1   r   r   r   r*   #  s    

zFirewallDirect.query_rulec             C   s6   | j ||ƒ |||f}|| jkr2t| j| jƒ ƒS g S )N)r@   r   Úlistr?   )r   r.   r/   r0   r1   r   r   r   Ú	get_rules)  s
    

zFirewallDirect.get_rulesc          	   C   sR   g }xH| j D ]>}|\}}}x.| j | D ] \}}|j||||t|ƒfƒ q&W qW |S )N)r   r)   rS   )r   rO   rP   r.   r/   r0   r2   r3   r   r   r   r   0  s    
 zFirewallDirect.get_all_rulesc             C   s²   |rr|| j krtƒ | j |< || j | |< || jkr<i | j|< || j| krb| j| |  |7  < q®|| j| |< n<| j | |= t| j | ƒdkr˜| j |= | j| |  |8  < d S )Nr   )r   r   r   r   )r   Úrule_idr1   r2   ÚenableÚcountr   r   r   Ú_register_rule8  s    


zFirewallDirect._register_rulec             C   sV   y| j j| j j|ƒj|ƒS  tk
rP } ztj|ƒ ttj	|ƒ‚W Y d d }~X nX d S )N)
r
   ÚrulerB   ÚnameÚ	Exceptionr   Zdebug2r	   r   ZCOMMAND_FAILED)r   r.   r3   Úmsgr   r   r   ÚpassthroughL  s
    
zFirewallDirect.passthroughc             C   sX   |r*|| j krg | j |< | j | j|ƒ n*| j | j|ƒ t| j | ƒdkrT| j |= d S )Nr   )r   r)   rF   r   )r   r.   r3   rV   r   r   r   Ú_register_passthroughT  s    

z$FirewallDirect._register_passthroughc             C   sX   |d kr| j ƒ }n|}| jjƒ r.|j| jjƒ | jd|t|ƒ|ƒ |d krT|jdƒ d S )NT)r   r
   rI   rJ   rK   Ú_passthroughrS   r#   )r   r.   r3   r$   r%   r   r   r   r9   ^  s    

zFirewallDirect.add_passthroughc             C   s@   |d kr| j ƒ }n|}| jd|t|ƒ|ƒ |d kr<|jdƒ d S )NFT)r   r_   rS   r#   )r   r.   r3   r$   r%   r   r   r   Úremove_passthroughl  s    
z!FirewallDirect.remove_passthroughc             C   s   || j kot|ƒ| j | kS )N)r   Útuple)r   r.   r3   r   r   r   r+   w  s    
z FirewallDirect.query_passthroughc             C   s>   g }x4| j D ]*}x$| j | D ]}|j|t|ƒfƒ qW qW |S )N)r   r)   rS   )r   rO   r.   r3   r   r   r   r    {  s
    z#FirewallDirect.get_all_passthroughsc             C   s4   g }|| j kr0x | j | D ]}|jt|ƒƒ qW |S )N)r   r)   rS   )r   r.   rO   r3   r   r   r   Úget_passthroughs‚  s
    
zFirewallDirect.get_passthroughsc             C   s¼   g }x²|D ]ª}d}x’|D ]Š}y|j |ƒ}W n tk
r>   Y qX t|ƒ|krd||d  krd}||d  jdƒ}x.|D ]&}	|dd… }
|	|
|d < |j|
ƒ qxW qW |s
|j|ƒ q
W |S )z5Split values combined with commas for options in optsFú,é   TN)ÚindexÚ
ValueErrorr   Úsplitr)   )r   r,   ZoptsZ	out_rulesrY   Z	processedÚoptÚiÚitemsÚitemrQ   r   r   r   Úsplit_value‰  s$    


zFirewallDirect.split_valuec          
   C   s*  | j ||ƒ | jj r2|dkr2| jjj||||ƒ |}| jj|ƒ}	| jj rd|	j|||ƒrdd| }n:| jjrž|dd … dkrž|	j|||d d… ƒrž|d d… }|||f}
||f}|ræ|
| jkrä|| j|
 krätt	j
d||||f ƒ‚nB|
| jks|| j|
 krtt	jd||||f ƒ‚| j|
 | }d}d	}|
| jkr”t| j|
 jƒ ƒ}d	}x@|t|ƒk r’||| kr’|| j|
 ||  7 }|d7 }qTW t|ƒg}| j|d
dgƒ}| j|ddgƒ}x<|D ]4}|j|	|	j||||t|ƒƒƒ |d7 }|d7 }qÄW | j||
|||ƒ |j| j||
|| |ƒ d S )Nr;   r<   z	%s_directé   Z_directz"rule '%s' already is in '%s:%s:%s'zrule '%s' is not in '%s:%s:%s'rd   r   z-sz--sourcez-dz--destination)r;   r<   iùÿÿÿiùÿÿÿiùÿÿÿ)r@   r
   rA   rD   Úcreate_zone_base_by_chainrB   Zis_chain_builtinr   r	   r   ÚALREADY_ENABLEDÚNOT_ENABLEDr   Úsortedr?   r   rS   rl   r8   Z
build_rulera   rX   Úadd_fail)r   rV   r.   r/   r0   r2   r3   r%   rL   Úbackendr1   rU   re   rW   Z	positionsÚjZ	args_listÚ_argsr   r   r   rQ   ¥  sZ    




(

zFirewallDirect._rulec             C   sÌ   | j ||ƒ | j|||ƒ ||f}|rV|| jkr„|| j| kr„ttjd|||f ƒ‚n.|| jksn|| j| kr„ttjd|||f ƒ‚| jj|ƒ}|j	||j
|||ƒƒ | j|||ƒ |j| j||| ƒ d S )Nz chain '%s' already is in '%s:%s'zchain '%s' is not in '%s:%s')r@   rE   r   r	   r   ro   rp   r
   rB   Z	add_rulesZbuild_chain_rulesrH   rr   )r   rG   r.   r/   r0   r%   r-   rs   r   r   r   rL     s$    

zFirewallDirect._chainc       
      C   sü   | j |ƒ t|ƒ}|rD|| jkrp|| j| krpttjd||f ƒ‚n,|| jks\|| j| krpttjd||f ƒ‚| jj|ƒ}|rÀ|j	|ƒ |dkrº|j
|ƒ\}}|rº|rº| jjj|||ƒ |}	n
|j|ƒ}	|j||	ƒ | j|||ƒ |j| j||| ƒ d S )Nzpassthrough '%s', '%s'r;   r<   )r;   r<   )r=   ra   r   r	   r   ro   rp   r
   rB   Zcheck_passthroughZpassthrough_parse_table_chainrD   rn   Zreverse_passthroughr8   r^   rr   )
r   rV   r.   r3   r%   Z
tuple_argsrs   r/   r0   ru   r   r   r   r_   '  s0    




zFirewallDirect._passthrough)N)N)N)N)N)N)N)N))Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r!   r&   r4   r5   r"   r=   r@   rE   rH   r6   rM   r'   rN   r   r8   rR   r*   rT   r   rX   r]   r^   r9   r`   r+   r    rb   rl   rQ   rL   r_   r   r   r   r   r   &   sL   	

'	

	




jN)Ú__all__Zfirewall.fw_typesr   Zfirewall.corer   r   Zfirewall.core.fw_transactionr   Zfirewall.core.loggerr   Zfirewallr   Zfirewall.errorsr	   Úobjectr   r   r   r   r   Ú<module>   s   