<!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jy                 @   s   d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZmZmZmZmZmZ d dl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 )    N)	SHORTCUTSDEFAULT_ZONE_TARGETSOURCE_IPSET_TYPES)FirewallTransaction)Policy)log)	Rich_Service	Rich_PortRich_ProtocolRich_SourcePortRich_ForwardPortRich_IcmpBlockRich_IcmpTypeRich_Masquerade	Rich_Mark)checkIPnMaskcheckIP6nMask	check_mac)errors)FirewallError)LastUpdatedOrderedDictc               @   sN  e Zd 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dd Zdd Zdd Zdd Zdd Zdd Zddd Zd!d" Zd#d$ Zd%d& Zdd'd(Zd)d* Zd+d, Zd-d. Zdd/d0Zdd1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!dd@dAZ"dBdC Z#ddDdEZ$ddFdGZ%ddHdIZ&dJdK Z'dLdM Z(dNdO Z)ddQdRZ*ddSdTZ+ddUdVZ,dWdX Z-ddYdZZ.dd[d\Z/d]d^ Z0d_d` Z1dadb Z2ddcddZ3dedf Z4dgdh Z5didj Z6dkdl Z7dmdn Z8dodp Z9ddqdrZ:dsdt Z;dudv Z<dwdx Z=ddydzZ>d{d| Z?d}d~ Z@dd ZAdddZBdd ZCdd ZDdd ZEdd ZFdddZGdd ZHdd ZIdd ZJdddZKdd ZLdd ZMdd ZNdddZOdd ZPdd ZQdddZRdddZSdddZTdd ZUdddZVdd ZWdd ZXdd ZYdddZZdd Z[dd Z\dd Z]dd Z^dd Z_dddZ`dd ZadddZbddĄ ZcddƄ ZddS )FirewallZoner   c             C   s   || _ i | _i | _d S )N)_fw_zones_zone_policies)selffw r   /usr/lib/python3.6/fw_zone.py__init__&   s    zFirewallZone.__init__c             C   s   d| j | jf S )Nz%s(%r))	__class__r   )r   r   r   r   __repr__+   s    zFirewallZone.__repr__c             C   s   | j j  | jj  d S )N)r   clearr   )r   r   r   r   cleanup.   s    
zFirewallZone.cleanupc             C   s
   t | jS )N)r   r   )r   r   r   r   new_transaction2   s    zFirewallZone.new_transactionc             C   s   dj ||dS )Nzzone_{fromZone}_{toZone})fromZonetoZone)format)r   r%   r&   r   r   r   policy_name_from_zones5   s    z#FirewallZone.policy_name_from_zonesc             C   s   t | jj S )N)sortedr   keys)r   r   r   r   	get_zones:   s    zFirewallZone.get_zonesc             C   s8   g }x.| j  D ]"}| j|s&| j|r|j| qW |S )N)r+   list_interfaceslist_sourcesappend)r   Zactive_zoneszoner   r   r   get_active_zones=   s
    zFirewallZone.get_active_zonesc             C   s6   | j |}x&| jD ]}|| j| jd kr|S qW d S )N
interfaces)_FirewallZone__interface_idr   settings)r   	interfaceinterface_idr/   r   r   r   get_zone_of_interfaceD   s
    
z"FirewallZone.get_zone_of_interfacec             C   s6   | j |}x&| jD ]}|| j| jd kr|S qW d S )Nsources)_FirewallZone__source_idr   r3   )r   source	source_idr/   r   r   r   get_zone_of_sourceL   s
    
zFirewallZone.get_zone_of_sourcec             C   s   | j j|}| j| S )N)r   
check_zoner   )r   r/   zr   r   r   get_zoneT   s    zFirewallZone.get_zonec             C   sB  t  }|j|_| j|||_| j|_|j|_|g|_|g|_ xdD  ]}||jkr~|d	kr~|dkr~t	||t
jt|| qD|d
kr||jkr|dkrt	||t
jt|| qD||jko|d
ko|dk rt	||t
jt|| qD|dkrDg |_xB|jD ]8}| j||}|| j|j|k r|jjt
j|  qW qDW |S )Nservicesports
masqueradeforward_portssource_portsicmp_blocksrules	protocolsHOSTANY)r?   r@   rA   rB   rC   rD   rE   rF   )r?   r@   rC   rD   rF   )rA   )rD   rB   )rE   )r   nameZderived_from_zoner(   ZONE_POLICY_PRIORITYZprioritytargetZingress_zonesZegress_zonessetattrcopydeepcopygetattrrE   _rich_rule_to_policiesr.   )r   z_objr%   r&   p_objZsettingruleZcurrent_policyr   r   r   policy_obj_from_zone_objX   s6       

