
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
³Y„jBu ã            	   @   s6  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d dl m!Z! d	Z"e"d
 d Z#dZ$dZ%i ddde% fidde% fdde% fdœdd e% fdd e% fdd e% fdd e% fdœdœZ&G dd„ de'ƒZ(dS )é    )Úabsolute_importN)Úlog)Ú	check_macÚgetPortRangeÚnormalizeIP6Úcheck_single_addressÚcheck_address)ÚFirewallErrorÚUNKNOWN_ERRORÚINVALID_RULEÚINVALID_ICMPTYPEÚINVALID_TYPEÚINVALID_ENTRYÚINVALID_PORT)ÚRich_AcceptÚRich_RejectÚ	Rich_DropÚ	Rich_MarkÚRich_MasqueradeÚRich_ForwardPortÚRich_IcmpBlock)Ú
ICMP_TYPESÚICMPV6_TYPES)ÚNftablesZ	firewalldÚ_Zpolicy_dropZpolicy_é
   Ú
PREROUTINGÚ
preroutingé–   éd   Zpostrouting)r   ÚPOSTROUTINGÚinputÚforwardÚoutput)r   ÚINPUTÚFORWARDÚOUTPUT)ÚrawÚmangleÚnatÚfilterc               @   sj  e Zd 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d„Zdd„ Zdd„ Zdd„ Zdd„ Zd‘dd„Zdd„ Zd’d d!„Zd"d#„ Zd“d%d&„Zd”d(d)„Zd•d*d+„Zd–d,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&d—dJdK„Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+d˜dTdU„Z,d™dVdW„Z-dšdXdY„Z.dZd[„ Z/d›d\d]„Z0dœd^d_„Z1d�d`da„Z2dždbdc„Z3dŸddde„Z4d dfdg„Z5dhdi„ Z6d¡djdk„Z7dldm„ Z8d¢dndo„Z9dpdq„ Z:drds„ Z;dtdu„ Z<dvdw„ Z=d£dxdy„Z>d¤dzd{„Z?d|d}„ Z@d¥d~d„ZAd€d�„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEdˆd‰„ ZFdŠd‹„ ZGdŒd�„ ZHd¦dŽd�„ZIdS )§ÚnftablesTc             C   sb   || _ d| _g | _i | _i | _i | _i | _i | _g g g dœ| _t	ƒ | _
| j
jdƒ | j
jdƒ d S )NT)ÚinetÚipÚip6)Ú_fwZrestore_command_existsZavailable_tablesÚrule_to_handleÚrule_ref_countÚrich_rule_priority_countsÚpolicy_priority_countsÚzone_source_index_cacheÚcreated_tablesr   r+   Zset_echo_outputZset_handle_output)ÚselfÚfw© r8   ú/usr/lib/python3.6/nftables.pyÚ__init__X   s    znftables.__init__c             C   sŠ  xdD ]}||krP qW d|| d kr`|| d d d || d d d f}|| d d= n(d|| d kr„d }|| d d= nd S || d d	 }|rÈ|dkrÈ||krÆ||| krÆ|| j |ƒ n¾|dk�r†||krâg ||< |�r(||| k�r|| j|ƒ || jd
d„ d� || j|ƒ}n| jj�r8d}nt|| ƒ}|| }||= |dk�rf||d< n |d8 }||d< ||d d d< d S )NÚaddÚinsertÚdeletez%%ZONE_SOURCE%%ÚruleÚzoneÚaddressz%%ZONE_INTERFACE%%Úfamilyc             S   s   | d S )Nr   r8   )Úxr8   r8   r9   Ú<lambda>„   s    z3nftables._run_replace_zone_source.<locals>.<lambda>)Úkeyr   é   Úindex)r;   r<   r=   )ÚremoveÚappendÚsortrF   r/   Ú_allow_zone_driftingÚlen)r6   r>   r4   ÚverbZzone_sourcerA   rF   Ú_verb_snippetr8   r8   r9   Ú_run_replace_zone_sourceg   sD    




z!nftables._run_replace_zone_sourcec             C   sB   d|krdt j|d ƒiS d|kr4dt j|d ƒiS ttdƒ‚d S )Nr<   r=   r;   zFailed to reverse rule)ÚcopyÚdeepcopyr	   r
   )r6   Údictr8   r8   r9   Úreverse_rule–   s
    znftables.reverse_rulec       
      C   s¨  xdD ]}||krP qW ||| d k�r¤|| d | }|| d |= t |ƒtkr^ttdƒ‚|| d d || d d f}|dkrÊ||ksª||| ksª|| | dkr´ttd	ƒ‚|| |  d
8  < nÚ||krÚi ||< ||| kròd|| |< d}xVt|| jƒ ƒD ]B}||k�r"|dk�r"P ||| | 7 }||k�r|dk�rP �qW || |  d
7  < || }	||= |dk�r„|	|d< n |d
8 }|	|d< ||d d d< d S )Nr;   r<   r=   r>   z%priority must be followed by a numberrA   Úchainr   z*nonexistent or underflow of priority countrE   rF   )r;   r<   r=   )ÚtypeÚintr	   r   r
   ÚsortedÚkeys)
r6   r>   Zpriority_countsÚtokenrL   ÚpriorityrS   rF   ÚprM   r8   r8   r9   Ú_set_rule_replace_priorityž   sD    

 


z#nftables._set_rule_replace_priorityc             C   sf   x`d
D ]X}||krd|| krt j|| d ƒ}xdD ]}||kr6||= q6W tj|dd	�}|S qW d S )Nr;   r<   r=   r>   rF   ÚhandleÚpositionT)Z	sort_keys)r;   r<   r=   )rF   r\   r]   )rO   rP   ÚjsonÚdumps)r6   r>   rL   Úrule_keyZnon_keyr8   r8   r9   Ú_get_rule_keyÌ   s    


