
    #fd                         d Z ddlZddlZddlZddlmZ ddlZddlmZm	Z	m
Z
 ddlmZ ddlZd Zd Z G d d	          ZdS )
z'frontend.py: frontend interface for ufw    N)UFWError)errorwarnmsg)UFWBackendIptablesc                 X   t           j                                        }dD ]4}|                    t           j                            |                     5dD ]4}|                    t           j                            |                     5dD ]4}|                    t           j                            |                     5dD ]4}|                    t           j                            |                     5dD ]4}|                    t           j                            |                     5dD ]4}|                    t           j        	                    |                     5g d}|D ]f}|                    t           j        
                    |                     |                    t           j                            |                     gt          |           dk    rd	}| |                                         d
k    rd}| |                                         dk    rP| |                                         dk    r2| |                                         |v r|                     |d           t          |           dk     sd
| v r2t          |           dk     rt          dd           t!                      	 |                    | d	d                   }nI# t$          $ r!}t          d|j        z             Y d}~n#d}~wt(          $ r t          dd            w xY w|S )zEParse command. Returns tuple for action, rule, ip_version and dryrun.)	enabledisablehelpz--helpz-hversionz	--versionreloadreset)listinfodefaultupdate)onofflowmediumhighfull)allowdenyreject)Nverbosenumbered)rawzbefore-rulesz
user-ruleszafter-ruleszlogging-rulesbuiltins	listeningadded)r   limitr   r   insertdeleteprepend      	--dry-runr   routerule   znot enough argsF)do_exitNz%szInvalid syntax)ufwparser	UFWParserregister_commandUFWCommandBasicUFWCommandAppUFWCommandLoggingUFWCommandDefaultUFWCommandStatusUFWCommandShowUFWCommandRuleUFWCommandRouteRulelenlowerr#   r   
ValueErrorparse_commandr   value	Exception)argvpirule_commandsidxpres          ./usr/lib/python3/dist-packages/ufw/frontend.pyr<   r<      s>   
A
 : : 	
3:55a889999 3 8 8	3:33A667777 < < <	3:77::;;;; ) < <	3:77::;;;; + ; ;	3:66q99::::A 9 9	3:44Q778888     M > >	3:44Q77888	3:99!<<==== 4yy1}}9??++C9??	))9??''9??--KKV$$$
4yy1}},,TQ////ll__T!""X&&      dag   .... Is   K! !
L'+L L'c                      t          di dt          j        j        ddddddddd	d
ddddddddddddddddddddddi d d!d"d#d$d%d&d'd(d(d)d)d*d*d+d,d-d.d/d0d1d2d3d3d4d5d6d7d8d9d:d;d<d=d>d?iz            } | S )@zPrint help messagea+  
Usage: %(progname)s %(command)s

%(commands)s:
 %(enable)-31s enables the firewall
 %(disable)-31s disables the firewall
 %(default)-31s set default policy
 %(logging)-31s set logging to %(level)s
 %(allow)-31s add allow %(rule)s
 %(deny)-31s add deny %(rule)s
 %(reject)-31s add reject %(rule)s
 %(limit)-31s add limit %(rule)s
 %(delete)-31s delete %(urule)s
 %(insert)-31s insert %(urule)s at %(number)s
 %(prepend)-31s prepend %(urule)s
 %(route)-31s add route %(urule)s
 %(route-delete)-31s delete route %(urule)s
 %(route-insert)-31s insert route %(urule)s at %(number)s
 %(reload)-31s reload firewall
 %(reset)-31s reset firewall
 %(status)-31s show firewall status
 %(statusnum)-31s show firewall status as numbered list of %(rules)s
 %(statusverbose)-31s show verbose firewall status
 %(show)-31s show firewall report
 %(version)-31s display version information

%(appcommands)s:
 %(applist)-31s list application profiles
 %(appinfo)-31s show information on %(profile)s
 %(appupdate)-31s update %(profile)s
 %(appdefault)-31s set default application policy
prognamecommandCOMMANDcommandsCommandsr	   r
   r   zdefault ARGloggingzlogging LEVELlevelLEVELr   z