z%FirewallZone.policy_obj_from_zone_objc             C   s   dd d	D |_ || j|j< g | j|j< xX|jdfd|jf|jdfgD ]8\}}| j|||}| jjj| | j|j j|j qFW | j	|j d S )
Nc             S   s   i | ]}t  |qS r   )r   ).0xr   r   r   
<dictcomp>   s   z)FirewallZone.add_zone.<locals>.<dictcomp>r1   r7   icmp_block_inversionforwardrG   rH   )r1   r7   rX   rY   )
r3   r   rI   r   rT   r   policyZ
add_policyr.   copy_permanent_to_runtime)r   objr%   r&   rR   r   r   r   add_zone~   s      

zFirewallZone.add_zonec             C   sn   | j | }x|jD ]}| j||dd qW x|jD ]}| j||dd q2W |jrZ| j| |jrj| j| d S )NF)allow_apply)	r   r1   add_interfacer7   
add_sourcerY   add_forwardrX   add_icmp_block_inversion)r   r/   r\   argr   r   r   r[      s    

z&FirewallZone.copy_permanent_to_runtimec             C   s8   | j | }|jr| j| |jj  | j |= | j|= d S )N)r   appliedunapply_zone_settingsr3   r"   r   )r   r/   r\   r   r   r   remove_zone   s    


zFirewallZone.remove_zoneNc             C   sV   xP| j  D ]D}| j| }t|jdks4t|jdkr
tjd| | j||d q
W d S )Nr   zApplying zone '%s')use_transaction)r+   r   lenr1   r7   r   debug1apply_zone_settings)r   rg   r/   rQ   r   r   r   apply_zones   s
    
zFirewallZone.apply_zonesc             C   s   | j | }||_d S )N)r   rd   )r   r/   rd   r\   r   r   r   set_zone_applied   s    
zFirewallZone.set_zone_appliedc             C   s   d|krd S |j d}t|dk r&d S d }x tD ]}|d t| kr0|}q0W |d k	r|d | j krhd S t|dkst|dkr|d dkr|d |fS d S )N_   r         prer   denyallowpost)rq   r   rr   rs   rt   )splitrh   r   r+   )r   chainZsplits_chainrV   r   r   r   zone_from_chain   s     

zFirewallZone.zone_from_chainc             C   st   | j |}|d krd S |\}}|d	kr0|}d}n4|d
krB|}d}n"|dkrTd}|}nttjd| | j|||fS )N
PREROUTING
FORWARD_INrH   INPUTrG   POSTROUTINGFORWARD_OUTz&chain '%s' can't be mapped to a policy)ry   rz   )r{   )r|   r}   )rx   r   r   ZINVALID_CHAINr(   )r   rv   rV   r/   rw   r%   r&   r   r   r   policy_from_chain   s    
zFirewallZone.policy_from_chainc       	      C   sj   |dkrf| j |}|d k	rf| j |\}}|d kr:| j }n|}| jjj|d||| |d krf|jd d S )Nipv4ipv6T)r   r   )r~   r$   r   rZ   Zgen_chain_rulesexecute)	r   ipvtablerv   rg   rV   rZ   rw   transactionr   r   r   create_zone_base_by_chain   s    

