Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
ray / purelib / ray / thirdparty_files / psutil / __pycache__ / _pslinux.cpython-310.pyc
Size: Mime:
o

‚‚õb¥Pã
@sâdZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddlm+Z+ddl,m-Z-dd l,m.Z.dd!l,m/Z/dd"l,m0Z0dd#l,m1Z1dd$l,m2Z2ej3d%krddl4Z4ndZ4gd&¢Z5d'Z6ej7 8d(e 9¡¡Z:ej7 8d)e 9¡¡Z;e<ed*ƒZ=e<ed+ƒZ>e ?d,¡Z@e A¡ZBdaCejDd-kZEd.ZFe4durDe
jGZHne4 Id/d0eJe
jGƒi¡ZKeKjHZHe4dur`dZLdZMd1ZNd2ZOnGd3d4„d4e4jIƒZPeQƒ RePjS¡ejTejUejVejWejXejYejZejZej[ej\ej]ej^d5œZ_ej`ejaejbejcejdejeejfejgejhejiejjd6œZked7gd8¢ƒZled9gd:¢ƒZmed;gd<¢ƒZned=d>ƒZoed?eojpd@ƒZqedAgdB¢ƒZredCdDdE serjp¡ƒZtedFgdG¢ƒZuedHgdI¢ƒZvdJdK„ZwdLdM„ZxdNdO„Zye$dPdQ„ƒZzzezdRƒWne{ye
 |¡edSdTƒdUdUdUƒa}YnwdZ~zddVlm~Z~Wn e€y@ddlZej‚ddWdXZƒe<eƒdYƒr>dšdZdY„Z~Ynwe~durRe5 „d[d\„e…eƒDƒ¡d]d^„Z†d_d`„Z‡dadb„Zˆdcdd„Z‰dedf„ZŠdgdh„Z‹didj„ZŒdkdl„Zdmdn„ZŽej7 8do¡s„ej7 8dp¡r‰dqdr„Zndsdr„ZejZGdtdu„due{ƒZ‘Gdvdw„dwƒZ’e’ƒZ“d›dydz„Z”d{d|„Z•d}d~„Z–ej—Z—dœd€d„Z˜Gd‚dƒ„dƒƒZ™dœd„d…„Zšd†d‡„Z›dˆd‰„ZœdŠd‹„ZdŒd„ZždŽd„ZŸdd‘„Z d’d“„Z¡d”d•„Z¢d–d—„Z£Gd˜d™„d™e¤ƒZ¥dS)zLinux platform implementation.é)ÚdivisionN)Údefaultdict)Ú
namedtupleé)Ú_common)Ú_psposix)Ú
_psutil_linux)Ú
_psutil_posix)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)ÚAccessDenied)Ú
NoSuchProcess)Ú
ZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Ú
isfile_strict)Úmemoize)Úmemoize_when_activated)Úopen_binary)Ú	open_text)Úparse_environ_block)Úpath_exists_strict)Ú
supports_ipv6)Ú
usage_percent)ÚPY3)ÚFileNotFoundError)ÚPermissionError)ÚProcessLookupError)Úb)Ú
basestring)éé)ZPROCFS_PATHÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚCONN_ESTABLISHEDÚ
CONN_SYN_SENTÚ
CONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚ
CONN_LAST_ACKÚCONN_LISTENÚCONN_CLOSINGz/sys/class/power_supplyz/proc/%s/smapsz/proc/%s/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittleiÚ
AddressFamilyÚAF_LINKér$c@seZdZdZdZdZdZdS)Ú
IOPriorityrrr;r$N)Ú__name__Ú
__module__Ú__qualname__r&r'r(r)©r@r@ú6/tmp/pip-target-wec6zj2z/lib/python/psutil/_pslinux.pyr<vs
r<)ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP)Z01Ú02Z03Z04Z05Z06Z07Z08Z09Z0AZ0BÚsvmem)ÚtotalÚ	availableÚpercentÚusedÚfreeÚactiveÚinactiveÚbuffersÚcachedÚsharedÚslabÚsdiskio)	Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesZ	read_timeZ
write_timeZread_merged_countZwrite_merged_countÚ	busy_timeÚ	popenfile)ÚpathÚfdÚpositionÚmodeÚflagsÚpmemz"rss vms shared text lib data dirtyÚpfullmem)ÚussÚpssÚswapÚ
pmmap_grouped)rbÚrssÚsizerjZshared_cleanZshared_dirtyZ
private_cleanZ
private_dirtyZ
referencedZ	anonymousrkÚ	pmmap_extzaddr perms ú Úpio)r\r]r^r_Z
read_charsZwrite_charsÚ	pcputimes)ÚuserÚsystemÚ
children_userÚchildren_systemÚiowaitcCsLt|tƒs	J|ƒ‚t |¡}| d¡d}| d¡r$t|ƒs$|dd…}|S)zWrapper around os.readlink().úrú
 (deleted)Néöÿÿÿ)Ú
isinstancer#ÚosÚreadlinkÚsplitÚendswithr)rbr@r@rAr}Ïs
r}cCsXtjdtjdtjdi}||tjtjBtjB@}|tj@r$| ddd¡}| dd¡}|S)zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    ÚrÚwzw+Úarzr+N)r|ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)rfZ	modes_maprer@r@rAÚfile_flags_to_modeãs
rˆcCs4| dd¡}d}|rd|}nd|}t |tj¡S)zÜ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.
    ú/ú!Tz
/sys/block/%sz/sys/block/%s/deviceN)r‡r|ÚaccessÚF_OK)ÚnameZincluding_virtualrbr@r@rAÚis_storage_deviceðs

rŽcCs”td|ƒ}| ¡ ¡dd…}Wdƒn1swYgd¢}t|ƒ}|dkr1| d¡|dkr:| d¡|d	krC| d
¡td|ƒadS)zø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/statrN)rsÚnicertÚidlerwZirqZsoftirqéZstealé	Zguesté
Z
guest_niceÚ	scputimes)rÚreadliner~ÚlenÚappendrr•)Úprocfs_pathÚfÚvaluesÚfieldsZvlenr@r@rAÚset_scputimes_ntuples	ÿ


rú/procr•zuser system idleç)ÚprlimitT)Ú	use_errnor cCsšGdd„dtjƒ}|ƒ}|durt ||dt |¡¡}n|ƒ}|d|_|d|_t ||t |¡t |¡¡}|dkrGt ¡}t|t	 
|¡ƒ‚|j|jfS)Nc@s eZdZdejfdejfgZdS)zprlimit.<locals>.StructRlimitÚrlim_curÚrlim_maxN)r=r>r?ÚctypesÚ
c_longlongÚ_fields_r@r@r@rAÚStructRlimit9sÿr§rr)r¤Ú	StructureÚlibcr Úbyrefr¢r£Ú	get_errnoÚOSErrorr|Ústrerror)ÚpidÚ	resource_Úlimitsr§ÚcurrentÚretÚnewÚerrnor@r@rAr 8s

ÿcCs"g|]
}| d¡r| ¡r|‘qS)ZRLIM)Ú
startswithÚisupper©Ú.0rIr@r@rAÚ
<listcomp>Qs"r¹cCs|d}|| dd¡}z|d}|d}|d}Wnty%|YSwz	tdtƒƒ}Wnty:|YSwd}| |D]}| ¡}| d¡rW|t| ¡d	ƒ7}qBWd
ƒn1sbwY|t	9}||}	||}
|
t
|
d|ƒ8}
|	|
7}	|	|t
|d|ƒ7}	t|	ƒS)
a…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.
    óMemFree:óCached:rs
Active(file):sInactive(file):ó
SReclaimable:z%s/zoneinfoslowrNr;g@)ÚgetÚKeyErrorrrÚIOErrorÚstriprµÚintr~ÚPAGESIZEÚmin)ÚmemsrTÚfallbackZlru_active_fileZlru_inactive_fileZslab_reclaimableršZ
watermark_lowÚlineÚavailZ	pagecacher@r@rAÚcalculate_avail_vmemYs<ÿÿ
€ýÿrÈcCs®g}i}tdtƒƒ}|D]}| ¡}t|dƒd||d<qWdƒn1s+wY|d}|d}z|d}WntyNd}| d	¡Ynwz|d
}Wntyed}| d¡Yn	w|| dd¡7}z|d
}	Wn ty”z|d}	Wnty‘d}	| d¡YnwYnwz|d}
Wnty«d}
| d¡Ynwz|d}Wn(tyÚz|d|d|d}Wnty×d}| d¡YnwYnwz|d}Wntyìd}Ynw||||}
|
dkrý||}
z|d}Wntyt|ƒ}Ynw|dkrd}| d¡||kr%|}t|||dd}|rIdd 	|¡t
|ƒdkr?dndf}t |t
¡t||||
||
||||	|ƒS)a“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/meminforérNs	MemTotal:rºsBuffers:rWr»rXr¼sShmem:s
MemShared:rYsActive:rUs	Inactive:sInact_dirty:sInact_clean:sInact_laundry:rVsSlab:s
MemAvailable:rQ©Zround_z6%s memory stats couldn't be determined and %s set to 0ú, ÚwasÚwere)rrr~rÁr¾r˜r½rÈrÚjoinr—ÚwarningsÚwarnÚRuntimeWarningrO)Zmissing_fieldsrÄršrÆrœrPrTrWrXrYrUrVrZrSrÇrRÚmsgr@r@rAÚvirtual_memorys¨þÿýþ	þ€ýþÿþÿþ€ú
ÿ	ÿ


þÿrÔc
CsØi}tdtƒƒ}|D]}| ¡}t|dƒd||d<qWdƒn1s)wYz
|d}|d}WntyTt ¡\}}}}}}}||9}||9}Ynw||}t||dd}	z	td	tƒƒ}Wn"ty‹}
zd
t	|
ƒ}t
 |t¡d}}
WYd}
~
n[d}
~
ww|Ld}}
|D]1}| 
d¡rªt| d¡dƒd
d}n| 
d¡r¼t| d¡dƒd
d}
|durÆ|
durÆqÓq•d}t
 |t¡d}}
Wdƒn1sÝwYt ||||	||
¡S)zReturn swap memory metrics.rÉrrÊrNs
SwapTotal:s	SwapFree:rËz	%s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)spswpinó r%spswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)rrr~rÁr¾ÚcextZ
linux_sysinforr¿ÚstrrÐrÑrÒrµrZsswap)rÄršrÆrœrPrTÚ_Zunit_multiplierrSrRÚerrrÓÚsinZsoutr@r@rAÚswap_memorysVþÿýÿ€û

€€îrÛcCsrtƒ}t|ƒtd|ƒ}| ¡ ¡}Wdƒn1swY|dttjƒd…}dd„|Dƒ}t|ŽS)zí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.
    rNrcSóg|]}t|ƒt‘qSr@©ÚfloatÚCLOCK_TICKSr·r@r@rAr¹Mózcpu_times.<locals>.<listcomp>)rrrr–r~r—r•Ú_fields)r™ršr›rœr@r@rAÚ	cpu_timesAsÿrâcCs tƒ}t|ƒg}td|ƒ7}| ¡|D]&}| d¡r<| ¡}|dttjƒd…}dd„|Dƒ}t|Ž}| 	|¡q|WdƒS1sIwYdS)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    rscpurcSrÜr@rÝr·r@r@rAr¹_ràz!per_cpu_times.<locals>.<listcomp>N)
rrrr–rµr~r—r•rár˜)r™ÚcpusršrÆr›rœÚentryr@r@rAÚ
per_cpu_timesQs

€$öråcCsîzt d¡WStyvd}tdtƒƒ}|D]
}| ¡ d¡r&|d7}qWdƒn1s1wY|dkrkt d¡}t	dtƒƒ}|D]}| 
d	¡d}| |¡r[|d7}qIWdƒn1sfwY|dkrrYdS|YSw)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNrú
%s/cpuinfos	processorrNzcpu\drrp)r|ÚsysconfÚ
ValueErrorrrÚlowerrµÚreÚcompilerr~Úmatch)ÚnumršrÆÚsearchr@r@rAÚcpu_count_logicales2€þÿ

€ýÿêrðc
Cs.tƒ}d}d}t |¡pt |¡D]}t|ƒ}| | ¡ ¡¡Wdƒq1s+wYqt|ƒ}|dkr;|Si}i}tdtƒƒ?}|D]4}| ¡ ¡}|sjz
|d||d<Wn	t	yfYnwi}qI| 
d¡r}| d	d
¡\}	}
t|
ƒ||	<qIWdƒn1sˆwYt
| ¡ƒ}|p–dS)z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNrrçó	cpu coresóphysical id)ròrñs	:r)ÚsetÚglobrÚaddÚreadrÀr—rrêr¾rµr~rÁÚsumr›)ÚlsÚp1Úp2rbršÚresultÚmappingZcurrent_inforÆÚkeyÚvaluer@r@rAÚcpu_count_cores‚s>
ÿÿÿ
€òÿrÿcCsÆtdtƒƒJ}d}d}d}|D]9}| d¡r t| ¡dƒ}n| d¡r.t| ¡dƒ}n
| d¡r;t| ¡dƒ}|durI|durI|durIqJqWdƒn1sTwYd}t ||||¡S)z*Return various CPU stats as a named tuple.rNsctxtrsintrssoftirqr)rrrµrÁr~rZ	scpustats)ršZctx_switchesZ
interruptsZsoft_interruptsrÆZsyscallsr@r@rAÚ	cpu_stats¬s*


ÿ€óÿrc	Csjg}tdtƒƒ"}|D]}| ¡ d¡r"| t| dd¡dƒ¡qWdƒ|S1s.wY|S)z<Return current CPU frequency from cpuinfo if available.
    rçscpu mhzó:rN)rrrêrµr˜rÞr~)r²ršrÆr@r@rAÚ_cpu_get_cpuinfo_freqÁs€þ
ÿürz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc	Csòtƒ}t d¡pt d¡}|jdd„dg}tjj}t|ƒD]W\}}t|ƒt|ƒkr2||d}n	t||dƒdd	}|durPt||d
ƒdd	}|durPt	dƒ‚t
|ƒd}t
t||dƒƒƒd}t
t||d
ƒƒƒd}| t 
|||¡¡q|S)z‚Return frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqcSstt d|¡ ¡ƒS)Nz[0-9]+)rÁrërïÚgroup)rIr@r@rAÚ<lambda>×ózcpu_freq.<locals>.<lambda>)rýièZscaling_cur_freqN©rÅZcpuinfo_cur_freqz!can't find current frequency fileZscaling_max_freqZscaling_min_freq)rrôÚsortr|rbrÏÚ	enumerater—rÚNotImplementedErrorrÁr˜rÚscpufreq)	Z
cpuinfo_freqsÚpathsr²ÚpjoinÚirbÚcurrZmax_Zmin_r@r@rAÚcpu_freqÎs,
þÿrcCsdd„tƒDƒS)z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        cSsg|]	}t |dd¡‘qS)rŸ)rr
r·r@r@rAr¹óózcpu_freq.<locals>.<listcomp>N)rr@r@r@rArïsc@seZdZdS)Ú_Ipv6UnsupportedErrorN)r=r>r?r@r@r@rArþsrc@sZeZdZdZdd„Zdd„Zdd„Zedd	„ƒZeddd„ƒZ	edd
d„ƒZ
ddd„Zd
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Cs˜dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fdœ|_d|_dS)NÚtcpÚtcp6ÚudpÚudp6Úunix)ÚallrÚtcp4rrÚudp4rrÚinetZinet4Zinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)Úselfrrrrrr@r@rAÚ__init__s$
õ

zConnections.__init__cCsÚttƒ}t d|j|f¡D]\}ztd|j||fƒ}Wn3ttfy'YqtyO}z|j	t	j
kr:WYd}~q|j	t	jkrJt|ƒWYd}~q‚d}~ww| 
d¡rj|dd…dd…}|| |t|ƒf¡q|S)Nú%s/%s/fdú%s/%s/fd/%szsocket:[r’éÿÿÿÿ)rÚlistr|Úlistdirr#r}rr!r¬r´ÚEINVALÚENAMETOOLONGrrµr˜rÁ)r$r®ÚinodesrcÚinoderÙr@r@rAÚget_proc_inodes%s(€ø

€zConnections.get_proc_inodescCs@i}tƒD]}z
| | |¡¡WqtttfyYqw|S©N)ÚpidsÚupdater/rr!r )r$r-r®r@r@rAÚget_all_inodes?s
ø	zConnections.get_all_inodesc	Csò| d¡\}}t|dƒ}|sdStr| d¡}|tjkr7tr-t |t 	|¡ddd…¡}nFt |t 	|¡¡}n<t 	|¡}z)trRt tj
tjdgt 
d|¡¢RŽ¡}nt tj
tjdgt 
d|¡¢RŽ¡}Wn
tyrtƒsqt‚‚wt ||¡S)	a†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
        ú:ér@ÚasciiNr(z>4Iz<4I)r~rÁrÚencoderrÚ
LITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoderÚstructÚpackÚunpackrérrrÚaddr)r?ÚfamilyÚipÚportr@r@rAÚdecode_addressOs8



þþ€ûzConnections.decode_addressNccsB| d¡rtj |¡sdSt|ƒ…}| ¡t|dƒD]r\}}z| ¡dd…\
}}	}
}}}}}}}WntyDt	d|||fƒ‚w||vrR||d\}
}nd\}
}|dur_||
kr_q|t
jkrit|}nt
j}zt |	|¡}	t |
|¡}
Wn	tyƒYqw||||	|
||
fVqWdƒdS1sšwYdS)z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nrr”z,error while parsing %s; malformed line %s %rr©Nr()rr|rbÚexistsrr–rr~réÚRuntimeErrorrrÚTCP_STATUSESrÚ	CONN_NONErrCr)Úfiler@Útype_r-Ú
filter_pidršÚlinenorÆrØÚladdrÚraddrÚstatusr.r®rcr@r@rAÚprocess_inet‚sB€
ÿÿÿÿ

ÿâ"þzConnections.process_inetc
cst|ƒz}| ¡|D]j}| ¡}z|dd…\}}}}}}}	Wnty6d|vr.Yqtd||fƒ‚w|	|vr@||	}
ndg}
|
D]0\}}|durR||krRqEt|ƒdkr]|d}
nd	}
t t|ƒ¡}d	}tj	}||||
|||fVqEqWdƒdS1s‚wYdS)
zParse /proc/net/unix files.rérpz)error while parsing %s; malformed line %rrENr’r(Ú)
rr–r~rérGr—rZsocktype_to_enumrÁrI)rJr@r-rLršrÆÚtokensrØrKr.Úpairsr®rcrbrOrPr@r@rAÚprocess_unixªs@€
ÿÿü

òï"þzConnections.process_unixcCs||jvrtd|d dd„|jDƒ¡fƒ‚tƒ|_|dur(| |¡}|s'gSn| ¡}tƒ}|j|D]Q\}}}d|j|f}|tj	tj
fvrS|j|||||d}	n	|j||||d}	|	D]&\}
}}}}}
}|rtt
 |
|||||
¡}nt
 |
|||||
|¡}| |¡q^q4t|ƒS)Nz+invalid %r kind argument; choose between %srÌcSsg|]}t|ƒ‘qSr@)Úreprr·r@r@rAr¹Órz(Connections.retrieve.<locals>.<listcomp>z	%s/net/%s)rL)r"rérÏrr#r/r3rórrrrQrVrÚpconnZsconnrõr))r$Úkindr®r-r²Z
proto_namer@rKrbrørcrNrOrPZ	bound_pidÚconnr@r@rAÚretrieveÐs@
ÿ
þ
ÿÿÿÿùzConnections.retriever0)r=r>r?Ú__doc__r%r/r3ÚstaticmethodrCrQrVr[r@r@r@rArs
2'%rrcCs
t |¡S)z$Return system-wide open connections.N)Ú_connectionsr[)rYr@r@rAÚnet_connectionsós
r_cCsØtdtƒƒ}| ¡}Wdƒn1swYi}|dd…D]F}| d¡}|dks4Jt|ƒƒ‚|d|… ¡}||dd… ¡ ¡}tt|ƒ\}}}	}
}}}
}}}}}}}}}|||||	||
|f||<q#|S)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z
%s/net/devNr;r4rr)	rrÚ	readlinesÚrfindrWrÀr~ÚmaprÁ)ršÚlinesÚretdictrÆÚcolonrrœZ
bytes_recvZpackets_recvZerrinZdropinZfifoinZframeinZcompressedinZmulticastinZ
bytes_sentZpackets_sentZerroutZdropoutZfifooutZ
collisionsoutZ
carrieroutZ
compressedoutr@r@rAÚnet_io_countersøs<
ÿ
ð
ÿrfc	Cs¬tjttjttjti}tƒ ¡}i}|D]?}zt	 
|¡}t	 |¡}t |¡\}}Wnt
yF}z|jtjkr8‚t|ƒWYd}~qd}~wwt |||||¡||<q|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rÖZDUPLEX_FULLr
ZDUPLEX_HALFrZDUPLEX_UNKNOWNrrfÚkeysÚ
cext_posixZ
net_if_mtuZnet_if_is_runningZnet_if_duplex_speedr¬r´ZENODEVrrZ	snicstats)	Z
duplex_mapÚnamesr²rZmtuZisupZduplexÚspeedrÙr@r@rAÚnet_if_statss&þ


€ûrkFcCs®dd„}dd„}tj dtƒ¡r|ƒ}ntj d¡r|ƒ}ntdtƒƒ‚i}|D]*}|\
}}}}	}
}}}
}}|s?t|ƒs?q*|	t9}	|
t9}
|||	|
|||
||f	||<q*|S)	zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    cssBtdtƒƒ}| ¡}Wdƒn1swY|D]€}| ¡}t|ƒ}|dkrJ|d}t|dƒ}tt|dd…ƒ\
}}}	}
}}}
}}}nG|dksR|dkrk|d}tt|dd…ƒ\}}}}	}
}}}
}}}n&|dkr‹|d}tt|dd…ƒ\}}}
}d	}	}
}}}ntd
|ƒ‚|||
|||	|
|||f
VqdS)Nú%s/diskstatsér$r;r%éérRrz!not sure how to interpret line %r)rrr`r~r—rÁrbré)ršrcrÆrœZflenrÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚ
writes_mergedÚwbytesÚwtimerØr`r@r@rAÚread_procfs@s6€
ÿÿÿÿëz%disk_io_counters.<locals>.read_procfscss΁t d¡D]^}t tj d|¡¡D]Q\}}}d|vrqttj |d¡ƒ}| ¡ ¡ ¡}Wdƒn1s8wYtj 	|¡}t
t|dd…ƒ\
}}}	}
}}}
}}}||||	|
|
||||f
VqqdS)Nú
/sys/blockÚstatr”)r|r*ÚwalkrbrÏrrörÀr~ÚbasenamerbrÁ)ÚblockÚrootrØÚfilesršrœrrprqrrrsrtrurvrwr`r@r@rAÚ
read_sysfsks"€ÿÿÿøÿz$disk_io_counters.<locals>.read_sysfsrlryzC%s/diskstats nor /sys/block filesystem are available on this systemN)r|rbrFrr	rŽÚDISK_SECTOR_SIZE)Zperdiskrxr€Úgenrdrärrprtrrrvrsrwrqrur`r@r@rAÚdisk_io_counters<s0+
ÿÿÿ
ÿrƒc@s@eZdZdZddgZdd„Zdd„Zdd	„Zd
d„Zdd
„Z	dS)ÚRootFsDeviceFinderaEdisk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/
    ÚmajorÚminorcCs(t d¡j}t |¡|_t |¡|_dS)Nr‰)r|rzÚst_devr…r†)r$Údevr@r@rAr%¤ózRootFsDeviceFinder.__init__cCsÒtdtƒƒX}| ¡dd…D]F}| ¡}t|ƒdkrq|d ¡r)t|dƒnd}|d ¡r7t|dƒnd}|d}||jkrV||jkrV|rVd|WdƒSqWdƒdS1sbwYdS)Nz