allow ARGSr*   r   z	deny ARGSr   zreject ARGSr"   z
limit ARGSr$   zdelete RULE|NUMuruleRULEr#   zinsert NUM RULEr%   zprepend RULEr)   z
route RULEzroute-deletezroute delete RULE|NUMzroute-insertzroute insert NUM RULEnumberNUMr   r   status	statusnumzstatus numberedrulesRULESstatusverbosezstatus verboseshowzshow ARGr   appcommandszApplication profile commandsapplistzapp listappinfozapp info PROFILEprofilePROFILE	appupdatezapp update PROFILE
appdefaultzapp default ARG)_r-   commonprogramName)help_msgs    rF   get_command_helpre   e   s    >"*
CJ* "*	I"*	Z"* 
8"* 
I	"*
 
M"* 
O"* 
'"* 
,"* 
"* 
"* 
="* 
,"* 
$"* 
&"* 
$"*  
N!"* "*" 
,#"*$ 
0%"*& 
0'"*( 
5)"** 
8+"*, 
'-"*. 
8/"*0 
'1"*2 
'3"*4 
*5"*6 
7"*8 
I9"*: 
6;"*< 
J="*> 
&?"*@ 
IA"*B 
*C"* "*D 
(E"* "*?A+ A, A,HF     c                       e Zd ZdZ	 	 ddZd Zd Zd Zdd	ZddZ	d Z
d Zd ZddZddZd Zd Zd Zd Zd Zd Zd ZddZdS )UFWFrontendUIiptablesNc                     |dk    r(	 t          |||          | _        n!# t          $ r  w xY wt          d|z            t	          d          | _        t	          d          | _        t	          d          | _        d S )Nrj   )rootdirdatadirzUnsupported backend type '%s'nyyes)r   backendr>   r   ra   norp   yes_full)selfdryrunbackend_typerl   rm   s        rF   __init__zUFWFrontend.__init__   s    :%%1&':A C  C  C    :lKLLL C&&S66%s     ,c                 d   d}d}|rd}d}|r| j                                         r|s| j                                         rd}|rY	 | j                             | j         j        d         d|           n+# t          $ r}t          |j                   Y d}~nd}~ww xY wd}|r	 | j                                          n # t          $ r}|r|j        }Y d}~nd}~ww xY w|dk    rh	 | j                             | j         j        d         dd           n+# t          $ r}t          |j                   Y d}~nd}~ww xY wt          |           t          d	          }nU	 | j         	                                 n+# t          $ r}t          |j                   Y d}~nd}~ww xY wt          d
          }|S )zlToggles ENABLED state in <config_dir>/ufw/ufw.conf and starts or
           stops running firewall.
         rr   rp   FTconfENABLEDNz0Firewall is active and enabled on system startupz/Firewall stopped and disabled on system startup)