z&FirewallZone.create_zone_base_by_chainc             C   s   t j  ||d}|S )N)Zdatesendertimeout)time)r   r   r   retr   r   r   Z__gen_settings   s    zFirewallZone.__gen_settingsc             C   s   | j |jS )N)r>   r3   )r   r/   r   r   r   get_settings   s    zFirewallZone.get_settingsc             C   s   | j |}x|D ]z}xt|| D ]h}|dkr<| j|||| q|dkr`| j|||d |d | q|dkrlqq|dkrvqtjd||| qW qW |r| j||| d S )Nr1   r7   r   ro   rX   rY   z3Zone '%s': Unknown setting '%s:%s', unable to apply)r   
_interface_sourcer   Zwarning_icmp_block_inversion)r   enabler/   r   r3   keyargsr   r   r   _zone_settings  s    

zFirewallZone._zone_settingsc             C   s   | j j|}| j| }|jr d S d|_|d kr8| j }n|}x2| j| D ]$}tjd|| | j jj	||d qHW | j
d|| |d kr|jd d S )NTz+Applying policy (%s) derived from zone '%s')rg   )r   r<   r   rd   r$   r   r   ri   rZ   apply_policy_settingsr   r   )r   r/   rg   _zoner\   r   rZ   r   r   r   rj     s    

z FirewallZone.apply_zone_settingsc             C   s   | j j|}| j| }|js d S |d kr2| j }n|}x$| j| D ]}| j jj||d qBW | jd|| |d kr||j	d d S )N)rg   FT)
r   r<   r   rd   r$   r   rZ   unapply_policy_settingsr   r   )r   r/   rg   r   r\   r   rZ   r   r   r   re   ,  s    

z"FirewallZone.unapply_zone_settingsc             C   s~   | j |}| j|}g }x\tdD ]P}|j| d |krZ|jtjt||j| d  q"|j||j| d   q"W t|S )zH
        :return: exported config updated with runtime settings
           r   )	r>   get_config_with_settings_dictrangeZIMPORT_EXPORT_STRUCTUREr.   rM   rN   rO   tuple)r   r/   r\   Z	conf_dictZ	conf_listir   r   r   get_config_with_settings?  s    

"z%FirewallZone.get_config_with_settingsc             C   s   | j |j }|d tkr"d|d< | j|| j|| j|| j|| j|| j|| j	|| j
|| j|| j|| j|| j|d}| jj||S )zH
        :return: exported config updated with runtime settings
        rK   default)r?   r@   rD   rA   rB   r1   r7   	rules_strrF   rC   rX   rY   )r>   Zexport_config_dictr   list_services
list_portslist_icmp_blocksquery_masqueradelist_forward_portsr,   r-   
list_ruleslist_protocolslist_source_portsquery_icmp_block_inversionquery_forwardr   Z'combine_runtime_with_permanent_settings)r   r/   Z	permanentZruntimer   r   r   r   O  s     z*FirewallZone.get_config_with_settings_dictc                s  ddl m  d fdd	} fdd}jjfjjfjjfjj	fj
jfjjfjjf||fjjfjjfjjfjjfd}j|}jj||\}}	xv|	D ]n}
t|	|
 tr$xX|	|
 D ]:}t|tr||
 d |f|  q||
 d || qW q||
 d | qW x|D ]}
t||
 trx||
 D ]l}|
dkr||
 d |||d nDt|tr||
 d |f|d|d n||
 d ||d|d q\W n6|
dkr||
 d ||d n||
 d |d|d q>W d S )Nr   )	Rich_Rulec                s   j |  |dd|d d S )N)rule_strr   )r   r   )add_rule)r/   r   r   r   )r   r   r   r   add_rule_wrapperh  s    zDFirewallZone.set_config_with_settings_dict.<locals>.add_rule_wrapperc                s   j |  |d d S )N)r   )remove_rule)r/   r   )r   r   r   r   remove_rule_wrapperj  s    zGFirewallZone.set_config_with_settings_dict.<locals>.remove_rule_wrapper)r?   r@   rD   rA   rB   r1   r7   r   rF   rC   rX   rY   ro   r1   r7   )r   )r   r   rX   )r   N)r1   r7   )rX   )firewall.core.richr   add_serviceremove_serviceadd_portremove_portadd_icmp_blockremove_icmp_blockadd_masqueraderemove_masqueradeadd_forward_portremove_forward_portr_   remove_interfacer`   remove_sourceadd_protocolremove_protocoladd_source_portremove_source_portrb   remove_icmp_block_inversionra   remove_forwardr   r   Zget_added_and_removed_settings