%s/partitionsr;r%rrr$ú/dev/%s)	rrr`r~r—ÚisdigitrÁr…r†)r$ršrÆrœr…r†rr@r@rAÚask_proc_partitions©s
ö€"ÿz&RootFsDeviceFinder.ask_proc_partitionscCs‚d|j|jf}t|ƒ+}|D]}| d¡r.| ¡ d¡d}|r.d|WdƒSqWdƒdS1s:wYdS)Nz/sys/dev/block/%s:%s/ueventzDEVNAME=r;rŠ)r…r†rrµrÀÚ
rpartition)r$rbršrÆrr@r@rAÚask_sys_dev_block¶s


û€"ÿz$RootFsDeviceFinder.ask_sys_dev_blockc	Cs®d|j|jf}t d¡}|D]E}zt|ƒ}Wn	ty Yqw|)| ¡ ¡}||krEtj	 
tj	 |¡¡}d|WdƒSWdƒq1sOwYqdS)Nz%s:%sz/sys/class/block/*/devrŠ)r…r†rôÚiglobrrrörÀr|rbr|Údirname)r$ÚneedlerrJršÚdatarr@r@rAÚask_sys_class_block¿s"
ÿüþúz&RootFsDeviceFinder.ask_sys_class_blockc
Csöd}|dur%z| ¡}Wnttfy$}z
t|ƒWYd}~nd}~ww|durHz| ¡}WnttfyG}z
t|ƒWYd}~nd}~ww|durkz| ¡}Wnttfyj}z
t|ƒWYd}~nd}~ww|durwtj |¡ry|SdSdSr0)	rŒr¿r¬rrŽr“r|rbrF)r$rbrÙr@r@rAÚfindÎs2€ÿ€ÿ€ÿÿzRootFsDeviceFinder.findN)
r=r>r?r\Ú	__slots__r%rŒrŽr“r”r@r@r@rAr„›s
	r„c	Cs<tƒ}tƒ}td|ƒ.}|D]#}| ¡}| d¡s"| | ¡¡q| d¡d}|dkr2| d¡qWdƒn1s=wY|dkrStj 	d¡rStj 
d¡}ntj 
d	|¡}g}t |¡}|D]7}	|	\}
}}}|
d
krrd}
|
dvr}t
ƒ ¡p||
}
|sˆ|
dks‡||vrˆqdd}
}t |
||||
|¡}| |¡qd|S)
z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodevú	rZzfsNržz	/etc/mtabz%s/self/mountsÚnonerS)z	/dev/rootZrootfs)rórrrÀrµrõr~r|rbÚisfileÚrealpathrÖÚdisk_partitionsr„r”rZ	sdiskpartr˜)rZfstypesr™ršrÆZfstypeZmounts_pathÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointÚoptsZmaxfileZmaxpathÚntupler@r@rAršåsB

€øÿ
ÿršcCsDt t¡}t d¡}| t d¡¡ttdd„|Dƒƒƒ}t d¡}t d¡}|D]}| 	d|¡}||vr:| 
|¡q)|D]ƒ}z|d}tt|ƒƒd	}t
j t
j |¡d
¡}t|ƒ ¡}	WntttfyjYq=wt|ddd
}
t|ddd
}t|ddd
 ¡}|
durzt|
ƒd	}
Wntyœd}
Ynw|durµzt|ƒd	}Wnty´d}Ynw||	 
|||
|f¡q=|sžt d¡}tt|ƒƒ}|D]Ì}zt
j |d¡}tt|ƒƒd	}t
j |d¡}t|ƒ ¡}	Wntttfy}
z
t|
ƒWYd}
~
qÑd}
~
wwt |d¡}tdd„|Dƒƒ}d}d}
|D]o}t
j ||d¡}t|dd
 ¡}|dkrHtt
j ||d¡dd
}n|dkrZtt
j ||d¡dd
}
|
durtzt|
ƒd	}
Wntysd}
Ynw|durz	t|ƒd	}Wq"tyd}Yq"wq"||	 
d||
|f¡qÑt|ƒS)aø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
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*cSóg|]	}| d¡d‘qS©rØr©r~r·r@r@rAr¹%rz(sensors_temperatures.<locals>.<listcomp>z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg@@rZ_maxNrZ_critÚ_labelrSz /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*cSs,g|]}d tj |¡ d¡dd…¡‘qS)rØrr$)rÏr|rbr|r~)r¸Úpr@r@rAr¹es
ÿÿÚ_typeÚcriticalÚ_tempÚhigh)Úcollectionsrr)rôÚextendÚsortedrórërìÚsubr˜rÞrr|rbrÏrrrÀr¿r¬rérÚdict)r²Ú	basenamesZ
basenames2ÚreplrZaltnameÚbaserbr±Ú	unit_namerªr¨ÚlabelrÙZ
trip_pathsZtrip_pointsZ
trip_pointZ	trip_typer@r@rAÚsensors_temperaturess¨

ÿ

€	÷ÿÿ
€þÿ
ÿ
ÿ
ÿ

ÿýrµcCsØt t¡}t d¡}|st d¡}ttdd„|Dƒƒƒ}|D]I}z
tt|dƒƒ}Wntt	fyB}z
t
|ƒWYd}~qd}~wwttj
 tj
 |¡d¡ƒ ¡}t|dd	d
 ¡}|| t ||¡¡qt|ƒS)a‡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
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*cSrŸr r¡r·r@r@rAr¹”rz sensors_fans.<locals>.<listcomp>r¢Nrr£rSr)r«rr)rôr­rórÁrr¿r¬rrr|rbrÏrrÀr˜rZsfanr¯)r²r°r²r±rÙr³r´r@r@rAÚsensors_fansƒs"



€þr¶csÆtƒ‰‡fdd„}dd„t t¡Dƒ}|sdStj tt|ƒd¡}||d|dƒ}||d	|d
ƒ}||d|dƒ}||d
ƒ}|dur_|dur_zd||}Wnty^d}Ynwtt	|dddƒ}|dkrodSd}|tj td¡tj td¡ƒ}	|	dur‰|	dk}nt	|ddd 
¡ ¡}
|
dkrœd}n|
dvr¢d}|r¨tj
}n4|durÇ|durÇz
t||dƒ}Wn!tyÆtj}Ynw|durÙt|dƒ}|dkrØtj}ntj}t |||¡S)aReturn 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	sP|D]#}t|ˆd}|ˆkr%zt|ƒWSty$| ¡YSwqdS)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rN)rrÁrérÀ)rrbr²©Únullr@rAÚ
multi_bcat«sÿýz#sensors_battery.<locals>.multi_bcatcSs&g|]}| d¡sd| ¡vr|‘qS)ZBATZbattery)rµrêr·r@r@rAr¹¸s

ÿz#sensors_battery.<locals>.<listcomp>Nrz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowgY@rŸz	/capacityr(rz
AC0/onlinez	AC/onlinerz/statusrSZdischargingF)ZchargingÚfullTié<)Úobjectr|r*ÚPOWER_SUPPLY_PATHrbrÏr­ÚZeroDivisionErrorrÁrrÀrêrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)r¹Zbatsr~Z
energy_nowZ	power_nowZenergy_fullZ
time_to_emptyrRZ
power_pluggedZonlinerPZsecsleftr@r·rAÚsensors_battery¢sn
þþþÿþ

ÿ€r¿c
Cs\g}t ¡}|D]#}|\}}}}}}|sq|dvrd}t ||p!d|||¡}	| |	¡q|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Ú	localhostN)rÖÚusersrZsuserr˜)
r›ZrawlistÚitemrsÚttyÚhostnameZtstampZuser_processr®Úntr@r@rArÁsrÁcCsvdtƒ}t|ƒ(}|D]}| d¡r*t| ¡ ¡dƒ}|a|WdƒSqtd|ƒ‚1s4wYdS)zAReturn the system boot time expressed in seconds since the epoch.rsbtimerNzline 'btime' not found in %s)rrrµrÞrÀr~Ú	BOOT_TIMErG)rbršrÆr²r@r@rAÚ	boot_times


ûÿúrÇcCsdd„t ttƒƒ¡DƒS)z7Returns a list of PIDs currently running on the system.cSsg|]
}| ¡rt|ƒ‘qSr@)r‹rÁr·r@r@rAr¹*szpids.<locals>.<listcomp>N)r|r*r"rr@r@r@rAr1(ór1c	Csªt |¡sdSz=dtƒ|f}t|ƒ'}|D]}| d¡r3t| ¡dƒ}||kWdƒWSqtd|ƒ‚1s=wYWdSttfyT|t	ƒvYSw)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fú%s/%s/statussTgid:rNz'Tgid' line not found in %s)
rÚ
pid_existsrrrµrÁr~réÚEnvironmentErrorr1)r®rbršrÆZtgidr@r@rArÊ-s 




úùÿrÊc
Cs i}tƒ}tƒD]E}ztd||fƒ}| ¡}Wdƒn1s"wYWnttfy3Yqw| d¡}||dd… ¡}t|dƒ}|||<q|S)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    ú
%s/%s/statNó)r;r)	rr1rrörr!rar~rÁ)r²r™r®ršr’ÚrparZdsetÚppidr@r@rAÚppid_mapMs 

ÿ€ý

rÐcst ˆ¡‡fdd„ƒ}|S)zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    cs„zˆ|g|¢Ri|¤ŽWStyt|j|jƒ‚ty't|j|jƒ‚tyAtj 	d|j
|jf¡s@t|j|jƒ‚‚w)Nú%s/%s)r r
r®Ú_namer!rrr|rbrFr#)r$ÚargsÚkwargs©Úfunr@rAÚwrappergsûz wrap_exceptions.<locals>.wrapperN)Ú	functoolsÚwraps)rÖr×r@rÕrAÚwrap_exceptionscs
rÚc@s~eZdZdZgd¢Zdd„Zdd„Zeedd„ƒƒZ	eed	d
„ƒƒZ
eedd„ƒƒZd
d„Zdd„Z
edd„ƒZdd„Zedd„ƒZedd„ƒZedd„ƒZej de ¡¡r^edd„ƒZedd„ƒZed d!„ƒZed`d#d$„ƒZed%d&„ƒZed'd(„ƒZeserŸed)d*„ƒZee  !d+¡e  !d,¡e  !d-¡fd.d/„ƒZ"d0d1„Z#neZ#er©ed2d3„ƒZ$ed4d5„ƒZ%ee  !d6¡fd7d8„ƒZ&ee  !d9¡fd:d;„ƒZ'ed<d=„ƒZ(ed>d?„ƒZ)ed@dA„ƒZ*e+rîedBdC„ƒZ,e  !dD¡fdEdF„Z-edGdH„ƒZ.e/rüedIdJ„ƒZ0edKdL„ƒZ1e2d"ured`dMdN„ƒZ3edOdP„ƒZ4edQdR„ƒZ5edadTdU„ƒZ6edVdW„ƒZ7edXdY„ƒZ8ee  !dZ¡fd[d\„ƒZ9ee  !d]¡fd^d_„ƒZ:d"S)bÚProcesszLinux process implementation.)r®rÒÚ_ppidr#Ú_cachecCs||_d|_d|_tƒ|_dSr0)r®rÒrÜrr#)r$r®r@r@rAr%}szProcess.__init__cCst d|j|jf¡dS)z+Raise NSP if the process disappeared on us.rÑN)r|rzr#r®©r$r@r@rAÚ
_assert_aliveƒszProcess._assert_alivecCsÐtd|j|jfƒ}| d¡}|| d¡d|…}||dd… ¡}i}||d<|d|d	<|d|d
<|d|d<|d
|d<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|S)aYParse /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 subtract 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.
        rÌrÍó(rr;NrrrPrÏr%ÚttynréÚutimeéÚstimeé
Úchildren_utimernÚchildren_stimeéÚcreate_timeé$Úcpu_numé'Úblkio_ticks)rr#r®rar”r~)r$r’rÎrrœr²r@r@rAÚ_parse_stat_file‰s"
zProcess._parse_stat_filecCs@td|j|jfƒ}| ¡WdƒS1swYdS)zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rÉN)rr#r®rö©r$ršr@r@rAÚ_read_status_file«s$ÿzProcess._read_status_filecCsDtd|j|jfƒ}| ¡ ¡WdƒS1swYdS)Nz%s/%s/smaps)rr#r®rörÀrðr@r@rAÚ_read_smaps_fileµs
$ÿzProcess._read_smaps_filecCó(|j |¡|j |¡|j |¡dSr0)rïZcache_activaterñròrÞr@r@rAÚ
oneshot_enter»r‰zProcess.oneshot_entercCrór0)rïZcache_deactivaterñròrÞr@r@rAÚoneshot_exitÀr‰zProcess.oneshot_exitcCs| ¡d}trt|ƒ}|S)Nr)rïrr)r$rr@r@rArÅszProcess.namec	CsŒztd|j|jfƒWSttfy8tj d|j|jf¡r#YdSt|jƒs/t	|j|j
ƒ‚t|j|j
|jƒ‚t
yEt|j|j
ƒ‚w)Nz	%s/%s/exerÑrS)r}r#r®rr!r|rbÚlexistsrÊrrÒrrÜr r
rÞr@r@rAÚexeÍs
ÿzProcess.execCs td|j|jfƒ}| ¡}Wdƒn1swY|s"gS| d¡r)dnd}| |¡r6|dd…}| |¡}|dkrNt|ƒdkrNd|vrN| d¡}|S)Nz
%s/%s/cmdlinerxrpr(r)rr#r®rörr~r—)r$ršr’ÚsepÚcmdliner@r@rArùÞs
ÿ


