PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/lib64/python2.7/site-packages/psutil
Viewing File: /usr/lib64/python2.7/site-packages/psutil/_pslinux.pyc
� S��]c@ sQdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddl&m'Z'ddl&m(Z(ddl&m)Z)ddl&m*Z*ddl&m+Z+ddl&m,Z,e j-d�krdddl.Z.ndZ.d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0gZ0d1Z1ej2j3d2ej4��Z5e6ed3�Z7e6ed4�Z8e6ed5�Z9e:�Z;e7r7x6e<e�D]%Z=e=j>d6�r e0j?e=�q q Wnej@d7�ZAej@d8�ZBdaCe,rgdnd9ZDe jEd:kZFd;ZGe.dkr�e jHZIn+e.jJd<ieKe jH�d=6�ZLeLjIZIe.dkr�d>ZMdZNd?ZOdZPn,d@e.jJfdA��YZQeR�jSeQjT�i ejUdB6ejVdC6ejWdD6ejXdE6ejYdF6ejZdG6ej[dH6ej[dI6ej\dJ6ej]dK6ej^dL6ej_dM6Z`i ejadN6ejbdO6ejcdP6ejddQ6ejedR6ejfdS6ejgdT6ejhdU6ejidV6ejjdW6ejkdX6ZldZmdZndZodZpedYdZd[d\d]d^d_d`dadbdcddg �Zqededfdgdhdidjdkdldmdng �Zredodpdqdrdsdtg�Zsedudv�Ztedwetjud��Zved{dpd|d}dyd~dd�d�d�d�dzg �Zwed�d�d�jxewju��Zyed�dfdgdhdid�d�g�Zzed�d�d�d�d�d�g�Z{d��Z|d��Z}d��Z~ed���Ze;e�d��Z�yed��Wn6e�k r�e j��ed�d��d�d�d��a�nXd��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�ej2j3d��s9ej2j3d��rEd��Z�n'ej2j3d��rcd��Z�n d��Z�ej�Z�d�e�fd���YZ�d�d�d���YZ�e��Z�d�d��Z�d��Z�d��Z�ej�Z�e�d��Z�e�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d�e:fd���YZ�dS(�sLinux platform implementation.i����(tdivisionN(t defaultdict(t namedtuplei(t_common(t_psposix(t _psutil_linux(t _psutil_posix(tdecode(tget_procfs_path(t isfile_strict(tmemoize(tmemoize_when_activated(tNIC_DUPLEX_FULL(tNIC_DUPLEX_HALF(tNIC_DUPLEX_UNKNOWN(t open_binary(t open_text(tparse_environ_block(tpath_exists_strict(t supports_ipv6(t usage_percent(tb(t basestring(tFileNotFoundError(tPermissionError(tProcessLookupError(tPY3iit PROCFS_PATHtIOPRIO_CLASS_NONEtIOPRIO_CLASS_RTtIOPRIO_CLASS_BEtIOPRIO_CLASS_IDLEtCONN_ESTABLISHEDt CONN_SYN_SENTt CONN_SYN_RECVtCONN_FIN_WAIT1tCONN_FIN_WAIT2tCONN_TIME_WAITt CONN_CLOSEtCONN_CLOSE_WAITt CONN_LAST_ACKt CONN_LISTENt CONN_CLOSINGs/sys/class/power_supplys/proc/%s/smapst linux_prlimittproc_ioprio_gettproc_cpu_affinity_gettRLIMt SC_CLK_TCKt SC_PAGE_SIZEi tlittleit AddressFamilytAF_LINKiit IOPrioritycB s eZdZdZdZdZRS(iiii(t__name__t __module__RRRR(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR4ystRtStDtTtttZtXtxtKtWtItPt01t02t03t04t05t06t07t08t09t0At0Btsvmemttotalt availabletpercenttusedtfreetactivetinactivetbufferstcachedtsharedtslabtsdiskiot read_countt write_countt read_bytest write_bytest read_timet write_timetread_merged_counttwrite_merged_countt busy_timet popenfiletpathtfdtpositiontmodetflagstpmems"rss vms shared text lib data dirtytpfullmemtusstpsstswapt pmmap_groupedtrsstsizet shared_cleant shared_dirtyt private_cleant private_dirtyt referencedt anonymoust pmmap_exts addr perms t tpiot read_charst write_charst pcputimestusertsystemt children_usertchildren_systemtiowaitcC sjt|t�st|��tj|�}|jd�d}|jd�rft|� rf|d }n|S(sWrapper around os.readlink().tis (deleted)i����(t isinstanceRtAssertionErrortostreadlinktsplittendswithR(Re((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR��s  cC s~idtj6dtj6dtj6}||tjtjBtjB@}|tj@rh|jddd�}n|jdd�}|S(sZConvert file's open() flags into a readable string. Used by Process.open_files(). trtwsw+taisr+(R�tO_RDONLYtO_WRONLYtO_RDWRtO_APPENDtreplace(Rit modes_mapRh((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytfile_flags_to_mode�s $ cC sH|jdd�}t}|r+d|}n d|}tj|tj�S(s�Return True if the given name refers to a root device (e.g. "sda", "nvme0n1") as opposed to a logical partition (e.g. "sda1", "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram") return True. t/t!s /sys/block/%ss/sys/block/%s/device(R�tTrueR�taccesstF_OK(tnametincluding_virtualRe((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytis_storage_device�s   cC s�td|��}|j�j�d}WdQXdddddd d g}t|�}|d krr|jd �n|d kr�|jd�n|dkr�|jd�ntd|�adS(s�Set a namedtuple of variable fields depending on the CPU times available on this Linux kernel version which may be: (user, nice, system, idle, iowait, irq, softirq, [steal, [guest, [guest_nice]]]) Used by cpu_times() function. s%s/statiNR~tniceRtidleR�tirqtsoftirqitsteali tguesti t guest_nicet scputimes(RtreadlineR�tlentappendRR�(t procfs_pathtftvaluestfieldstvlen((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytset_scputimes_ntuple s     cC sly;|rt|�n t|��}|j�j�SWdQXWn*ttfk rg|tk ra|S�nXdS(s�Return file content. fallback: the value returned in case the file does not exist or cannot be read binary: whether to open the file in binary or text mode. N(RRtreadtstriptIOErrortOSErrort_DEFAULT(tfnametfallbacktbinaryR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcat&s! s/procR�suser system idlegc C sI|d}||jdd�}y"|d}|d}|d}Wntk rV|SXytdt��}Wntk r�|SXd}|�NxF|D]>}|j�}|jd�r�|t|j�d �7}q�q�WWd QX|t 9}|}||} ||} | t | d |�8} | | 7} | |t |d |�7} t| �S( s�Fallback for kernels < 3.14 where /proc/meminfo does not provide "MemAvailable:" column, see: https://blog.famzah.net/2014/09/24/ This code reimplements the algorithm outlined here: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 XXX: on recent kernels this calculation differs by ~1.5% than "MemAvailable:" as it's calculated slightly differently, see: https://gitlab.com/procps-ng/procps/issues/42 https://github.com/famzah/linux-memavailable-procfs/issues/2 It is still way more realistic than doing (free + cached) though. sMemFree:sCached:is Active(file):sInactive(file):s SReclaimable:s %s/zoneinfotlowiNig@( tgettKeyErrorRRR�R�t startswithtintR�tPAGESIZEtmin( tmemsRSR�tlru_active_filetlru_inactive_filetslab_reclaimableR�t watermark_lowtlinetavailt pagecache((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcalculate_avail_vmemCs4       '    c C s+g}i}tdt���@}x6|D].}|j�}t|d�d||d<q)WWdQX|d}|d}y|d}Wn$tk r�d}|jd �nXy|d }Wn$tk r�d}|jd �nX||jd d�7}y|d } WnFtk rKy|d} WqLtk rGd} |jd�qLXnXy|d} Wn$tk r�d} |jd�nXy|d} WnVtk r�y|d|d|d} Wq�tk r�d} |jd�q�XnXy|d} Wntk rd} nX||||} | dkr;||} ny|d}Wntk rht|�}nX|dkr�d}|jd�n||kr�|}nt|||dd�}|rddj |�t |�dkr�dndf}t j |t �nt|||| || | ||| | � S(s�Report virtual memory stats. This implementation matches "free" and "vmstat -s" cmdline utility values and procps-ng-3.3.12 source was used as a reference (2016-09-18): https://gitlab.com/procps-ng/procps/blob/ 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c For reference, procps-ng-3.3.10 is the version available on Ubuntu 16.04. Note about "available" memory: up until psutil 4.3 it was calculated as "avail = (free + buffers + cached)". Now "MemAvailable:" column (kernel 3.14) from /proc/meminfo is used as it's more accurate. That matches "available" column in newer versions of "free". s %s/meminfoiiiNs MemTotal:sMemFree:sBuffers:RVsCached:RWs SReclaimable:sShmem:s MemShared:RXsActive:RTs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:RUsSlab:s MemAvailable:RPtround_s6%s memory stats couldn't be determined and %s set to 0s, twastwere(RRR�R�R�R�R�R�RtjoinR�twarningstwarntRuntimeWarningRN(tmissing_fieldsR�R�R�R�RORSRVRWRXRTRURYRRR�RQtmsg((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytvirtual_memoryxs�  &                  "c C si}tdt���@}x6|D].}|j�}t|d�d||d<q#WWdQXy|d}|d}WnFtk r�tj�\}}}}}}}||9}||9}nX||}t||dd�} ytd t��}Wn=tk r1} d t | �} t j | t �d} } n�X|��d} } x�|D]�}|jd �r�t|jd �d�d d} n3|jd�r�t|jd �d�d d} n| dk rJ| dk rJPqJqJWd} t j | t �d} } WdQXtj|||| | | �S(sReturn swap memory metrics.s %s/meminfoiiiNs SwapTotal:s SwapFree:R�s %s/vmstatsP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)tpswpinRyitpswpoutsK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0(RRR�R�R�tcextt linux_sysinfoRR�tstrR�R�R�tNoneR�Rtsswap(R�R�R�R�RORSt_tunit_multiplierRRRQterrR�tsintsout((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt swap_memory�sD  &  !     $$cC s�t�}t|�td|��}|j�j�}WdQX|dttj�d!}g|D]}t|�t ^q_}t|�S(s�Return a named tuple representing the following system-wide CPU times: (user, nice, system, idle, iowait, irq, softirq [steal, [guest, [guest_nice]]]) Last 3 fields may not be available on all Linux kernel versions. s%s/statNi( RR�RR�R�R�R�t_fieldstfloatt CLOCK_TICKS(R�R�R�R�R>((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt cpu_times,s  #c C s�t�}t|�g}td|���}|j�x�|D]z}|jd�r=|j�}|dttj�d!}g|D]}t |�t ^q}t|�}|j |�q=q=W|SWdQXdS(sfReturn a list of namedtuple representing the CPU times for every CPU available on the system. s%s/stattcpuiN( RR�RR�R�R�R�R�R�R�R�R�(R�tcpusR�R�R�R�R>tentry((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt per_cpu_times<s     # cC s ytjd�SWn�tk rd}tdt���:}x0|D](}|j�jd�rD|d7}qDqDWWdQX|dkr�tjd�}t dt���G}x=|D]5}|j d �d}|j |�r�|d7}q�q�WWdQXn|dkrdS|SXdS( s0Return the number of logical CPUs in the system.tSC_NPROCESSORS_ONLNis %s/cpuinfot processoriNscpu\ds%s/statRy( R�tsysconft ValueErrorRRtlowerR�tretcompileRR�tmatchR�(tnumR�R�tsearch((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcpu_count_logicalPs$     c C sYt�}xEtjd�D]4}t|�� }|jt|j���WdQXqWt|�}|dkrm|Si}i}tdt����}x�|D]�}|j�j �}|s�d|kr�d|kr�|d||d<ni}q�|j d�s|j d�r�|j dd�\}}t|�||<q�q�WWdQXt |j ��}|pXdS( s2Return the number of physical cores in the system.s2/sys/devices/system/cpu/cpu[0-9]*/topology/core_idNis %s/cpuinfos physical ids cpu coress :i(tsettglobRtaddR�R�R�RR�R�R�R�tsumR�R�( tcore_idsReR�tresulttmappingt current_infoR�tkeytvalue((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcpu_count_physicalms0   #      c C s�tdt����}d}d}d}x�|D]�}|jd�r]t|j�d�}nP|jd�r�t|j�d�}n(|jd�r�t|j�d�}n|dk r/|dk r/|dk r/Pq/q/WWdQXd}tj||||�S(s*Return various CPU stats as a named tuple.s%s/stattctxtitintrR�Ni(RRR�R�R�R�Rt scpustats(R�t ctx_switchest interruptstsoft_interruptsR�tsyscalls((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt cpu_stats�s"  s'/sys/devices/system/cpu/cpufreq/policy0s$/sys/devices/system/cpu/cpu0/cpufreqcC sd�}g}xtt��D]�}||�}|s=qntjj}t||d�dd �}|d kr�t||d�dd �}|d kr�td��q�nt|�d}tt||d���d}tt||d���d}|j t j |||��qW|S( s�Return frequency metrics for all CPUs. Contrarily to other OSes, Linux updates these values in real-time. cS s9x2d|d|fD]}tjj|�r|SqWdS(Ns(/sys/devices/system/cpu/cpufreq/policy%ss%/sys/devices/system/cpu/cpu%s/cpufreq(R�Retexists(R�tp((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytget_path�s tscaling_cur_freqR�tcpuinfo_cur_freqs!can't find current frequency filei�tscaling_max_freqtscaling_min_freqN( trangeR�R�ReR�R�R�tNotImplementedErrorR�R�Rtscpufreq(RtrettnRetpjointcurrtmax_tmin_((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcpu_freq�s$      s /proc/cpuinfoc C s�g}tdt���j}x`|D]X}|j�jd�r#|jdd�\}}|jtjt|�dd��q#q#WWdQX|S(s}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. s %s/cpuinfoscpu mhzs :igN( RRR�R�R�R�RR R�(R R�R�R�R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�s /cC sgS(sGDummy implementation when none of the above files are present. ((((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�st_Ipv6UnsupportedErrorcB seZRS((R5R6(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�st ConnectionscB sheZdZd�Zd�Zd�Zed��Zedd��Z edd��Z dd�Z RS( swA wrapper on top of /proc/net/* files, retrieving per-process and system-wide open connections (TCP, UDP, UNIX) similarly to "netstat -an". Note: in case of UNIX sockets we're only able to determine the local endpoint/path, not the one it's connected to. According to [1] it would be possible but not easily. [1] http://serverfault.com/a/417946 cC s dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}i |||||fd6||fd6|fd6|fd6||fd6|fd6|fd6|fd6||||fd 6||fd 6||fd 6|_d|_dS( Nttcpttcp6tudptudp6tunixtallttcp4tudp4tinettinet4tinet6( tsockettAF_INETt SOCK_STREAMtAF_INET6t SOCK_DGRAMtAF_UNIXR�ttmapt _procfs_path(tselfRRRRR((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt__init__�s$        cC s�tt�}x�tjd|j|f�D]�}y td|j||f�}WnGttfk rkq)q)tk r�}|j t j kr�q)n�q)X|j d�r)|dd }||j |t |�f�q)q)W|S(Ns%s/%s/fds %s/%s/fd/%sssocket:[ii����(RtlistR�tlistdirR(R�RRR�terrnotEINVALR�R�R�(R)tpidtinodesRftinodeR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytget_proc_inodes s # $cC sXi}xKt�D]@}y|j|j|��Wqtttfk rOqqXqW|S(N(tpidstupdateR2RRR(R)R0R/((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytget_all_inodess cC sS|jd�\}}t|d�}|s.dStrF|jd�}n|tjkr�tr�tj|tj |�ddd��}qCtj|tj |��}n�tj |�}ygtr�tjtj t j dt j d|���}n-tjtj t j dt j d|���}Wn&tk rBt�s<t�qC�nXtj||�S( s�Accept an "ip:port" address as displayed in /proc/net/* and convert it into a human readable form, like: "0500000A:0016" -> ("10.0.0.5", 22) "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521) The IP address portion is a little or big endian four-byte hexadecimal number; that is, the least significant byte is listed first, so we need to reverse the order of the bytes to convert it to an IP address. The port is represented as a two-byte hexadecimal number. Reference: http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html t:itasciiNi����s>4Is<4I((R�R�RtencodeR!R"t LITTLE_ENDIANt inet_ntoptbase64t b16decodeR$tstructtpacktunpackR�RRRtaddr(R@tfamilytiptport((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytdecode_address/s0+$%   cc s�|jd�r&tjj|� r&dSt|dt��[}|j�xGt|d�D]6\}}y2|j�d \ }} } } }}}}}} Wn*t k r�t d|||f��nX| |kr�|| d\} }n d \} }|dk r || kr qUqU|t j kr)t| } n tj} y(tj| |�} tj| |�} Wntk rpqUnX|||| | | | fVqUWWdQXdS( s.Parse /proc/net/tcp* and /proc/net/udp* files.t6Nt bufferingii s,error while parsing %s; malformed line %s %rii����(Ni����(R�R�ReRRtBIGFILE_BUFFERINGR�t enumerateR�R�t RuntimeErrorR�R!R#t TCP_STATUSESRt CONN_NONERRDR(tfileRAttype_R0t filter_pidR�tlinenoR�R�tladdrtraddrtstatusR1R/Rf((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt process_inetfs2" 2      cc sbt|dt��J}|j�x6|D].}|j�}y&|dd!\}}}}}}} Wn9tk r�d|kr�q&ntd||f��nX| |kr�|| } n d g} x�| D]�\} } |d k r�|| kr�q�q�t|�dkr |d} nd} tj t |��}d}tj }| ||| ||| fVq�Wq&WWd QXd S( sParse /proc/net/unix files.RFiiRys)error while parsing %s; malformed line %ri����itN(Ni����( RRGR�R�R�RIR�R�Rtsocktype_to_enumR�RK(RLRAR0RNR�R�ttokensR�RMR1tpairsR/RfReRQRR((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt process_unix�s2   &       c C s�||jkrMtd|djg|jD]}t|�^q(�f��nt�|_|dk r�|j|�}|s�gSn |j�}t �}x|j|D]�\}}}|t j t j fkr�|j d|j|f|||d|�} n(|jd|j|f||d|�} xx| D]p\} }}} } } }|rjtj| ||| | | �}n!tj| ||| | | |�}|j|�q(Wq�Wt|�S(Ns+invalid %r kind argument; choose between %ss, s %s/net/%sRN(R'R�R�treprRR(R�R2R5R�R!R"R$RSRXRtpconntsconnR�R+(R)tkindR/R>R0R R�RARMtlsRfRPRQRRt bound_pidtconn((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytretrieve�s48    "  N( R5R6t__doc__R*R2R5t staticmethodRDR�RSRXR`(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�s    7'%RcC s tj|�S(s$Return system-wide open connections.(t _connectionsR`(R\((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnet_connections�scC s�tdt���}|j�}WdQXi}x�|dD]�}|jd�}|dksltt|���|| j�}||dj�j�}tt |�\}}} } } } } }}}}}}}}}||||| || |f||<q9W|S(ssReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. s %s/net/devNiR6ii( RRt readlinestrfindR�RYR�R�tmapR�(R�tlinestretdictR�tcolonR�R�t bytes_recvt packets_recvterrintdropintfifointframeint compressedint multicastint bytes_sentt packets_sentterrouttdropouttfifooutt collisionsoutt carrieroutt compressedout((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnet_io_counters�s? c C s�ittj6ttj6ttj6}t�j�}i}x�|D]�}y7t j |�}t j |�}tj |�\}}Wn+t k r�}|jtjkr��q�q@Xtj|||||�||<q@W|S(s)Get NIC stats (isup, duplex, speed, mtu).(R R�t DUPLEX_FULLR t DUPLEX_HALFRtDUPLEX_UNKNOWNR{tkeyst cext_posixt net_if_mtut net_if_flagstnet_if_duplex_speedR�R-tENODEVRt snicstats( t duplex_maptnamesR R�tmtutisuptduplextspeedR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt net_if_statss     $c C s�d�}d�}tjjdt��r7|�}n1tjjd�rU|�}ntdt���i}x�|D]}}|\ }}}} } } } } }}| r�t|� r�qun| t9} | t9} ||| | | | | ||f ||<quW|S(scReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. cs s�tdt���}|j�}WdQXx`|D]X}|j�}t|�}|dkr�|d}t|d�}tt|dd!�\ }}} } } } } }}}n�|dks�|dkr|d}tt|dd!�\ }}}} } } } } }}}n^|dkrT|d}tt|d�\}}} } d } } }} }ntd |��||| || | | || |f Vq/WdS( Ns %s/diskstatsiiiiiiiis!not sure how to interpret line %r(RRReR�R�R�RgR�(R�RhR�R�tflenR�treadst reads_mergedtrbytestrtimetwritest writes_mergedtwbytestwtimeR�Rc((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt read_procfs#s&     7 :  cs sx�tjd�D]�}x�tjtjjd|��D]�\}}}d|krVq5nttjj|d���}|j�j�j�}WdQXtjj |�}t t |�\ }}} } } } } }}}}||| | | | ||| |f Vq5WqWdS(Ns /sys/blocktstat( R�R,twalkReR�RR�R�R�tbasenameRgR�(tblocktrootR�tfilesR�R�R�R�R�R�R�R�R�R�R�Rc((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt read_sysfsMs. 0s %s/diskstatss /sys/blocksC%s/diskstats nor /sys/block filesystem are available on this system(R�ReRRR R�tDISK_SECTOR_SIZE(tperdiskR�R�tgenRiR�R�R�R�R�R�R�R�R�R�Rc((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytdisk_io_counterss& *     $   c C s�t�}t�}td|��x}xn|D]f}|j�}|jd�sc|j|j��q,|jd�d}|dkr,|jd�q,q,WWdQX|dkr�tjj d�r�tjj d�}ntjj d |�}g}t j |�}x�|D]y} | \} } }} | d kr.d } n|sU| d ks||krUqqUnt j| | || �} |j| �qW|S( s8Return mounted disk partitions as a list of namedtuples.s%s/filesystemstnodevs itzfsNs/procs /etc/mtabs%s/self/mountstnoneRT(R�RRR�R�R�R�R�RetisfiletrealpathR�tdisk_partitionsRt sdiskpartR�(RtfstypesR�R�R�tfstypet mounts_pathtretlistt partitionst partitiontdevicet mountpointtoptstntuple((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�}s2         cC sdtjt�}tjd�}|jtjd��ttg|D]}|jd�d^qA��}x�|D]x}yW|d}tt |��d}t j j t j j |�d�}t |dt�}Wn9tttfk r}tjd ||ft�qmnXt |d d d�}t |d d d�} t |d d ddt�} |dk r�yt|�d}Wq�tk r�d}q�Xn| dk r�yt| �d} Wq�tk r�d} q�Xn||j| ||| f�qmW|sZtjd�}tt|��}xG|D]<}yVt j j |d�}tt |��d}t j j |d�}t |dt�}Wn9tttfk r�}tjd ||ft�qnXtj|d�} tg| D]1} dj t j j| �jd�dd!�^q��} d} d}x!| D]}t j j ||d�}t |d ddt�}|dkr�t t j j ||d�d d�} n4|dkr�t t j j ||d�d d�}n|dk r�yt|�d}Wq�tk r�d}q�Xn| dk ryt| �d} Wq2tk r.d} q2XqqW||jd||| f�qWnt|�S(s�Return hardware (CPU and others) temperatures as a dict including hardware name, label, current, max and critical temperatures. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon - /sys/class/thermal/thermal_zone* is another one but it's more difficult to parse s/sys/class/hwmon/hwmon*/temp*_*s&/sys/class/hwmon/hwmon*/device/temp*_*R�it_inputg@�@R�R�signoring %r for file %rt_maxR�t_critt_labelRTs /sys/class/thermal/thermal_zone*ttempttypes /trip_point*it_typetcriticalt_tempthighN(t collectionsRR+R�textendtsortedR�R�R�R�R�ReR�tdirnametFalseR�R�R�R�R�R�R�R�R�tdict(R t basenamesR>tbaseRetcurrentt unit_nameR�R�R�tlabelt trip_pathsRt trip_pointst trip_pointt trip_type((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytsensors_temperatures�s� 2  !       ! >          $cC s6tjt�}tjd�}|s6tjd�}nttg|D]}|jd�d^qC��}x�|D]�}ytt|d��}Wn0t t fk r�}t j d|t �qonXttjjtjj|�d�dt�}t|d d d dt�}||jtj||��qoWt|�S( s�Return hardware fans info (for CPU and other peripherals) as a dict including hardware label and current speed. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon s/sys/class/hwmon/hwmon*/fan*_*s%/sys/class/hwmon/hwmon*/device/fan*_*R�iR�s ignoring %rR�R�R�R�RT(R�RR+R�R�R�R�R�R�R�R�R�R�R�R�ReR�R�R�R�RtsfanR�(R R�R>R�R�R�R�R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt sensors_fans s 2 $ !c  s.t���fd�}gtjt�D]}|jd�r(|^q(}|sSdStjjtt|�d�}||d|d�}||d|d�}||d|d �}|dks�|dkr�dS|dk ryd ||}Wq:t k r d }q:Xn,t t |d d d��}|dkr:dSd}|tjjtd�tjjtd��} | dk r�| dk}nLt |dd ddt �j �} | dkr�t }n| dkr�t}n|r�tj} n5yt ||d�} Wnt k rtj} nXtj|| |�S(sReturn battery information. Implementation note: it appears /sys/class/power_supply/BAT0/ directory structure may vary and provide files with the same meaning but under different names, see: https://github.com/giampaolo/psutil/issues/966 c sMxF|D]>}t|d��}|�kr|j�rAt|�S|SqWdS(svAttempt to read the content of multiple files which may not exist. If none of them exist return None. R�N(R�tisdigitR�R�(tpathsReR (tnull(s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt multi_cat6s   tBATis /energy_nows /charge_nows /power_nows /current_nows /energy_fulls /charge_fullgY@gs /capacityR�i����s AC0/onlines AC/onlineis/statusRTR�t dischargingtchargingtfulliN(R�R�(tobjectR�R,tPOWER_SUPPLY_PATHR�R�ReR�R�tZeroDivisionErrorR�R�R�R�R�RtPOWER_TIME_UNLIMITEDtPOWER_TIME_UNKNOWNtsbattery( R�R>tbatsR�t energy_nowt power_nowt energy_fullRQt power_pluggedtonlineRRtsecsleft((R�s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytsensors_battery-sV  1        "       c C s�g}tj�}xu|D]m}|\}}}}}}|sCqn|dkrXd}ntj||pjd|||�} |j| �qW|S(s:Return currently connected users as a list of namedtuples.s:0.0s:0t localhost(s:0.0s:0N(R�tusersRtsuserR�R�( R�trawlisttitemR~tttythostnamettstampt user_processR/tnt((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR��s    !cC s|dt�}t|��]}xC|D];}|jd�r#t|j�j�d�}|a|Sq#Wtd|��WdQXdS(sAReturn the system boot time expressed in seconds since the epoch.s%s/stattbtimeisline 'btime' not found in %sN(RRR�R�R�R�t BOOT_TIMERI(ReR�R�R ((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt boot_time�s  cC s;gtjtt���D]}|j�rt|�^qS(s7Returns a list of PIDs currently running on the system.(R�R,RRR�R�(R>((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR3�scC s�tj|�stSy|dt�|f}t|��W}x=|D]5}|jd�r?t|j�d�}||kSq?Wtd|��WdQXWn!t tfk r�|t �kSXdS(scCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). s %s/%s/statussTgid:is'Tgid' line not found in %sN( Rt pid_existsR�RRR�R�R�R�tEnvironmentErrorR3(R/ReR�R�ttgid((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR��s  cC s�i}t�}x�t�D]�}y/td||f��}|j�}WdQXWnttfk rgqX|jd�}||dj�}t|d�}|||<qW|S(ssObtain a {pid: ppid, ...} dict for all running processes in one shot. Used to speed up Process.children(). s %s/%s/statNt)ii( RR3RR�RRRfR�R�(R R�R/R�tdatatrpartdsettppid((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytppid_map�s c s"tj���fd��}|S(slDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. c s�y�|||�SWn�tk r<t|j|j��nstk rat|j|j��nNtk r�tjj d|j |jf�s�t|j|j��n�nXdS(Ns%s/%s( Rt AccessDeniedR/t_nameRt NoSuchProcessRR�ReRR((R)targstkwargs(tfun(s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytwrapper�s   "(t functoolstwraps(RR((Rs5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytwrap_exceptions�stProcesscB seZdZdddddgZd�Zd�Zeed���Zeed ���Z eed ���Z d �Z d �Z ed ��Z d�Zed��Zed��Zed��Zejjdej��r�ed��Zned��Zed��Zed7d��Zed��Zed��Zer�eejd�ejd�ejd�d��Z neZ er�ed��Z!ned��Z"eejd�d ��Z#eejd!�d"��Z$ed#��Z%ed$��Z&ed%��Z'e(rMed&��Z)ejd'�d(�Z*ed)��Z+ne,rted*��Z-ed+��Z.ne/r�ed7d,��Z0ned-��Z1ed.��Z2ed/d0��Z3ed1��Z4ed2��Z5eejd3�d4��Z6eejd5�d6��Z7RS(8sLinux process implementation.R/R�t_ppidR(t_cachecC s+||_d|_d|_t�|_dS(N(R/R�R�RRR((R)R/((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR*�s   cC s!tjd|j|jf�dS(s+Raise NSP if the process disappeared on us.s%s/%sN(R�R�R(R/(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt _assert_alivescC std|j|jf��}|j�}WdQX|jd�}||jd�d|!}||dj�}i}||d<|d|d <|d|d <|d |d <|d |d<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|S(sZParse /proc/{pid}/stat file and return a dict with various process info. Using "man proc" as a reference: where "man proc" refers to position N always substract 3 (e.g ppid position 4 in 'man proc' == position 1 in here). The return value is cached in case oneshot() ctx manager is in use. s %s/%s/statNR�t(iiR�iRRR�itttynri tutimei tstimei tchildren_utimeitchildren_stimeit create_timei$tcpu_numi't blkio_ticks(RR(R/R�RftfindR�(R)R�R�R�R�R�R ((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt_parse_stat_file s$  cC s3td|j|jf��}|j�SWdQXdS(s�Read /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. s %s/%s/statusN(RR(R/R�(R)R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt_read_status_file.scC s?td|j|jfdt��}|j�j�SWdQXdS(Ns %s/%s/smapsRF(RR(R/RGR�R�(R)R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt_read_smaps_file8s cC s4|jj|�|jj|�|jj|�dS(N(Rtcache_activateRR(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt oneshot_enter?scC s4|jj|�|jj|�|jj|�dS(N(Rtcache_deactivateRR(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt oneshot_exitDscC s)|j�d}tr%t|�}n|S(NR�(RRR(R)R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�IscC s�ytd|j|jf�SWn�ttfk r�tjjd|j|jf�rZdSt|j�s�t |j|j ��q�t |j|j |j ��n&t k r�t|j|j ��nXdS(Ns %s/%s/exes%s/%sRT(R�R(R/RRR�RetlexistsR�R�R�t ZombieProcessRRR�(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytexeQs" cC s�td|j|jf��}|j�}WdQX|s;gS|jd�rPdnd}|j|�rr|d }n|j|�}|dkr�t|�dkr�d|kr�|jd�}n|S(Ns %s/%s/cmdlineR�Ryi����i(RR(R/R�R�R�R�(R)R�R�tseptcmdline((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyRbs *cC s;td|j|jf��}|j�}WdQXt|�S(Ns %s/%s/environ(RR(R/R�R(R)R�R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytenviron{scC sGt|j�d�}tj�}y ||SWntk rBdSXdS(NR (R�RRtget_terminal_mapR�R�(R)ttty_nrR'((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytterminal�s    s /proc/%s/ioc C sd|j|jf}i}t|��m}xc|D][}|j�}|r2y|jd�\}}Wntk ryq2q�Xt|�||<q2q2WWdQX|s�td|��ny5t|d|d|d|d|d|d �SWn0t k r}td |d ||f��nXdS( Ns%s/%s/ios: s%s file was emptytsyscrtsyscwR]R^trchartwchars1%r field was not found in %s; found fields are %ri( R(R/RR�R�R�R�RIRzR�(R)R�R�R�R�R�R�R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt io_counters�s0   cC s�|j�}t|d�t}t|d�t}t|d�t}t|d�t}t|d�t}t|||||�S(NR R R RR(RR�R�R}(R)R�R R R RR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR��s cC st|j�d�S(sWhat CPU the process is on.R(R�R(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�scC stj|j||j�S(N(Rtwait_pidR/R�(R)ttimeout((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytwait�scC s1t|j�d�}tp"t�}|t|S(NR(R�RR�R�R�(R)tctimetbt((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�sc C s�td|j|jf��O}g|j�j�d D]}t|�t^q6\}}}}}}} WdQXt||||||| �S(Ns %s/%s/statmi(RR(R/R�R�R�R�Rj( R)R�R>tvmsRpRXttexttlibR�tdirty((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt memory_info�s Ns\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c C s�|j�}|j�}ttt|j|���d}ttt|j|���d}ttt|j|���d}t||||f�S(Ni(R1RR�RgR�tfindallRk( R)t _private_ret_pss_ret_swap_ret basic_memt smaps_dataRlRmRn((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytmemory_full_info�s  """cC s�d�}|j�}|sgS|jd�}g}|jd�}|g}x�|||�D]v\}}|jdd�}y|\} } } } } }Wn0tk r�|dg\} } } } } }nX|s�d}nJtr�t|�}n|j�}|jd�r"t |� r"|d }n|j t| �t| �||d |j d d�|j d d�|j d d�|j d d�|j dd�|j dd�|j dd�|j dd�|j dd�f �q\W|S(sPReturn process's mapped memory regions as a list of named tuples. Fields are explained in 'man proc'; here is an updated (Apr 2012) version: http://goo.gl/fmebo /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if CONFIG_MMU kernel configuration option is not enabled. cs s�i}x�|D]�}|jdd�}|djd�sY|j�|fV|j|�q y t|d�d||d<Wq tk r�|djd�r�q q�td|��q Xq W|j�|fVdS(NiiR6iisVmFlags:s#don't know how to interpret line %r(R�R�R�tpopR�R�R�R�(Rht current_blockR�R�R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt get_blocks s   s iiRTs[anon]s (deleted)i����sRss:sSize:sPss:s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:sSwap:N( RR�R9R�R�RRR�R�RR�R�(R)R;R�RhR]t first_lineR:theaderthfieldsR@tpermstoffsettdevR1Re((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt memory_mapssF    #    cC s~ytd|j|jf�SWnYttfk ryt|j�s[t|j|j��qzt|j|j|j ��nXdS(Ns %s/%s/cwd( R�R(R/RRR�R�R�RR(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcwdDs sctxt_switches:\t(\d+)cC sh|j�}|j|�}|s@td|j|jf��n$tjt|d�t|d��SdS(Ns�'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in %s/%s/status; the kernel is probably older than 2.6.23ii(RR2R R(R/RtpctxswR�(R)t _ctxsw_reR�tctxsw((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnum_ctx_switchesOs sThreads:\t(\d+)cC s#|j�}t|j|�d�S(Ni(RR�R2(R)t_num_threads_reR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt num_threads]s c C s4tjd|j|jf�}|j�g}t}x�|D]�}d|j|j|f}y+t|��}|j�j�}WdQXWnt k r�t }q<nX||j d�d}|j d�}t |d�t} t |d�t} tjt|�| | �} |j| �q<W|r0|j�n|S(Ns %s/%s/tasks%s/%s/task/%s/statR�iRyi i (R�R,R(R/tsortR�RR�R�RR�RR�R�R�RtpthreadR�R�R( R)t thread_idsR�t hit_enoentt thread_idR�R�tstR�R R R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytthreadses,    cC stj|j�S(N(R�t getpriorityR/(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnice_get�scC stj|j|�S(N(R�t setpriorityR/(R)R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnice_set�scC stj|j�S(N(R�R-R/(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcpu_affinity_get�ssCpus_allowed_list:\t(\d+)-(\d+)cC sq|j�}|j|�}|rTttt|dd�t|dd�d��Stttt����SdS(Nii(RR2R+R R�R�R�(R)t_reR�R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt_get_eligible_cpus�s  3cC s�ytj|j|�Wn�ttfk r�}t|t�sP|jtjkr�|j�}t t t t ����}x[|D]P}||kr�td||f��n||kr~td||f��q~q~Wn�nXdS(Ns(invalid CPU number %r; choose between %ss0CPU number %r is not eligible; choose between %s( R�tproc_cpu_affinity_setR/R�R�R�R-R.RWttupleR R�R�(R)R�R�t eligible_cpustall_cpusR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcpu_affinity_set�s !    cC sCtj|j�\}}tdk r3t|�}ntj||�S(N(R�R,R/tenumR�R4Rtpionice(R)tioclassR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt ionice_get�s cC s}|dkrd}n|r@|ttfkr@td|��n|dksX|dkrgtd��ntj|j||�S(Nis%r ioclass accepts no valueisvalue not in 0-7 range(R�RRR�R�tproc_ioprio_setR/(R)R_R�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt ionice_set�s  cC s�|jdkrtd��nys|dkr@tj|j|�St|�dkrktdt|���n|\}}tj|j|||�WnUtk r�}|jtj kr�t |j�r�t |j|j |j ��q��nXdS(Nis)can't use prlimit() against PID 0 processis4second argument must be a (soft, hard) tuple, got %s(R/R�R�R�R+R�RYR�R-tENOSYSR�RR�R(R)tresourcetlimitstsoftthardR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytrlimit�s  !cC s5|j�d}tr%|j�}ntj|d�S(NRRt?(RRRt PROC_STATUSESR�(R)tletter((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyRR�sc C s�g}tjd|j|jf�}t}xi|D]a}d|j|j|f}yt|�}WnMttfk r�t}q2q2t k r�}|j t j kr�q2n�q2X|j d�r2t |�r2d|j|j|f}yTt|��B}t|j�j�d�} t|j�j�dd�} WdQXWntk rRt}q�Xt| �} t|t|�t| �| | �} |j| �q2q2W|r�|j�n|S(Ns%s/%s/fds %s/%s/fd/%sR�s%s/%s/fdinfo/%sii(R�R,R(R/R�R�RRR�R�R-R.R�R RR�R�R�R�RdR�R( R)R�R�RMRfRLReR�R�tposRiRhR�((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt open_files�s< )   ! RcC s#tj||j�}|j�|S(N(RcR`R/R(R)R\R ((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt connectionss cC s#ttjd|j|jf��S(Ns%s/%s/fd(R�R�R,R(R/(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnum_fdsscC st|j�d�S(NR�(R�R(R)((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�!ssUid:\t(\d+)\t(\d+)\t(\d+)cC sM|j�}|j|�d\}}}tjt|�t|�t|��S(Ni(RR2RtpuidsR�(R)t_uids_reR�trealt effectivetsaved((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytuids%s sGid:\t(\d+)\t(\d+)\t(\d+)cC sM|j�}|j|�d\}}}tjt|�t|�t|��S(Ni(RR2RtpgidsR�(R)t_gids_reR�RrRsRt((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytgids+s N(8R5R6Rat __slots__R*RRR RRRRRR�RRRR"R�ReRtgetpidR'R�RR�R*RR1t HAS_SMAPSR�R�R8RBRCRGRIRPRRRTtHAS_CPU_AFFINITYRURWR\tHAS_PROC_IO_PRIORITYR`Rbt HAS_PRLIMITRhRRRmRnRoR�RuRx(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR�sz  "         D     ,(ii(sussspsssswap((�Rat __future__RR;R�R-RR�R�R�R!R=tsyst tracebackR�RRRTRRRR�RR�RRR R R R R RRRRRRRt_compatRRRRRRt version_infoR]R�t__extra__all__R�ReRRzR{thasattrR~R}R|R�R�tdirR�R�R�R�R�R�R�RGt byteorderR9R�t AF_PACKETR3tIntEnumR�R2RRRRR4tglobalsR4t __members__tSTATUS_RUNNINGtSTATUS_SLEEPINGtSTATUS_DISK_SLEEPtSTATUS_STOPPEDtSTATUS_TRACING_STOPt STATUS_ZOMBIEt STATUS_DEADtSTATUS_WAKE_KILLt STATUS_WAKINGt STATUS_IDLEt STATUS_PARKEDRjR R!R"R#R$R%R&R'R(R)R*RJR�RR�tTimeoutExpiredRNRZRdRjR�RkRoR�RxRzR}R�R�R�R�R�R�t Exceptiont print_excR�R�R�R�R�R�R�R�RRt net_if_addrsRRRcRdR{R�t disk_usageR�R�R�R�R�R�R�R�R3R�R�RR(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt<module>s\                                                         5 z :    $   �   %   ^ ( h X