
    #fd                     |    S r SSKrSSKrSSKrSSKJr  SSKrSSKJrJ	r	J
r
  SSKJr  SSKrS rS r " S S	5      rg)
z'frontend.py: frontend interface for ufw    N)UFWError)errorwarnmsg)UFWBackendIptablesc                    [         R                  R                  5       nS H1  nUR                  [         R                  R	                  U5      5        M3     S H1  nUR                  [         R                  R                  U5      5        M3     S H1  nUR                  [         R                  R                  U5      5        M3     S H1  nUR                  [         R                  R                  U5      5        M3     S H1  nUR                  [         R                  R                  U5      5        M3     S H1  nUR                  [         R                  R                  U5      5        M3     / SQnU H_  nUR                  [         R                  R                  U5      5        UR                  [         R                  R                  U5      5        Ma     [        U 5      S:  an  S	nX   R                  5       S
:X  a  SnX   R                  5       S:w  a>  X   R                  5       S:w  a(  X   R                  5       U;   a  U R                  US5        [        U 5      S:  d  S
U ;   a#  [        U 5      S:  a  [        SSS9  [!        5       e UR#                  U S	S 5      nU$ ! [$         a#  n[        SUR&                  -  5         SnAW$ SnAf[(         a    [        SSS9  e f = f)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<      sV   

A
 	
3::55a89
 3	3::33A67 3 <	3::77:; < )	3::77:; ) +	3::66q9: +A	3::44Q78A
 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   J 