isinstancelistr   )r   r/   r3   r   r   r   Zsetting_to_fnZold_settingsZadd_settingsZremove_settingsr   r   r   )r   r   r   set_config_with_settings_dicte  sF    













  
z*FirewallZone.set_config_with_settings_dictc             C   s   | j j| d S )N)r   check_interface)r   r4   r   r   r   r     s    zFirewallZone.check_interfacec             C   s\   | j j|}| j| }| j|}||jd krX|jd | }d|krX|d d k	rX|d S d S )Nr1   r   )r   r<   r   r2   r3   )r   r/   r4   r   _objr5   r3   r   r   r   interface_get_sender  s    

z!FirewallZone.interface_get_senderc             C   s   | j | |S )N)r   )r   r4   r   r   r   Z__interface_id  s    
zFirewallZone.__interface_idTc       
      C   s  | j j  | j j|}| j| }| j|}||jd krLttjd||f | j	|d k	rjttj
d| tjd||f  |d kr| j }	n|}	|j r|r| j||	d |	j| j|d |r| jd|||	 | j|||| |	j| j|| |d kr|	jd |S )Nr1   z'%s' already bound to '%s'z'%s' already bound to a zonez&Setting zone of interface '%s' to '%s')rg   FT)r   check_panicr<   r   r2   r3   r   r   ZONE_ALREADY_SETr6   ZONE_CONFLICTr   ri   r$   rd   rj   add_failrl   r   !_FirewallZone__register_interface#_FirewallZone__unregister_interfacer   )
r   r/   r4   r   rg   r^   r   r   r5   r   r   r   r   r_     s8    









zFirewallZone.add_interfacec             C   s6   | j d||jd |< | p"|dk|jd | d< d S )Nr   r1    __default__)_FirewallZone__gen_settingsr3   )r   r   r5   r/   r   r   r   r   Z__register_interface  s    z!FirewallZone.__register_interfacec             C   sR   | j j  | j|}| j j|}||kr,|S |d k	r@| j|| | j|||}|S )N)r   r   r6   r<   r   r_   )r   r/   r4   r   	_old_zone	_new_zoner   r   r   r   change_zone_of_interface  s    

z%FirewallZone.change_zone_of_interfacec             C   sz   | j j  |d kr| j }n|}| j|| | jd|d|dd |d k	rd|dkrd| jd|d|dd |d krv|jd d S )NT+)r.   r   F)r   r   r$   rj   r   r   )r   Zold_zoneZnew_zonerg   r   r   r   r   change_default_zone  s    

z FirewallZone.change_default_zonec       	      C   s   | j j  | j|}|d kr,ttjd| |dkr8|n
| j j|}||krbttjd|||f |d krt| j }n|}| j	| }| j
|}|j| j|| | jd||| |d kr|jd |S )Nz'%s' is not in any zoner   z"remove_interface(%s, %s): zoi='%s'FT)r   r   r6   r   r   ZUNKNOWN_INTERFACEr<   r   r$   r   r2   add_postr   r   r   )	r   r/   r4   rg   Zzoir   r   r   r5   r   r   r   r     s(    






zFirewallZone.remove_interfacec             C   s   ||j d kr|j d |= d S )Nr1   )r3   )r   r   r5   r   r   r   Z__unregister_interface  s    z#FirewallZone.__unregister_interfacec             C   s   | j || j|d kS )Nr1   )r2   r   )r   r/   r4   r   r   r   query_interface  s    zFirewallZone.query_interfacec             C   s   | j |d j S )Nr1   )r   r*   )r   r/   r   r   r   r,   "  s    zFirewallZone.list_interfacesFc             C   sx   t |rdS t|rdS t|r$dS |jdrh| j|dd   |rV| j|dd   | j|dd  S ttj	|d S )Nr   r   r   zipset:   )
r   r   r   
startswith_check_ipset_type_for_source_check_ipset_applied_ipset_familyr   r   ZINVALID_ADDR)r   r9   rd   r   r   r   check_source'  s    
zFirewallZone.check_sourcec             C   s   | j ||d}||fS )N)rd   )r   )r   r9   rd   r   r   r   r   Z__source_id6  s    zFirewallZone.__source_idc       
      C   s  | j j  | j j|}| j| }t|r0|j }| j||d}||jd kr`tt	j
d||f | j|d k	r~tt	jd| |d kr| j }	n|}	|j r|r| j||	d |	j| j|d |r| jd||d |d	 |	 | j|||| |	j| j|| |d kr|	jd |S )
N)rd   r7   z'%s' already bound to '%s'z'%s' already bound to a zone)rg   FTr   ro   )r   r   r<   r   r   upperr8   r3   r   r   r   r;   r   r$   rd   rj   r   rl   r   _FirewallZone__register_source _FirewallZone__unregister_sourcer   )
r   r/   r9   r   rg   r^   r   r   r:   r   r   r   r   r`   :  s4    





