o
    Faj                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	 ddl
mZmZmZmZmZmZ ddlZG dd dejjZdS )z-backend_iptables.py: iptables backend for ufw    N)UFWErrorUFWRule)warndebugmsgcmdcmd_pipe	_findpathc                   @   s   e Zd ZdZd+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 Zdd Zdd Zd-ddZd.dd Zd!d" Zd-d#d$Zd%d& Zd'd( Zd)d* ZdS )/UFWBackendIptableszInstance class for UFWBackendNc                 C   s  dt jj d | _|| _|| _i }tt jj|}tj	
|d|d< tj	
|d|d< tj	
|d|d< tj	
|d	|d
< tj	
|d|d< tj	
|d|d< tj	
tt jj|d|d< t jjj| d||||d g g g g d| _dD ]C}d}|dkr|  r||7 }n|dkrqsdD ]}dD ]}	d|||	f }
| j| |
 qq| jd |d  | jd |d  qsg d| _d| _dS ) z!UFWBackendIptables initializationz# z
_comment #zufw/user.rulesruleszufw/before.rulesbefore_ruleszufw/after.rulesafter_ruleszufw/user6.rulesrules6zufw/before6.rulesbefore6_ruleszufw/after6.rulesafter6_ruleszufw-initinitiptables)rootdirdatadir)beforeuseraftermisc)46ufwr   )r   r   r   inputoutputforwardz%s-%s-logging-%sr   z-logging-denyz-logging-allow)-mlimit--limitz3/minute-jLOG--log-prefixz[UFW LIMIT BLOCK]N)r   commonprogramNamecomment_strr   r   r	   
config_dirospathjoin	state_dirbackend
UFWBackend__init__chainsuse_ipv6appendufw_user_limit_logufw_user_limit_log_text)selfdryrunr   r   filesr)   verchain_prefixloctargetchain r>   6/usr/lib/python3/dist-packages/ufw/backend_iptables.pyr0       sD   