znftables._get_rule_keyc             C   sL  dddddg}dddg}g }g }t j| jƒ}t j| jƒ}t j| jƒ}	| jj ƒ }
�xÊ|D �]À}t|ƒtkrvtt	d| ƒ‚x|D ]}||kr|P q|W ||kr¤tt
d| ƒ‚| j|ƒ}||
k�rDtjd| j|
| |ƒ |dkrê|
|  d	7  < qVnX|
| d	k�r|
|  d	8  < qVn6|
| d	k�r,|
|  d	8  < ntt	d
||
| f ƒ‚n|�r\|dk�r\d	|
|< |j|ƒ t j|ƒ}|�rttd || d d ƒƒ|| d d< | j||dƒ | j||dƒ | j||	ƒ |dk�rdd|d d d |d d d |d d d | j| dœii}|j|ƒ qVW dddd	iig| i}tjƒ dk�rVtjd| jtj|ƒƒ | jj|ƒ\}}}|dk�rŠtdd|tj|ƒf ƒ‚|| _|| _|	| _|
| _d}x |D ]˜}|d	7 }| j|ƒ}|�sÌ�q¬d|k�rê| j|= | j|= �q¬x"|D ]}||d | k�rðP �qðW ||d | k�r$�q¬|d | | d d | j|< �q¬W d S )Nr;   r<   r=   ÚflushÚreplacez#rule must be a dictionary, rule: %szno valid verb found, rule: %sz%s: prev rule ref cnt %d, %srE   z)rule ref count bug: rule_key '%s', cnt %dr>   Úexprz%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%rA   ÚtablerS   )rA   re   rS   r\   r+   ZmetainfoZjson_schema_versioné   z.%s: calling python-nftables with JSON blob: %sr   z'%s' failed: %s
JSON blob:
%szpython-nftablesr\   )rO   rP   r2   r3   r4   r1   rT   rQ   r	   r
   r   ra   r   Zdebug2Ú	__class__rH   Úlistr*   r[   rN   r0   ZgetDebugLogLevelZdebug3r^   r_   r+   Zjson_cmdÚ
ValueError)r6   ÚrulesÚ
log_deniedZ_valid_verbsZ_valid_add_verbsZ_deduplicated_rulesZ_executed_rulesr2   r3   r4   r1   r>   rL   r`   Z_ruleZ	json_blobZrcr#   ÚerrorrF   r8   r8   r9   Ú	set_rulesÚ   s�    







&






znftables.set_rulesc             C   s   | j |g|ƒ dS )NÚ )rm   )r6   r>   rk   r8   r8   r9   Úset_rule:  s    znftables.set_ruleNc             C   s   |r
|gS t jƒ S )N)ÚIPTABLES_TO_NFT_HOOKrW   )r6   re   r8   r8   r9   Úget_available_tables>  s    znftables.get_available_tablesc             C   sF   g }x<dD ]4}|j dd||dœiiƒ |j dd||dœiiƒ q
W |S )	Nr,   r-   r.   r;   re   )rA   Únamer=   )r,   r-   r.   )rH   )r6   re   rj   rA   r8   r8   r9   Ú_build_delete_table_rulesB  s    


z"nftables._build_delete_table_rulesc             C   s    i }i }xB| j dƒD ]4}| j|ƒ}|| jkr| j| ||< | j| ||< qW || _|| _i | _i | _i | _x*dD ]"}t| j| krp| j| j	tƒ qpW | j
tƒS )NTr,   r-   r.   )r,   r-   r.   )Ú _build_set_policy_rules_ct_rulesra   r0   r1   r2   r3   r4   Ú
TABLE_NAMEr5   rG   rs   )r6   Zsaved_rule_to_handleZsaved_rule_ref_countr>   Ú
policy_keyrA   r8   r8   r9   Úbuild_flush_rulesP  s     


znftables.build_flush_rulesc             C   sl   dddœ| }g }xTdD ]L}|j |ddtd	d
|f ddddiiddddgidœidd igdœiiƒ qW |S )Nr;   r=   )TFr!   r"   r#   r>   r,   z%s_%sr*   ÚmatchÚctrD   ÚstateÚinÚsetÚestablishedÚrelated)ÚleftÚopÚrightÚaccept)rA   re   rS   rd   )r!   r"   r#   )rH   ÚTABLE_NAME_POLICY)r6   ÚenableÚadd_delrj   Úhookr8   r8   r9   rt   g  s    


z)nftables._build_set_policy_rules_ct_rulesc             C   st  g }|dkrt|j dddtdœiiƒ | jd j tƒ x>dD ]6}|j dddtd	d
|f d|dt d ddœiiƒ q:W |dk� rö|j dddtdœiiƒ | jd j tƒ x>dD ]6}|j dddtd	d|f d|dt d ddœiiƒ q¬W || jdƒ7 }nz|dk�rfx4| jdƒD ]&}| j|ƒ}|| jk�r|j |ƒ �qW || jtƒ7 }t| jd k�rp| jd jtƒ n
t	t
dƒ |S )NZPANICr;   re   r,   )rA   rr   r   r#   rS   z%s_%sr'   r*   i,  rE   Údrop)rA   re   rr   rT   r†   ÚprioÚpolicyÚDROPr!   r"   r   TÚACCEPTFznot implemented)r   r#   iÔþÿÿ)r!   r"   r#   )rH   rƒ   r5   ÚNFT_HOOK_OFFSETrt   ra   r0   rs   rG   r	   r
   )r6   r‰   rj   r†   r>   rv   r8   r8   r9   Úbuild_set_policy_rulest  sH    













znftables.build_set_policy_rulesc             C   sJ   t ƒ }|d ks|dkr$|jtjƒ ƒ |d ks4|dkrB|jtjƒ ƒ t|ƒS )NÚipv4Úipv6)r|   Úupdater   rW   r   rh   )r6   ÚipvZ	supportedr8   r8   r9   Úsupported_icmp_types¨  s    znftables.supported_icmp_typesc             C   s>   g }x4dD ],}|j dd|tdœiiƒ | j| j tƒ q
W |S )Nr,   r-   r.   r;   re   )rA   rr   )r,   r-   r.   )rH   ru   r5   )r6   Zdefault_tablesrA   r8   r8   r9   Úbuild_default_tables²  s    

znftables.build_default_tablesÚoffc             C   sª  g }xÐt d jƒ D ]À}|jdddtd| ddt d | d  t d | d	 d
œiiƒ xz| jjrlddddgndddgD ]X}|jdddtd||f dœiiƒ |jdddtd| ddd||f iigdœiiƒ qvW qW xâd?D ]Ú}xÔt d jƒ D ]Ä}|jdd|td| ddt d | d  t d | d	 d
œiiƒ x~| jj�rJddddgndddgD ]Z}|jdd|td||f dœiiƒ |jdd|td| ddd||f iigdœiiƒ �qTW qîW qÜW xVt d jƒ D ]F}|jdddtd| ddt d | d  t d | d	 d
œiiƒ �qÈW |jdddtdd ddddiid d!d"d#gid$œid%d igdœiiƒ |jdddtdd dddd&iid d'd$œid%d igdœiiƒ |jdddtdd dd(dd)iid*d+d$œid%d igdœiiƒ x~| jj�ræddddgndddgD ]Z}|jdddtd,d|f dœiiƒ |jdddtdd ddd,d|f iigdœiiƒ �qðW |d-k�r¦|jdddtdd ddddiid d!d.gid$œi| j|ƒd/d0d1iigdœiiƒ |jdddtdd ddddiid d!d.gid$œid2d igdœiiƒ |d-k�r$|jdddtdd | j|ƒd/d0d3iigdœiiƒ |jdddtdd d4d5d6d7œigdœiiƒ |jdddtdd8 ddddiid d!d"d#gid$œid%d igdœiiƒ |jdddtdd8 dddd&iid d'd$œid%d igdœiiƒ |jdddtdd8 dd(dd)iid*d+d$œid%d igdœiiƒ xbd@D ]Z}|jdddtd,d8|f dœiiƒ |jdddtdd8 ddd,d8|f iigdœiiƒ �qW xŠdAD ]‚}xz| jj�rŽddgndgD ]^}|jdddtd;d8||f dœiiƒ |jdddtdd8 ddd;d8||f iigdœiiƒ �q”W �qvW xbdBD ]Z}|jdddtd,d8|f dœiiƒ |jdddtdd8 ddd,d8|f iigdœiiƒ �qW |d-k�r¸|jdddtdd8 ddddiid d!d.gid$œi| j|ƒd/d0d1iigdœiiƒ |jdddtdd8 ddddiid d!d.gid$œid2d igdœiiƒ |d-k�r6|jdddtdd8 | j|ƒd/d0d3iigdœiiƒ |jdddtdd8 d4d5d6d7œigdœiiƒ |jdddtdd< ddddiid d!d"d#gid$œid%d igdœiiƒ |jdddtd=dd(dd>iid*d+d$œid%d igdœiiƒ xbdCD ]Z}|jdddtd,d<|f dœiiƒ |jdddtdd< ddd,d<|f iigdœiiƒ �qäW xbdDD ]Z}|jdddtd,d<|f dœiiƒ |jdddtdd< ddd,d<|f iigdœiiƒ �qHW |S )ENr(   r;   rS   r,   z	mangle_%sr*   z%sr   rE   )rA   re   rr   rT   r†   rˆ   ÚPOLICIES_preZZONES_SOURCEZZONESÚPOLICIES_postzmangle_%s_%s)rA   re   rr   r>   ÚjumpÚtarget)rA   re   rS   rd   r-   r.   r)   znat_%sz	nat_%s_%sz	filter_%sr$   rx   ry   rD   rz   r{   r|   r}   r~   )r   r€   r�   r‚   ZstatusÚdnatÚmetaÚiifnamez==Úlozfilter_%s_%sr”   Zinvalidr   ÚprefixzSTATE_INVALID_DROP: r‡   zFINAL_REJECT: ÚrejectÚicmpxzadmin-prohibited)rT   rd   r%   ÚINÚOUTzfilter_%s_%s_%sr&   Úfilter_OUTPUTÚoifname)r-   r.   )r•   )r    r¡   )r–   )r•   )r–   )rp   rW   rH   ru   r/   rJ   Ú_pkttype_match_fragment)r6   rk   Zdefault_rulesrS   Zdispatch_suffixrA   Ú	directionr8   r8   r9   Úbuild_default_rulesº  sŠ   
$

(

&

.
 


&

&











&


.


&










&


&znftables.build_default_rulesc             C   s4   |dkrdddgS |dkr dgS |dkr0ddgS g S )	Nr*   r$   Ú
FORWARD_INÚFORWARD_OUTr(   r   r)   r    r8   )r6   re   r8   r8   r9   Úget_zone_table_chains‹  s    
znftables.get_zone_table_chainsr,   c
                s¨  ˆdkr\ˆdkr\g }
|
j ˆjˆ|ˆˆ||||dd�	ƒ |
j ˆjˆ|ˆˆ||||dd�	ƒ |
S ˆjjj|ƒ‰ˆjdk rxdnd‰ˆdkr�ˆd	kr�d
nd}ˆjjj|ˆt|ƒ‰ g }g }|rÚ|jddddiiddt	|ƒidœiƒ |�r|jddddiiddt	|ƒidœiƒ dddœ}|�rlxT|D ]L}ˆdk�rTˆjj
j|ƒ}||k�rTˆ|| k�rT�q|jˆjd|ƒƒ �qW |�rÈxT|D ]L}ˆdk�r°ˆjj
j|ƒ}||k�r°ˆ|| k�r°�qx|jˆjd|ƒƒ �qxW ‡ ‡‡‡‡‡‡‡fdd„}g }
|�rHx¶|D ]P}|�rxB|D ]}|
j|||ƒƒ �qW n"ˆdk�r0|�r0n|
j||d ƒƒ �qòW n\ˆdk�rZ|�rZnJ|�r‚xB|D ]}|
j|d |ƒƒ �qfW n"ˆdk�r”|�r”n|
j|d d ƒƒ |
S )Nr)   r,   r-   )rA   r.   r   ÚpreÚpostr    TFrx   rš   rD   r›   z==r|   )r   r€   r�   r£   )rŽ   r�   ÚsaddrÚdaddrc                s‚   g }| r|j | ƒ |r |j |ƒ |j dddˆˆ f iiƒ ˆtdˆˆˆf |dœ}|jˆjˆƒƒ ˆrrdd|iiS dd|iiS d S )	Nr—   r˜   z%s_%sz%s_%s_POLICIES_%s)rA   re   rS   rd   r;   r>   r=   )rH   ru   r�   Ú_policy_priority_fragment)Úingress_fragmentÚegress_fragmentÚexpr_fragmentsr>   )Ú_policyrS   Úchain_suffixr„   rA   Úp_objr6   re   r8   r9   Ú_generate_policy_dispatch_ruleÉ  s    

zRnftables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)ÚextendÚ!build_policy_ingress_egress_rulesr/   r‰   Z
get_policyrY   Úpolicy_base_chain_nameÚPOLICY_CHAIN_PREFIXrH   rh   r?   Zcheck_sourceÚ_rule_addr_fragment)r6   r„   r‰   re   rS   Zingress_interfacesZegress_interfacesZingress_sourcesZegress_sourcesrA   rj   ÚisSNATZingress_fragmentsZegress_fragmentsZipv_to_familyÚsrcr‘   Údstrµ   r¯   r°   r8   )r²   rS   r³   r„   rA   r´   r6   re   r9   r·   •  sv    









z*nftables.build_policy_ingress_egress_rulesFc	          
   C   sª  |dkrT|dkrTg }	|	j | j|||||||dƒƒ |	j | j|||||||dƒƒ |	S |dkrh|dkrhdnd}
| jjj||t|
d�}d	d
d	d	d
d
dœ| }|t|ƒd  dkrÄ|d t|ƒd … d }d}|dkrè|dd||f iig}n,ddd|iid|dœi|dd||f iig}|�rL| �rLd}|td||f |dœ}|j| j	ƒ ƒ nP|�rnd}|td||f |dœ}n.d}|td||f |dœ}|�sœ|j| j	ƒ ƒ |d|iigS )Nr)   r,   r-   r.   r    TF)r»   r›   r£   )r   r    r$   r§   r¨   r&   rE   ú+Ú*Úgotor˜   z%s_%srx   rš   rD   z==)r   r€   r�   r<   z%s_%s_ZONES)rA   re   rS   rd   r;   r=   r>   )
r¶   Ú!build_zone_source_interface_rulesr/   r‰   r¸   r¹   rK   ru   r�   Ú_zone_interface_fragment)r6   r„   r?   r‰   Ú	interfacere   rS   rH   rA   rj   r»   r²   ÚoptÚactionr±   rL   r>   r8   r8   r9   rÁ      s\    



z*nftables.build_zone_source_interface_rulesc          	   C   sn  |dkrª|dkrªg }|j dƒr6| j|tdƒd … ƒ}	nd }	td|ƒsTt|ƒsT|	dkrp|j| j||||||dƒƒ td|ƒsŠt|ƒsŠ|	dkr¦|j| j||||||dƒƒ |S |dkr¾|dkr¾d	nd
}
| jjj	||t
|
d�}dddœ| }dddddddœ| }| jj�rd||f }nd||f }d}|t|| j||ƒ|dd||f iigdœ}|j| j||ƒƒ |d|iigS )Nr)   r,   zipset:rŽ   r-   r�   r.   r    TF)r»   r<   r=   )TFr¬   r­   )r   r    r$   r§   r¨   r&   z%s_%s_ZONES_SOURCEz%s_%s_ZONESrÀ   r˜   z%s_%s)rA   re   rS   rd   r>   )Ú
startswithÚ_set_get_familyrK   r   r   r¶   Úbuild_zone_source_address_rulesr/   r‰   r¸   r¹   rJ   ru   rº   r�   Ú_zone_source_fragment)r6   r„   r?   r‰   r@   re   rS   rA   rj   Zipset_familyr»   r²   r…   rÄ   Zzone_dispatch_chainrÅ   r>   r8   r8   r9   rÈ   <  sB    


z(nftables.build_zone_source_address_rulesc             C   s  |dkrH|dkrHg }|j | j||||dƒƒ |j | j||||dƒƒ |S dddœ| }|dkrj|dkrjd	nd
}| jjj||t|d�}	g }|j|d|td||	f dœiiƒ x0d!D ](}
|j|d|td||	|
f dœiiƒ q°W xDd"D ]<}
|j|d|td||	f ddd||	|
f iigdœiiƒ qâW | jjj| j	}| jj
ƒ dk�r¬|dk�r¬|d#k�r¬|}|dk�rhd}|j|d|td||	f | j| jj
ƒ ƒddd|	|f iigdœiiƒ |dk�r|d$k�r|d%k�rÔ| jƒ }n|jƒ d i}|j|d|td||	f |gdœiiƒ |�s|jƒ  |S )&Nr)   r,   r-   r.   r;   r=   )TFr    TF)r»   rS   z%s_%s)rA   re   rr   rª   r   ÚdenyÚallowr«   z%s_%s_%sr>   r—   r˜   )rA   re   rS   rd   r”   r*   ÚREJECTú
%%REJECT%%rŠ   r�   z"filter_%s_%s: "r‹   )rª   r   rÊ   rË   r«   )rª   r   rÊ   rË   r«   )rÌ   rÍ   rŠ   )r‹   rÌ   rÍ   rŠ   )rÍ   rÌ   )r¶   Úbuild_policy_chain_rulesr/   r‰   r¸   r¹   rH   ru   Z	_policiesr˜   Úget_log_deniedr¤   Ú_reject_fragmentÚlowerÚreverse)r6   r„   r‰   re   rS   rA   rj   r…   r»   r²   r³   r˜   Z
log_suffixÚtarget_fragmentr8   r8   r9   rÎ   j  sZ    





&




 





z!nftables.build_policy_chain_rulesc             C   s<   |dkri S |dkr,ddddiid	|d
œiS t td|ƒ‚d S )NÚallÚunicastÚ	broadcastÚ	multicastrx   rš   rD   Úpkttypez==)r   r€   r�   zInvalid pkttype "%s")rÕ   rÖ   r×   )r	   r   )r6   rØ   r8   r8   r9   r¤   £  s    
z nftables._pkttype_match_fragmentc             C   s  ddddœiddddœiddddœiddddœiddddœiddddœiddddœiddddœiddddœiddddœiddd	dœiddd	dœiddd
dœiddd
dœiddd
dœiddddœiddddœiddddœiddddœiddddœiddddœidddiidddiidœ}|| S )Nrž   Úicmpzhost-prohibited)rT   rd   znet-prohibitedzadmin-prohibitedÚicmpv6znet-unreachablezhost-unreachablezport-unreachablerŸ   zprot-unreachablezaddr-unreachablezno-routerT   z	tcp reset)zicmp-host-prohibitedzhost-prohibzicmp-net-prohibitedz
net-prohibzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezicmp6-port-unreachablezport-unreachzicmp-proto-unreachablezproto-unreachzicmp6-addr-unreachablezaddr-unreachzicmp6-no-routezno-routez	tcp-resetztcp-rstr8   )r6   Zreject_typeZfragsr8   r8   r9   Ú_reject_types_fragment­  s0    
znftables._reject_types_fragmentc             C   s   ddddœiS )Nrž   rŸ   zadmin-prohibited)rT   rd   r8   )r6   r8   r8   r9   rÐ   Í  s    znftables._reject_fragmentc             C   s    ddddiiddddgid	œiS )
Nrx   rš   rD   Úl4protoz==r|   rÙ   rÚ   )r   r€   r�   r8   )r6   r8   r8   r9   Ú_icmp_match_fragmentÑ  s    znftables._icmp_match_fragmentc             C   sP   |si S dddddœ}|j ƒ \}}||| dœ}|jƒ }|d k	rH||d< d|iS )	NÚsecondZminuteZhourZday)ÚsÚmÚhÚd)ÚrateZperÚburstÚlimit)Zvalue_parseZburst_parse)r6   rå   Zrich_to_nftrã   Zdurationrâ   rä   r8   r8   r9   Ú_rich_rule_limit_fragmentÖ  s    z"nftables._rich_rule_limit_fragmentc             C   sÂ   t |jƒtttgkrn<|jrHt |jƒtttt	gkrRt
tdt |jƒ ƒ‚n
t
tdƒ‚|jdkr¬t |jƒttgks€t |jƒtt	gkr„dS t |jƒtgks¦t |jƒttgkr¾dS n|jdk rºdS dS d S )NzUnknown action %szNo rule action specified.r   rË   rÊ   rª   r«   )rT   Úelementr   r   r   rÅ   r   r   r   r   r	   r   rY   )r6   Ú	rich_ruler8   r8   r9   Ú_rich_rule_chain_suffixî  s     


z nftables._rich_rule_chain_suffixc             C   s>   |j  r|j rttdƒ‚|jdkr(dS |jdk r6dS dS d S )NzNot log or auditr   r   rª   r«   )r   Úauditr	   r   rY   )r6   rè   r8   r8   r9   Ú _rich_rule_chain_suffix_from_log  s    


z)nftables._rich_rule_chain_suffix_from_logc             C   s   dd iS )Nz%%ZONE_INTERFACE%%r8   )r6   r8   r8   r9   rÂ     s    z!nftables._zone_interface_fragmentc             C   sN   t d|ƒrt|ƒ}n,td|ƒr@|jdƒ}t|d ƒd |d  }d||dœiS )Nr�   ú/r   rE   z%%ZONE_SOURCE%%)r?   r@   )r   r   r   Úsplit)r6   r?   r@   Z
addr_splitr8   r8   r9   rÉ     s    



znftables._zone_source_fragmentc             C   s
   d|j iS )Nz%%POLICY_PRIORITY%%)rY   )r6   r‰   r8   r8   r9   r®     s    z"nftables._policy_priority_fragmentc             C   s   | s|j dkri S d|j iS )Nr   z%%RICH_RULE_PRIORITY%%)rY   )r6   rè   r8   r8   r9   Ú_rich_rule_priority_fragment  s    z%nftables._rich_rule_priority_fragmentc             C   sÆ   |j s
i S | jjj||tƒ}dddœ| }| j|ƒ}i }	|j jrPd|j j |	d< |j jr|d|j jkrhdn|j j}
d|
 |	d< d	td
|||f || j	|j j
ƒd|	ig dœ}|j| j|ƒƒ |d|iiS )Nr;   r=   )TFz%sr�   ZwarningÚwarnÚlevelr,   z%s_%s_%sr   )rA   re   rS   rd   r>   )r   r/   r‰   r¸   r¹   rë   r�   rð   ru   ræ   rå   r�   rî   )r6   r‰   rè   r„   re   r±   r²   r…   r³   Zlog_optionsrð   r>   r8   r8   r9   Ú_rich_rule_log"  s&    
znftables._rich_rule_logc       
      C   s‚   |j s
i S | jjj||tƒ}dddœ| }| j|ƒ}dtd|||f || j|j jƒdddiig d	œ}	|	j	| j
|ƒƒ |d
|	iiS )Nr;   r=   )TFr,   z%s_%s_%sr   rð   rê   )rA   re   rS   rd   r>   )rê   r/   r‰   r¸   r¹   rë   ru   ræ   rå   r�   rî   )
r6   r‰   rè   r„   re   r±   r²   r…   r³   r>   r8   r8   r9   Ú_rich_rule_audit<  s    
znftables._rich_rule_auditc             C   s˜  |j s
i S | jjj||tƒ}dddœ| }| j|ƒ}d|||f }	t|j ƒtkr\dd i}
�n t|j ƒtkrŒ|j jr‚| j	|j jƒ}
ndd i}
nÐt|j ƒt
kr¤dd i}
n¸t|j ƒtk�rHd}| jjj||tƒ}d|||f }	|j jjd	ƒ}t|ƒd
k�r,ddddiidddddii|d
 gi|d gidœi}
nddddii|d dœi}
nttdt|j ƒ ƒ‚dt|	|| j|j jƒ|
g dœ}|j| j|ƒƒ |d|iiS )Nr;   r=   )TFz%s_%s_%sr‚   rž   r‡   r(   rì   rE   rš   rD   Úmarkú^ú&r   )rD   ÚvaluezUnknown action %sr,   )rA   re   rS   rd   r>   )rÅ   r/   r‰   r¸   r¹   ré   rT   r   r   rÛ   r   r   r|   rí   rK   r	   r   ru   ræ   rå   r�   rî   )r6   r‰   rè   r„   re   r±   r²   r…   r³   rS   Zrule_actionrö   r>   r8   r8   r9   Ú_rich_rule_actionN  sB    


,znftables._rich_rule_actionc             C   sê   |j dƒr0| j|tdƒd … d|kr(dnd|ƒS t|ƒr>d}n†td|ƒrNd}nvtd|ƒr€d}tj|dd�}d	|jj	|j
d
œi}nDtd|ƒr˜d}t|ƒ}n,d}|jdƒ}d	t|d ƒt|d ƒd
œi}dd||dœi|rÚdnd|dœiS d S )Nzipset:r­   TFÚetherrŽ   r-   )Ústrictr�   )ÚaddrrK   r�   r.   rì   r   rE   rx   Úpayload)ÚprotocolÚfieldz!=z==)r   r€   r�   )rÆ   Ú_set_match_fragmentrK   r   r   r   Ú	ipaddressZIPv4NetworkZnetwork_addressZ
compressedZ	prefixlenr   rí   rU   )r6   Z
addr_fieldr@   ÚinvertrA   Znormalized_addressZaddr_lenr8   r8   r9   rº   y  s(    
&





znftables._rule_addr_fragmentc             C   s6   |si S |d
krt td| ƒ‚ddddiid|d	œiS )NrŽ   r�   zInvalid familyrx   rš   rD   Únfprotoz==)r   r€   r�   )rŽ   r�   )r	   r   )r6   Zrich_familyr8   r8   r9   Ú_rich_rule_family_fragment’  s    
z#nftables._rich_rule_family_fragmentc             C   s8   |si S |j r|j }n|jr&d|j }| jd||jd�S )Nzipset:r­   )r   )rú   Úipsetrº   r   )r6   Z	rich_destr@   r8   r8   r9   Ú_rich_rule_destination_fragment�  s    
z(nftables._rich_rule_destination_fragmentc             C   sZ   |si S |j r|j }n2t|dƒr.|jr.|j}nt|dƒrH|jrHd|j }| jd||jd�S )NÚmacr  zipset:r¬   )r   )rú   Úhasattrr  r  rº   r   )r6   Zrich_sourcer@   r8   r8   r9   Ú_rich_rule_source_fragment§  s    
z#nftables._rich_rule_source_fragmentc             C   sP   t |ƒ}t|tƒr$|dk r$ttƒ‚n(t|ƒdkr8|d S d|d |d giS d S )Nr   rE   Úrange)r   Ú
isinstancerU   r	   r   rK   )r6   Úportr  r8   r8   r9   Ú_port_fragment´  s    
znftables._port_fragmentc          	   C   sb  dddœ| }d}| j jj||tƒ}	g }
|r>|
j| j|jƒƒ |rT|
j| jd|ƒƒ |r||
j| j|j	ƒƒ |
j| j
|jƒƒ |
jdd|dd	œid
| j|ƒdœiƒ | s¶t|jƒtkrÜ|
jddddiiddddgidœiƒ g }|�r0|j| j|||||
ƒƒ |j| j|||||
ƒƒ |j| j|||||
ƒƒ n.|j|ddtd||	f |
dd ig dœiiƒ |S )Nr;   r=   )TFr*   r­   rx   rû   Údport)rü   rý   z==)r   r€   r�   ry   rD   rz   r{   r|   ÚnewÚ	untrackedr>   r,   z%s_%s_allowr‚   )rA   re   rS   rd   )r/   r‰   r¸   r¹   rH   r  rA   rº   r  Údestinationr  Úsourcer  rT   rÅ   r   rñ   rò   r÷   ru   )r6   r„   r‰   Úprotor
  r  rè   r…   re   r²   r±   rj   r8   r8   r9   Úbuild_policy_ports_rules½  s:    


z!nftables.build_policy_ports_rulesc          	   C   sZ  dddœ| }d}| j jj||tƒ}g }	|r>|	j| j|jƒƒ |rT|	j| jd|ƒƒ |r||	j| j|j	ƒƒ |	j| j
|jƒƒ |	jdddd	iid
|dœiƒ | s®t|jƒtkrÔ|	jddddiiddddgidœiƒ g }
|�r(|
j| j|||||	ƒƒ |
j| j|||||	ƒƒ |
j| j|||||	ƒƒ n.|
j|ddtd||f |	dd ig dœiiƒ |
S )Nr;   r=   )TFr*   r­   rx   rš   rD   rÜ   z==)r   r€   r�   ry   rz   r{   r|   r  r  r>   r,   z%s_%s_allowr‚   )rA   re   rS   rd   )r/   r‰   r¸   r¹   rH   r  rA   rº   r  r  r  r  rT   rÅ   r   rñ   rò   r÷   ru   )r6   r„   r‰   rü   r  rè   r…   re   r²   r±   rj   r8   r8   r9   Úbuild_policy_protocol_rulesá  s8    

z$nftables.build_policy_protocol_rulesc          	   C   sb  dddœ| }d}| j jj||tƒ}	g }
|r>|
j| j|jƒƒ |rT|
j| jd|ƒƒ |r||
j| j|j	ƒƒ |
j| j
|jƒƒ |
jdd|dd	œid
| j|ƒdœiƒ | s¶t|jƒtkrÜ|
jddddiiddddgidœiƒ g }|�r0|j| j|||||
ƒƒ |j| j|||||
ƒƒ |j| j|||||
ƒƒ n.|j|ddtd||	f |
dd ig dœiiƒ |S )Nr;   r=   )TFr*   r­   rx   rû   Úsport)rü   rý   z==)r   r€   r�   ry   rD   rz   r{   r|   r  r  r>   r,   z%s_%s_allowr‚   )rA   re   rS   rd   )r/   r‰   r¸   r¹   rH   r  rA   rº   r  r  r  r  r  rT   rÅ   r   rñ   rò   r÷   ru   )r6   r„   r‰   r  r
  r  rè   r…   re   r²   r±   rj   r8   r8   r9   Úbuild_policy_source_ports_rules  s:    


z(nftables.build_policy_source_ports_rulesc          	   C   sÌ   d}| j jj||tƒ}	dddœ| }
g }|rR|jdddtd||f ||dœiiƒ g }|rl|j| jd	|ƒƒ |jd
d|ddœid| j|ƒdœiƒ |jdd||f iƒ |j|
ddtd|	 |dœiiƒ |S )Nr*   r;   r=   )TFz	ct helperr,   zhelper-%s-%s)rA   re   rr   rT   rü   r­   rx   rû   r  )rü   rý   z==)r   r€   r�   r>   zfilter_%s_allow)rA   re   rS   rd   )r/   r‰   r¸   r¹   rH   ru   rº   r  )r6   r„   r‰   r  r
  r  Zhelper_nameZmodule_short_namere   r²   r…   rj   r±   r8   r8   r9   Úbuild_policy_helper_ports_rules)  s.    



z(nftables.build_policy_helper_ports_rulesc             C   s²   dddœ| }| j jj||tƒ}g }	|rv|t|ƒd  dkrT|d t|ƒd … d }ddd	d
iid|dœidd ig}
n| jd|ƒdd ig}
dtd| |
dœ}|	j|d|iiƒ |	S )Nr;   r=   )TFrE   r¾   r¿   rx   rš   rD   r£   z==)r   r€   r�   r‚   r­   r,   zfilter_%s_allow)rA   re   rS   rd   r>   )r/   r‰   r¸   r¹   rK   rº   ru   rH   )r6   r„   r?   r‰   re   rÃ   r  r…   r²   rj   rd   r>   r8   r8   r9   Úbuild_zone_forward_rulesF  s"    z!nftables.build_zone_forward_rulesc          	   C   s¸   d}| j jj||tdd�}dddœ| }g }|r`|j| j|jƒƒ |j| j|jƒƒ | j	|ƒ}	nd}	|t
d||	f |d	d
ddiidddœidd ig dœ}
|
j| j|ƒƒ |d|
iigS )Nr)   T)r»   r;   r=   )TFrË   z	nat_%s_%srx   rš   rD   r£   z!=rœ   )r   r€   r�   Z
masquerade)rA   re   rS   rd   r>   )r/   r‰   r¸   r¹   rH   r  r  r  r  ré   ru   r�   rî   )r6   r„   r‰   rA   rè   re   r²   r…   r±   r³   r>   r8   r8   r9   Ú"_build_policy_masquerade_nat_rules_  s&    
z+nftables._build_policy_masquerade_nat_rulesc          
   C   s^  g }|rD|j r|j dks,|jrDtd|jjƒrD|j| j||d|ƒƒ nV|r„|j rX|j dksl|jr„td|jjƒr„|j| j||d|ƒƒ n|j| j||d|ƒƒ d}| jjj||t	ƒ}dddœ| }g }|rö|j