rq   
is_enabledset_defaultfilesr   r   r=   start_firewallra   stop_firewall)rt   enabledres
config_strchangedrE   	error_strs          rF   set_enabledzUFWFrontend.set_enabled   s5    
 	J 	DL3355 		 L3355	G  	(();F)C)2J@ @ @ @   ag 	 	G(++---- ( ( ( ( !I( B#L,,T\-?-G-6> > > > # # #!'NNNNNNNN# i   FGGCC**,,,,   ag EFFC
s`   ,A3 3
B=BB#B= =
C	CC$,D 
D9D44D9E6 6
F FFc                 0   d}	 | j                             ||          }| j                                         r2| j                                          | j                                          n+# t
          $ r}t          |j                   Y d}~nd}~ww xY w|S )zSets default policy of firewallry   N)rq   set_default_policyr|   r   r   r   r   r=   )rt   policy	directionr   rE   s        rF   r   zUFWFrontend.set_default_policy   s    	,11&)DDC|&&(( .**,,,++--- 	 	 	!'NNNNNNNN	 
s   A&A+ +
B5BBc                     d}	 | j                             |          }n+# t          $ r}t          |j                   Y d}~nd}~ww xY w|S )zSets log level of firewallry   N)rq   set_loglevelr   r   r=   )rt   rN   r   rE   s       rF   r   zUFWFrontend.set_loglevel  s`    	,++E22CC 	 	 	!'NNNNNNNN	 
    
AAAFc                     	 | j                             ||          }n+# t          $ r}t          |j                   Y d}~nd}~ww xY w|S )zShows status of firewallN)rq   
get_statusr   r   r=   )rt   r   
show_countoutrE   s        rF   r   zUFWFrontend.get_status  s]    	,))':>>CC 	 	 	!'NNNNNNNN	 
s    
AAAr   c                     	 | j                             |          }n+# t          $ r}t          |j                   Y d}~nd}~ww xY w|S )zShows raw output of firewallN)rq   get_running_rawr   r   r=   )rt   
rules_typer   rE   s       rF   get_show_rawzUFWFrontend.get_show_raw  s[    	,..z::CC 	 	 	!'NNNNNNNN	 
s    
AA  Ac                 `   d}	 t           j                            | j                                                  }n,# t
          $ r t          d          }t          |          w xY w| j                                        }t          |
                                          }|                                 |D ]=}| j                                        s|dv r!|d|z  z  }t          ||         
                                          }|                                 |D ]}||         |         D ]}	|	d         }
|
                    d          s|
                    d          sd}|d|z  z  }|
d	k    s|
d
k    r|dz  }d|	d         z  }
n'|d|
z  z  }t           j                            |
          }|dt          j                            |	d                   z  z  }t           j                            d|dd         ||
dd          }|                    |                    d                     |dk    r|                    d|           |                                 | j                            |          }t1          |          dk    r[|dz  }|D ]S}|dk    rK|dz
  t1          |          k     r5|d|t           j        j                            ||dz
                     fz  z  }T|dz  }Đא?| j                                        st           j                            d           |S )zMShows listening services and incoming rules that might affect
           themry   zCould not get listening status)tcp6udp6z%s:
laddrz127.z::1z  %s z0.0.0.0z::z* z%s/0z%s z(%s)exer   Nr+   inF)actionprotocoldportdstr   forward6r   
r'   z   [%2d] %s
z)Skipping tcp6 and udp6 (IPv6 is disabled))r-   utilparse_netstat_outputrq   use_ipv6r>   ra   r   	get_rulesr   keyssort
startswithget_if_from_ipospathbasenamerb   UFWRuleset_v6endswithset_interface	normalizeget_matchingr9   r.   r7   get_commanddebug)rt   r   derr_msgrV   	protocolsprotoportsportitemaddrifnamer*   matchingrA   s                  rF   get_show_listeningzUFWFrontend.get_show_listening  sP    	$--dl.C.C.E.EFFAA 	$ 	$ 	$899G7###	$ &&((NN	 3	$ 3	$E<((** u8H/H/H7e$$C5))EJJLLL -$ -$eHTN ,$ ,$D=D??622 *$??511*$!#w~-9,,4KC#)T']#;DD54</C%(X%<%<T%B%BFv(8(8e(E(EEE  #z11;@!98<6:<@:?  2  3  3 ENN3$7$7888!R<< ..tV<<<((( $(<#<#<T#B#Bx==1,,4KC%- & &#$q55QUSZZ-?-?$'?a(+
(A(M(M*/!*)6 )6>& ,& %&C tY,$-$^ |$$&& 	HHNNFGGG
s	   6; )A$c                    | j                                         }t          d          }t          |          dk    r|t          d          z   S g }| j                                         D ]w}|j        r(dt
          j        j                            |          z  }n$t
          j        j	                            |          }||v rZ|
                    |           |d|z  z  }x|S )z!Shows added rules to the firewallz9Added user rules (see 'ufw status' for running firewall):r   z
(None)route %sz
ufw %s)rq   r   ra   r9   r   r-   r.   r8   r   r7   append)rt   rV   r   r!   rrstrs         rF   get_show_addedzUFWFrontend.get_show_addedf  s    &&((KLLu::??:&&'')) 	% 	%Ay @!
6BB1EEF z0<<Q?? u}}LL:$$CC
rf   c                    d}d}d}g }|j         dk    r"|j        dk    r|                    |           ng }	 |j        r|dk    r| j                            |d          }n|dk    r| j                            |d          }n|dk    r| j                            |d          }| j                            |d          }|D ]F}	|D ]A}
|
j        }d|
_        |	                    |
          s||
_        |                    |
           BGn!t          d          |z  }t          |          t          |          dk    rC| j        j        s7t          d	          }|dk    r|}n|dk    r|d
z   }n|dk    r|dz   |z   d
z   }|S |D ]k}|                                }|j        |_        |                    |j                   |                    |j                   |                    |           ln9| j                            |          }|j        dk    r|                                 n# t(          $ r  w xY wd}d}t          d          }| j                            d          }| j                            d          }t-          |          D ]\  }}|}|j        ||z   k    r)|t/          |j                  dz   z  }t          |          	 | j                                        r|dk    r|j        dk    r&|dk    r|dk    rdnd}|                    |           n4|j        |k    r)|t/          |j                  dz   z  }t          |          |                    d           | j                            |          }n|dk    r|j        dk    r&|dk    r|dk    rdnd}|                    |           nh|j        |k    r|                    |j        |z
             n?|j        dk    r4|j        |k    r)|t/          |j                  dz   z  }t          |          |                    d           | j                            |          }n|dk    r|j        }|                    d           |dk    r&|dk    r|dk    rdnd}|                    |           n_|j        sX||k    rR| j                            ||z
  |z   d          }|dk    r|                    |           n|                    d           | j                            |          }|j        s8|dk    r2| j                            d          }|                    |dz              |                    d           |dk    r&|dk    r|dk    rdnd}|                    |           nq|j        sj|j        dk    r_|j        |k    rT| j                            |j        d          }|dk    r|                    ||z
             n|                    d           |dk    r|dz  }|j        s.|j        |k    r#|dk    r|                    |j        |z
             || j                            |          z  }nt          d          |z  }t          |          |j        dk    r%|dk    r|dk    rdnd}|                    |           |dk    s|dk    r0|                    d           | j                            |          }nE|dk    rt          d          }t          |          t          d          |z  }t          |          n!# t          $ r}|j        }d}Y d}~ n4d}~ww xY w|j        r#t          d          }t?          j         |           |s||z  }n2t          |          dk    rtC          |           nd}tE          tG          |dz                       }|                                 |D ]}|dk    r||         r~||                                         }d|_        	 |                     ||           I# t(          $ r8 d}t          d          |$                                z  }tA          |           Y w xY w|t          d          z  }|r|t          d          z  }n|t          d          z  }t          |          |S )zUpdates firewall with rulery   v4Fv6TbothzInvalid IP version '%s'r   z"Could not delete non-existent rulez (v6)r   zInvalid position ''r'   zIPv6 support not enabledNz Rule changed after normalizationzCould not back out rule '%s'z"
Error applying application rules.z# Some rules could not be unapplied.z( Attempted rules successfully unapplied.)%dappsappr   removerq   get_app_rules_from_systemr   matchra   r   r9   ru   dup_rule
set_actionr   set_logtypelogtypeget_app_rules_from_templatepositionreverser>   get_rules_count	enumeratestrr   set_positionr   set_rulefind_other_positionr=   updatedwarningsr   r   r   rangeformat_rule)rt   r*   
ip_versionr   r   tmprV   tmprules	tmprules6xro   prev6r   count	set_errorpos_err_msgnum_v4num_v6rA   beginuser_posr@   rE   warn_msg
undo_errorindexesjbackout_rules                               rF   r   zUFWFrontend.set_rule  s	   9??tyBLLH2; /(!T))#'<#I#ICG$P $P#t++#'<#I#ICG$O $O#v--#'<#I#ICG$P $P$(L$J$JCG%O %O	 "* 7 7A%. 7 7()','(wwqzz !7+0AD$,OOA$6$6$677 #$$=">">*"M&w/// 8}}))$,2E) DEE%--"%CC'4//"%-CC'611"%*s"2W"<C"
' ( (LLNN#';T[111dl333Q( !LDDTJJE }))    	,----e44--d33e$$ c	( c	(DAqEzFVO++s1:44{+++Z<((** U0!T)):++).!!AAENN51111Z&00'3qz??S+@@K"*;"7"77"l33A66#t++:++).!!AAENN51111Z&00NN1:+>????Z1__v1E1E'3qz??S+@@K"*;"7"77"l33A66#v--#$:#r>>).!!AAENN51111!" 	2h.?.? !% @ @ (6 1E 94!A !AA 1uu !q 1 1 1 1 !"q 1 1 1"l33A66  !x 9HqLL%)\%A%A%%H%HFNN8a<888#r>>).!!AAENN51111!" 2aj1nn:// !% @ @AF!H !HA 1uu !q5y 9 9 9 9 !"q 1 1 1"994KC  !x @AJ,?,?#r>>NN1:+>???t|44Q777"#$=">">*"M&w///zR''%*aZZFaKKQu---!T))Z6-A-A"l33A66#t++"#$>"?"?&w///"#$=">">*"M&w///   ' 	
 y (?@@h''' 	$3JCCZZ1__'NNNN J5q>>**GOO ' '199q9#(8#4#4#6#6L*.L''lJ????$ ' ' '%)
#$%C#D#D%&]]__$5X' q>???G I1BCCC1GHHH7###
s>   EH+ B(H+ +H7Q/]  
]
	]]#`::?a<;a<c                 N   	 t          |          }n/# t          $ r" t          d          |z  }t          |          w xY w| j                                        }|dk    s|t          |          k    r!t          d          |z  }t          |          | j                            |          }|s!t          d          |z  }t          |          d|_        d}|j	        rd}d}|s|j
        r(dt          j        j                            |          z  }	n$t          j        j                            |          }	t          d          |	| j        | j        d	z  }