zUFWBackendIptables.__init__c                 C   sb   t d}| jd dkr|d7 }|S | jd dkr|d7 }|S | jd dkr+|d7 }|S |d	7 }|S )
zGet current policyzNew profiles:default_application_policyacceptz allowdropz denyrejectz rejectz skip)_defaults)r6   rstrr>   r>   r?   get_default_application_policyP   s   z1UFWBackendIptables.get_default_application_policyc              	   C   s  | j s|dkr|dkr|dkrtd| }t||dkr/|dkr/|dkr/td| }t|d	}|dkr8d
}n|dkr>d}d}d}|dkrbz| | jd d| d W n ty\    w d}d}n;|dkrz| | jd d| d W n ty|    w d}d}nz| | jd d| d W n ty    w d}d}td| }| jd | jd fD ]F}ztj	
|}	W n ty    w |	d }
|	d D ]}||rtj	|
||| qtj	|
| qztj	|	 W q ty    w td||d }|td7 }|S )zSets default policy of firewallallowdenyrC   zUnsupported policy '%s'incomingoutgoingroutedz%Unsupported policy for direction '%s'INPUTOUTPUTFORWARD rE   zDEFAULT_%s_POLICYz"ACCEPT"z	UFW BLOCKz	UFW ALLOWz"REJECT"z"DROP"r   r   tmporigz5Default %(direction)s policy changed to '%(policy)s'
)	directionpolicyz*(be sure to update your rules accordingly))r7   rD   r   set_defaultr8   	Exceptionrecompiler   util
open_filessearchwrite_to_filesubclose_files)r6   rT   rS   err_msgr=   old_log_strnew_log_strpatffnsfdlinerF   r>   r>   r?   set_default_policy^   s   
z%UFWBackendIptables.set_default_policyc                 C   s  | j rdtd }|dtd 7 }|S |   g d}g }g }|dkr1|d g d}g d}n|d	kr{d
D ]}|d|  |d|  q7dD ]}|d|  |d|  qJdD ]}|d|  |d|  q]dD ]	}|d|  qpn|dkrdD ]}|d|  |d|  qn|dkrdD ]}|d|  |d|  q| jd d r|d |d | jd d r|d |d n`|d krdD ]}|d!|  |d"|  qnH|d#kr-dD ],}|d$|  |d%|  |d&|  |d'|  |d(|  |d)|  q|d* |d+ |d, |d- d.| }|D ]H}d/|v rW|d/\}	}|d0|	 7 }t| jg| |d|	g \}
}nt| jg| |g \}
}||7 }|dkrq|d17 }|
d2krzt|q3|dks| 	 r|d37 }|D ]H}d/|v r|d/\}	}|d0|	 7 }t| jg| |d|	g \}
}nt| j
g| |g \}
}||7 }|dkr|d17 }|
d2krt|q|S )4z'Show current running status of firewall> zChecking raw iptables
zChecking raw ip6tables
)-nz-vz-x-Lrawz-t)filternatmanglerk   )rl   rn   rk   builtins)rM   rO   rN   z	filter:%s)
PREROUTINGrM   rO   rN   POSTROUTINGz	mangle:%s)rp   rN   zraw:%s)rp   rq   rN   znat:%sr   )r   r   r   zufw-before-%szufw6-before-%sr   ufw-user-%sufw6-user-%sr!   r   zufw-user-limit-acceptufw-user-limitr   zufw6-user-limit-acceptufw6-user-limitr   zufw-after-%szufw6-after-%sloggingzufw-before-logging-%szufw6-before-logging-%szufw-user-logging-%szufw6-user-logging-%szufw-after-logging-%szufw6-after-logging-%szufw-logging-allowzufw-logging-denyzufw6-logging-allowzufw6-logging-denyzIPV4 (%s):
:z(%s) 
r   z

IPV6:
)r7   rD   initcapsr3   capssplitr   r   r   r2   	ip6tables)r6   
rules_typeoutargsitemsitems6cbitrcrQ   r>   r>   r?   get_running_raw   s   











 


 

z"UFWBackendIptables.get_running_rawFc           $      C   s  d}| j rdtd }|  r|dtd 7 }|S td}dD ]@}t| jdd| d	g\}}|d
kr8td  S |dkrDt|d|  |  r_t| jdd| d	g\}}|dkr_t|d qd}d}	d}
| j| j }d
}i }|D ]}d}i }d}d}|s|j	dks|j
dkrd}| }||v rtd|  qrd||< dD ]}d||< d}d}|dkr|j}|s|j	dkr|j	}|jr|dkr|d7 }n |j}n|j}|s|j
dkr|j
}|jr|dkr|d7 }n|j}|dkr|dkr|||< |dkr|| dkr|||< n
||  d| 7  < |r#|jdkr#||  d|j 7  < |r|dkrU|j	dkrU||  d|j	 7  < |jrM|dkrM||  d7  < ||  d7  < |dkr|j
dkr||  d|j
 7  < |jr||dkr|||  d7  < ||  d7  < |dkr|dks|dkrd||< |r|jdkr|j|jkr|j|jkr||  d|j 7  < |dkr||  d7  < n;|r|jdkr|j|jkr||  d|j 7  < n|jr|jdkr|jdkrd|| vr||  d7  < |jr3|dkr|jdkr||  d|j 7  < |dkr2|jdkr2||  d|j 7  < q|dkrI|jdkrI||  d|j 7  < |dkr_|jdkr_||  d|j 7  < qg }d}|jsp|j d kr|jr|||j  |r|jd kr||j t|dkrd!d"| }|r|d#| 7 }|j }|jrd$}|jd%kr|js|s|sd}d}|jdkrd&|  }|d'|d d|j |g|d ||f 7 }|r||7 }n|jr|
|7 }
n|jd kr |	|7 }	n||7 }|d
7 }qr|dks|	dks|
dkrd(}|r!|d)7 }td*}td+}td,}d-}||||f }|r=|d)7 }||d.t| d.t| d.t| f 7 }||7 }|dkr_||7 }|dkro|	dkro|td/7 }|	dkrx||	7 }|dkr|
dkr|td/7 }|
dkr||
7 }|}|r|   \} }!td0| ! | !d1| !d2dd3 }"| " }#td4|!|"|#|d5 S td6| S )7zShow ufw managed rulesrP   rh   zChecking iptables
zChecking ip6tables
problem runningr   rj   rr   ri      zStatus: inactiver   z iptables: %s
rs   
 ip6tablesTFzSkipping found tuple '%s')dstsrcr   z::/0 (v6)z	0.0.0.0/0any /z (%s)r   Anywherez on %sr~   z (%s)z, z[%2d] FWDinz # %sz%-26s %-12s%-26s%s%s
z

z     ToFromActionz%-26s %-12s%s
-rx   zCDefault: %(in)s (incoming), %(out)s (outgoing), %(routed)s (routed)r   r   )r   r~   rL   z0Status: active
%(log)s
%(pol)s
%(app)s%(status)s)logpolappstatuszStatus: active%s)#r7   rD   r2   r   r   r   r|   r   r   dappsappget_app_tupler   r   v6dportr   sportprotocolr   interface_ininterface_outlogtyperS   lowerr3   lenr,   uppercommentget_commentactionget_loglevel_get_default_policyrG   )$r6   verbose
show_countr~   r_   rS   r   out6sstr_outstr_rter   count	app_rulesrtmp_strlocationtupl
show_protor;   portrQ   attribs
attrib_strdir_strr(   full_strstr_tostr_from
str_actionrules_header_fmtrules_headerlevellogging_str
policy_strapp_policy_strr>   r>   r?   
get_status  sz  







 











zUFWBackendIptables.get_statusc                 C   s   | j rtdtd  dS g }|| jd  | jdur7| jdur7|d || j |d || j |d t|\}}|dkrPtd	| }t|dS )
zStop the firewallrh   running ufw-initr   N	--rootdir	--datadirz
force-stopr   problem running ufw-init
%s)	r7   r   rD   r3   r8   r   r   r   r   r6   r   r   r~   r_   r>   r>   r?   stop_firewall  s   


z UFWBackendIptables.stop_firewallc                 C   s(  | j rtdtd  dS g }|| jd  | jdur7| jdur7|d || j |d || j |d t|\}}|dkrPtd	| }t|d
| j	vsa| j	d
 t
| j vryz| d W dS  tyx   td}t|w z| | j	d
  W dS  ty   td}t|w )zStart the firewallrh   r   r   Nr   r   startr   r   loglevellowzCould not set LOGLEVELzCould not load logging rules)r7   r   rD   r3   r8   r   r   r   r   rE   list	loglevelskeysset_loglevelrV   update_loggingr   r>   r>   r?   start_firewall  s8   



z!UFWBackendIptables.start_firewallc                 C   s   | j rdS |   d}| j}|rd}| j}dD ]7}|dks!|dkr5|r+| jd d s+q|s5| jd d s5qt|d	d
|d | g\}}|dkrNtd  dS qdS )zCheck if all chains existFr   ufw6)r   r   r   r!   limit-acceptr!   r   r   r   ri   rj   z-user-r   z_need_reload: forcing reloadT)r7   ry   r   r|   rz   r   r   )r6   r   prefixexer=   r   r~   r>   r>   r?   _need_reload  s(   zUFWBackendIptables._need_reloadc                 C   s   t d}| jrtd |  rtd dS dS |  rwz| jd D ]}| |d|g | |d|g q!W n ty@   t|w t	d| j
d g| jd	g\}}|d
krZt|d |  ryt	d| j
d g| jd	g\}}|d
kr{t|d dS dS dS )zReload firewall rules filer   z> | iptables-restorez> | ip6tables-restorer   -F-Zcatr   ri   r   z	 iptablesr   r   N)rD   r7   r   r2   
is_enabledr1   
_chain_cmdrV   r   r   r8   iptables_restoreip6tables_restore)r6   r_   r   r   r~   r>   r>   r?   _reload_user_rules:  s:   z%UFWBackendIptables._reload_user_rulesc                 C   s8  g }t d}t d}t d}||rK||rA||r.||d|d| n	||d| ||d| n||d| n|| t d}t d	}	t d
}
d}t|D ]v\}}||r|d| }| dkrd}n| dkrd}nd}d||f }|	|sd| }|d|||< |||d| d | | |||
d| d | |d| |||
d| d | |d| | qet d}t|D ]4\}}||r|d|}|d| d |}|d| d |}|||< ||| ||| q|S ) z5Return list of iptables rules appropriate for sendingz-p all zport z-j (REJECT(_log(-all)?)?)z-p tcp z-j \1 --reject-with tcp-resetz-p udp rP   z(.*)-j ([A-Z]+)_log(-all)?(.*)z-j [A-Z]+_log-allz(-A|-D) ([a-zA-Z0-9\-]+)z'-m limit --limit 3/min --limit-burst 10\2rA   ALLOWr!   LIMITBLOCKz"%s -j LOG --log-prefix "[UFW %s] "z-m conntrack --ctstate NEW z	\1-j \2\4z\1-j z-user-logging-z\1 z\1-j RETURN\1z	 -j LIMITz+ -m conntrack --ctstate NEW -m recent --setzL -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 -j z-user-limitz -j z-user-limit-accept)	rW   rX   r[   r3   r]   	enumeratestripr   insert)r6   fruler   suffixsnippets	pat_protopat_port
pat_rejectpat_log
pat_logall	pat_chain
limit_argsr   r   rT   lstr	pat_limittmp1tmp2tmp3r>   r>   r?   _get_rules_from_formattedV  s   













z,UFWBackendIptables._get_rules_from_formattedc           	      C   s   g }|  |||}td}t|D ]8\}}||d|  ||rJ|| d || |d|dd ||  |d| 7  < q|S )z_Return list of iptables rules appropriate for sending as arguments
           to cmd()
        z(.*) --log-prefix (".* ")(.*)r   r%   r   "rP   z\3)	r   rW   rX   r   r3   r]   r{   matchreplace)	r6   r   r   r   r   str_snippetsrb   r   r   r>   r>   r?   _get_lists_from_formatted  s   

z,UFWBackendIptables._get_lists_from_formattedc                 C   s  | j d g}|  r|| j d  |D ]}ztj|}W n ty0   td| }t|w t	
d}t	
d}t	
d}|D ]z}|}	d}
d|v rX|d\}	}| }
||	r|d|	}t	d	| }t|d
k sxt|dkrtd| }t| qBd}d}d}t|dkst|dkrtd| }|d dd }d|d v rd|d v r||d r||d r|d dd dd }|d dd dd }n'|d dr|d dd }n|d dr|d dd }nt| qBz|d }d}d|v rd}|dd }t|dk r7t||d |d |d |d |d |||
	}n;t||d |d |d |d |d |||
	}t	
d}|d
 d krb|d!|d
 |_|d d krr|d!|d |_|dkr}|d| |dkr|d"| W n ty   td#| }t| Y qBw || j d kr|d | j| qB|d | j| qB|  qd$S )%z$Read in rules that were added by ufwr   r   zCouldn't open '%s' for readingz^### tuple ###\s*zin_\w+zout_\w+rP   z	 comment=z\s+   	   z)Skipping malformed tuple (bad length): %sr      z$Skipping malformed tuple (iface): %srD   r   !   r   in_out_Frw   T            %20r   r   r~   zSkipping malformed tuple: %sN)r8   r2   r3   r   rY   open_file_readrV   rD   r   rW   rX   r{   r   r   r]   r   r   r[   	partition
startswithr   r   r   set_interfaceset_v6r   r   close)r6   rfnsrc   rR   r_   	pat_tuplepat_iface_inpat_iface_out	orig_linerf   r   hexr   rQ   wmsgdtyper   r   r   r   rule	pat_spacewarn_msgr>   r>   r?   _read_rules  s   











zUFWBackendIptables._read_rulesc                 C   s&  | j d }|r| j d }t|tjstd| }t|ztj|}W n t	y-    w | 
  d}| j}|r>d}| j}| jrGtj }n|d }tj|d tj|d| d	  tj|d| d
  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  tj|d| d  |dkr| jd d s|dkr| jd d rtj|d| d  tj|d| d  tj|d |D ]	}|j}	|jr3d|j }	|jdkr@|	d|j 7 }	d}
|jdkrR|jdkrR|j}
n0|jdkrg|jdkrgd |j|jf }
n|jdkrx|
d!|j|jf 7 }
n
|
d!|j|jf 7 }
|jdkr|jdkrd"|	|j|j|j|j|j|
f }|j dkr|d#|j  7 }tj||d$  nGt!"d%}d&}|jr|#d'|j}d&}|jr|#d'|j}d(|	|j|j|j|j|j|||
f	 }|j dkr|d#|j  7 }tj||d$  d)}|jrd*}n|jd+krd,}d-||f }d.||$ f }| %|||D ]
}tj|| q"q$tj|d/ tj|d0 z
| &| j'd1 }W n	 t	yP    w |D ]2\}}}t(|d2krh|d2 d3krhqS|)|d& rtj|d%*|+d4d5+d6d7d$  qStj|d8 |dkr| jd d s|dkr| jd d rtj|d9 | j'd1 d:krtj|d;| d< d%*| j, d= | j- d>  tj|d;| d?  tj|d;| d@  tj|dA tj|dB z| jrtj.|dC W dDS tj.| W dDS  t	y    w )Ez.Write out new rules to file to user chain filer   r   z'%s' is not writabler   r   rQ   z*filter
rw   z-user-input - [0:0]
z-user-output - [0:0]
z-user-forward - [0:0]
z-before-logging-input - [0:0]
z-before-logging-output - [0:0]
z -before-logging-forward - [0:0]
z-user-logging-input - [0:0]
z-user-logging-output - [0:0]
z-user-logging-forward - [0:0]
z-after-logging-input - [0:0]
z-after-logging-output - [0:0]
z-after-logging-forward - [0:0]
z-logging-deny - [0:0]
z-logging-allow - [0:0]
r!   r   r   z-user-limit - [0:0]
z-user-limit-accept - [0:0]
z### RULES ###
zroute:rP   rD   zin_%s!out_%sz%s_%sz#
### tuple ### %s %s %s %s %s %s %sz comment=%srx   r   r   r  z)
### tuple ### %s %s %s %s %s %s %s %s %sr   r   r~   r   
%s-user-%sz	-A %s %s
z
### END RULES ###
z
### LOGGING ###
r   r   -D[z"[z] z] "z### END LOGGING ###
z
### RATE LIMITING ###
offz-A z-user-limit z "z "
z-user-limit -j REJECT
z-user-limit-accept -j ACCEPT
z### END RATE LIMITING ###
zCOMMIT
FN)/r8   r*   accessW_OKrD   r   r   rY   rZ   rV   ry   r   r   r7   sysstdoutfilenor\   rz   r   r   r   r   r   rS   r   r   r   r   r   r   r   r   rW   rX   r]   format_ruler   _get_logging_rulesrE   r   r  r,   r  r4   r5   r^   )r6   r   
rules_filer_   rd   r:   r   re   r   r   ifaceststrr   r   r   chain_suffixr=   rule_strr   lrules_tr   qr>   r>   r?   _write_rules  sT  






zUFWBackendIptables._write_rulesTc              	   C   sn  |    d}|jr)|  std}t||jdkr(| jd d s(td|j S n|jdkr<| jd d s<td|j S |jrQ|jdkrQ|jd	krQtd
}t|g }d}d}| j	}|j
}	|jrv| jdk rs|jdkso|jdkrstdS | j}|	dk s|	t|krtd|	 }t||	dkr|jrtd}t||	t|krtd|	 }t|z|  W n ty    w d}
d}d}d}|D ]}z|  W n ty    w |j|j|j|jf}|
|	kr|d dkr|d dkr|
dks|d dkr|d dks||krd}||  d}n|	d7 }	|}|
d7 }
t||}|dk r+|d7 }|dkrD|sD|sDd}|jsC||  q|dkrV|jrV|jdkrVd}q|dk rn|jsn|snd}d}||  q|| q|r|dkrtd}|jr|d7 }|S n?|s|js||  |s|jr| jstd}|jr|d7 }|S |r|js|std}|jr|d7 }|S |jr|| _n|| _	z| |j W n ty     ty   td}t| Y nw td}|jrtd}|  r5| js5d}|s| |js|rPd}|r(|td7 }n|td 7 }|jr6|d7 }|rIz|   W nR tyH    w |td!7 }nB|r|jrd"}td#}|jre|d7 }|r{z|   W n	 tyw    w d}n|td!7 }n|s|s|jsd$}td%}|dkr5| j}d&}|jr| j }d'}|d7 }d(}|j!rd)}n|j"d*krd+}d,||f }td-}t#|d.|d/g\}}|dkrt|d0|||$ f }t%&d1}| '|||D ]H}t#|g| \}}|dkrt(|t)j* t| |d$kr3|+d2,|r3|-d3d2,|}t#|d"|d4d5g\}}|dkr3t.d6|  q|S )7aX  Updates firewall with rule by:
        * appending the rule to the chain if new rule and firewall enabled
        * deleting the rule from the chain if found and firewall enabled
        * inserting the rule if possible and firewall enabled
        * updating user rules file
        * reloading the user rules file if rule is modified
        rP   z)Adding IPv6 rule failed: IPv6 not enabledr!   r   z#Skipping unsupported IPv6 '%s' ruler   z#Skipping unsupported IPv4 '%s' ruleudptcpz/Must specify 'tcp' or 'udp' with multiple portsFz1.4z:Skipping IPv6 application rule. Need at least iptables 1.4r   zInvalid position '%d'z Cannot specify insert and deletez#Cannot insert rule at position '%d'r   )rP   rP   rP   rP   r	  r  Tz Skipping inserting existing ruler   z"Could not delete non-existent rulezSkipping adding existing rulezCouldn't update rules filezRules updatedzRules updated (v6)zRule insertedzRule updatedz (skipped reloading firewall)r$  zRule deleted-Az
Rule addedr   r   r   r   r~   r   r#  !Could not update running firewallrj   ri   z%s %s %sz(-A +)(ufw6?-user-[a-z\-]+)(.*)r   r   r#   RETURNzFAILOK: -D %s -j RETURN)/ry   r   r2   rD   r   r   rz   multir   r   positioniptables_versionr   r   r   r   remove	normalizerV   r   r   r3   dup_ruler   r   r   r7   r5  r   r   r   r   r|   r   rS   r   r,  rW   rX   r  r   r)  stderrr[   r,   r]   r   )r6   r  allow_reloadrF   r_   newrulesfoundmodifiedr   r=  r   insertedmatcheslastr   currentretflagr   r:   r1  r=   r   r~   r2  r   r   r   r>   r>   r?   set_rule  sZ  


"







zUFWBackendIptables.set_rulec           
      C   st   g }g }|r
| j }n| j}| }|| |  | }|D ]}| }|  | }	|	|kr7|| q |S )z@Return a list of UFWRules from the system based on template rule)r   r   rA  r  r@  r   r3   )
r6   templater   r   r   normr   r   rQ   	tmp_tupler>   r>   r?   get_app_rules_from_system  s"   

z,UFWBackendIptables.get_app_rules_from_systemc                 C   s\   | j }|dr| j}t|g| \}}|dkr,td| }|r(td|  dS t|dS )zPerform command on chainr   r   zCould not perform '%s'zFAILOK: N)r   r  r|   r   rD   r   r   )r6   r=   r   fail_okr   r   r~   r_   r>   r>   r?   r     s   
zUFWBackendIptables._chain_cmdc           	   	   C   sx  | j rdS |   g }z| |}W n ty    w z| jdd | jdd W n ty1     tyA   td}t| Y nw |  sHdS td}| jd | jd  | jd	  | jd
  D ]}z| 	|d|dg W q` tyx   t|w z$| jd | jd	  | jd
  D ]}| 	|d|g | 	|d|g qW n ty   t|w |D ]B\}}}d}t