| j|jƒƒ |j
| j|jƒƒ | j|ƒ}	nd	}	d
td||	f |ddddiiddddgidœidd ig dœ}
|
j| j|ƒƒ |j
|d|
iiƒ |S )Nr�   r.   rŽ   r-   r*   r;   r=   )TFrË   r,   zfilter_%s_%srx   ry   rD   rz   r{   r|   r  r  )r   r€   r�   r‚   )rA   re   rS   rd   r>   )rA   r  r   rú   r¶   r  r/   r‰   r¸   r¹   rH   r  r  r  ré   ru   r�   rî   )r6   r„   r‰   rè   rj   re   r²   r…   r±   r³   r>   r8   r8   r9   Úbuild_policy_masquerade_rulesx  s8    
z&nftables.build_policy_masquerade_rulesc	             C   s$  d}	| j jj||	tƒ}
dddœ| }g }|r\|j| j|jƒƒ |j| j|jƒƒ | j	|ƒ}nd}|jdd|dd	œid
| j
|ƒdœiƒ |rØtd|ƒrœt|ƒ}|rÄ|dkrÄ|jd|| j
|ƒdœiƒ qð|jdd|iiƒ n|jdd| j
|ƒiiƒ |td|
|f |dœ}|j| j|ƒƒ |d|iigS )Nr)   r;   r=   )TFrË   rx   rû   r  )rü   rý   z==)r   r€   r�   r�   rn   r™   )rú   r
  rú   Zredirectr
  z	nat_%s_%s)rA   re   rS   rd   r>   )r/   r‰   r¸   r¹   rH   r  r  r  r  ré   r  r   r   ru   r�   rî   )r6   r„   r‰   r
  rü   ÚtoaddrÚtoportrA   rè   re   r²   r…   r±   r³   r>   r8   r8   r9   Ú$_build_policy_forward_port_nat_rules�  s4    