t%          |
t&          j        d
           t&          j                                                                                                        }|dk    r<|| j                                        k    r|| j                                        k    rd
}d}|r|                     ||          }nt          d          }|S )zDelete rulezCould not find rule '%s'r   zCould not find rule '%d'Tr   r   r   z=Deleting:
 %(rule)s
Proceed with operation (%(yes)s|%(no)s)? )r*   rp   rr   Foutputnewlinero   ry   Aborted)intr>   ra   r   rq   r   r9   get_rule_by_numberr   r   r   r-   r.   r8   r   r7   rp   rr   r   sysstdoutstdinreadliner:   striprs   r   )rt   rR   forcern   r   rV   r*   r   proceedr   promptansr   s                rF   delete_rulezUFWFrontend.delete_ruleO  s1   	$FAA 	$ 	$ 	$233f<G7###	$ &&((66QU^^233a7G7###|..q11 	$233a7G7###
7 	J 	 | C!
6BB4HHI z0<<TBB , - -9=8<7;w1@ 1@AF sz59999)$$&&,,..4466CczzcTX^^%5%555dm))++++ 	--j11CCI,,C
s    ,>c                 	   d}|                     d          r\|                    d          }t          |          dk    r|                     |d                   }nr|                     d          }n[|dk    r|                     d          }n>|                     d          rjt	          d	          }|                    d
          }t          |          dk    rt          |          |                     |d         |d                   }n|dk    r|                     |          }n|dk    r|                                 }n|dk    r|                     d          }ni|                     d          rj|                    d
          d         }|dk    r| 	                                }n|dk    r| 
                                }n|                     |          }n|dk    r|                     dd          }n|dk    r|                     d          }n|dk    r|                     d          }n|dk    re| j                                        r;|                     d           |                     d           t	          d          }n8t	          d          }n'|                     d          r1|                     |                    d
          d         |          }n|dk    s|dk    s|dk    s|dk    r|j        dk    r	 | j                            |j                  }||j        k    r||_        |                    |d            nt# t
          $ rg}|j        st)          |j                   t,          j                            |j                  st	          d!          }t          |          Y d"}~nd"}~ww xY w|j        dk    r	 | j                            |j                  }||j        k    r||_        |                    |d            nt# t
          $ rg}|j        st)          |j                   t,          j                            |j                  st	          d!          }t          |          Y d"}~nd"}~ww xY w|                     ||          }n!t	          d#          |z  }t          |          |S )$zPerform action on rule. action, rule and ip_version are usually
           based on return values from parse_command().
        ry   z