|dkr|d dkrd}z"|dkrt
|dkr| j	|dg|dd  dd | 	||| W q ty   t|w dD ]I}| jd d r|dks| jd d r9|dkr9| j	|d|g| j | jd g dd | jd dkr9| j	|d|g| j | jd g dd qdS )z#Update loglevel of running firewallNF)r   Tz&Couldn't update rules file for loggingr:  r   r   r   r   rj   ri   r   r   r   r$  delete_firstr   )rR  )rt   ru   r!   r   rt   r   ru   r   r   r&  -I)r7   ry   r-  rV   r5  r   rD   r   r1   r   r   rz   r4   r5   rE   )	r6   r   rules_tr_   r   r   r4  rR  r=   r>   r>   r?   r     s   


z!UFWBackendIptables.update_loggingc           	      C   s  g }|t | j vrtd| }t||dkr/| jd D ]}||d|ddgdg q|S | jd D ]}||d|ddgd	g q4g d
}| j| | jd krg }| j| | jd k r`|}| jd D ]I}dD ]D}||r| |dks~| |dkrd}||d|ddd|g| d	g qi| j| | jd krd}||d|ddd|g| d	g qiqeg }| j| | jd k r|}| jd D ]S}|drd}n9|drd}| j| | jd k r||d|ddddddg| d	g n||d|ddddddddg
| d	g ||d|ddd|g| d	g q| j| | jd kr\g }| j| | jd k r0|}| j| | jd k rAg d| }d }| jd! D ]}||d|ddd|g| d	g qH|S )"z%Get rules for specified logging levelzInvalid log level '%s'r&  r   rT  r#   r;  rS  r$  rP   )r    r!   r"   z3/minz--limit-burst10r   highr   r   rC   rI   z[UFW BLOCK] r9  r$   r%   mediumz[UFW ALLOW] r   rH   r    	conntrack	--ctstateINVALIDz[UFW AUDIT INVALID] full)r    rY  rZ  NEWz[UFW AUDIT] r   )	r   r   r   rD   r   r1   r3   endswithr   )	r6   r   rU  r_   r   r   largsr   r   r>   r>   r?   r-    s   


z%UFWBackendIptables._get_logging_rulesc              
   C   s  d}t tjj| j}g }| jD ]2}| j| dsq|| j|  tj	
|dtj	| j| }tj	|sAtd| }t|qtd}|D ]}d||f }tj	|ratd| }t|qI|D ]}d||f }|tdtj	||d	 7 }t|| qd|D ]]}d||f }ttj	
|dtj	|tj	| t|| zt|}	|	tj }
W n ty   td
| }t| Y qw |
tj@ r|td| 7 }q|
tj@ r|td| 7 }q|S )zReset the firewallrP   z.rulesr   zCould not find '%s'. Abortingz%Y%m%d_%H%M%Sz%s.%sz'%s' already exists. Abortingz"Backing up '%(old)s' to '%(new)s'
)oldnewzCouldn't stat '%s'zWARN: '%s' is world writablezWARN: '%s' is world readable)r	   r   r&   	share_dirr   r8   r^  r3   r*   r+   r,   basenameisfilerD   r   timestrftimeexistsrenameshutilcopydirnamecopymodestatST_MODErV   r   S_IWOTHS_IROTH)r6   resrb  allfilesr   fnr_   extr`  statinfomoder!  r>   r>   r?   resetk  sb   







zUFWBackendIptables.reset)NN)FF)F)T)__name__
__module____qualname____doc__r0   rG   rg   r   r   r   r   r   r   r   r  r"  r5  rM  rQ  r   r   r-  rw  r>   r>   r>   r?   r
      s0    
0K
] f!D
e 
* i
JZr
   )r{  r*   rW   ri  rm  r)  re  
ufw.commonr   r   ufw.utilr   r   r   r   r   r	   ufw.backendr   r.   r/   r
   r>   r>   r>   r?   <module>   s     