z-nftables._build_policy_forward_port_nat_rulesc       	   
   C   sØ   g }|rF|j r|j dks&|rFtd|ƒrF|j| j||||||d|ƒƒ nŽ|rˆ|j rZ|j dksh|rˆtd|ƒrˆ|j| j||||||d|ƒƒ nL|r¶td|ƒr¶|j| j||||||d|ƒƒ n|j| j||||||d|ƒƒ |S )Nr�   r.   rŽ   r-   )rA   r   r¶   r  )	r6   r„   r‰   r
  rü   r  r  rè   rj   r8   r8   r9   Úbuild_policy_forward_port_rulesÂ  s    z(nftables.build_policy_forward_port_rulesc             C   sH   dd|ddœid|dœig}|d k	rD|j dd|ddœid|dœiƒ |S )Nrx   rû   rT   )rü   rý   z==)r   r€   r�   Úcode)rH   )r6   rü   rT   r  Ú	fragmentsr8   r8   r9   Ú_icmp_types_fragments×  s    znftables._icmp_types_fragmentsc             C   s‚   |dkr4|t kr4t | \}}}| jd||r.d n|ƒS |dkrh|tkrht| \}}}| jd||rbd n|ƒS ttd|| j|f ƒ‚d S )NrŽ   rÙ   r�   rÚ   z)ICMP type '%s' not supported by %s for %s)r   r   r   r	   r   rr   )r6   r‘   Z	icmp_typeZ_typeÚ_codeZ