logging-onra   r'   r   zlogging-offr   zdefault-zUnsupported default policy-r+   r&   r   rT   zstatus-verboseTrY   r    r!   zstatus-numberedFr	   r
   r   Firewall reloadedz&Firewall not enabled (skipping reload)zdelete-r   r   r   r"   r   Invalid profile nameNUnsupported action '%s')r   splitr9   r   ra   r   r   r   r   r   r   r   r   rq   r|   r  r   find_application_nameset_portr   r   r=   r-   applicationsvalid_profile_namer   r   )	rt   r   r*   r   r  r   r   r   rE   s	            rF   	do_actionzUFWFrontend.do_action  s    \** M	$,,s##C3xx!||''A//''--}$$##E**CCz** E	$455G,,s##C3xx1}}w'''))#a&#a&99CCw**U##CCx//##CC'''//$''CCv&& 9	$,,s##A&Ck!!--//))++'',,(((//%..CCx""4((CCy  ""5))CCx|&&(( B  '''  &&&+,,@AAy)) $	$""6<<#4#4Q#7??CCw&F"2"2f6H6HwyB0,<<TYGGCdi''$'	c5111 0 0 0; 'ag+>>tyII 0"#$:";";&w///0 0 0 0 0	0 yB0,<<TYGGCdi''$'	c5111 0 0 0; 'ag+>>tyII 0"#$:";";&w///0 0 0 0 0	0 --j11CC122f=G7###
