PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/lib/python3/dist-packages/ufw/__pycache__/
Upload File :
Current File : //lib/python3/dist-packages/ufw/__pycache__/util.cpython-311.pyc
�

#fd$���"�dZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZddlmZmZdZdZgd�Zgd�Zd	d
gZd�Zd�Zd
�Zd�Zd�Zd;d�Zd�Z d�Z!d�Z"d�Z#d<d�Z$d�Z%d�Z&d�Z'd<d�Z(d�Z)ej*dfd�Z+d�Z,d�Z-d �Z.d!�Z/e	j0��fd"�Z1e	j0��fd#�Z2d$�Z3d%�Z4d&�Z5d'�Z6d(�Z7d)�Z8d*�Z9d+�Z:d=d,�Z;d>d-�Z<d.�Z=d?d/�Z>d0�Z?d1�Z@d2�ZAd3�ZBd4�ZCd5�ZDd6�ZEd7�ZFd@d9�ZGd:�ZHdS)Az"util.py: utility functions for ufw�)�print_functionN)�reduce)�mkstemp�mktempF)�tcp�udp�ipv6�esp�ah�igmp�gre�vrrp)r	r
rrr
rr	rc�
�d}	tj|��n#t$r�wxYw	tj|d��d}n#t$rYnwxYw	tj|d��|dkrd}nd}n#t$rYnwxYw|S)z8Get the protocol for a specified port from /etc/services�rr�any)�socket�
getservbyname�	Exception)�port�protos  �*/usr/lib/python3/dist-packages/ufw/util.py�get_services_protor.s����E����T�"�"�"�"������
�����
���T�5�)�)�)������
�
�
���
����
���T�5�)�)�)��E�>�>��E�E��E����
�
�
���
�����Ls+��%�A�
A�
A� A3�3
B�?Bc�P�d}d}|�d��}t|��dkr|d}d}nlt|��dkr;|d}|d}|tvr!td|z��}t	|���ntd��}t	|���||fS)	zParse port or port and protocolr�/�rr�zInvalid port with protocol '%s'zBad port)�split�len�portless_protocols�_�
ValueError)�p_strrr�tmp�err_msgs     r�parse_port_protor%Hs���
�D��E�
�+�+�c�
�
�C�
�3�x�x�1�}�}��1�v�����	�S���Q����1�v���A����&�&�&��9�E�A�B�B�G��W�%�%�%�'��J�-�-����!�!�!��%�=��c��tjstd��dSt|��dkst	jd|��sdS|�d��}	tjtj|d��n#t$rYdSwxYwt|��dkrdSt|��dkrt|dd	��sdSd	S)
zVerifies if valid IPv6 addressz"python does not have IPv6 support.F�+z^[a-fA-F0-9:\./]+$rrrrT)r�has_ipv6�warnr�re�matchr�	inet_pton�AF_INET6r�_valid_cidr_netmask��addr�nets  r�valid_address6r3\s����?���
1�2�2�2��u��4�y�y�2�~�~�R�X�&;�T�B�B�~��u�
�*�*�S�/�/�C������#�a�&�1�1�1�1�������u�u������3�x�x�!�|�|��u�	�S���Q���"�3�q�6�4�0�0�	��5��4s�%B�
B�Bc��t|��dkstjd|��sdS|�d��}	t	jtj|d��t|dd��sdSn#t$rYdSwxYwt|��dkrdSt|��dkrt|dd��sdSdS)	zVerifies if valid IPv4 address�z^[0-9\./]+$FrrrrT)
rr+r,rrr-�AF_INET�_valid_dotted_quadsr�
valid_netmaskr0s  r�valid_address4r9vs����4�y�y�2�~�~�R�X�n�d�;�;�~��u�
�*�*�S�/�/�C�������Q��0�0�0�"�3�q�6�5�1�1�	��5�	�������u�u������3�x�x�!�|�|��u�	�S���Q����S��V�U�+�+�	��5��4s�;A?�?
B
�B
c�B�t||��pt||��S)z(Verifies if valid cidr or dotted netmask)r/r7)�nm�v6s  rr8r8�s"���r�2�&�&�E�*=�b�"�*E�*E�Er&rc��|dkrt|��S|dkrt|��S|dkrt|��pt|��St�)zValidate IP addresses�6�4r)r3r9r!)r1�versions  r�
valid_addressrA�s\���#�~�~��d�#�#�#�	�C����d�#�#�#�	�E�	�	��d�#�#�;�~�d�';�';�;�
�r&c�0�g}d}d}tj}|rd}tj}d|vrE|�d��}|r|ddkr|d=n3|s|ddks|ddkr|d=n|�|��|sTt|��d	krAt
|d|��r+	t|d|��|d<n#t$rYnwxYw|d
}tj	|tj
||����}||d
krd}t|��d	krA|d|dzz
}|s1t|��}||krd|�d
|�d�}t|��|}d}t||��sd|z}t|��t�||fS)z�Convert address to standard form. Use no netmask for IP addresses. If
       netmask is specified and not all 1's, for IPv4 use cidr if possible,
       otherwise dotted netmask and for IPv6, use cidr.
    Fr?r>rr�128�32z255.255.255.255rrTzUsing 'z' for address '�'zInvalid address '%s')rr6r.r�appendrr7�_dotted_netmask_to_cidrr�	inet_ntopr-�_address4_to_network�debugrAr!)	�origr<r2�changedr@�s_typer1�network�dbg_msgs	         r�normalize_addressrP�s���

�C��G��G�
�^�F�	�!������
�d�{�{��j�j��o�o��
�	�#�a�&�E�/�/��A����	��Q��4���3�q�6�5F�+F�+F��A����
�
�4����
��#�c�(�(�a�-�-�$7��A���$C�$C�-�	�,�S��V�R�8�8�C��F�F���	�	�	��D�	�����q�6�D���F�F�$4�V�T�$B�$B�C�C�D��s�1�v�~�~���
�3�x�x�1�}�}���c�!�f�����	�*�4�0�0�G��$����;B�7�7�D�D�D�I���g����������w�'�'��(�D�1��
�g�������'�?�s�-C�
C�Cc�"�t|d��S)z"Opens the specified file read-only�r)�open)�fns r�open_file_readrU�s����C�=�=�r&c��t|��}	t��\}}n##t$r|����wxYw||||d�S)z=Opens the specified file read-only and a tempfile read-write.)rK�orignamer#�tmpname)rUrr�close)rTrKr#rXs    r�
open_filesrZ�sb���"���D�� �����g�g�������
�
����
������r�#�'�K�K�Ks	�#� Ac��|dkrdS|sttjd���tr>|tj���krt�|��dSd}tjddkr$tj|t|d����}ntj||��}|dkrttjd���dS)	z~Write to the file descriptor and error out of 0 bytes written. Intended
       to be used with open_files() and close_files().rNzNot a valid file descriptor���r��asciiz"Could not write to file descriptor)�OSError�errno�ENOENT�
msg_output�sys�stdout�fileno�write�version_info�os�bytes�EIO)�fd�out�rcs   r�
write_to_filern�s����b�y�y���
�C��e�l�$A�B�B�B���b�C�J�-�-�/�/�/�/����������	�B�
����a���
�X�b�%��W�-�-�
.�
.���
�X�b�#�
�
��	�Q�w�w��e�i�!E�F�F�F��wr&Tc�*�|d���tj|d��|rBtj|d|d��tj|d|d��tj|d��dS)zuCloses the specified files (as returned by open_files), and update
       original file with the temporary file.
    rKr#rWrXN)rYrh�shutil�copystat�copy�unlink)�fns�updates  r�close_filesrvs�����K�������H�S��Z����
�5����J���Y��8�8�8���C�	�N�C�
�O�4�4�4��I�c�)�n�����r&c�,�t|��	tj|tjtjd���}n(#t
$r}dt
|��gcYd}~Sd}~wwxYw|���d}|jt
|��gS)z!Try to execute the given command.T)rd�stderr�universal_newlines�Nr)	rJ�
subprocess�Popen�PIPE�STDOUTr_�str�communicate�
returncode)�command�sp�exrls    r�cmdr�s���	�'�N�N�N��
�
�g�j�o�%/�%6�15�7�7�7���������S��W�W�~���������������
�.�.�
�
�1�
�C��M�3�s�8�8�$�$s�,>�
A#�A�A#�A#c�,�	tj|tj���}tj||j���}n(#t$r}dt|��gcYd}~Sd}~wwxYw|���d}|jt|��gS)z#Try to pipe command1 into command2.)rd)�stdinrzNr)r{r|r}rdr_rr�r�)�command1�command2�sp1�sp2r�rls      r�cmd_piper�$s������x�
��@�@�@����x�s�z�:�:�:���������S��W�W�~����������������/�/�
�
�A�
�C��N�C��H�H�%�%s�;>�
A#�A�A#�A#c�r�	|j}n#t$r|}YnwxYw	|�dd��}n#t$r|}YnwxYwtr4t	jtj��r|�|��n"|�t|����|�
��dS)zQImplement our own print statement that will output utf-8 when
       appropriate.�utf-8�ignoreN)�bufferr�encoderb�inspect�isclass�io�StringIOrfri�flush)�output�s�writerrls    r�_printr�2s�����������������������h�h�w��)�)�����������������!�g�o�b�k�2�2�!����Q��������U�3�Z�Z� � � �
�L�L�N�N�N�N�Ns�
���4�A�Ac��	ttjd|z��n#t$rYnwxYw|rtjd��dSdS)zPrint error message and exitz
ERROR: %s
rN)r�rcrx�IOError�exit)rl�do_exits  r�errorr�Gsf��
��s�z�=�3�.�/�/�/�/���
�
�
���
���������������s� �
-�-c�d�	ttjd|z��dS#t$rYdSwxYw)zPrint warning messagez	WARN: %s
N)r�rcrxr��rls rr*r*RsF��
��s�z�<�#�-�.�.�.�.�.���
�
�
����
���s�!�
/�/c��tr|tjkrt}	|rt|d|z��dSt|d|z��dS#t$rYdSwxYw)z
Print messagez%s
�%sN)rbrcrdr�r�)rlr��newlines   r�msgr�Zs~����f��
�*�*���
��	'��6�6�C�<�(�(�(�(�(��6�4�#�:�&�&�&�&�&���
�
�
����
���s�A�A�
A�Ac�v�tr1	ttjd|z��dS#t$rYdSwxYwdS)zPrint debug messagez
DEBUG: %s
N)�	DEBUGGINGr�rcrxr�r�s rrJrJhsX����	��3�:�}�s�2�3�3�3�3�3���	�	�	��D�D�	�����s�(�
6�6c�N�t|fd�|�d����S)z�
    A word-wrap function that preserves existing line breaks
    and most spaces in the text. Expects that existing line
    breaks are posix newlines (
).
    c	���|�dt|��|�d��z
dz
t|�dd��d��z|k�|��S)Nz 
�
rr)r�rfindr)�line�word�widths   r�<lambda>zword_wrap.<locals>.<lambda>wsk���4��#�d�)�)�D�J�J�t�$4�$4�4�q�8��d�j�j��q�1�1�!�4�5�5�6�9>�?�A�A��4�	3�r&� )rr)�textr�s  r�	word_wrapr�qs6���5����
�*�*�S�/�/���r&c�"�t|d��S)zWord wrap to a specific width�K)r�)r�s r�	wrap_textr��s���T�2���r&c�@��d��|��fd����dS)a$Sorts list of strings into numeric order, with text case-insensitive.
       Modifies list in place.

       Eg:
       [ '80', 'a222', 'a32', 'a2', 'b1', '443', 'telnet', '3', 'http', 'ZZZ']

       sorts to:
       ['3', '80', '443', 'a2', 'a32', 'a222', 'b1', 'http', 'telnet', 'ZZZ']
    c�p�|���rt|��n|���S�N)�isdigit�int�lower)�ts rr�zhuman_sort.<locals>.<lambda>�s%��q�y�y�{�{�9�S��V�V�V����	�	�r&c�F���fd�tjd|��D��S)Nc�&��g|]
}�|����S�r�)�.0�c�norms  �r�
<listcomp>z0human_sort.<locals>.<lambda>.<locals>.<listcomp>�s!���F�F�F��T�T�!�W�W�F�F�Fr&z([0-9]+))r+r)�kr�s �rr�zhuman_sort.<locals>.<lambda>�s(���F�F�F�F�b�h�z�1�.E�.E�F�F�F�r&)�keyN)�sort)�lstr�s @r�
human_sortr��s1���:�9�D��H�H�F�F�F�F�H�G�G�G�G�Gr&c���	t|��}n#t$rtd���wxYwtj�dt
|��d��}tj�|��std|z���t|���
��d�dd��d���d}t|��S)zdFinds parent process id for pid based on /proc/<pid>/stat. See
       'man 5 proc' for details.
    zpid must be an integer�/proc�stat�Couldn't find '%s'r�)r)
