
    #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y)
z'frontend.py: frontend interface for ufw    N)UFWError)errorwarnmsg)UFWBackendIptablesc                    t         j                  j                         }dD ]0  }|j                  t         j                  j	                  |             2 dD ]0  }|j                  t         j                  j                  |             2 dD ]0  }|j                  t         j                  j                  |             2 dD ]0  }|j                  t         j                  j                  |             2 dD ]0  }|j                  t         j                  j                  |             2 dD ]0  }|j                  t         j                  j                  |             2 g d}|D ]^  }|j                  t         j                  j                  |             |j                  t         j                  j                  |             ` t        |       dkD  rmd	}| |   j                         d
k(  rd}| |   j                         dk7  r=| |   j                         dk7  r'| |   j                         |v r| j                  |d       t        |       dk  sd
| v r%t        |       dk  rt        dd       t!               	 |j#                  | d	d       }|S # t$        $ r#}t        d|j&                  z         Y d}~S d}~wt(        $ r t        dd        w xY w)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9: 3 8	3::33A678 < <	3::77:;< ) <	3::77:;< + ;	3::66q9:;A 9	3::44Q789
 M >	3::44Q78	3::99!<=> 4y1}9??+C9??	)9??'9??-KKV$
4y1},TQ/l__T!"X& I   dagg
 I	  .s   7J 	KJ44K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    >"*
CJJ** "*	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,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y)UFWFrontendUINc                     |dk(  r	 t        |||      | _        nt        d|z        t	        d      | _        t	        d      | _        t	        d      | _        y # t        $ r  w xY w)Niptables)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__   sm    :%1&':A C
 :lKLL C&S6%  s   A A%c                 t   d}d}|rd}d}|r| j                   j                         r|s| j                   j                         rd}|r5	 | j                   j                  | j                   j                  d   d|       d}|rm	 | j                   j                          |dk7  r@	 | j                   j                  | j                   j                  d   dd       t        |       t        d	      }|S 	 | j                   j                          t        d
      }|S # t        $ r}t        |j                         Y d}~d}~ww xY w# t        $ r}|r|j                  }Y d}~d}~ww xY w# t        $ r}t        |j                         Y d}~d}~ww xY w# t        $ r}t        |j                         Y d}~d}~ww xY w)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   s    
JDLL335DLL335G ((););F)C)2J@
 	(++-
 B#LL,,T\\-?-?-G-6> i FGC 
**, EFC
A  agg  ( !I(   #!''NN#  aggs`   4D E  !4E$ .F 	D=D88D= 	E!	EE!$	F-FF	F7F22F7c                 8   d}	 | j                   j                  ||      }| j                   j                         r4| j                   j                          | j                   j	                          |S # t
        $ r }t        |j                         Y d}~|S d}~ww xY w)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&)DC||&&(**,++- 
  	!''NN
	s   A*A0 0	B9BBc                     d}	 | j                   j                  |      }|S # t        $ r }t        |j                         Y d}~|S d}~ww xY w)zSets log level of firewallry   N)rq   set_loglevelr   r   r=   )rt   rN   r   rE   s       rF   r   zUFWFrontend.set_loglevel  sK    	,,++E2C 
  	!''NN
	   ! 	A
AA
c                     	 | j                   j                  ||      }|S # t        $ r }t        |j                         Y d}~S d}~ww xY w)zShows status of firewallN)rq   
get_statusr   r   r=   )rt   r   
show_countoutrE   s        rF   r   zUFWFrontend.get_status  sH    	,,))':>C 
  	!''NN
	s     	A	AA	c                     	 | j                   j                  |      }|S # t        $ r }t        |j                         Y d}~S d}~ww xY w)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  sF    	,,..z:C 
  	!''NN
	s    	AAAc                    d}	 t         j                  j                  | j                  j	                               }| j                  j                         }t        |j                               }|j                          |D ]   }| j                  j	                         s|dv r#|d|z  z  }t        ||   j                               }|j                          |D ]  }||   |   D ]  }	|	d   }
|
j                  d      r|
j                  d      r-d}|d|z  z  }|
d	k(  s|
d
k(  r|dz  }d|	d   z  }
n'|d|
z  z  }t         j                  j                  |
      }|dt        j                  j!                  |	d         z  z  }t         j"                  j%                  d|dd ||