s4   AM 
O%AOOAP# #
R-ARRc                     d}	 | j                             |          }n+# t          $ r}t          |j                   Y d}~nd}~ww xY w|S )z+Sets default application policy of firewallry   N)rq   set_default_application_policyr   r   r=   )rt   r   r   rE   s       rF   r  z*UFWFrontend.set_default_application_policy  s`    	,==fEECC 	 	 	!'NNNNNNNN	 
r   c                     t          | j        j                                                  }|                                 t          d          }|D ]
}|d|z  z  }|S )z*Display list of known application profileszAvailable applications:
  %s)r   rq   profilesr   r   ra   )rt   namesr   rn   s       rF   get_application_listz UFWFrontend.get_application_list  s_    T\*//1122

*++ 	# 	#AHN"DDrf   c                    g }|dk    r@t          | j        j                                                  }|                                 nRt
          j                            |          st          d          }t          |          |
                    |           d}|D ]}|| j        j        vs| j        j        |         s!t          d          |z  }t          |          t
          j                            || j        j        |                   st          d          }t          |          |t          d          |z  z  }|t          d          t
          j                            | j        j        |                   z  z  }|t          d          t
          j                            | j        j        |                   z  z  }t
          j                            | j        j        |                   }t          |          d	k    s
d
|d         v r|t          d          z  }n|t          d          z  }|D ]
}|d|z  z  }||t          |          d	z
           k    r|dz  }t
          j                            |          S )zDisplay information on profileallr	  ry   zCould not find profile '%s'zInvalid profilezProfile: %s
z
Title: %s
zDescription: %s

r'   ,r   zPorts:zPort:r  z

--

)r   rq   r  r   r   r-   r  r  ra   r   r   verify_profile	get_titleget_description	get_portsr9   r   	wrap_text)rt   pnamer  r   r   namer   r@   s           rF   get_application_infoz UFWFrontend.get_application_info  ss   E>>.335566EJJLLLL#66u== (233w'''LL 	% 	%D4<000<(. 19::dCw'''#224|$T*, , (-..w'''Ao&&$//DAm$$(8(B(B(,(=d(C)E )E F FD A+,,-0-=-M-M-1\-B4-H.J .JK KD $..t|/DT/JKKE5zzA~~a(#'