zProcess.cmdlinecCsJtd|j|jfƒ}| ¡}Wdƒt|ƒS1swYt|ƒS)Nz
%s/%s/environ)rr#r®rör)r$ršr’r@r@rAÚenviron÷s

ÿþzProcess.environcCs8t| ¡dƒ}t ¡}z||WStyYdSw)Nrá)rÁrïrZget_terminal_mapr¾)r$Ztty_nrr"r@r@rAÚterminalýs
ÿzProcess.terminalz/proc/%s/ioc
Csðd|j|jf}i}t|ƒ,}|D]!}| ¡}|r2z	| d¡\}}Wn	ty+Yqwt|ƒ||<qWdƒn1s=wY|sJtd|ƒ‚zt|d|d|d|d|d|d	ƒWSt	yw}ztd
|d||fƒ‚d}~ww)Nz%s/%s/ios: z%s file was emptyssyscrssyscws
read_bytesswrite_bytessrcharswcharz1%r field was not found in %s; found fields are %rr)
r#r®rrÀr~rérÁrGrqr¾)r$ÚfnamerœršrÆrrþrÙr@r@rAÚio_counterss@
þ€öÿúÿ€ÿzProcess.io_counterscCsh| ¡}t|dƒt}t|dƒt}t|dƒt}t|dƒt}t|dƒt}t|||||ƒS)Nrãrårçrèrî)rïrÞrßrr)r$r›rãrårçrèrwr@r@rArâ'szProcess.cpu_timescCót| ¡dƒS)zWhat CPU the process is on.rìN©rÁrïrÞr@r@rArì1szProcess.cpu_numNcCst |j||j¡Sr0)rZwait_pidr®rÒ)r$Útimeoutr@r@rAÚwait6szProcess.waitcCs&t| ¡dƒ}tptƒ}|t|S)Nrê)rÞrïrÆrÇrß)r$ÚctimeZbtr@r@rArê:s
zProcess.create_timec	Csttd|j|jfƒ}dd„| ¡ ¡dd…Dƒ\}}}}}}}Wdƒn1s+wYt|||||||ƒS)Nz%s/%s/statmcSsg|]}t|ƒt‘qSr@)rÁrÂr·r@r@rAr¹Tràz'Process.memory_info.<locals>.<listcomp>rR)rr#r®r–r~rg)	r$ršZvmsrmrYÚtextÚlibr’Zdirtyr@r@rAÚmemory_infoEs

