£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
3
YjW                 @   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rt ||< |	|| |	|
f< q|W qbW xP| jD ]F}x@| j| D ]2}
| jj	||
s||k rg ||< || j|
 qW qW |||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||	|
||sy| j||	|
|||d W q tk
r" } ztjt| W Y d d }~X qX qW qW 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	rt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rtt	j
d||||f nB|
| jks|| j|
 krtt	jd||||f | j|
 | }d}d	}|
| jkrt| 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 }qW | 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<   iii)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rttjd|||f n.|| jksn|| j| krt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   