_omit_coder8   r8   r9   Ú_icmp_types_to_nft_fragmentsá  s    z%nftables._icmp_types_to_nft_fragmentsc             C   sB  d}| j jj||tƒ}dddœ| }|r6|jr6|j}n<|jrjg }d|jkrT|jdƒ d|jkrr|jdƒ nddg}g }	�xÄ|D �]º}
| j jj|ƒr¨d||f }dd i}nd	||f }| jƒ }g }|rú|j| j	|j
ƒƒ |j| j|jƒƒ |j| j|jƒƒ |j| j|
|jƒƒ |�r¶|	j| j|||||ƒƒ |	j| j|||||ƒƒ |j�rf|	j| j|||||ƒƒ nN| j|ƒ}d
td|||f || jƒ g dœ}|j| j|ƒƒ |	j|d|iiƒ q~| j jƒ dk�r| j jj|ƒ �r|	j|dd
t||| j| j jƒ ƒddd||f iig dœiiƒ |	j|dd
t|||g dœiiƒ q~W |	S )Nr*   r;   r=   )TFrŽ   r�   z%s_%s_allowr‚   z
%s_%s_denyr,   z%s_%s_%s)rA   re   rS   rd   r>   r”   r   r�   z"%s_%s_ICMP_BLOCK: ")r/   r‰   r¸   r¹   Úipvsr  rH   Úquery_icmp_block_inversionrÐ   r  rA   r  r  r  r¶   r"  rr   rñ   rò   rÅ   r÷   ré   ru   r�   rî   rÏ   r¤   )r6   r„   r‰   Zictrè   re   r²   r…   r#  rj   r‘   Zfinal_chainrÓ   r±   r³   r>   r8   r8   r9   Úbuild_policy_icmp_block_rulesì  sb    