dd      }|j'                  |j)                  d             |dk7  r|j+                  d|       |j-                          | j                  j/                  |      }t1        |      dkD  r[|dz  }|D ]Q  }|dkD  s	|dz
  t1        |      k  s|d|t         j2                  j4                  j7                  ||dz
           fz  z  }S |dz  }   | j                  j	                         st         j                  j9                  d       |S # t
        $ r t        d      }t        |      w xY w)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  s    	$--dll.C.C.EFA
 &&(N	 3	$E<<((*u8H/H7e$$C5)EJJL -$eHTN ,$D=D??62??51!#w~-9,4KC#)T']#;D54</C%(XX%<%<T%BFv(8(8e(EEE  #zz11;@!98<6:<@:?  2  3 ENN3$78!R< ..tV<( $(<<#<#<T#Bx=1,4KC%- &#$q5QUSZ-?$'?a(+

(A(A(M(M*/!*)6>& ,& %&C& tY,$-$3	$j ||$$&HHNNFG
A  	$89G7##	$s   7J? ? Kc                    | j                   j                         }t        d      }t        |      dk(  r|t        d      z   S g }| j                   j                         D ]  }|j                  r-dt
        j                  j                  j                  |      z  }n)t
        j                  j                  j                  |      }||v rj|j                  |       |d|z  z  } |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u:?:&&'') 	%Ayy!

66BB1EF zz00<<Q? u}LL:$$C	%" 
rf   c                    d}d}d}g }|j                   dk(  r"|j                  dk(  r|j                  |       ng }	 |j                  r|dk(  r| j                  j                  |d      }n|dk(  r| j                  j                  |d      }n|dk(  r| j                  j                  |d      }| j                  j                  |d      }|D ]F  }	|D ]?  }
|
j                  }d|
_        |	j                  |
      r(||
_        |j                  |
       A H nt        d      |z  }t        |      t        |      dk(  rH| j                  j                  s2t        d	      }|dk(  r|}|S |dk(  r|d
z   }|S |dk(  r|dz   |z   d
z   }|S |D ]j  }|j                         }|j                  |_        |j                  |j                         |j                  |j                          |j                  |       l n:| j                  j#                  |      }|j$                  dk7  r|j'                          d}d}t        d      }| j                  j+                  d      }| j                  j+                  d      }t-        |      D ]  \  }}|}|j$                  ||z   kD  r&|t/        |j$                        dz   z  }t        |      	 | j                  j1                         r|dk(  r|j$                  dk(  r |dk(  r|dk(  rdnd}|j3                  |       n5|j$                  |kD  r&|t/        |j$                        dz   z  }t        |      |j5                  d       | j                  j7                  |      }n|dk(  r|j$                  dk(  r |dk(  r|dk(  rdnd}|j3                  |       nr|j$                  |kD  r|j3                  |j$                  |z
         nD|j$                  dk7  r5|j$                  |k  r&|t/        |j$                        dz   z  }t        |      |j5                  d       | j                  j7                  |      }n|dk(  r|j$                  }|j5                  d       |dk(  r |dk(  r|dk(  rdnd}|j3                  |       n[|j                  sO||kD  rJ| j                  j9                  ||z
  |z   d      }|dkD  r|j3                  |       n|j3                  d       | j                  j7                  |      }|j                  s4|dkD  r/| j                  j+                  d      }|j3                  |dz          |j5                  d       |dk(  r |dk(  r|dk(  rdnd}|j3                  |       n{|j                  so|j$                  dkD  r`|j$                  |k  rQ| j                  j9                  |j$                  d      }|dkD  r|j3                  ||z
         n|j3                  d       |dk7  r|dz  }|j                  s2|j$                  |kD  r#|dk7  r|j3                  |j$                  |z
         || j                  j7                  |      z  }nt        d      |z  }t        |      |j$                  dk(  r|dk(  r|dk(  rdnd}|j3                  |       |dk(  s|dk(  r-|j5                  d       | j                  j7                  |      }n4|dk(  rt        d      }t        |      t        d      |z  }t        |      |j<                  st        d      }t?        j@                  |        |s||z  }|S t        |      dk(  rtC        |       |S d}tE        tG        |dz               }|j'                          |D ];  }|dkD  s	||   s||   j                         }d|_        	 | j7                  ||       = |t        d      z  }|r|t        d      z  }t        |      |t        d      z  }t        |      # t(        $ r  w xY w# t        $ r}|j:                  }d}Y d}~ d}~ww xY w# t(        $ r, d}t        d      jI                         z  }tA        |       Y w xY w)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   99?tyyBLLH2;;!T)#'<<#I#ICG$P#t+#'<<#I#ICG$O#v-#'<<#I#ICG$P$(LL$J$JCG%O	 "* 7A%. 7()','(wwqz+0AD$,OOA$677 #$$=">*"M&w// 8})$,,2E2E DE%-"%C
  #
	 (4/"%-C  #
 (61"%*s"2W"<C"
' (LLN#';;T[[1dll3Q( !LLDDTJE }}) 	,---e4--d3e$ c	(DAqEzzFVO+s1::44{++Z<<((*!T)::+).!!AENN51ZZ&0'3qzz?S+@@K"*;"77"ll33A6#t+::+).!!AENN51ZZ&0NN1::+>?ZZ1_v1E'3qzz?S+@@K"*;"77"ll33A6#v-#$::#r>).!!AENN51!"h.? !% @ @ (6 1E 94!AA 1u !q 1 !"q 1"ll33A6  !xxHqL%)\\%A%A%%HFNN8a<8#r>).!!AENN51!"ajj1n::/ !% @ @AF!HA 1u !q5y 9 !"q 1"94KC  !xxAJJ,?#r>NN1::+>?t||44Q77"#$=">*"M&w//zzR'%*aZFaKQu-!T)Z6-A"ll33A6#t+"#$>"?&w//"#$=">*"M&w// yy?@h'Gc	(J 3JC> 
= Z1_'N8 
1 J5q>*GOO '19q#(8#4#4#6L*.L''lJ?' q>??G1BCC 7## 1GHH7##Y  H  '' 	6 % '%)
#$%C#D%&]]_$5X'sQ   B<` :A-` (` 4` B*` Q`:a`	a '`;;a 2a87a8c                    	 t        |      }| j                  j                         }|dk  s|t        |      kD  rt        d      |z  }t        |      | j                  j                  |      }|st        d      |z  }t        |      d|_        d}|j                  rd}d}|s|j                  r-dt        j                  j                  j                  |      z  }	n)t        j                  j                  j                  |      }	t        d      |	| j                   | j"                  d	z  }
t%        |
t&        j(                  d
       t&        j*                  j-                         j/                         j1                         }|dk7  r<|| j                   j/                         k7  r|| j2                  j/                         k7  rd
}d}|r| j5                  ||      }|S t        d      }|S # t        $ r t        d      |z  }t        |      w xY w)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  s   	$FA
 &&(6QU^23a7G7##||..q123a7G7##
77J||!

66BB4HI zz00<<TB , -9=8<7;ww1@AF szz59))$$&,,.446CczcTXX^^%55dmm))++--j1C 
 I,C