ÿÿzProcess.memory_infocCsôd}}}zRtd |j|j¡ƒ>}|D]3}| d¡r(|t| ¡dƒd7}q| d¡r8t| ¡dƒd}q| d¡rGt| ¡dƒd}qWdƒn1sRwYWntytt|jƒskt	|j|j
ƒ‚t|j|j
|jƒ‚w|||fS)Nrz{}/{}/smaps_rollupsPrivate_rrÊóPss:óSwap:)
rÚformatr#r®rµrÁr~r!rÊrrÒrrÜ)r$rirjrkršrÆr@r@rAÚ_parse_smaps_rollupYs.ÿ


€ùþ€

ü
zProcess._parse_smaps_rollups\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)cCsZ| ¡}ttt| |¡ƒƒd}ttt| |¡ƒƒd}ttt| |¡ƒƒd}|||fS)NrÊ)ròr÷rbrÁÚfindall)r$Z_private_reZ_pss_reZ_swap_reZ
smaps_datarirjrkr@r@rAÚ_parse_smapsqs

zProcess._parse_smapscCs<tr
| ¡\}}}n| ¡\}}}| ¡}t||||fŽSr0)ÚHAS_PROC_SMAPS_ROLLUPr	rrrh)r$rirjrkZ	basic_memr@r@rAÚmemory_full_infos
zProcess.memory_full_infocCsPdd„}| ¡}|sgS| d¡}g}| d¡}|g}|||ƒD]…\}}| dd¡}z
|\}	}
}}}
}WntyH|dg\}	}
}}}
}Ynw|sNd}ntrTt|ƒ}| ¡}| d	¡rgt|ƒsg|dd
…}| 	t|	ƒt|
ƒ|| 
dd¡| 
dd¡| 
d
d¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡f
¡q |S)aPReturn 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.
            c	ssži}|D]@}| dd¡}|d d¡s!| ¡|fV| |¡qzt|dƒd||d<WqtyE|d d¡r?Yqtd|ƒ‚w| ¡|fVdS)NérrrrÊsVmFlags:z#don't know how to interpret line %r)r~rÚpopr˜rÁrérµ)rcÚ