zFirewallZone.add_sourcec             C   s6   | j d||jd |< | p"|dk|jd | d< d S )Nr   r7   r   r   )r   r3   )r   r   r:   r/   r   r   r   r   Z__register_sourcea  s    zFirewallZone.__register_sourcec             C   sb   | j j  | j|}| j j|}||kr,|S t|r<|j }|d k	rP| j|| | j|||}|S )N)r   r   r;   r<   r   r   r   r`   )r   r/   r9   r   r   r   r   r   r   r   change_zone_of_sourceg  s    

z"FirewallZone.change_zone_of_sourcec       	      C   s   | j j  t|r|j }| j|}|d kr<ttjd| |dkrH|n
| j j|}||krrttj	d|||f |d kr| j
 }n|}| j| }| j|}|j| j|| | jd||d |d | |d kr|jd |S )Nz'%s' is not in any zoner   zremove_source(%s, %s): zos='%s'Fr   ro   T)r   r   r   r   r;   r   r   ZUNKNOWN_SOURCEr<   r   r$   r   r8   r   r   r   r   )	r   r/   r9   rg   Zzosr   r   r   r:   r   r   r   r   y  s,    






zFirewallZone.remove_sourcec             C   s   ||j d kr|j d |= d S )Nr7   )r3   )r   r   r:   r   r   r   Z__unregister_source  s    z FirewallZone.__unregister_sourcec             C   s(   t |r|j }| j|| j|d kS )Nr7   )r   r   r8   r   )r   r/   r9   r   r   r   query_source  s    zFirewallZone.query_sourcec             C   s   dd | j |d j D S )Nc             S   s   g | ]}|d  qS )ro   r   )rU   kr   r   r   
<listcomp>  s    z-FirewallZone.list_sources.<locals>.<listcomp>r7   )r   r*   )r   r/   r   r   r   r-     s    zFirewallZone.list_sourcesc                s  x j j D ]}|jsqxP j| D ]B}x< j jj|D ]*\}}	|j||||||	|}
|j||
 q8W q$W  j|d} j	|d r|dkr|j
|||d|d}
|j||
 qW xΈ j jj D ]}| j jj|kr| j jj|krq| j jj krd j jj|jrd| r<t j|dkr< j jj||d n& j jjd	|| |j fd
d| q|r|j fdd| qW d S )NrH   rY   r   *filter)r4   ro   )rg   Fc                s    |  j jj ko j jjd| S )NT)r   rZ   )get_active_policies_not_derived_from_zone!_ingress_egress_zones_transaction)p)r   r   r   <lambda>  s   z)FirewallZone._interface.<locals>.<lambda>c                s   |  j jj ko j jj| S )N)r   rZ   r   r   )r   )r   r   r   r     s   )r   r   )r   enabled_backendspolicies_supportedr   rZ   #_get_table_chains_for_zone_dispatchZ!build_zone_source_interface_rules	add_rulesr(   r   build_zone_forward_rules"get_policies_not_derived_from_zonelist_ingress_zoneslist_egress_zonesr   
get_policyrd   rh   r,   r   _ingress_egress_zonesr   )r   r   r/   r4   r   r.   backendrZ   r   rv   rE   r   )r   r   r     s2    $zFirewallZone._interfacec             C   s$   | j |dkrd S | jjj|ddS )Nzhash:macF)rd   )_ipset_typer   ipsetZ
get_family)r   rI   r   r   r   r     s    zFirewallZone._ipset_familyc             C   s   | j jj|ddS )NF)rd   )r   r   Zget_type)r   rI   r   r   r   r     s    zFirewallZone._ipset_typec             C   s   dj |g| jjj| S )N,)joinr   r   Zget_dimension)r   rI   flagr   r   r   _ipset_match_flags  s    zFirewallZone._ipset_match_flagsc             C   s   | j jj|S )N)r   r   Zcheck_applied)r   rI   r   r   r   r     s    z!FirewallZone._check_ipset_appliedc             C   s*   | j |}|tkr&ttjd||f d S )Nz.ipset '%s' with type '%s' not usable as source)r   r   r   r   ZINVALID_IPSET)r   rI   Z_typer   r   r   r     s    
z)FirewallZone._check_ipset_type_for_sourcec          
      s  x|r j j|gn j j D ]}|js*qxN j| D ]@}x: j jj|D ](\}}	|j||||||	}