r�rr!rh�path�joinr�isfiler�rS�	readlines�rsplitr)�mypid�pid�name�ppids    r�get_ppidr��s���3��%�j�j�����3�3�3��1�2�2�2�3�����7�<�<���S���6�2�2�D�
�7�>�>�$���5��*�d�3�4�4�4���:�:���!�!�!�$�+�+�C��3�3�A�6�<�<�>�>�q�A�D��t�9�9�s��,c��	t|��}nf#t$r"td��}t|��YdSt$r/td��t|��z}t
|���wxYw|dks|dkrdStj�	dt|��d��}tj�
|��s!td��|z}t
|���	t|�����d�
��d}n/#t$r"td	��|z}t
|���wxYwtd
|z��|dkrdSt|��S)
z1Determine if current process is running under sshz%Couldn't find pid (is /proc mounted?)Fz!Couldn't find parent pid for '%s'rr�r�r�rz"Could not find executable for '%s'zunder_ssh: exe is '%s'z(sshd)T)r�r�r r*rrr!rhr�r�r�rSr�rrJ�	under_ssh)r�r��warn_msgr$r��exes      rr�r��s���"���}�}���������<�=�=���X�����u�u��"�"�"��7�8�8�C��H�H�E����!�!�!�"�����a�x�x�4�1�9�9��u�
�7�<�<���T���F�3�3�D�
�7�>�>�$���"��(�)�)�T�2����!�!�!�"��4�j�j�"�"�$�$�Q�'�-�-�/�/��2�����"�"�"��8�9�9�T�B����!�!�!�"����
�
"�c�
*�+�+�+��h����t�����s��(A5�8A5�5?D5�5,E!c��d}|rd}tjd|��r&t|��dkst|��|krdSdS)zVerifies cidr netmasks� ��^[0-9]+$rFT)r+r,r�)r;r<�nums   rr/r/�sN��
�C�	����
�8�K��$�$���B���!���s�2�w�w��}�}��u��4r&c���|rdStjd|��r[tjd|��}t|��dkrdS|D]-}|r&t	|��dkst	|��dkrdS�.ndSdS)z.Verifies dotted quad ip addresses and netmasksFz^[0-9]+\.[0-9\.]+$z\.�r�T)r+r,rrr�)r;r<�quads�qs    rr7r7�s���	���u�
�8�)�2�.�.�	��H�T�2�&�&�E��5�z�z�Q����u��
!�
!���!�C��F�F�Q�J�J�#�a�&�&�3�,�,� �5�5�+7�
!��5��4r&c	� �d}|rt�t||��st�d}	ttjdtj|����d��}nJ#t$r=ttjdtj|����d��}YnwxYwd}td��D]}||z	dzdkrd}�|rd}n|dz
}�|dkr|dkrtd|z
��}t||��st�|S)	z@Convert netmask to cidr. IPv6 dotted netmasks are not supported.rr�>LFr�rTr\)r!r7�long�struct�unpackr�	inet_aton�	NameErrorr��rangerr/)r;r<�cidr�mbits�bits�	found_one�ns       rrGrG�s?��
�D�	�#���"�2�r�*�*�	�����
	E���
�d�F�,<�R�,@�,@�A�A�!�D�E�E�D�D���	E�	E�	E��v�}�T�6�+;�B�+?�+?�@�@��C�D�D�D�D�D�	E�����	��r���	�	�A���	�Q��!�#�#� �	�	����E��E��Q�J�E�E��A�:�:�%�2�+�+��r�E�z�?�?�D��t�R�(�(�����Ks�:A!�!AB(�'B(c�l�d}|rt�t||��st�	td��}n#t$rd}YnwxYwt	d��D] }|t|��kr|dd|z
zz}�!t
jtj	d|����}t||��st�|S)z<Convert cidr to netmask. IPv6 dotted netmasks not supported.rrr�rr5r�)r!r/r�r�r�r�r�	inet_ntoar��packr7)r�r<r;r�r�s     r�_cidr_to_dotted_netmaskr�$s���	�B�	�7���"�4��,�,�	���
	���7�7�D�D���	�	�	��D�D�D�	�����r���	$�	$�A��3�t�9�9�}�}���R�!�V��#���
�
�f�k�$��5�5�
6�
6���r�2�&�&����
�Is�4�A�Ac	�t�d|vrtd��|S|�d��}t|��dkst|dd��st�|d}|d}|}t|d��rt
|d��}	ttj	dtj|����d��}ttj	dtj|����d��}n�#t$rwttj	dtj|����d��}ttj	dtj|����d��}YnwxYw||z}tjtjd|����}|�d|��S)z8Convert an IPv4 address and netmask to a network addressrz8_address4_to_network: skipping address without a netmaskrrFrr�)rJrrr7r!r/r�r�r�r�rr�r�r�r�r�)	r1r#�host�orig_nmr;�	host_bits�nm_bits�network_bitsrNs	         rrIrIAs���
�$���
�H�I�I�I���
�*�*�S�/�/�C�
�3�x�x�1�}�}�/��A���>�>�}����q�6�D��!�f�G�	�B��2�u�%�%�0�
$�R��
/�
/��D����t�V�-=�d�-C�-C�D�D�Q�G�H�H�	��v�}�T�6�+;�B�+?�+?�@�@��C�D�D�����D�D�D���
�d�F�,<�T�,B�,B�C�C�A�F�G�G�	��f�m�D�&�*:�2�*>�*>�?�?��B�C�C����D�����w�&�L���v�{�4��>�>�?�?�G��g�g�w�w�'�'s�A4D�A>F�Fc�t�d�}d|vrtd��|S|�d��}t|��dkst|dd��st�|d}|d}tjdtjtj	|����}	td��}n#t$rd}YnwxYwtd	��D]M}|||d
��}td
��D])}	|dt||	��zd|	z
|d
zz
zz}�*�N	td��}
n#t$rd}
YnwxYwtd��D] }|t|��kr|
dd|z
zz}
�!||
z}g}td	��D]@}|�t||d��|d
z|d
zd
z�d�����Atjtj	tjd|d|d|d|d
|d|d|d|d�	�	��}
|
�d|��S)z8Convert an IPv6 address and netmask to a network addressc�j��d��fd�t|dz
dd��D����S)zDecimal to binaryrc�:��g|]}t�|z	dz����S)r)r)r��yr�s  �rr�z9_address6_to_network.<locals>.dec2bin.<locals>.<listcomp>hs)���L�L�L���S�A�X��N�+�+�L�L�Lr&rr\)r�r�)r��counts` r�dec2binz%_address6_to_network.<locals>.dec2binfs:����w�w�L�L�L�L�U�5��7�B��5K�5K�L�L�L�M�M�Mr&rz8_address6_to_network: skipping address without a netmaskrrTrz>8H��rzr�r]r����)rJrrr8r!r�r�rr-r.r�r�r�r�rFrHr�)r1rr#�	orig_host�netmask�unpackedr��ir��jr�r2r�rNs              r�_address6_to_networkr
ds���N�N�N��$���
�H�I�I�I���
�*�*�S�/�/�C�
�3�x�x�1�}�}�M�#�a�&�$�7�7�}����A��I��!�f�G��}�U�F�$4�V�_�5>�%@�%@�A�A�H����G�G�	�	�������	�	�	������1�X�X�9�9���G�H�Q�K��$�$���r���	9�	9�A��!�c�!�A�$�i�i�-�S��U�1�R�4�Z�8�8�I�I�	9���q�'�'�����������������3�Z�Z�*�*���s�7�|�|����q�W��M�)�)�G���g�
�C�
�C�
�1�X�X�<�<���
�
�3�w�w�s�C�(�(��2��a��d�2�g��6��:�:�;�;�;�;���v��%�{�5�#�a�&�#�a�&�+.�q�6�3�q�6�3�q�6�+.�q�6�3�q�6�3�q�6� C� C�D�D�G�
�g�g�w�w�'�'s$�!B1�1C�?C�!D1�1E�?Ec���|�d��}t|��dkst|d|��st�|d}|d}|dks|dkrdS|}d|vrM|�d��}t|��dkst|d|��st�|d}|dks|dkrdS|r&t	|��rt	|��st�n%t|��rt|��st�t
||��r|st||��}|r[t|�d|�����d��d}t|�d|�����d��d}nZt|�d|�����d��d}t|�d|�����d��d}||kS)z&Determine if address x is in network yrrrrz0.0.0.0z::T)
rrr8r!r3r9r/r�r
rI)	�
tested_add�
tested_netr<r#rr	�address�orig_networkrNs	         r�
in_networkr�s:��
�
�
�3�
�
�C�
�3�x�x�1�}�}�M�#�a�&�"�5�5�}����A��I��!�f�G��I����d�!2�!2��t��G�
�g�~�~��m�m�C� � ���s�8�8�q�=�=�
�c�!�f�b� 9� 9�=����a�&���)���w�$����t�	���g�&�&�	�n�Y�.G�.G�	���	��g�&�&�	�n�Y�.G�.G�	����7�B�'�'�7��7�)�'�2�6�6��
�	I�+�-6�Y�Y���-A�B�B�BG�%��*�*�Q�P��&�(/�����(:�;�;�;@�5��:�:�a�I���,�-6�Y�Y���-A�B�B�BG�%��*�*�Q�P��&�(/�����(:�;�;�;@�5��:�:�a�I���l�"�"r&c���d}dD]E}tj�|d��}tj�|��rnd}�F|dkrt	t
jd���|S)Nr)z/sbinz/binz	/usr/sbinz/usr/binz/usr/local/sbinz/usr/local/bin�iptableszCould not find iptables)rhr�r��existsr_r`ra)r��ds  r�_find_system_iptablesr�sr��
�C�3�����g�l�l�1�j�)�)��
�7�>�>�#���	��E��C�C�
�b�y�y��e�l�$=�>�>�>��Jr&c���|�t��}t|dg��\}}|dkrttjd|z���tjd|��}tjdd|d��S)	zReturn iptables versionNz-VrzError running '%s'z\sz^vrr)rr�r_r`rar+r�sub)r�rmrlr#s    r�get_iptables_versionr�sq��
�{�#�%�%���S�$�K� � �I�R��	�Q�w�w��e�l�$8�C�$@�A�A�A�
�(�4��
�
�C�
�6�$��C��F�#�#�#r&c�x�d�}|r1tj��dkrttjd���|�t��}g}d}|�d��rd}|tdd�	��z
}t|d
|g��\}}|dkrttj	|���|||gd���r|�
d��|||gd
���r|�
d��t|d|g��t|d|g��\}}|dkrttj	|���|S)z[Return capabilities set for netfilter to support new features. Callers
       must be root.c�J�|d|g}t||z��\}}|dkrdSdS)Nz-ArTF)r�)r��chain�rule�argsrmrls      r�test_capz,get_netfilter_capabilities.<locals>.test_cap�s6���T�5�!����t��$�$�	��S�
��7�7��4��ur&rzMust be rootNz
ufw-caps-test�	ip6tableszufw6-caps-testr)�prefix�dirz-N)�-m�	conntrack�	--ctstate�NEWr%�recentz--setz
recent-set)r%r&r'r(r%r)z--updatez	--seconds�30z
--hitcountr>z
recent-updatez-Fz-X)rh�getuidr_r`�EPERMr�endswithrr�rarF)r��	do_checksr!�capsrrmrls       r�get_netfilter_capabilitiesr0�s�������3�R�Y�[�[�A�%�%��e�k�>�2�2�2�
�{�#�%�%��
�D��E�
�|�|�K� � �!� ��
�V�2�2�
&�
&�
&�&�E��S�$��&�'�'�I�R��	�Q�w�w��e�l�C�(�(�(��x��U�6�6�6�7�7�"����L�!�!�!��x��U�0�0�0�1�1�%�	
���O�$�$�$���d�E������S�$��&�'�'�I�R��	�Q�w�w��e�l�C�(�(�(��Kr&c�T�t|��}t��}|���D�]t}|�d��s|�d��s�.|���}|d}|d�d��d}t��}d�|d�d��dd���|d<|d	|d
<|d�d��d|d
<|d
dkr|d
|d<n$|d�d��d|d<||vrt��||<g|||<n|||vrg|||<|||�|����v|S)z:Get and parse netstat the output from get_netstat_output()rrrr�:r\N�laddrr]�uidrrr��-r�)�get_netstat_output�dict�
splitlines�
startswithrr�rF)r<�netstat_outputrr�r#rr�items        r�parse_netstat_outputr<'s���(��+�+�N����A��)�)�+�+�$�$�����u�%�%�	�d�o�o�e�.D�.D�	���j�j�l�l���A����1�v�|�|�C� � ��$���v�v������Q����c�!2�!2�3�B�3�!7�8�8��W�
��!�f��U���!�f�l�l�3�'�'��*��U����;�#����u�+�D��K�K��a�&�,�,�s�+�+�A�.�D��K���>�>��v�v�A�e�H��A�e�H�T�N�N��1�U�8�#�#�!#��%����	�%������d�#�#�#�#��Hr&c���d}|�r1d}tj�|��sttjd|z���t
|�����D]�}|����|�dkr�d�	�fd�tdt�d��d��D����}�d	���d
kr-|�dt�d	���d����}��|dkrttjd
���n�t!jt jt j��}	t!jt)j|���dt/jd|dd�����dd���}n(#t2$rttjd
���wxYwt5||��dS)zGet IP address for interfacer�/proc/net/if_inet6�'%s' does not existrr2c�6��g|]}�d||dz���S�rr�r��r�rr#s  �rr�z"get_ip_from_if.<locals>.<listcomp>[�)���L�L�L�a�C��F�1�Q�q�S�5�M�L�L�Lr&rr�r�80rr�No such devicei��256sN���)rhr�rr_r`rarSr�rr�r�rr�r�r��ENODEVrr6�
SOCK_DGRAMr��fcntl�ioctlrer�r�rrP)�ifnamer<r1�procr�r�r#s      @r�get_ip_from_ifrPMs����
�D�
�:�#���w�~�~�d�#�#�	F��%�,�(=��(D�E�E�E���J�J�(�(�*�*�	E�	E�D��*�*�,�,�C���Q�����x�x�L�L�L�L�5��C��A��K�K��3K�3K�L�L�L�N�N���q�6�<�<�>�>�T�)�)�&*�d�d�C��A�������,C�,C�,C�D�D���2�:�:��%�,�(8�9�9�9��
�M�&�.�&�*;�<�<��	:��#�E�K����
�
�F�$*�K���s��s��$D�$D�%F�%F�FH��e�%M�N�N�D�D���	:�	:�	:��%�,�(8�9�9�9�	:�����T�2�&�&�q�)�)s
�"AG�%G%c���d}d}t|��rd}d}n)t|��sttjd���t
j�|��sttj	d|z���d}|�rt|�����D]�}|�����d�
��}d	��fd
�tdt!�d��d��D����}�d
���dkr-|�dt%�d
���d����}||ksd|vrt'||d��r|}n��n�t|�����D]`}d	|vr�|�d	��d�
��}	t)|d��}n#t$rY�RwxYw||kr|}n�a|S)zGet interface for IP addressFz
/proc/net/devTr>rEr?rrr2c�6��g|]}�d||dz���SrAr�rBs  �rr�z"get_if_from_ip.<locals>.<listcomp>�rCr&rr�rrDrr)r3r9r�r`rJrhr�rr_rarSr�r�stripr�r�rr�r�rrP)	r1r<rO�matchedr�rN�tmp_addr�ipr#s	        @r�get_if_from_iprWms���	�B��D��d���6�
��#���
�D�
!�
!�6��e�l�$4�5�5�5�
�7�>�>�$���B��e�l�$9�D�$@�A�A�A��G�	����J�J�(�(�*�*�	�	�D��*�*�,�,�C���V�\�\�^�^�F��x�x�L�L�L�L�5��C��A��K�K��3K�3K�L�L�L�N�N�H��1�v�|�|�~�~��%�%�&.�h�h��C��F�L�L�N�N�B�0G�0G�0G�H���x����x���J�t�X�t�$D�$D�� ��������J�J�(�(�*�*�	�	�D��$�����Z�Z��_�_�Q�'�-�-�/�/�F�
�#�F�E�2�2�����
�
�
���
�����T�z�z� ������Ns�G+�+
G8�7G8c�6�tjd��}|���tjd��}t��}|D�]J}|�|��s�tj�d|d��}tj	|tj
tjz��s�gd}	tjtj�d|d����}n#t$rYnwxYw	tj|��}n#t$rY��wxYw|D]s}	tjtj�||����d}n#t$rY�HwxYw|�dtj�|����||<�t��L|S)zGet inodes of files in /procr�r�rkr5r�rr)rh�listdirr�r+�compiler7r,r�r��access�F_OK�R_OK�readlinkrr��basename)	�
proc_files�pat�inodesr�fd_path�exe_path�dirsr�inodes	         r�_get_proc_inodesrg�s�����G�$�$�J��O�O����
�*�[�
!�
!�C�
�V�V�F�
�F�F���y�y��|�|�	���'�,�,�w��4�0�0���y��"�'�B�G�"3�4�4�	����	��{�2�7�<�<���E�#B�#B�C�C�H�H���	�	�	��D�	����	��:�g�&�&�D�D���	�	�	��H�	�����	F�	F�A�
�������W�a� 8� 8�9�9�!�<�����
�
�
���
����'(�q�q�"�'�*:�*:�8�*D�*D�*D�E�F�5�M�M�	F��Ms6�73C+�+
C8�7C8�<D�
D�D�&8E�
E,�+E,c���ddddddddd	d
dd�}d
dddd�}tj�d|��}tj|tjtjz��st�g}d}t|�����}|D]�}|�	��}|sd}�|t||dd��}	|�d��rd}	n|�d��r|	d
kr�q||d�	d��\}
}||d}||d}
|�|
t|d��||
|	f����|S)z=Read /proc/net/(tcp|udp)[6] file and return a list of tuples �ESTABLISHED�SYN_SENT�SYN_RECV�	FIN_WAIT1�	FIN_WAIT2�	TIME_WAIT�CLOSE�
CLOSE_WAIT�LAST_ACK�LISTEN�CLOSING)rrr]r�rrrr�	�
�rr]rrt)�
local_addr�stater4rfz	/proc/netFTrxrr�NArrwr2r4rf)
rhr�r�r[r\r]r!rSr�rr�r9rF)�protocol�
tcp_states�proc_net_fieldsrTr��
skipped_first�linesr��fieldsrxr3rr4rfs              r�_read_proc_net_protocolr��s���#� � �!�!�!��"� �� ���J�'(�!"� �!"���O�
����k�8�	,�	,�B�
�9�R���2�7�*�+�+����
�C��M���H�H��� � �E��
>�
>���������	� �M���3�v�o�g�&>�?��D�D�E�����u�%�%�	��E�E�
�
 �
 ��
'�
'�	�E�X�,=�,=���_�\�:�;�A�A�#�F�F���t��_�U�+�,����w�/�0���
�
�E�3�t�R�=�=�#�u�e�<�=�=�=�=��Jr&c�f���d}t���dkr�d�tddd��D]8}�d��fd�t|dz|d��D����z
��9td��fd�tdt���d	��D����d
��d}n{g��fd�tddd��D��D]2}��tt
|d�������3td
����d��d}|S)zDConvert an address from /proc/net/(tcp|udp)* to a normalized addressrrrr�c�*��g|]}�|dz
|���S�rr��r�r�paddrs  �rr�z(convert_proc_address.<locals>.<listcomp>�s%���F�F�F�a�U�1�Q�3�q�5�\�F�F�Fr&���r2c�N��g|]!}�||dz������"S)r�)r�)r�rr#s  �rr�z(convert_proc_address.<locals>.<listcomp>�s1���B�B�B�q��A�a��c�E�
� � �"�"�B�B�Br&r�Tc�*��g|]}�|dz
|���Sr�r�r�s  �rr�z(convert_proc_address.<locals>.<listcomp>�s%���:�:�:�A�5��1��Q��<�:�:�:r&r�.F)rr�r�rPrFrr�)r��	convertedrr#s`  @r�convert_proc_addressr��sG�����I�
�5�z�z�A�~�~����q�"�a���	H�	H�A��2�7�7�F�F�F�F�5��1��a��3D�3D�F�F�F�G�G�G�C�C�%�c�h�h�B�B�B�B�E�!�S��X�X�q�,A�,A�B�B�B�'D�'D������	�	���:�:�:�:��q�!�R���:�:�:�	(�	(�A��J�J�s�3�q�"�:�:���'�'�'�'�%�c�h�h�s�m�m�U�;�;�A�>�	��r&c�4�t��}ddg}|r|ddgz
}|D]F}	t|��||<�#t$r$td|z��}t	|��Y�CwxYwt��}t
|�����}|���d}|D]k}||D]`\}}	}
}}t|��}
d}t|��|vr|t|��}||d�d	|
�d
|	��d�d	|d�d	|
d�d	|d�d	|�d
�z
}�a�l|S)z5netstat-style output, without IPv6 address truncationrr�tcp6�udp6z!Could not get statistics for '%s'rr5�5r�r2�46�11r�)r7r�rr r*rg�list�keysr�r�r�)r<�
proc_net_datar�pr�rb�	protocolsr�r3rr4rfrxr1r�s               rr6r6s����F�F�M�
�E�N�E�	�"�
�&�&�!�!��
����	�6�q�9�9�M�!�����	�	�	��<��B�C�C�H���N�N�N��H�	����
�
�
�F��]�'�'�)�)�*�*�I�
�N�N����
�A�
�
O�
O��0=�a�0@�		O�		O�,�U�D�#�u�e�'��.�.�D��C��5�z�z�V�#�#��S��Z�Z�(��
�q�q�q�q�BF�$�$���7M�7M�7M�7M�7<�u�u�u�c�c�c�c�5�5�5�5�#�#�#�O�
O�A�A�		O�
�Hs�4�+A"�!A"c��|�|S|�d��r?t|��dkr|}nItj�||dd���}n tj�||��}|S)zAdd prefix to dirNrrr)r9rrhr�r�)r$r#�newdirs   r�	_findpathr�&so��
�~��
�
�~�~�c���+��s�8�8�a�<�<��F�F��W�\�\�&�#�a�b�b�'�2�2�F�F�����f�c�*�*���Mr&c���tjddkrtj|d��St	j|�dd������d��S)z,Take a string and convert it to a hex stringrr]�hexr�r�)�errorsr^)rcrg�codecsr��binascii�hexlify�decode)r�s r�
hex_encoder�4sX��
����Q����}�Q��&�&�&���A�H�H�W�X�H�>�>�?�?�F�F�w�O�O�Or&c��tjddkr)|�d����d��Stjdt|��dzr
|dd	�n|z���dd
��S)z,Take a hex string and convert it to a stringrr]r�)�encodingr�r�rNr\�backslashreplace)rcrgr�r��	unhexlifyr)�hs r�
hex_decoder�=s���
����Q����x�x��x�'�'�.�.�w�7�7�7���d��A����
�&A�a����f�f��B�C�C�J�J��#���r&�
/run/ufw.lockc�l�d}|s/t|d��}tj|tj��|S)zCreate a blocking lockfileN�w)rSrL�lockf�LOCK_EX)�lockfile�dryrun�locks   r�create_lockr�Ls7���D��)��H�c�"�"��
��D�%�-�(�(�(��Kr&c��|�dS	tj|tj��|���dS#t$rYdSwxYw)z(Free lockfile created with create_lock()N)rLr��LOCK_UNrYr!)r�s r�release_lockr�UsZ���|���
�
��D�%�-�(�(�(��
�
��������
�
�
�	
���
���s�3;�
A	�A	)r)Tr�)NT)F)r�F)I�__doc__�
__future__rr�r�r`rLr�r�rhr+rprr�r{rc�	functoolsr�tempfilerrr�rb�supported_protocolsr�ipv4_only_protocolsrr%r3r9r8rArPrUrZrnrvr�r�r�r�r*rdr�rJr�r�r��getpidr�r�r/r7rGr�rIr
rrrr0r<rPrWrgr�r�r6r�r�r�r�r�r�r&r�<module>r�s��(�(�"&�%�%�%�%�%�����
�
�
�
���������	�	�	�	�����	�	�	�	�	�	�	�	�
�
�
�
�
�
�
�
�
�
�
�
�����
�
�
�
�������$�$�$�$�$�$�$�$��	�
�
�Q�P�P��A�A�A���v�&�����4���(���4���2F�F�F�	�	�	�	�4�4�4�n���

L�
L�
L�G�G�G�2����%�%�%�	&�	&�	&����*����
�
�
��J��
�
�
�
����������
H�H�H��2�9�;�;�����.�"�)�+�+�!�!�!�!�N	�	�	����2$�$�$�\���: (� (� (�F7(�7(�7(�t,#�,#�,#�h���	$�	$�	$�	$�6�6�6�6�r#
�#
�#
�L*�*�*�*�@,�,�,�^"�"�"�J,�,�,�^���& 
� 
� 
�F���P�P�P��������

�

�

�

�

r&