current_blockr’rÆrœr@r@rAÚ
get_blocks¥s"€ÿûz'Process.memory_maps.<locals>.get_blocksó
rNrrSz[anon]ryrzsRss:sSize:rs
Shared_Clean:s
Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:sReferenced:s
Anonymous:r)ròr~rrérrrÀrrr˜r½)r$rr’rcrøÚ
first_linerÚheaderZhfieldsr?ZpermsÚoffsetrˆr.rbr@r@rAÚmemory_mapsœsN	

ÿÿ
ÿ









õ
zProcess.memory_mapsc	CsTztd|j|jfƒWSttfy)t|jƒs t|j|jƒ‚t|j|j|j	ƒ‚w)Nz	%s/%s/cwd)
r}r#r®rr!rÊrrÒrrÜrÞr@r@rAÚcwdàs
ûzProcess.cwdsctxt_switches:\t(\d+)cCsF| ¡}| |¡}|std|j|jfƒ‚t t|dƒt|dƒ¡S)Nzˆ'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in %s/%s/status; the kernel is probably older than 2.6.23rr)rñr
r	r#r®rZpctxswrÁ)r$Z	_ctxsw_rer’Zctxswr@r@rAÚnum_ctx_switchesës
ÿþÿzProcess.num_ctx_switchessThreads:\t(\d+)cCs| ¡}t| |¡dƒS©Nr)rñrÁr
)r$Z_num_threads_rer’r@r@rAÚnum_threadsùszProcess.num_threadsc	Csþt d|j|jf¡}| ¡g}d}|D]a}d|j|j|f}zt|ƒ}| ¡ ¡}Wdƒn1s6wYWntyGd}Yqw|| 	d¡dd…}| 
d¡}t|dƒt}	t|d	ƒt}
t
 t|ƒ|	|