|j||
 qJW q6W  j	|d} j
|d r|j|||d|d}
|j||
 qW xΈ j jj D ]}| j jj|kr| j jj|krq| j jj krl j jj|jrl| rDt j|dkrD j jj||d n& j jjd|| |j fdd	| q|r|j fd
d	| qW d S )NrH   rY   r   )r9   ro   )rg   Fc                s    |  j jj ko j jjd| S )NT)r   rZ   r   r   )r   )r   r   r   r     s   z&FirewallZone._source.<locals>.<lambda>c                s   |  j jj ko j jj| S )N)r   rZ   r   r   )r   )r   r   r   r   
  s   )r   get_backend_by_ipvr   r   r   rZ   r   Zbuild_zone_source_address_rulesr   r(   r   r   r   r   r   r   r   rd   rh   r-   r   r   r   )r   r   r/   r   r9   r   r   rZ   r   rv   rE   r   )r   r   r     s2    "$zFirewallZone._sourcec             C   s0   | j j|}| j|d}| j jj|||| |S )NrG   )r   r<   r(   rZ   r   )r   r/   servicer   r   p_namer   r   r   r     s    zFirewallZone.add_servicec             C   s,   | j j|}| j|d}| j jj|| |S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   r     s    zFirewallZone.remove_servicec             C   s(   | j j|}| j|d}| j jj||S )NrG   )r   r<   r(   rZ   query_service)r   r/   r   r   r   r   r   r     s    zFirewallZone.query_servicec             C   s&   | j j|}| j|d}| j jj|S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r     s    zFirewallZone.list_servicesc             C   s2   | j j|}| j|d}| j jj||||| |S )NrG   )r   r<   r(   rZ   r   )r   r/   portprotocolr   r   r   r   r   r   r   #  s    zFirewallZone.add_portc             C   s.   | j j|}| j|d}| j jj||| |S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   r   r   )  s    zFirewallZone.remove_portc             C   s*   | j j|}| j|d}| j jj|||S )NrG   )r   r<   r(   rZ   
query_port)r   r/   r   r   r   r   r   r   r   /  s    zFirewallZone.query_portc             C   s&   | j j|}| j|d}| j jj|S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   4  s    zFirewallZone.list_portsc             C   s2   | j j|}| j|d}| j jj||||| |S )NrG   )r   r<   r(   rZ   r   )r   r/   source_portr   r   r   r   r   r   r   r   9  s    zFirewallZone.add_source_portc             C   s.   | j j|}| j|d}| j jj||| |S )NrG   )r   r<   r(   rZ   r   )r   r/   r  r   r   r   r   r   r   ?  s    zFirewallZone.remove_source_portc             C   s*   | j j|}| j|d}| j jj|||S )NrG   )r   r<   r(   rZ   query_source_port)r   r/   r  r   r   r   r   r   r  E  s    zFirewallZone.query_source_portc             C   s&   | j j|}| j|d}| j jj|S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   J  s    zFirewallZone.list_source_portsc             C   s   | j j|}t|jtkr(| j|dgS t|jttt	t
gkrL| j|dgS t|jttgkrv| j|d| j|dgS t|jtgkr| j|dgS t|jtgkr| jd|gS |jd kr| j|dgS tdt|j d S )NrH   rG   z Rich rule type (%s) not handled.)r   r<   typeactionr   r(   elementr   r	   r
   r   r   r   r   r   r   )r   r/   rS   r   r   r   rP   O  s     