W  	$23f<G7##	$s   G) )#Hc                    d}|j                  d      rH|j                  d      }t        |      dkD  r| j                  |d         }|S | j                  d      }|S |dk(  r| j                  d      }|S |j                  d      rOt	        d	      }|j                  d
      }t        |      dk7  rt        |      | j                  |d   |d         }|S |dk(  r| j                  |      }|S |dk(  r| j                         }|S |dk(  r| j                  d      }|S |j                  d      rU|j                  d
      d   }|dk(  r| j                         }|S |dk(  r| j                         }|S | j                  |      }|S |dk(  r| j                  dd      }|S |dk(  r| j                  d      }|S |dk(  r| j                  d      }|S |dk(  rV| j                  j                         r/| j                  d       | j                  d       t	        d      }|S t	        d      }|S |j                  d      r&| j                  |j                  d
      d   |      }|S |dk(  s|dk(  s
|dk(  s|dk(  r|j                   dk7  rN	 | j                  j#                  |j                         }||j                   k7  r||_        |j%                  |d        |j2                  dk7  rN	 | j                  j#                  |j2                        }||j2                  k7  r||_        |j%                  |d        | j5                  ||      }|S t	        d#      |z  }t        |      # t
        $ rj}|j&                  st)        |j*                         t,        j.                  j1                  |j                         st	        d!      }t        |      Y d"}~d"}~ww xY w# t
        $ rk}|j&                  st)        |j*                         t,        j.                  j1                  |j2                        st	        d!      }t        |      Y d"}~d"}~ww xY w)$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  sh    \*,,s#C3x!|''A/X 