¡}| |¡q|r}| ¡|S)
Nz
%s/%s/taskFz%s/%s/task/%s/statTrÍr;rÕrârä)r|r*r#r®rrrörÀrr”r~rÞrßrZpthreadrÁr˜rß)r$Z
thread_idsr›Ú
hit_enoentÚ	thread_idrüršÚstr›rãråržr@r@rAÚthreadss4
ÿ
ÿ€ü
zProcess.threadscCót |j¡Sr0)rhÚgetpriorityr®rÞr@r@rAÚnice_getszProcess.nice_getcCst |j|¡Sr0)rhÚsetpriorityr®)r$rþr@r@rAÚnice_set&szProcess.nice_setcCrr0)rÖr6r®rÞr@r@rAÚcpu_affinity_get-szProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsR| ¡}| |¡}|r ttt|ddƒt|ddƒdƒƒSttttƒƒƒƒS)Nrr)rñr
r)ÚrangerÁr—rå)r$Ú_rer’rír@r@rAÚ_get_eligible_cpus1s

*zProcess._get_eligible_cpusc
Csžz
t |j|¡WdSttfyN}z6t|tƒs|jtjkrI| ¡}t	t
ttƒƒƒƒ}|D]}||vr<td||fƒ‚||vrHtd||fƒ‚q.‚d}~ww)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s)
rÖZproc_cpu_affinity_setr®r¬rér{r´r+r'Útupler%r—rå)r$rãrÙZ
eligible_cpusZall_cpusÚcpur@r@rAÚcpu_affinity_set;s.ÿÿÿÿÿ€ózProcess.cpu_affinity_setcCs,t |j¡\}}tdurt|ƒ}t ||¡Sr0)rÖr5r®Úenumr<rZpionice©r$Zioclassrþr@r@rAÚ
ionice_getQszProcess.ionice_getcCsP|durd}|r|ttfvrtd|ƒ‚|dks|dkr tdƒ‚t |j||¡S)Nrz%r ioclass accepts no valuerRzvalue not in 0-7 range)r)r&rérÖZproc_ioprio_setr®r,r@r@rAÚ
ionice_setXszProcess.ionice_setc
Csœ|jdkr	tdƒ‚z#|durt|j|ƒWSt|ƒdkr#tdt|ƒƒ‚t|j||ƒWdStyM}z|jtjkrHt|jƒrHt	|j|j
|jƒ‚‚d}~ww)Nrz)can't use prlimit() against PID 0 processr;z4second argument must be a (soft, hard) tuple, got %s)r®rér r—rWr¬r´ZENOSYSrÊrrÒrÜ)r$r¯r°rÙr@r@rAÚrlimitds$
ÿÿ€úzProcess.rlimitcCs$| ¡d}tr| ¡}t |d¡S)NrPú?)rïrrÚ
PROC_STATUSESr½)r$Úletterr@r@rArP~szProcess.statusc
Cs~g}t d|j|jf¡}d}|D]¥}d|j|j|f}zt|ƒ}Wn5ttfy/d}YqtyW}z|jtj	krBWYd}~q|jtj
krRt|ƒWYd}~q‚d}~ww| d¡r¶t
|ƒr¶d|j|j|f}z+t|ƒ}t| ¡ ¡dƒ}	t| ¡ ¡ddƒ}
Wdƒn1swYWnty d}Yqwt|
ƒ}t|t|ƒt|	ƒ||
ƒ}| |¡q|r½| ¡|S)	Nr&Fr'Tr‰z%s/%s/fdinfo/%srr’)r|r*r#r®r}rr!r¬r´r+r,rrµrrrÁr–r~rˆrar˜rß)
r$r›rrrcrJrbrÙršÚposrfreržr@r@rAÚ
open_files†sR€ø
ÿ
þ€ýÿ
€zProcess.open_filesrcCst ||j¡}| ¡|Sr0)r^r[r®rß)r$rYr²r@r@rAÚconnections¶szProcess.connectionscCstt d|j|jf¡ƒS)Nr&)r—r|r*r#r®rÞr@r@rAÚnum_fds¼rÈzProcess.num_fdscCrþ)NrÏrÿrÞr@r@rArÏÀszProcess.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCó6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡Sr)rñr
rZpuidsrÁ)r$Z_uids_rer’ÚrealÚ	effectiveÚsavedr@r@rAÚuidsÄózProcess.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCr7r)rñr
rZpgidsrÁ)r$Z_gids_rer’r8r9r:r@r@rAÚgidsÊr<zProcess.gidsr0©r);r=r>r?r\r•r%rßrÚrrïrñròrôrõrr÷rùrúrûr|rbrFÚgetpidrýrârìrrêrrÚHAS_PROC_SMAPSr	rërìrr
rrrrrr!r#ÚHAS_CPU_AFFINITYr$r'r*ÚHAS_PROC_IO_PRIORITYr-r.r r/rPr4r5r6rÏr;r=r@r@r@rArÛxsº 



	

	