z#FirewallZone._rich_rule_to_policiesc             C   s.   x(| j ||D ]}| jjj|||| qW |S )N)rP   r   rZ   r   )r   r/   rS   r   r   r   r   r   r   r   b  s    zFirewallZone.add_rulec             C   s*   x$| j ||D ]}| jjj|| qW |S )N)rP   r   rZ   r   )r   r/   rS   r   r   r   r   r   g  s    zFirewallZone.remove_rulec             C   s2   d}x(| j ||D ]}|o(| jjj||}qW |S )NT)rP   r   rZ   
query_rule)r   r/   rS   r   r   r   r   r   r  l  s    zFirewallZone.query_rulec             C   s^   | j j|}t }xB| j|d| j|d| jd|gD ]}|jt| j jj| q6W t|S )NrH   rG   )r   r<   setr(   updaterZ   r   r   )r   r/   r   r   r   r   r   r   r  s    
zFirewallZone.list_rulesc             C   s0   | j j|}| j|d}| j jj|||| |S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   r   r   r   {  s    zFirewallZone.add_protocolc             C   s,   | j j|}| j|d}| j jj|| |S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   r     s    zFirewallZone.remove_protocolc             C   s(   | j j|}| j|d}| j jj||S )NrG   )r   r<   r(   rZ   query_protocol)r   r/   r   r   r   r   r   r	    s    zFirewallZone.query_protocolc             C   s&   | j j|}| j|d}| j jj|S )NrG   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r     s    zFirewallZone.list_protocolsc             C   s.   | j j|}| jd|}| j jj||| |S )NrH   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r   r   r     s    zFirewallZone.add_masqueradec             C   s*   | j j|}| jd|}| j jj| |S )NrH   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r     s    zFirewallZone.remove_masqueradec             C   s&   | j j|}| jd|}| j jj|S )NrH   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r     s    zFirewallZone.query_masqueradec       	      C   s6   | j j|}| j|d}| j jj||||||| |S )NrH   )r   r<   r(   rZ   r   )	r   r/   r   r   toporttoaddrr   r   r   r   r   r   r     s
    zFirewallZone.add_forward_portc             C   s2   | j j|}| j|d}| j jj||||| |S )NrH   )r   r<   r(   rZ   r   )r   r/   r   r   r
  r  r   r   r   r   r     s    z FirewallZone.remove_forward_portc             C   s.   | j j|}| j|d}| j jj|||||S )NrH   )r   r<   r(   rZ   query_forward_port)r   r/   r   r   r
  r  r   r   r   r   r    s    zFirewallZone.query_forward_portc             C   s&   | j j|}| j|d}| j jj|S )NrH   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r     s    zFirewallZone.list_forward_portsc             C   sP   | j j|}| j|d}| j jj|||| | j|d}| j jj|||| |S )NrG   rH   )r   r<   r(   rZ   r   )r   r/   icmpr   r   r   r   r   r   r     s    zFirewallZone.add_icmp_blockc             C   sH   | j j|}| j|d}| j jj|| | j|d}| j jj|| |S )NrG   rH   )r   r<   r(   rZ   r   )r   r/   r  r   r   r   r   r     s    zFirewallZone.remove_icmp_blockc             C   sD   | j j|}| j|d}| j|d}| j jj||oB| j jj||S )NrG   rH   )r   r<   r(   rZ   query_icmp_block)r   r/   r  p_name_host