U ''-T 
S }$##E*CP 
O z*45G,,s#C3x1}w''))#a&#a&9CD 
C w**U#C@ 
 x//#C| 
{ ''//$'Cx 
w v&,,s#A&Ck!--/p 
o ))+l 
i '',h 
g ((//%.Cd 
c x""4(C` 
_ y ""5)C\ 
[ x||&&(  '  &+,R 
O @AN 
M y)""6<<#4Q#7?CJ 
I w&F"2f6HwyyB0,,<<TYYGCdii'$'	c51 yyB0,,<<TYYGCdii'$'	c51 --j1C
 
 12f=G7##3   0;;agg++>>tyyI"#$:";&w// J	0   0;;agg++>>tyyI"#$:";&w// J	0s4    AM AO 	O
 A OO
	QA P<<Qc                     d}	 | j                   j                  |      }|S # t        $ r }t        |j                         Y d}~|S d}~ww xY w)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  sK    	,,==fEC 
  	!''NN
	r   c                     t        | j                  j                  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  sU    T\\**//12

*+ 	#AHN"D	#rf   c                    g }|dk(  r>t        | j                  j                  j                               }|j	                          nFt
        j                  j                  |      st        d      }t        |      |j                  |       d}|D ]  }|| j                  j                  vs| j                  j                  |   st        d      |z  }t        |      t
        j                  j                  || j                  j                  |         st        d      }t        |      |t        d      |z  z  }|t        d      t
        j                  j                  | j                  j                  |         z  z  }|t        d      t
        j                  j                  | j                  j                  |         z  z  }t
        j                  j                  | j                  j                  |         }t        |      d	kD  sd
|d   v r|t        d      z  }n|t        d      z  }|D ]
  }|d|z  z  } ||t        |      d	z
     k7  s|dz  } t
        j                   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  s<   E>..3356EJJL##66u=23w''LL 	%D4<<000<<((.9:dCw''##224||$$T*,-.w''Ao&$//DAm$(8(8(B(B(,(=(=d(C)E F FD A+,-0-=-=-M-M-1\\-B-B4-H.JK KD $$..t||/D/DT/JKE5zA~a(#'
" 'A&' uSZ\**$;	%> xx!!$''rf   c                    d}d}d}	 | j                   j                  r t        j                  j	                         rd}|dk(  rwt        | j                   j                  j                               }|j                          |D ]4  }| j                   j                  |      \  }}|s$|dk7  r|dz  }||z  }|}6 n(| j                   j                  |      \  }}|dk7  r|dz  }|rU| j                   j                         r;|r+	 | j                   j                          |t        d      z  }|S |t        d      z  }|S # t
        $ r d}Y w xY w# t
        $ r  w xY w)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_   	!||%%#((*<*<*>$ eDLL116689HMMO +#||;;A>ebytCKD%*N+ &*\\%A%A'%J"T>rzdll557LL335 -..  677?  	! !L		!2 ! s   6D; E ;E
	E
Ec                    d}d}|dk(  rt        d      }t        |      | j                  j                  d   }|dk(  r(t        j
                  j                  d|d|d       |S |d	k(  rd
}n)|dk(  rd}n!|dk(  rd}nt        d      |z  }t        |      dg}| j                  j                  r|j                  d       |||gz  }	 t        |      }d|j                  v r9| j                  |j                  |j                  d   |j                  d         }|S | j                  |j                  dd      }|S # t        $ r  w xY w)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  sV   e?@G7##,,''(DEfHHNN"G- .K FF F-.':G7##y<<KK$&'##	t$B RWW>>"))RWWV_"$''("35D
  >>"))R4D  		s   	D: :Ec                    d}|dk(  r| j                  d      }|S |dk(  r| j                  d      }|S |dk(  r| j                  d      }|S |dk(  r| j                  d	      }|S |d
k(  r| j                         }|S |dk(  r| j                  |      }|S |dk(  s|dk(  r?| j                  |      }d}|dk(  r| j	                  |      }|dk7  r
|dk7  r|dz  }||z   }|S t        d      |z  }t        |      )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  sO    _$55g>C0 
/ ~%55f=C, 
+ ''55h?C( 
' ~%55f=C$ 
# v++-C  
 v++G4C 
 x6->#>**73DD**++G4rzdbj+C
 
 12f=G7##rf   c                    d}| j                   j                  rt        j                  j	                         rt        d      | j                  | j                  dz  }t        |t        j                  d       t        j                  j                         j                         j                         }|dk7  r || j                  k7  r|| j                  k7  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    <<!!chh&8&8&: C D $8:F szz59))$$&,,.446CczcTXXo#2Frf   c                    d}t        d      | j                  | j                  dz  }| j                  j                  rCt
        j                  j                         r%t        d      | j                  | j                  dz  }| j                  j                  r|st        t
        j                  j                  |      t        j                  d       t        j                  j                         j                         j                         }|dk7  r+|| j                  k7  r|| j                   k7  rt        d      }|S | j                  j#                         r|| j%                  d      z  }| j                  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  s)    2 3 HHDGG46 <<!!chh&8&8&: 6 7 !%8:F
 <<!!%""6*3::uM))$$&,,.446CczcTXXo#2F	l
<<""$4##E**Cll  "
rf   )rk   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      sv    ,6'+! 4lFP:JX/b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 EPEPD Drf   