"
"
z&nftables.build_policy_icmp_block_rulesc             C   sâ   d}| j jj||tƒ}g }dddœ| }| j jj|ƒr@| jƒ }ndd i}|j|ddtd||f d	| jƒ |gd
œiiƒ | j j	ƒ dkrÞ| j jj|ƒrÞ|j|ddtd||f d	| jƒ | j
| j j	ƒ ƒddd||f iigd
œiiƒ |S )Nr*   r;   r=   )TFr‚   r>   r,   z%s_%sé   )rA   re   rS   rF   rd   r”   r   r�   z%s_%s_ICMP_BLOCK: )r/   r‰   r¸   r¹   r$  rÐ   rH   ru   rÝ   rÏ   r¤   )r6   r„   r‰   re   r²   rj   r…   rÓ   r8   r8   r9   Ú'build_policy_icmp_block_inversion_rules(  s,    




 z0nftables.build_policy_icmp_block_inversion_rulesc             C   sÆ   g }ddddiidddœiddd	d
dgddœidddœig}|dkrV|j dddiiƒ |j dd iƒ |j dddtd|dœiiƒ |j dddtddddddœiddddgidœid d igdœiiƒ |S )!Nrx   rš   rD   r  z==r�   )r   r€   r�   Zfibr¬   Ziifró   Zoif)ÚflagsÚresultFr”   r   r�   zrpfilter_DROP: r‡   r<   r>   r,   Zfilter_PREROUTING)rA   re   rS   rd   rû   rÚ   rT   )rü   rý   r|   znd-router-advertznd-neighbor-solicitr‚   )rH   ru   )r6   rk   rj   r±   r8   r8   r9   Úbuild_rpfilter_rulesG  s0    