p_name_fwdr   r   r   r    s
    zFirewallZone.query_icmp_blockc             C   sH   | j j|}| j|d}| j|d}tt| j jj|| j jj| S )NrG   rH   )r   r<   r(   r)   r  rZ   r   )r   r/   r  r  r   r   r   r     s
    zFirewallZone.list_icmp_blocksc             C   sH   | j j|}| j|d}| j jj|| | j|d}| j jj|| |S )NrG   rH   )r   r<   r(   rZ   rb   )r   r/   r   r   r   r   r   rb     s    z%FirewallZone.add_icmp_block_inversionc             C   sL   | j j|}| j|d}| j jj||| | j|d}| j jj||| d S )NrG   rH   )r   r<   r(   rZ   r   )r   r   r/   r   r   r   r   r   r     s
    z"FirewallZone._icmp_block_inversionc             C   sD   | j j|}| j|d}| j jj| | j|d}| j jj| |S )NrG   rH   )r   r<   r(   rZ   r   )r   r/   r   r   r   r   r     s    z(FirewallZone.remove_icmp_block_inversionc             C   s@   | j j|}| j|d}| j|d}| j jj|o>| j jj|S )NrG   rH   )r   r<   r(   rZ   r   )r   r/   r  r  r   r   r   r     s
    z'FirewallZone.query_icmp_block_inversionc       
   	   C   s   | j |d}xT| j| jd D ]@}x:| jj D ],}|js:q.|j|||d|d}|j|| q.W qW xj| j| jd D ]V\}}	xL|r| jj|gn| jj D ],}|jsq|j|||d|	d}|j|| qW qtW d S )NrH   r1   r   )r4   r7   )r9   )	r(   r   r3   r   r   r   r   r   r   )
r   r   r/   r   r   r4   r   rE   r   r9   r   r   r   _forward  s    "zFirewallZone._forwardc             C   s   dS )NTr   )r   r   r   r   Z__forward_id  s    zFirewallZone.__forward_idc       	      C   s   | j j|}| j j| | j j  | j| }| j }||jd krRttj	d| |d krd| j
 }n|}|jr|| jd|| | j|||| |j| j|| |d kr|jd |S )NrY   zforward already enabled in '%s'T)r   r<   Zcheck_timeoutr   r   _FirewallZone__forward_idr3   r   r   ZALREADY_ENABLEDr$   rd   r  _FirewallZone__register_forwardr   !_FirewallZone__unregister_forwardr   )	r   r/   r   r   rg   r   r   
forward_idr   r   r   r   ra     s$    




zFirewallZone.add_forwardc             C   s   | j |||jd |< d S )NrY   )r   r3   )r   r   r  r   r   r   r   r   Z__register_forward.  s    zFirewallZone.__register_forwardc             C   s   | j j|}| j j  | j| }| j }||jd krFttjd| |d krX| j	 }n|}|j
rp| jd|| |j| j|| |d kr|jd |S )NrY   zforward not enabled in '%s'FT)r   r<   r   r   r  r3   r   r   ZNOT_ENABLEDr$   rd   r  r   r  r   )r   r/   rg   r   r   r  r   r   r   r   r   2  s     




zFirewallZone.remove_forwardc             C   s   ||j d kr|j d |= d S )NrY   )r3   )r   r   r  r   r   r   Z__unregister_forwardK  s    z!FirewallZone.__unregister_forwardc             C   s   | j  | j|d kS )NrY   )r  r   )r   r/   r   r   r   r   O  s    zFirewallZone.query_forward)N)N)N)N)NNT)N)N)N)F)F)NNT)N)N)F)r   N)r   N)r   N)r   N)r   N)r   N)NNr   N)NN)NN)r   N)N)r   NN)N)e__name__
__module____qualname__rJ   r   r!   r#   r$   r(   r+   r0   r6   r;   r>   rT   r]   r[   rf   rk   rl   rx   r~   r   r   r   r   rj   re   r   r   r   r   r   r2   r_   r   r   r   r   r   r   r,   r   r8   r`   r   r   r   r   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   rP   r   r   r  r   r   r   r	  r   r   r   r   r   r   r  r   r   r   r  r   rb   r   r   r   r  r  ra   r  r   r  r   r   r   r   r   r   #   s   &



8 
(




 
&


,(



	

 
 
 

		
		 

r   )"r   rM   Zfirewall.core.baser   r   r   Zfirewall.core.fw_transactionr   Zfirewall.core.io.policyr   Zfirewall.core.loggerr   r   r   r	   r
   r   r   r   r   r   r   Zfirewall.functionsr   r   r   Zfirewallr   Zfirewall.errorsr   Zfirewall.fw_typesr   objectr   r   r   r   r   <module>   s   ,