PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB` 3 peɨ@sdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl m Z ddlmZmZmZddlmZmZmZmZmZddlZddlZdd d d d d dddddddddddgZeedZerx$eeD]Zej drej!eqWej"dZ#ej"dZ$da%e j&Z'dZ(dZ)dZ*dZ+e j,e j-e j.e j/e j0e j1e j2e j2e j3e j4d Z5e j6e j7e j8e j9e j:e j;e je j?e j@d! ZAdZBdZCdZDd"d#ZEed$eEZFed%d&d'd(d)d*d+d,d-d.g ZGed/d0ZHed1d2d3d4d5d6d7d8d9d:d;dd?jJeIjKZLd@dAZMdBdCZNedDdEdFdZOedGdEdHdZPdIdJZQdKdLZRdMdNZSdOdPZTdQdRZUdSdTZVdUdVZWdWdXZXGdYdZdZZYeYZZdid\d]Z[d^d_Z\d`daZ]djdcddZ^e j_Z_dedfZ`GdgdhdheaZbdS)kzLinux platform implementation.)divisionN)_common)_psposix) isfile_strict usage_percent deprecated)PY3 namedtuplewrapsb defaultdictIOPRIO_CLASS_NONEIOPRIO_CLASS_RTIOPRIO_CLASS_BEIOPRIO_CLASS_IDLECONN_ESTABLISHED CONN_SYN_SENT CONN_SYN_RECVCONN_FIN_WAIT1CONN_FIN_WAIT2CONN_TIME_WAIT CONN_CLOSECONN_CLOSE_WAIT CONN_LAST_ACK CONN_LISTEN CONN_CLOSINGphymem_buffers cached_phymem linux_prlimitZRLIM SC_CLK_TCK SC_PAGE_SIZE) RSDTtZXxKW) Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0BcCstdd}z|jjdd}Wd|jXddddd d d g}t|}|d krZ|jd |dkrl|jd|dkr~|jd|S)zReturn 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]]]) z /proc/statrbr!NusernicesystemidleZiowaitZirqZsoftirqZsteal Zguest Z guest_nice)openreadlinesplitcloselenappend)fvaluesfieldsZvlenr?1/usr/lib/fm-agent/dependencies/psutil/_pslinux.py_get_cputimes_fieldscs     rA scputimessvmemtotalZ availablepercentusedfreeactiveinactivebufferscachedpextmemz"rss vms shared text lib data dirty pmmap_groupedpathrsssizeZpssZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousswap pmmap_extz addr perms  cCs6tj\}}}}}}d}}}tdd}tdtdtd} } } zx|D]|} | j| rrt| jdd}n>| j| rt| jdd}n| j| rt| jdd}|dk rN|dk rN|dk rNPqNWd} tj| t d }}}Wd|j X|||}||}t |||dd }t ||||||||| S) Nz /proc/meminfor.zCached:zActive:z Inactive:r!izW'cached', 'active' and 'inactive' memory stats couldn't be determined and were set to 0r)_round) cext linux_sysinfor6r startswithintr8warningswarnRuntimeWarningr9rrC)rDrGrJshared_rKrHrIr<ZCACHEDZACTIVEZINACTIVElinemsgZavailrFrEr?r?r@virtual_memorys2          r`c Cstj\}}}}}}||}t||dd}tdd}tdtd}}d}} zx|D]h} | j|rt| jtdddd }n(| j|rt| jtdddd } |dk rV| dk rVPqVWd } tj | t d }} Wd|j Xt j |||||| S) Nr!)rTz /proc/vmstatr.ZpswpinZpswpoutrSizK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0r)rUrVrr6r rWrXr8rYrZr[r9rsswap) r]rDrGrFrEr<ZSINZSOUTsinsoutr^r_r?r?r@ swap_memorys&        rezpsutil.virtual_memory().cached) replacementcCstjS)N)r`rKr?r?r?r@rszpsutil.virtual_memory().bufferscCstjS)N)r`rJr?r?r?r@rsc CsRtdd}z|jj}Wd|jX|dttjd}dd|D}t|S)zReturn 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. z /proc/statr.Nr!cSsg|]}t|tqSr?)float CLOCK_TICKS).0r+r?r?r@ szcpu_times..)r6r7r8r9r:rB_fields)r<r=r>r?r?r@ cpu_timess  rlc Csg}tdd}zj|jtd}xT|D]L}|j|r&|j}|dttjd}dd|D}t|}|j|q&W|S|j XdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. z /proc/statr.cpur!cSsg|]}t|tqSr?)rgrh)rir+r?r?r@rjsz!per_cpu_times..N) r6r7r rWr8r:rBrkr;r9)cpusr<ZCPUr^r=r>entryr?r?r@ per_cpu_timess   rpcCsy tjdStk rpd}tdd}z |j}Wd|jXtd}x"|D]}|jj|rN|d7}qNWYnX|dkrtdd }z |j}Wd|jXt j d }x,|D]$}|j d d}|j |r|d7}qW|dkrdS|S) z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNrz /proc/cpuinfor.N processorr!z /proc/statrtzcpu\drS) ossysconf ValueErrorr6 readlinesr9r lowerrWrecompiler8match)numr<linesZ PROCESSORr^searchr?r?r@cpu_count_logicals2            rc Csntdd}z |j}Wd|jXt}td}x(|D] }|jj|r6|j|jq6W|rft |SdSdS)z1Return the number of physical CPUs in the system.z /proc/cpuinfor.Nz physical id) r6rwr9setr rxrWaddstripr:)r<r}foundZ PHYSICAL_IDr^r?r?r@cpu_count_physical&s    rc Cs\g}tj}xJ|D]B}|\}}}}}|s*q|dkr6d}tj||pBd||}|j|qW|S)z:Return currently connected users as a list of namedtuples.z:0.0 localhostN)rUusersrsuserr;) retlistZrawlistitemr/ZttyhostnameZtstampZ user_processntr?r?r@r:s rc Csbtdd}zHtd}x2|D]*}|j|rt|jjd}|a|SqWtdWd|jXdS)zAReturn the system boot time expressed in seconds since the epoch.z /proc/statr.Zbtimer!zline 'btime' not foundN) r6r rWrgrr8 BOOT_TIME RuntimeErrorr9)r<ZBTIMEr^retr?r?r@ boot_timeLs    rcCsddtjtdDS)z7Returns a list of PIDs currently running on the system.cSsg|]}|jrt|qSr?)isdigitrX)rir+r?r?r@rj`szpids..z/proc)rtlistdirr r?r?r?r@pids^srcCs tj|S)z&Check For the existence of a unix pid.)r pid_exists)pidr?r?r@rcsrc@sNeZdZdZddZddZddZdd Zdd d Zdd dZ dddZ d S) ConnectionsawA 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 c Csdtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd |_dS)Ntcptcp6udpudp6unix) allrtcp4rrudp4rrinetinet4inet6)socketAF_INET SOCK_STREAMAF_INET6 SOCK_DGRAMAF_UNIXtmap)selfrrrrrr?r?r@__init__vs    zConnections.__init__c Cstt}xxtjd|D]f}ytjd||f}Wntk rHwYqX|jdr|dddd}||j|t|fqW|S)Nz /proc/%s/fdz/proc/%s/fd/%szsocket:[r3r!) r listrtrreadlinkOSErrorrWr;rX)rrinodesfdinoder?r?r@get_proc_inodess zConnections.get_proc_inodesc Csji}x`tD]V}y|j|j|Wq tk r`tjd}|jtjtjtj tj fkr\Yq Xq W|S)Nr!) rupdaterrsysexc_infoerrnoENOENTESRCHEPERMEACCES)rrrerrr?r?r@get_all_inodess   zConnections.get_all_inodescCs|jd\}}t|d}|s fStr.|jd}|tjkrttjdkr`tj|t j |ddd }qtj|t j |}nVt j |}tjdkrtjtj t j d t jd|}n tjtj t j d t jd|}||fS) aAccept 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 :asciilittleNr!>4I<4Ir)r)r)r8rXrencoderrr byteorder inet_ntopbase64 b16decoderstructpackunpack)raddrfamilyipportr?r?r@decode_addresss&      zConnections.decode_addressNc cs |jdrtjj| rdSt|d}|jx|D]}|jdd\ }} } } }}}}}} | |krt|| dkr|tj krt d|| d\} }nd \} }|dk r|| krq4q4|tj krt | } nt j} |j| |} |j| |} |||| | | | fVq4W|jdS) z.Parse /proc/net/tcp* and /proc/net/udp* files.6Nrsr5r!z,ambiguos inode with multiple PIDs referencesrr)Nr)endswithrtrNexistsr6r7r8r:rrrvr TCP_STATUSESr CONN_NONErr9)rfilertype_r filter_pidr<r^r]laddrraddrstatusrrrr?r?r@ process_inets(  $    zConnections.process_inetc cst|d}|jx|D]}|j}|dd\}}}}} }} | |krP|| } nd g} xd| D]\\} } |dk rx|| krxq\q\t|dkr|d }nd}t| } d}tj}| || |||| fVq\WqW|jdS) zParse /proc/net/unix files.rsrNr!r3r)Nrr)r6r7r8r:rXrrr9)rrrrrr<r^tokensr]rrpairsrrrNrrr?r?r@ process_unixs&     zConnections.process_unixc Cs||jkr,td|djdd|jDf|dk rH|j|}|sPgSn|j}g}x|j|D]\}}}|tjtjfkr|jd|||||d}n|j d||||d}xT|D]L\} }}} } } } |rt j | ||| | | }nt j | ||| | | | }|j |qWq`W|S)Nz+invalid %r kind argument; choose between %sz, cSsg|] }t|qSr?)repr)rir+r?r?r@rjsz(Connections.retrieve..z /proc/net/%s)r)rrvjoinrrrrrrrrpconnsconnr;)rkindrrrr<rrlsrrrrZ bound_pidconnr?r?r@retrieves.  zConnections.retrieve)N)N)N) __name__ __module__ __qualname____doc__rrrrrrrr?r?r?r@rjs / rrcCs tj|S)z$Return system-wide open connections.) _connectionsr)rr?r?r@net_connections7srcCstdd}z |j}Wd|jXi}x|ddD]}|jd}|dksVtt||d|j}||ddjj}t|d}t|d}t|d} t|d} t|d } t|d } t|d } t|d }| || || | | |f||<q4W|S) zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z /proc/net/devrsNr"rrr!r#r3r4r5 ) r6rwr9rfindAssertionErrorrrr8rX)r<r}retdictr^Zcolonnamer> bytes_recv packets_recverrindropin bytes_sent packets_senterroutdropoutr?r?r@net_io_counters<s*            rcCsjd}g}tdd}z|jdd}Wd|jXxXt|D]L}|j\}}}}|d jrh|j|q<| s~|d j| r<|j|qZreadsrbytesZrtimeZwriteswbytesZwtimer?r?r@disk_io_counters[s@         $  rFc Csg}tdd}z*x$|D]}|jds|j|jqWWd|jXg}tj}xT|D]L}|\}}} } |dkrrd}|s|dksV| |krqVtj||| | } |j| qVW|S)z6Return mounted disk partitions as a list of nameduplesz/proc/filesystemsrZnodevNZnoner) r6rWr;rr9rUdisk_partitionsr sdiskpart) rZphydevsr<r^rr partitiondevice mountpointfstypeoptsntupler?r?r@rs&      rcstfdd}|S)zlDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. c sy|f||Stk rtdks0tdkr2tjd}|jtjtjfkr^t|j|j |jtj tj fkr~t|j|j YnXdS)Nr!) EnvironmentError NoSuchProcess AccessDeniedrrrrrr_namerr)rargskwargsr)funr?r@wrappers z wrap_exceptions..wrapper)r )rrr?)rr@wrap_exceptionssrc@seZdZdZddgZddZeddZdd Zed d Z ed d Z e j j de jrjeddZnddZeddZedGddZeddZeddZeddZe j j de jrddZnd dZed!d"Zed#d$Zed%d&Zed'd(Zed)d*Zed+d,Zed-d.Zed/d0Zeed1rZed2d3Z ed4d5Z!e"rnedHd6d7Z#ed8d9Z$ed:d;Z%edId=d>Z&ed?d@Z'edAdBZ(edCdDZ)edEdFZ*dS)JProcesszLinux process implementation.rr cCs||_d|_dS)N)rr )rrr?r?r@rszProcess.__init__c Cs^d|j}trt|dtd}n t|d}z&|jjddjddjdd}Wd|jX|S) Nz /proc/%s/statrs)encodingrSr!(r))rrr6DEFAULT_ENCODINGreadr8replacer9)rfnamer<rr?r?r@rs  & z Process.namec Csytjd|j}Wn|ttfk rtjd}|jtjtj fkrjtj j d|jr\dSt |j|j |jtjtjfkrt|j|j YnX|jdd}|jdrtj j| r|dd }|S) Nz /proc/%s/exer!z/proc/%srrz (deleted)r5i)rtrrrIOErrorrrrrrrNlexistsr r rrr r8rr)rexerr?r?r@rs  z Process.exec CsPd|j}trt|dtd}n t|d}zdd|jjdDS|jXdS)Nz/proc/%s/cmdliners)rcSsg|] }|r|qSr?r?)rir+r?r?r@rjsz#Process.cmdline..r)rrr6rrr8r9)rrr<r?r?r@cmdlines  zProcess.cmdlinecCsdtj}td|jd}zt|jjtdd}Wd|jXy||St k r^dSXdS)Nz /proc/%s/statr.rS) rZ_get_terminal_mapr6rrXrr8r r9KeyError)rrr<Ztty_nrr?r?r@terminal s zProcess.terminalz /proc/%s/ioc Cs.d|j}t|d}tdtd}}tdtd}}zd}}} } x|D]} |dkrx| j|rxt| jd}qP|dkr| j|rt| jd}qP| dkr| j|rt| jd} qP| dkrP| j|rPt| jd} qPWx(||| | fD]} | dkrtd|qWtj||| | S|j XdS) Nz /proc/%s/ior.ZsyscrZsyscw read_bytes write_bytesr!z(couldn't read all necessary info from %r) rr6r rWrXr8NotImplementedErrorrpior9) rrr<ZSYSCRZSYSCWZ READ_BYTESZ WRITE_BYTESZrcountZwcountrrr^r+r?r?r@ io_counterss*   zProcess.io_counterscCstd|jdS)Nz+couldn't find /proc/%s/io (kernel too old?))r%r)rr?r?r@r'1sc Cstd|jd}z|jj}Wd|jX||jtddd}|jtd}t|dt }t|dt }t j ||S)Nz /proc/%s/statr.rr"rSr ) r6rrrr9findr r8rgrhr pcputimes)rr<str=utimestimer?r?r@rl5s zProcess.cpu_timesNc CsDytj|j|Stjk r>tdkr*t||j|jYnXdS)N)rZwait_pidrTimeoutExpiredr )rtimeoutr?r?r@waitCs z Process.waitc Csrtd|jd}z|jj}Wd|jX||jtddd}|jtd}tp\t }t |dt |S)Nz /proc/%s/statr.rr"rS) r6rrrr9rr r8rrrgrh)rr<r+r=Zbtr?r?r@ create_timeMs  zProcess.create_timec CsTtd|jd}z4|jjdd\}}tjt|tt|tS|jXdS)Nz/proc/%s/statmr.r") r6rr7r8rpmemrXPAGESIZEr9)rr<vmsrOr?r?r@ memory_info_s zProcess.memory_infoc Cs`td|jd}z0dd|jjddD\}}}}}}}Wd|jXt|||||||S)Nz/proc/%s/statmr.cSsg|]}t|tqSr?)rXr4)rir+r?r?r@rjysz*Process.memory_info_ex..r)r6rr7r8r9rL) rr<r5rOr\textlibdataZdirtyr?r?r@memory_info_exis 0 zProcess.memory_info_exz/proc/%s/smapsc #sdytd|jdj}|gfdd}|rx|D]\}}|jdd}y|\}}}} } } Wn*tk r|dg\}}}} } } YnX| sd} n| j} ||| |d |jd d |jd d |jd d |jdd |jdd |jdd |jdd |jdd |jdd f VqBWjWntk rdk rFjt j d} | j t j t j fkrtt|j|j| j t jt jfkrt|j|jYn dk rjYnXjdS)zReturn process's mapped memory regions as a list of nameduples. Fields are explained in 'man proc'; here is an updated (Apr 2012) version: http://goo.gl/fmebo Nz/proc/%s/smapsrsc 3si}xD]}|jdd}|djdsBj|fVj|q yt|dd||d<Wq tk r|djdrw n td|Yq Xq Wj|fVdS)Nrrr!izVmFlags:z#don't know how to interpret line %r)r8rpopr;rXrvrW)r9r^r>) current_blockr<r?r@ get_blockss   z'Process.memory_maps..get_blocksr;rz[anon]zRss:zSize:rzPss:z Shared_Clean:z Shared_Dirty:zPrivate_Clean:zPrivate_Dirty:z Referenced:z Anonymous:zSwap:r!)r6rr7r8rvrgetr9r rrrrrr r rrr ) r first_liner>headerr9ZhfieldsrpermsoffsetdevrrNrr?)r=r<r@ memory_mapssT             zProcess.memory_mapscCsd|j}t|dS)Nzfcouldn't find /proc/%s/smaps; kernel < 2.6.14 or CONFIG_MMU kernel configuration option is not enabled)rr%)rr_r?r?r@rEscCstjd|j}|jddS)Nz /proc/%s/cwdrr)rtrrr)rrNr?r?r@cwdsz Process.cwdc Csd}}td|jd}td}td}zrx^|D]V}|j|rPt|jd}n|j|rjt|jd}|dk r0|dk r0tj||Sq0Wtd|jWd|j XdS)Nz/proc/%s/statusr.Zvoluntary_ctxt_switchesZnonvoluntary_ctxt_switchesr!z'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'fields were not found in /proc/%s/status; the kernel is probably older than 2.6.23) r6rr rWrXr8rpctxswr%r9)rZvolZunvolr<Z VOLUNTARYZ NON_VOLUNTARYr^r?r?r@num_ctx_switchess    zProcess.num_ctx_switchesc Cs\td|jd}zszProcess.ionice_getcCs|tdfkr$|rd}t|t}d}|ttfkr>|dkr`d}n"|tkr\|rVd}t|d}nd}d|kordknstdtj|j||S)Nz*can't specify value with IOPRIO_CLASS_NONErraz*can't specify value with IOPRIO_CLASS_IDLEr3z0value argument range expected is between 0 and 8)r rvrrrrUZproc_ioprio_setr)rr\rSr_r?r?r@ ionice_setCs&  zProcess.ionice_setcCsZ|jdkrtd|dkr(tj|j|St|dkrs              !&K 9