znftables.build_rpfilter_rulesc          	   C   s¶   ddddddddd	g	}d
d„ |D ƒ}dddddœidd|idœig}| j jd"krb|jdddiiƒ |j| jdƒƒ g }|jdddtdd|dœiiƒ |jdddtd d!|dœiiƒ |S )#Nz::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19c             S   s2   g | ]*}d |j dƒd t|j dƒd ƒdœi‘qS )r�   rì   r   rE   )rú   rK   )rí   rU   )Ú.0rB   r8   r8   r9   ú
<listcomp>n  s    z5nftables.build_rfc3964_ipv4_rules.<locals>.<listcomp>rx   rû   r.   r­   )rü   rý   z==r|   )r   r€   r�   rÕ   rÔ   r   r�   zRFC3964_IPv4_REJECT: zaddr-unreachr;   r>   r,   r¢   rE   )rA   re   rS   rF   rd   Zfilter_FORWARDé   )rÕ   rÔ   )r/   Z_log_deniedrH   rÛ   ru   )r6   Z	daddr_setr±   rj   r8   r8   r9   Úbuild_rfc3964_ipv4_rulesc  s:    

z!nftables.build_rfc3964_ipv4_rulesc             C   sŽ   d}g }|j | j|jƒƒ |j | j|jƒƒ |j | j|jƒƒ g }|j | j|||||ƒƒ |j | j|||||ƒƒ |j | j	|||||ƒƒ |S )Nr*   )
rH   r  rA   r  r  r  r  rñ   rò   r÷   )r6   r„   r‰   rè   re   r±   rj   r8   r8   r9   Ú*build_policy_rich_source_destination_rules†  s    z3nftables.build_policy_rich_source_destination_rulesc             C   s   |dkrdS dS )NrŽ   r�   ÚebTF)rŽ   r�   r0  r8   )r6   r‘   r8   r8   r9   Úis_ipv_supported•  s    znftables.is_ipv_supportedc             C   s°   dddœ}|| || ddg|| dd|| g|| dd|| g|| dg|| || || g|| ddg|| dd|| g|| dgdd	œ}||krž|| S t td
| ƒ‚d S )NZ	ipv4_addrZ	ipv6_addr)rŽ   r�   Z
inet_protoZinet_serviceró   ZifnameZ
ether_addr)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!ipset type name '%s' is not valid)r	   r   )r6   r‘   rT   Zipv_addrÚtypesr8   r8   r9   Ú_set_type_listš  s"    

znftables._set_type_listc       
      C   sÎ   |rd|kr|d dkrd}nd}t || j||ƒdœ}x0|jdƒd jdƒD ]}|dkrLdg|d< P qLW |r”d|kr€|d |d< d|kr”|d |d< g }x0dD ](}d|i}	|	j|ƒ |jdd|	iiƒ qžW |S )NrA   Úinet6r�   rŽ   )re   rr   rT   ú:rE   ú,r-   Únetr
  Zintervalr(  ZtimeoutZmaxelemÚsizer,   r.   r;   r|   )r-   r7  r
  )r,   r-   r.   )ru   r3  rí   r�   rH   )