" ' 'A&uSZZ\***$x!!$'''rf   c                    d}d}d}	 | j         j        r t          j                                        rd}n# t
          $ r d}Y nw xY w|dk    rvt          | j         j                                                  }|	                                 |D ]3}| j         
                    |          \  }}|r|dk    r|dz  }||z  }|}4n(| j         
                    |          \  }}|dk    r|dz  }|rj| j                                         rQ|r=	 | j                                          n# t
          $ r  w xY w|t          d          z  }n|t          d          z  }|S )Refresh application profilery   TFr  r   r  zSkipped reloading firewall)rq   	do_checksr-   r   	under_sshr>   r   r  r   r   update_app_ruler|   _reload_user_rulesra   )	rt   r]   r   allow_reloadtrigger_reloadr  r@   r   founds	            rF   application_updatezUFWFrontend.application_update  s   	!|% %#(*<*<*>*> %$ 	! 	! 	! !LLL		! eDL1668899HMMOOO + +#|;;A>>e +byytCKD%*N+ &*\%A%A'%J%J"T>rzz 	8dl5577 	8 8L335555    -...6777s   ,5 AA	D# #D/c                    d}d}|dk    rt          d          }t          |          | j        j        d         }|dk    r(t          j                            d|d|d           |S |d	k    rd
}n3|dk    rd}n*|dk    rd}n!t          d          |z  }t          |          dg}| j        j        r|                    d           |||gz  }	 t          |          }n# t          $ r  w xY wd|j        v r3|                     |j        |j        d         |j        d                   }n|                     |j        dd          }|S )r$  ry   r  z%Cannot specify 'all' with '--add-new'default_application_policyskipzPolicy is 'z', not adding profile 'r   acceptr   dropr   r   zUnknown policy '%s'r-   r(   r*   iptype)ra   r   rq   defaultsr-   r   r   ru   r   r<   r>   datar  r   )rt   r]   r   r   r   r   argsrD   s           rF   application_addzUFWFrontend.application_addB  s   e?@@G7###,'(DEfHNNN"FFGGG- . . .K  FFFF  FF-..':G7###y< 	%KK$$$&'##	t$$BB 	 	 		 RW>>")RWV_"$'("35 5DD >>")R44Ds   C! !C-c                 F   d}|dk    r|                      d          }n|dk    r|                      d          }n|dk    r|                      d          }n|dk    r|                      d	          }n|d
k    r|                                 }n|dk    r|                     |          }nv|dk    s|dk    rI|                     |          }d}|dk    r|                     |          }|dk    r|dk    r|dz  }||z   }n!t          d          |z  }t          |          |S )zzPerform action on profile. action and profile are usually based on
           return values from parse_command().
        ry   zdefault-allowr   zdefault-denyr   zdefault-rejectr   zdefault-skipr/  r   r   r   zupdate-with-newr   r
  )r  r  r"  r,  r6  ra   r   )rt   r   r]   r   str1str2r   s          rF   do_application_actionz!UFWFrontend.do_application_actionl  s`    _$$55g>>CC~%%55f==CC'''55h??CC~%%55f==CCv++--CCv++G44CCx6->#>#>**733DD***++G44rzzdbjj+CC122f=G7###
rf   c                    d}| j         j        rt          j                                        rt          d          | j        | j        dz  }t          |t          j
        d           t          j                                                                                                        }|dk    r|| j        k    r|| j        k    rd}|S )z6If running under ssh, prompt the user for confirmationTzWCommand may disrupt existing ssh connections. Proceed with operation (%(yes)s|%(no)s)? rp   rr   Fr   ro   )rq   r%  r-   r   r&  ra   rp   rr   r   r   r   r   r   r:   r   rs   )rt   r  r  r  s       rF   continue_under_sshzUFWFrontend.continue_under_ssh  s    <! 	 ch&8&8&:&: 	  C D D $88:F sz59999)$$&&,,..4466CczzcTXoo#2F2Frf   c                    d}t          d          | j        | j        dz  }| j        j        r=t
          j                                        rt          d          | j        | j        dz  }| j        j        r|st          t
          j        	                    |          t          j        d           t          j                                                                                                        }|dk    r'|| j        k    r|| j        k    rt          d          }|S | j                                        r||                     d          z  }| j                                        }|S )	zReset the firewallry   zTResetting all rules to installed defaults. Proceed with operation (%(yes)s|%(no)s)? r<  zResetting all rules to installed defaults. This may disrupt existing ssh connections. Proceed with operation (%(yes)s|%(no)s)? Fr   ro   r   )ra   rp   rr   rq   r%  r-   r   r&  r   r  r   r   r   r   r:   r   rs   r|   r   r   )rt   r  r   r  r  s        rF   r   zUFWFrontend.reset  sZ    2 3 3 HDG446 <! 	:ch&8&8&:&: 	: 6 7 7 !%88:F
 <! 	% 	""6**3:uMMMM)$$&&,,..4466CczzcTXoo#2F2F	ll
<""$$ 	+4##E***Cl  ""
rf   )rj   NN)FF)r   )F)__name__
__module____qualname____doc__rw   r   r   r   r   r   r   r   r   r  r  r  r  r"  r,  r6  r:  r=  r    rf   rF   rh   rh      sm       H,6'+! ! ! ! 4 4 4l          F F FP  :J J JX/ / / /bT T T Tl    ,( ,( ,(\) ) )V( ( (T  @       rf   rh   )rB  r   r   r   
ufw.commonr   ufw.utilr-   r   r   r   ufw.backend_iptablesr   
ufw.parserr<   re   rh   rC  rf   rF   <module>rH     s    - -" 
			 



         % % % % % % % % % % 3 3 3 3 3 3    E E EPE E EPD D D D D D D D D Drf   