K(KKc                  *   [        S0 S[        R                  R                  _SS_SS_SS_SS_S	S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_0 S S!_S"S#_S$S%_S&S'_S(S(_S)S)_S*S*_S+S,_S-S._S/S0_S1S2_S3S3_S4S5_S6S7_S8S9_S:S;_S<S=_ES>S?0E-  5      n U $ )@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                       \ rS rSrSr  SS jrS rS rS rSS jr	SS	 jr
S
 rS rS rSS jrSS jrS rS rS rS rS rS rS rSS jrSrg)UFWFrontend   UINc                     US:X  a   [        XUS9U l        O[        SU-  5      e[	        S5      U l        [	        S5      U l        [	        S5      U l        g ! [         a    e f = f)Niptables)rootdirdatadirzUnsupported backend type '%s'nyyes)r   backendr>   r   ra   norq   yes_full)selfdryrunbackend_typerm   rn   s        rF   __init__UFWFrontend.__init__   sk    :%1&:A C
 :lKLL C&S6%  s   A A#c                    SnSnU(       a  SnSnU(       a  U R                   R                  5       (       a&  U(       d!  U R                   R                  5       (       a  SnU(       a5   U R                   R                  U R                   R                  S   SU5        SnU(       an   U R                   R                  5         US:w  a@   U R                   R                  U R                   R                  S   SS5        [        U5        [        S	5      nU$  U R                   R                  5         [        S
5      nU$ ! [         a  n[        UR                  5         SnANSnAff = f! [         a  nU(       a  UR                  n SnANSnAff = f! [         a  n[        UR                  5         SnANSnAff = f! [         a  n[        UR                  5         SnANSnAff = f)zYToggles ENABLED state in <config_dir>/ufw/ufw.conf and starts or
stops running firewall.
 rs   rq   FTconfENABLEDNz0Firewall is active and enabled on system startupz/Firewall stopped and disabled on system startup)
rr   
is_enabledset_defaultfilesr   r   r=   start_firewallra   stop_firewall)ru   enabledres
config_strchangedrE   	error_strs          rF   set_enabledUFWFrontend.set_enabled   s    
JDLL3355DLL3355G ((););F)C)2J@
 	(++-
 B#LL,,T\\-?-?-G-6> i FGC 
**, EFC
A  agg  ( !I(   #!''NN#  aggs`   &4D9 $E% 4F F; 9
E"EE"%
F/FF
F8F33F8;
G$GG$c                 B   Sn U R                   R                  X5      nU R                   R                  5       (       a4  U R                   R                  5         U R                   R	                  5         U$ ! [
         a   n[        UR                  5         SnAU$ SnAff = f)zSets default policy of firewallr{   N)rr   set_default_policyr~   r   r   r   r   r=   )ru   policy	directionr   rE   s        rF   r   UFWFrontend.set_default_policy   s~    	,,11&DC||&&((**,++- 
  	!''NN
	s   A.A4 4
B>BBc                     Sn U R                   R                  U5      nU$ ! [         a   n[        UR                  5         SnAU$ SnAff = f)zSets log level of firewallr{   N)rr   set_loglevelr   r   r=   )ru   rN   r   rE   s       rF   r   UFWFrontend.set_loglevel  sK    	,,++E2C 
  	!''NN
	   ! 
AAAc                      U R                   R                  X5      nU$ ! [         a   n[        UR                  5         SnAW$ SnAff = f)zShows status of firewallN)rr   
get_statusr   r   r=   )ru   r   
show_countoutrE   s        rF   r   UFWFrontend.get_status  sF    	,,))'>C 
  	!''NN
	    
A	AA	c                      U R                   R                  U5      nU$ ! [         a   n[        UR                  5         SnAW$ SnAff = f)zShows raw output of firewallN)rr   get_running_rawr   r   r=   )ru   
rules_typer   rE   s       rF   get_show_rawUFWFrontend.get_show_raw  sF    	,,..z:C 
  	!''NN
	r   c                    Sn [         R                  R                  U R                  R	                  5       5      nU R                  R                  5       n[        UR                  5       5      nUR                  5         U GH  nU R                  R	                  5       (       d  US;   a  M+  USU-  -  n[        X&   R                  5       5      nUR                  5         U GH  nX&   U    GH  n	U	S   n
U
R                  S5      (       a  M!  U
R                  S5      (       a  M9  SnUSU-  -  nU
S	:X  d  U
S
:X  a  US-  nSU	S   -  n
O'USU
-  -  n[         R                  R                  U
5      nUS[        R                  R!                  U	S   5      -  -  n[         R"                  R%                  SUSS UU
SSS9nUR'                  UR)                  S5      5        US:w  a  UR+                  SU5        UR-                  5         U R                  R/                  U5      n[1        U5      S:  a`  US-  nU HU  nUS:  d  M  US-
  [1        U5      :  d  M  USU[         R2                  R4                  R7                  XNS-
     5      4-  -  nMW     US-  nGM     GM     GM      U R                  R	                  5       (       d  [         R                  R9                  S5        U$ ! [
         a    [        S5      n[        U5      ef = f)zBShows listening services and incoming rules that might affect
themr{   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_outputrr   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)ru   r   derr_msgrV   	protocolsprotoportsportitemaddrifnamer*   matchingrA   s                  rF   get_show_listeningUFWFrontend.get_show_listening  s    	$--dll.C.C.EFA
 &&(N	E<<((**u8H/H7e$$C)EJJLHTND=D??622??51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 +  j ||$$&&HHNNFG
A  	$89G7##	$s   7K" "!Lc                    U R                   R                  5       n[        S5      n[        U5      S:X  a  U[        S5      -   $ / nU R                   R                  5        H  nUR                  (       a-  S[
        R                  R                  R                  U5      -  nO)[
        R                  R                  R                  U5      nXS;   a  Mq  UR                  U5        USU-  -  nM     U$ )z!Shows added rules to the firewallz9Added user rules (see 'ufw status' for running firewall):r   z
(None)route %sz
ufw %s)rr   r   ra   r9   r   r-   r.   r8   r   r7   append)ru   rV   r   r!   rrstrs         rF   get_show_addedUFWFrontend.get_show_addedf  s    &&(KLu:?:&&'')Ayy!

66BB1EF zz00<<Q? }LL:$$C *" 
rf   c                    SnSnSn/ nUR                   S:X  a#  UR                  S:X  a  UR                  U5        GO/ n UR                  (       Ga  US:X  a  U R                  R                  US5      nOUS:X  a  U R                  R                  US5      nOUS:X  a  U R                  R                  US5      nU R                  R                  US5      nU HN  n	U HE  n
U
R                  nSU
l        U	R                  U
5      (       a  M.  Xl        UR                  U
5        MG     MP     O[        S5      U-  n[        U5      e[        U5      S:X  aP  U R                  R                  (       d5  [        S	5      nUS:X  a  UnU$ US:X  a  US
-   nU$ US:X  a  US-   U-   S
-   nU$ U Hk  nUR                  5       nUR                  Ul        UR                  UR                  5        UR                  UR                   5        UR                  U5        Mm     O;U R                  R#                  U5      nUR$                  S:w  a  UR'                  5         SnSn[        S5      nU R                  R+                  S5      nU R                  R+                  S5      n[-        U5       GH   u  nnUnUR$                  UU-   :  a&  U[/        UR$                  5      S-   -  n[        U5      e U R                  R1                  5       (       Ga  US:X  a  UR$                  S:X  a"  US:X  a  US:X  a  SOSnUR3                  U5        O6UR$                  U:  a&  U[/        UR$                  5      S-   -  n[        U5      eUR5                  S5        U R                  R7                  U5      nGOUS:X  a  UR$                  S:X  a"  US:X  a  US:X  a  SOSnUR3                  U5        OuUR$                  U:  a  UR3                  UR$                  U-
  5        OFUR$                  S:w  a6  UR$                  U::  a&  U[/        UR$                  5      S-   -  n[        U5      eUR5                  S5        U R                  R7                  U5      nGOUS:X  Ga2  UR$                  nUR5                  S5        US:X  a"  US:X  a  US:X  a  SOSnUR3                  U5        ObUR                  (       dQ  UU:  aK  U R                  R9                  UU-
  U-   S5      nUS:  a  UR3                  U5        OUR3                  S5        U R                  R7                  U5      nUR                  (       d5  US:  a/  U R                  R+                  S5      nUR3                  US-   5        UR5                  S5        US:X  a"  US:X  a  US:X  a  SOSnUR3                  U5        OUR                  (       dr  UR$                  S:  ab  UR$                  U::  aR  U R                  R9                  UR$                  S5      nUS:  a  UR3                  UU-
  5        OUR3                  S5        US:w  a  US-  nUR                  (       d4  UR$                  U:  a$  US:w  a  UR3                  UR$                  U-
  5        XPR                  R7                  U5      -  nO[        S5      U-  n[        U5      eUR$                  S:X  a!  US:X  a  US:X  a  SOSnUR3                  U5        US:X  d  US:X  a-  UR5                  S5        U R                  R7                  U5      nO5US:X  a  [        S5      n[        U5      e[        S5      U-  n[        U5      eUR<                  (       d  GM  [        S5      n[>        R@                  " U5        GM     U(       d  X5-  nU$ [        U5      S:X  a  [C        U5        U$ Sn[E        [G        US-   5      5      nUR'                  5         U HD  nUS:  d  M  UU   (       d  M  UU   R                  5       nSUl         U R7                  UU5        MF     U[        S5      -  nU(       a  U[        S5      -  nOU[        S5      -  n[        U5      e! [(         a    e f = f! [         a  nUR:                  nSn SnA  GM  SnAff = f! [(         a-    Sn[        S5      WRI                  5       -  n[A        U5         M  f = f)zUpdates firewall with ruler{   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   removerr   get_app_rules_from_systemr   matchra   r   r9   rv   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)ru   r*   
ip_versionr   r   tmprV   tmprules	tmprules6xrp   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   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	 "*A%.()','(wwqzz+0D$,OOA$6 &/ "* #$$=">*"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$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::+>?||44Q77"#$=">*"M&w//zzR'%*aZFaKQu-!T)Z6-A"ll33A6#t+"#$>"?&w//"#$=">*"M&w// yyy?@h'G %J JC> 
= Z1_'N8 
1 J5q>*GOO19q#(8#4#4#6L*.L''lJ?  q>??G1BCC1GHH7##Y  H  '' 	6 % '%)
#$%C#D%&]]_$5X'sr   Ca= 
A7a= a= a= "A1a= ;a= "B:bCb9H8b2Bb55b*b4=b	
b1b,,b143c+*c+c                 P    [        U5      nU R                  R                  5       nUS::  d  U[        U5      :  a  [        S5      U-  n[        U5      eU R                  R                  U5      nU(       d  [        S5      U-  n[        U5      eSUl        SnUR                  (       a  SnSnU(       Gd"  UR                  (       a-  S[        R                  R                  R                  U5      -  n	O)[        R                  R                  R                  U5      n	[        S5      U	U R                   U R"                  S	.-  n
[%        U
[&        R(                  S
S9  [&        R*                  R-                  5       R/                  5       R1                  5       nUS:w  a<  XR                   R/                  5       :w  a  XR2                  R/                  5       :w  a  S
nSnU(       a  U R5                  Xg5      nU$ [        S5      nU$ ! [         a    [        S5      U-  n[        U5      ef = f)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*   rq   rs   Foutputnewlinerp   r{   Aborted)intr>   ra   r   rr   r   r9   get_rule_by_numberr   r   r   r-   r.   r8   r   r7   rq   rs   r   sysstdoutstdinreadliner:   striprt   r   )ru   rR   forcero   r   rV   r*   r   proceedr   promptansr   s                rF   delete_rule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czcXX^^%55mm))++--1C 
 I,C
W  	$23f<G7##	$s   H $H%c                 	   SnUR                  S5      (       aJ  UR                  S5      n[        U5      S:  a  U R                  US   5      nU$ U R                  S5      n U$ US:X  a  U R                  S5      nU$ UR                  S5      (       aP  [	        S	5      nUR                  S
5      n[        U5      S:w  a  [        U5      eU R                  US   US   5      nU$ US:X  a  U R                  U5      nU$ US:X  a  U R                  5       nU$ US:X  a  U R                  S5      nU$ UR                  S5      (       aX  UR                  S
5      S   nUS:X  a  U R                  5       nU$ US:X  a  U R                  5       nU$ U R                  U5      n U$ US:X  a  U R                  SS5      nU$ US:X  a  U R                  S5      nU$ US:X  a  U R                  S5      nU$ US:X  a\  U R                  R                  5       (       a/  U R                  S5        U R                  S5        [	        S5      nU$ [	        S5      n U$ UR                  S5      (       a&  U R                  UR                  S
5      S   U5      nU$ US:X  d  US:X  d  US:X  d  US:X  a  UR                   S:w  aM   U R                  R#                  UR                   5      nXbR                   :w  a  Xbl        UR%                  US 5        UR2                  S:w  aM   U R                  R#                  UR2                  5      nXbR2                  :w  a  Xbl        UR%                  US 5        U R5                  X#5      nU$ [	        S#5      U-  n[        U5      e! [
         au  nUR&                  (       d  [)        UR*                  5        [,        R.                  R1                  UR                   5      (       d  [	        S!5      n[        U5      e S"nAGNS"nAff = f! [
         au  nUR&                  (       d  [)        UR*                  5        [,        R.                  R1                  UR2                  5      (       d  [	        S!5      n[        U5      e S"nAGN(S"nAff = f)$zmPerform action on rule. action, rule and ip_version are usually
based on return values from parse_command().
r{   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   rr   r~   r  r   find_application_nameset_portr   r   r=   r-   applicationsvalid_profile_namer   r   )	ru   r   r*   r   r  r   r   r   rE   s	            rF   	do_actionUFWFrontend.do_action  ss    \**,,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ii'$'	c51 yyB0,,<<TYYGCii'$'	c51 --1C
 
 12f=G7##3   0;;agg++>>tyyII"#$:";&w// J	0   0;;agg++>>tyyII"#$:";&w// J	0s4   -AN 
AP 
PA*O<<P
RA*Q>>Rc                     Sn U R                   R                  U5      nU$ ! [         a   n[        UR                  5         SnAU$ SnAff = f)z+Sets default application policy of firewallr{   N)rr   set_default_application_policyr   r   r=   )ru   r   r   rE   s       rF   r  *UFWFrontend.set_default_application_policy  sK    	,,==fEC 
  	!''NN
	r   c                     [        U R                  R                  R                  5       5      nUR	                  5         [        S5      nU H  nUSU-  -  nM     U$ )z*Display list of known application profileszAvailable applications:
  %s)r   rr   profilesr   r   ra   )ru   namesr   ro   s       rF   get_application_list UFWFrontend.get_application_list  sP    T\\**//12

*+AHN"D rf   c                 &   / nUS:X  a>  [        U R                  R                  R                  5       5      nUR	                  5         OK[
        R                  R                  U5      (       d  [        S5      n[        U5      eUR                  U5        SnU GH  nXPR                  R                  ;  d  U R                  R                  U   (       d  [        S5      U-  n[        U5      e[
        R                  R                  UU R                  R                  U   5      (       d  [        S5      n[        U5      eU[        S5      U-  -  nU[        S5      [
        R                  R                  U R                  R                  U   5      -  -  nU[        S5      [
        R                  R                  U R                  R                  U   5      -  -  n[
        R                  R                  U R                  R                  U   5      n[        U5      S	:  d	  S
US   ;   a  U[        S5      -  nOU[        S5      -  nU H  nUSU-  -  nM     XR[        U5      S	-
     :w  d  GM  US-  nGM     [
        R                   R#                  U5      $ )zDisplay information on profileallr  r{   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   rr   r#  r   r   r-   r  r  ra   r   r   verify_profile	get_titleget_description	get_portsr9   r   	wrap_text)ru   pnamer$  r   r   namer   r@   s           rF   get_application_info UFWFrontend.get_application_info  s6   E>..3356EJJL##66u==23w''LLD<<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&  SZ\**$; > xx!!$''rf   c                    SnSnSn U R                   R                  (       a%  [        R                  R	                  5       (       a  SnUS:X  a~  [        U R                   R                  R                  5       5      nUR                  5         U H:  nU R                   R                  U5      u  pxU(       d  M)  US:w  a  US-  nX'-  nUnM<     O(U R                   R                  U5      u  p$US:w  a  US-  nU(       a_  U R                   R                  5       (       a@  U(       a+   U R                   R                  5         U[        S5      -  nU$ U[        S5      -  nU$ ! [
         a    Sn GN#f = f! [
         a    e f = f)Refresh application profiler{   TFr(  r   r  zSkipped reloading firewall)rr   	do_checksr-   r   	under_sshr>   r   r#  r   r   update_app_ruler~   _reload_user_rulesra   )	ru   r]   r   allow_reloadtrigger_reloadr#  r@   r   founds	            rF   application_updateUFWFrontend.application_update  s\   	!||%%#((*<*<*>*>$ eDLL116689HMMO#||;;A>5bytKD%*N  &*\\%A%A'%J"Trzdll5577LL335 -..  677?  	! !L		!2 ! s   A E "E/ E,+E,/E;c                    SnSnUS:X  a  [        S5      n[        U5      eU R                  R                  S   nUS:X  a*  [        R
                  R                  SU< SU< S35        U$ US	:X  a  S
nO+US:X  a  SnO"US:X  a  SnO[        S5      U-  n[        U5      eS/nU R                  R                  (       a  UR                  S5        XcU/-  n [        U5      nSUR                  ;   a9  U R                  UR                  UR                  S   UR                  S   5      nU$ U R                  UR                  SS5      nU$ ! [         a    e f = f)r4  r{   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   rr   defaultsr-   r   r   rv   r   r<   r>   datar  r   )ru   r]   r   r   r   r   argsrD   s           rF   application_addUFWFrontend.application_addB  sT   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   E Ec                    SnUS:X  a  U R                  S5      nU$ US:X  a  U R                  S5      nU$ US:X  a  U R                  S5      nU$ US:X  a  U R                  S	5      nU$ US
:X  a  U R                  5       nU$ US:X  a  U R                  U5      nU$ US:X  d  US:X  aA  U R                  U5      nSnUS:X  a  U R	                  U5      nUS:w  a  US:w  a  US-  nXE-   nU$ [        S5      U-  n[        U5      e)zgPerform action on profile. action and profile are usually based on
return values from parse_command().
r{   zdefault-allowr   zdefault-denyr   zdefault-rejectr   zdefault-skipr@  r   r   r   zupdate-with-newr   r  )r  r%  r1  r<  rG  ra   r   )ru   r   r]   r   str1str2r   s          rF   do_application_action!UFWFrontend.do_application_actionl  sM    _$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                    SnU R                   R                  (       a  [        R                  R	                  5       (       a  [        S5      U R                  U R                  S.-  n[        U[        R                  SS9  [        R                  R                  5       R                  5       R                  5       nUS:w  a   X0R                  :w  a  X0R                  :w  a  SnU$ )z6If running under ssh, prompt the user for confirmationTzWCommand may disrupt existing ssh connections. Proceed with operation (%(yes)s|%(no)s)? rq   rs   Fr  rp   )rr   r5  r-   r   r6  ra   rq   rs   r   r  r  r	  r
  r:   r  rt   )ru   r  r  r  s       rF   continue_under_sshUFWFrontend.continue_under_ssh  s    <<!!chh&8&8&:&: C D $8:F szz59))$$&,,.446CczcXXo#2Frf   c                 8   Sn[        S5      U R                  U R                  S.-  nU R                  R                  (       aH  [
        R                  R                  5       (       a%  [        S5      U R                  U R                  S.-  nU R                  R                  (       a  U(       d  [        [
        R                  R                  U5      [        R                  SS9  [        R                  R                  5       R                  5       R                  5       nUS:w  a+  X@R                  :w  a  X@R                   :w  a  [        S5      nU$ U R                  R#                  5       (       a  X R%                  S5      -  nU R                  R'                  5       nU$ )	zReset the firewallr{   zTResetting all rules to installed defaults. Proceed with operation (%(yes)s|%(no)s)? rO  zResetting all rules to installed defaults. This may disrupt existing ssh connections. Proceed with operation (%(yes)s|%(no)s)? Fr  rp   r  )ra   rq   rs   rr   r5  r-   r   r6  r   r.  r  r  r	  r
  r:   r  rt   r~   r   r   )ru   r  r   r  r  s        rF   r   UFWFrontend.reset  s)    2 3 HHDGG46 <<!!chh&8&8&:&: 6 7 !%8:F
 <<!!%""6*3::uM))$$&,,.446CczcXXo#2F	l
<<""$$##E**Cll  "
rf   )rr   rs   rq   rt   )rl   NN)FF)r   )F)__name__
__module____qualname____firstlineno____doc__rx   r   r   r   r   r   r   r   r   r  r  r  r%  r1  r<  rG  rL  rP  r   __static_attributes__ rf   rF   rh   rh      sv    ,6'+! 4lFP:JX/bTl,(\)V(T@rf   rh   )rX  r   r  r   
ufw.commonr   ufw.utilr-   r   r   r   ufw.backend_iptablesr   
ufw.parserr<   re   rh   rZ  rf   rF   <module>r_     s?    -" 
 
    % % 3 EPEPD Drf   