r6   rr   rT   Úoptionsr‘   Zset_dictÚtrj   rA   Z	rule_dictr8   r8   r9   Úbuild_set_create_rules´  s*    


znftables.build_set_create_rulesc             C   s$   | j |||ƒ}| j|| jjƒ ƒ d S )N)r;  rm   r/   rÏ   )r6   rr   rT   r9  rj   r8   r8   r9   Ú
set_createÒ  s    znftables.set_createc             C   s8   x2dD ]*}dd|t |dœii}| j|| jjƒ ƒ qW d S )Nr,   r-   r.   r=   r|   )rA   re   rr   )r,   r-   r.   )ru   ro   r/   rÏ   )r6   rr   rA   r>   r8   r8   r9   Úset_destroyÖ  s
    
znftables.set_destroyc             C   s6  | j jj|ƒjjdƒd jdƒ}g }xØtt|ƒƒD ]È}|| dkrr|jdddiiƒ |jdd	|rdd
nddœiƒ q2|| dkr¢|jd| j|ƒ|r”dnddœiƒ q2|| dkrÊ|jdd|r¾dndiiƒ q2|| dkrê|jdddiiƒ q2t	d||  ƒ‚q2W dt|ƒdk�rd|in|d |�r&dndd| dœiS )Nr5  rE   r6  r
  rš   rD   rÜ   rû   Zthr  r  )rü   rý   r-   r7  r  r­   r¬   Zifacer›   r£   ró   z-Unsupported ipset type for match fragment: %srx   Úconcatr   z!=z==ú@)r   r€   r�   )r-   r7  r  )
r/   r  Ú	get_ipsetrT   rí   r  rK   rH   rÇ   r	   )r6   rr   Z
match_destr   Útype_formatr  Úir8   r8   r9   rþ   Ý  s$     znftables._set_match_fragmentc             C   sN  | j jj|ƒ}|jjdƒd jdƒ}|jdƒ}t|ƒt|ƒkrHttdƒ‚g }�xâtt|ƒƒD �]Ð}|| dk�r,y|| j	dƒ}W n& t
k
r¨   |jdƒ || }	Y n,X |j|| d |… ƒ || |d d … }	y|	j	dƒ}W n  t
k
�r   |j|	ƒ Y n(X |jd|	d |… |	|d d … giƒ q\|| dk�r d|| k�rb|jd|| jdƒiƒ n¼y|| j	dƒ}W nL t
k
�rÀ   || }
d|jk�r²|jd dk�r²t|
ƒ}
|j|
ƒ Y n^X || d |… }
d|jk�rö|jd dk�röt|
ƒ}
|jd|
t|| |d d … ƒdœiƒ q\|j|| ƒ q\W t|ƒdk�rJd|igS |S )Nr5  rE   r6  z+Number of values does not match ipset type.r
  Ztcpú-r  r-   r7  rì   rA   r4  r�   )rú   rK   r>  )r-   r7  )r/   r  r@  rT   rí   rK   r	   r   r  rF   ri   rH   r9  r   rU   )r6   rr   ÚentryÚobjrA  Zentry_tokensZfragmentrB  rF   Zport_strrú   r8   r8   r9   Ú_set_entry_fragmentô  sL    

("znftables._set_entry_fragmentc          	   C   sj   g }g }t |ttfƒs|g}x|D ]}|j| j||ƒƒ q"W x(dD ] }|jdd|t||dœiiƒ qBW |S )Nr,   r-   r.   r;   rç   )rA   re   rr   Úelem)r,   r-   r.   )r	  rh   Útupler¶   rF  rH   ru   )r6   rr   Úentriesrj   Úelementsrç   rA   r8   r8   r9   Úbuild_set_add_rules(  s    


znftables.build_set_add_rulesc             C   s"   | j ||ƒ}| j|| jjƒ ƒ d S )N)rK  rm   r/   rÏ   )r6   rr   rD  rj   r8   r8   r9   Úset_add7  s    znftables.set_addc             C   sF   | j ||ƒ}x4dD ],}dd|t||dœii}| j|| jjƒ ƒ qW d S )Nr,   r-   r.   r=   rç   )rA   re   rr   rG  )r,   r-   r.   )rF  ru   ro   r/   rÏ   )r6   rr   rD  rç   rA   r>   r8   r8   r9   Ú
set_delete;  s    
znftables.set_deletec             C   s4   g }x*dD ]"}dd|t |dœii}|j|ƒ q
W |S )Nr,   r-   r.   rb   r|   )rA   re   rr   )r,   r-   r.   )ru   rH   )r6   rr   rj   rA   r>   r8   r8   r9   Úbuild_set_flush_rulesD  s    
znftables.build_set_flush_rulesc             C   s    | j |ƒ}| j|| jjƒ ƒ d S )N)rN  rm   r/   rÏ   )r6   rr   rj   r8   r8   r9   Ú	set_flushM  s    
znftables.set_flushc             C   sJ   | j jj|ƒ}|jdkrd}n(|jrBd|jkrB|jd dkrBd}nd}|S )Nzhash:macrø   rA   r4  r.   r-   )r/   r  r@  rT   r9  )r6   rr   r  rA   r8   r8   r9   rÇ   Q  s    
znftables._set_get_familyc             C   s�   g }|j | j|||ƒƒ |j | j|ƒƒ xbtdt|ƒdƒD ]<}|j | j||||d … ƒƒ | j|| jjƒ ƒ |j	ƒ  q:W | j|| jjƒ ƒ d S )Nr   iè  )
r¶   r;  rN  r  rK   rK  rm   r/   rÏ   Úclear)r6   Zset_nameZ	type_namerI  Zcreate_optionsZentry_optionsrj   rB  r8   r8   r9   Úset_restore^  s    znftables.set_restore)N)N)r”   )r,   )Fr,   )r,   )r,   )F)NN)NN)NN)NN)N)N)N)N)N)N)F)N)N)F)NN)JÚ__name__Ú
__module__Ú__qualname__rr   Zpolicies_supportedr:   rN   rR   r[   ra   rm   ro   rq   rs   rw   rt   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  r  r  r  r  r  r  r  r  r  r  r  r   r"  r%  r'  r*  r.  r/  r1  r3  r;  r<  r=  rþ   rF  rK  rL  rM  rN  rO  rÇ   rQ  r8   r8   r8   r9   r+   T   s’   /.`
4


 R
i 
;
-
9
 +

	
$
$
$


'
$



<
#


4		r+   ijÿÿÿiœÿÿÿ))Z
__future__r   rO   r^   rÿ   Zfirewall.core.loggerr   Zfirewall.functionsr   r   r   r   r   Zfirewall.errorsr	   r
   r   r   r   r   r   Zfirewall.core.richr   r   r   r   r   r   r   Zfirewall.core.icmpr   r   Znftables.nftablesr   ru   rƒ   r¹   rŒ   rp   Úobjectr+   r8   r8   r8   r9   Ú<module>   s,   $$