û
	
C

ÿ





ÿ




	

/

rÛr0r>)F)¦r\Ú
__future__rr:r«r´rØrôr|rërr<ÚsysÚ	tracebackrÐrrrSrrrrÖr	rhr
rrr
rrrrrrrrrrrrrrrrZ_compatrrr r!r"r#Úversion_infor+Z__extra__all__r½rbrFr?r@rÚhasattrrBrArèrßZgetpagesizerÂrÆÚ	byteorderr8rÚ	AF_PACKETr:ÚIntEnumrÁr9r&r'r(r)r<Úglobalsr2Ú__members__ZSTATUS_RUNNINGZSTATUS_SLEEPINGZSTATUS_DISK_SLEEPZSTATUS_STOPPEDZSTATUS_TRACING_STOPZ
STATUS_ZOMBIEZSTATUS_DEADZSTATUS_WAKE_KILLZ
STATUS_WAKINGZSTATUS_IDLEZ
STATUS_PARKEDr1r*r+r,r-r.r/r0r1r2r3r4rHrOr[rargrárhrlrÏrorqrrr}rˆrŽrÚ	ExceptionÚ	print_excr•r ÚresourceÚImportErrorr¤ÚCDLLr©r¬ÚdirrÈrÔrÛrârårðrÿrrrZnet_if_addrsrrr^r_rfrkÚ
disk_usagerƒr„ršrµr¶r¿rÁrÇr1rÊrÐrÚr¼rÛr@r@r@rAÚ<module>sj





ÿ
ôõÿÿÿ
þÿÿ


ý
€ù
ÿ	4z:*
ÿ
!o
%
_
J-qa