Viewing File: /opt/alt/python35/lib64/python3.5/site-packages/psutil/__pycache__/_pslinux.cpython-35.pyc



Cs[v0@s?dZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlm 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+ddl)m,Z,ej-dkrTddl.Z.ndZ.d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/gZ/d0Z0ej1j2d1ej3Z4e5ed2Z6e7Z8e6rx0e9eD]"Z:e:j;d3re/j<e:qWej=d4Z>ej=d5Z?da@e(r3dnd6ZAejBd7kZCd8ZDe.dkrfe
jEZFn*e.jGd9d:eHe
jEiZIeIjFZFe.dkrdZJdZKd;ZLdZMn,Gd<d=d=e.jGZNeOjPeNjQd>ejRd?ejSd@ejTdAejUdBejVdCejWdDejXdEejXdFejYdGejZdHej[dIej\iZ]dJej^dKej_dLej`dMejadNejbdOejcdPejddQejedRejfdSejgdTejhiZiedUdVdWdXdYdZd[d\d]d^d_d`gZjedadbdcdddedfdgdhdidjg	ZkedkdldmdndodpgZledqdrZmedsemjndZoedwdldxdydudzd{d|d}d~ddvgZpedddjqepjnZreddbdcdddeddgZsddZtddZue(rddZvnddZvddZwddZxddZyddZzeddZ{e8dddZ|ye{dWn7e}k
re
j~edddddaYnXddZddZddZddZddZddZddZddZej1j2ds$ej1j2dr0ddZejZGddde}ZGdddZeZdddZddZddZejZdddZdddZddZddZddZddZddZddZddZddZddZGddde7ZdS)zLinux platform implementation.)divisionN)defaultdict)
namedtuple)_common)_psposix)
_psutil_linux)
_psutil_posix)ENCODING)
ENCODING_ERRS)
isfile_strict)memoize)memoize_when_activated)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN)parse_environ_block)path_exists_strict)
supports_ipv6)
usage_percent)b)
basestring)long)PY3)AccessDenied)
NoSuchProcess)
ZombieProcessPROCFS_PATHIOPRIO_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_ACKCONN_LISTENCONN_CLOSINGz/sys/class/power_supplyz/proc/%s/smaps
linux_prlimitZRLIM
SC_CLK_TCKSC_PAGE_SIZEi littlei
AddressFamilyAF_LINKc@s(eZdZdZdZdZdZdS)
IOPriorityrrr5rN)__name__
__module____qualname__r r!r"r#r:r:/_pslinux.pyr6wsr6RSDTtZXxKWIPZ01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0Bsvmemtotal	availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskioZ
read_countZwrite_countZ
read_bytesZwrite_bytesZ	read_timeZ
write_timeZread_merged_countZwrite_merged_count	busy_time	popenfilepathfdZpositionmodeflagspmemz"rss vms shared text lib data dirtypfullmemusspssswap
pmmap_groupedrsssizeZshared_cleanZshared_dirtyZ
private_cleanZ
private_dirtyZ
referencedZ	anonymous	pmmap_extzaddr perms  pioZ
read_charsZwrite_charscKst|d|S)Nrb)open)fnamekwargsr:r:r;open_binarysrjcKs6tr&|jdt|jdtt|d|S)zOn Python 3 opens a file in text mode by using fs encoding and
    a proper en/decoding errors handler.
    On Python 2 this is just an alias for open(name, 'rt').
    encodingerrorsZrt)r
setdefaultr
rrg)rhrir:r:r;	open_textsrncCs|jdtdtS)Nrkrl)decoder
r)sr:r:r;rosrocCs|S)Nr:)rpr:r:r;roscCstjdjS)z+Return updated psutil.PROCFS_PATH constant.Zpsutil)sysmodulesrr:r:r:r;get_procfs_pathsrscCsmt|tst|tj|}|jdd}|jdrit|ri|dd}|S)zWrapper around os.readlink().rz
 (deleted)N
i)
isinstancerAssertionErrorosreadlinksplitendswithr)rWr:r:r;rysrycCsxtjdtjdtjdi}||tjtjBtjB@}|tj@rb|jddd}|jdd}|S)zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    rwzw+arzr+)rxO_RDONLYO_WRONLYO_RDWRO_APPENDreplace)rZZ	modes_maprYr:r:r;file_flags_to_modes!
rcCsH|jdd}d}|r+d|}n
d|}tj|tjS)zReturn 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/device)rrxaccessF_OK)nameZincluding_virtualrWr:r:r;is_storage_devices


rcCstd|#}|jjdd}WdQRXdddddd	d
g}t|}|dkrv|jd|d
kr|jd|dkr|jdtd|adS)zSet 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.
    z%s/statrNusernicesystemZidleZiowaitZirqZsoftirqZsteal	ZguestruZ
guest_nice	scputimes)rjreadlinerzlenappendrr)procfs_pathfvaluesfieldsZvlenr:r:r;set_scputimes_ntuples	#


rTcCsny<|rt|n	t|}|jjSWdQRXWn+ttfk
ri|tk	rb|SYnXdS)zReturn 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)rjrnreadstripIOErrorOSError_DEFAULT)rhfallbackbinaryrr:r:r;cat8s!rz/procrzuser system idlegcCsO|d}||jdd}y"|d}|d}|d}Wntk
rZ|SYnXytdt}Wntk
r|SYnXd}|KxC|D];}|j}|jdr|t|jd	7}qWWd
QRX|t	9}|}||}	||}
|
t
|
d|8}
|	|
7}	|	|t
|d|7}	t|	S)
aFallback 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:rs
Active(file):sInactive(file):s
SReclaimable:z%s/zoneinfoslowrNr5g@)getKeyErrorrjrsrr
startswithintrzPAGESIZEmin)memsrMrZlru_active_fileZlru_inactive_fileZslab_reclaimablerZ
watermark_lowlineavailZ	pagecacher:r:r;calculate_avail_vmemUs4



	
	
%



rcWCs)g}i}tdt@}x6|D].}|j}t|dd||d<q)WWdQRX|d}|d}y|d}Wn%tk
rd}|jd	YnXy|d
}Wn%tk
rd}|jdYnX||jdd7}y|d
}	WnHtk
rPy|d}	Wn%tk
rKd}	|jdYnXYnXy|d}
Wn%tk
rd}
|jdYnXy|d}WnXtk
ry|d|d|d}Wn%tk
rd}|jdYnXYnXy|d}Wntk
rd}YnX||||}
|
dkrA||}
y|d}Wntk
rot|}YnX|dkrd}|jd||kr|}t|||dd}|rddj	|t
|dkrdndf}tj|t
t||||
||
||||	|S)aReport 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".
    z
%s/meminforirNs	MemTotal:sMemFree:sBuffers:rPsCached:rQs
SReclaimable:sShmem:s
MemShared:rRsActive:rNs	Inactive:sInact_dirty:sInact_clean:sInact_laundry:rOsSlab:s
MemAvailable:rJround_z6%s memory stats couldn't be determined and %s set to 0z, ZwasZwere)rjrsrzrrrrrrjoinrwarningswarnRuntimeWarningrH)Zmissing_fieldsrrrrrIrMrPrQrRrNrOrSrLrrKmsgr:r:r;virtual_memorys
'










	

"rc%Cs'i}tdt@}x6|D].}|j}t|dd||d<q#WWdQRXy|d}|d}WnGtk
rtj\}}}}}}}||9}||9}YnX||}t||dd}	ytd	t}WnOtk
rE}
z/d
t	|
}t
j|td}}
WYdd}
~
XnX|d}}
x|D]}|j
drt|jddd
d}n0|j
drt|jddd
d}
|dk	r^|
dk	r^Pq^Wd}t
j|td}}
WdQRXtj||||	||
S)zReturn swap memory metrics.z
%s/meminforirNs
SwapTotal:s	SwapFree:rz	%s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)spswpin rspswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)rjrsrzrrcextZ
linux_sysinforrstrrrrrrZsswap)rrrrrIrM_Zunit_multiplierrLrKerrrsinZsoutr:r:r;swap_memorysD
'

!




$!rcCsyt}t|td|}|jj}WdQRX|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%s/statNrcSs g|]}t|tqSr:)floatCLOCK_TICKS).0rCr:r:r;
<listcomp>Js	zcpu_times.<locals>.<listcomp>)rsrrjrrzrr_fields)rrrrr:r:r;	cpu_times>s	
rcCst}t|g}td|}|jxr|D]j}|jdr=|j}|dttjd}dd|D}t|}|j	|q=W|SWdQRXdS)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    z%s/statscpurcSs g|]}t|tqSr:)rr)rrCr:r:r;r\s	z!per_cpu_times.<locals>.<listcomp>N)
rsrrjrrrzrrrr)rcpusrrrrentryr:r:r;
per_cpu_timesNs	


rcCsytjdSWntk
rd}tdt7}x-|D]%}|jjdrD|d7}qDWWdQRX|dkrtjd}t	dtD}x:|D]2}|j
d	d}|j|r|d7}qWWdQRX|dkrdS|SYnXdS)
z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNrz
%s/cpuinfos	processorrNzcpu\dz%s/statrd)rxsysconf
ValueErrorrjrslowerrrecompilernrzmatch)numrrsearchr:r:r;cpu_count_logicalbs$


rcCsi}i}tdt}x|D]}|jj}|szd|krqd|krq|d||d<i}q)|jds|jdr)|jdd\}}t|||<q)WWdQRXt|jpdS)z2Return the number of physical cores in the system.z
%s/cpuinfosphysical ids	cpu coress	:rN)	rjrsrrrrzrsumr)mappingZcurrent_inforrkeyvaluer:r:r;cpu_count_physicals
	rcCstdt}d}d}d}x|D]}|jdr]t|jd}nM|jdrt|jd}n%|jdrt|jd}|dk	r/|dk	r/|dk	r/Pq/WWdQRXd}tj||||S)z*Return various CPU stats as a named tuple.z%s/statNsctxtrsintrssoftirqr)rjrsrrrzrZ	scpustats)rZctx_switchesZ
interruptsZsoft_interruptsrZsyscallsr:r:r;	cpu_statss"
rz/sys/devices/system/cpu/cpufreqz$/sys/devices/system/cpu/cpu0/cpufreqcCs>g}tjd}|r4|jdddn%tjd}|jdddtjj}x|D]}t||ddd	}|d	krt||d
dd	}|d	krtdt|d}tt||d
d}tt||dd}|jt	j
|||qlW|S)zReturn frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z'/sys/devices/system/cpu/cpufreq/policy*rcSs ttjj|ddS)N)rrxrWbasename)rCr:r:r;<lambda>szcpu_freq.<locals>.<lambda>z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqcSsttjd|jdS)Nz[0-9]+r)rrrgroup)rCr:r:r;rsZscaling_cur_freqrNZcpuinfo_cur_freqz!can't find current frequency fileiZscaling_max_freqZscaling_min_freq)globsortrxrWrrNotImplementedErrorrrrZscpufreq)retlsZpjoinrWZcurrZmax_Zmin_r:r:r;cpu_freqs&
	 rc@seZdZdS)_Ipv6UnsupportedErrorN)r7r8r9r:r:r:r;rsrc@seZdZdZddZddZddZedd	Zed
ddZ	ed
d
dZ
d
ddZd
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
    cCsdtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}d|||||fd||fd|fd|fd||fd|fd|fd|fd	||||fd
||fd||fi|_d|_dS)NZtcptcp6Zudpudp6unixalltcp4udp4inetZinet4Zinet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfrrrrrr:r:r;__init__s"					zConnections.__init__cCstt}xtjd|j|fD]}y td|j||f}Wnatk
r}zA|jtjtj	fkrw)n|jtj
krw)nWYdd}~Xq)X|jdr)|dddd}||j|t
|fq)W|S)Nz%s/%s/fdz%s/%s/fd/%szsocket:[rr)rlistrxlistdirrryrerrnoENOENTESRCHEINVALrrr)rpidinodesrXinoderr:r:r;get_proc_inodess# !zConnections.get_proc_inodescCsi}x}tD]r}y|j|j|Wqtk
r}z/|jtjtjtjtjfkroWYdd}~XqXqW|S)N)	pidsupdaterrrrrEPERMEACCES)rrrrr:r:r;get_all_inodess!zConnections.get_all_inodesc
CsQ|jd\}}t|d}|s.fStrC|jd}|tjkrtrtj|tj	|ddd}qAtj|tj	|}ntj	|}ygtrtjtj
tjdtj
d|}n-tjtj
tjdtj
d|}Wn'tk
r@ts9tnYnXtj||S)	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
        :asciiNrz>4Iz<4Ir)rzrrencoderr
LITTLE_ENDIAN	inet_ntopbase64Z	b16decoderstructpackunpackrrrraddr)r	familyZipportr:r:r;decode_address*s0+$%
		zConnections.decode_addressNccs|jdr&tjj|r&dSt|dtc}|jxOt|dD]>\}}y8|jdd\
}}	}
}}}}}}}Wn+t	k
rt
d|||fYnX||kr||d\}
}nd	\}
}|dk	r||
krqUqU|tjkr0t
|}n	tj}y(tj|	|}	tj|
|}
Wntk
rxwUYnX||||	|
||
fVqUWWdQRXdS)
z.Parse /proc/net/tcp* and /proc/net/udp* files.6N	bufferingrruz,error while parsing %s; malformed line %s %rrr)Nr)r{rxrWexistsrnBIGFILE_BUFFERINGr	enumeraterzrRuntimeErrorrrTCP_STATUSESr	CONN_NONErrr)filer
type_r
filter_pidrlinenorrladdrraddrstatusrrrXr:r:r;process_inetas2"
8

	
zConnections.process_inetccs[t|dtB}|jx.|D]&}|j}y)|dd\}}}}}}}	Wn7tk
rd|krw&td||fYnX|	|kr||	}
n	dg}
x|
D]\}}|dk	r||krqqt|dkr
|d}
nd	}
t|}d	}tj	}||||
|||fVqWq&WWdQRXdS)
zParse /proc/net/unix files.rrrdz)error while parsing %s; malformed line %rNrrr)Nrr)
rnrrrzrrrrrr)rr
rrrrtokensrrrZpairsrrXrWrrr:r:r;process_unixs2

)

	
	zConnections.process_unixc
Cs||jkr>td|djdd|jDft|_|dk	rr|j|}|s~gSn|j}t}x|j|D]\}}}|tj	tj
fkr|jd|j|f|||d|}n(|jd|j|f||d|}xx|D]p\}	}}}
}}}
|r[t
j|	|||
||}n!t
j|	|||
|||
}|j|qWqWt|S)Nz+invalid %r kind argument; choose between %sz, cSsg|]}t|qSr:)repr)rrCr:r:r;rs	z(Connections.retrieve.<locals>.<listcomp>z	%s/net/%sr)rrrrsrrrsetrrrrr rZpconnZsconnaddr)rkindrrrrr
rrrXrrrZ	bound_pidconnr:r:r;retrieves4)	"zConnections.retrieve)r7r8r9__doc__rrrstaticmethodrrr r&r:r:r:r;rs
7'%rrcCs
tj|S)z$Return system-wide open connections.)_connectionsr&)r$r:r:r;net_connectionssr*cCstdt}|j}WdQRXi}x|ddD]}|jd}|dksstt||d|j}||ddjj}tt	|\}}}	}
}}}
}}}}}}}}}|||||	||
|f||<q@W|S)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z
%s/net/devNr5rrr)
rnrs	readlinesrfindrwr!rrzmapr)rlinesretdictrZcolonrrZ
bytes_recvZpackets_recvZerrinZdropinZfifoinZframeinZcompressedinZmulticastinZ
bytes_sentZpackets_sentZerroutZdropoutZfifooutZ
collisionsoutZ
carrieroutZ
compressedoutr:r:r;net_io_counterss ?r0c	Cstjttjttjti}tj}i}x|D]}y7t	j
|}t	j|}tj|\}}Wn:t
k
r}z|jtjkrWYdd}~Xq=Xtj|||||||<q=W|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rZDUPLEX_FULLrZDUPLEX_HALFrZDUPLEX_UNKNOWNrr0keys
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedrrZENODEVrZ	snicstats)	Z
duplex_mapnamesrrZmtuZisupduplexZspeedrr:r:r;net_if_statss		
$r5FcCsdd}dd}tjjdtr=|}n1tjjdr[|}ntdti}x|D]z}|\
}}}}	}
}}}
}}|rt|rq{|	t9}	|
t9}
|||	|
|||
||f	||<q{W|S)zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    csstdt}|j}WdQRXx`|D]X}|j}t|}|dkr|d}t|d}tt|dd\
}}}	}
}}}
}}}n|dkr|d}tt|dd\}}}}	}
}}}
}}}nd|dkrU|d}tt|dd\}}}
}d}	}
}}}ntd	||||
|||	|
|||f
Vq0WdS)
Nz%s/diskstatsrr5rrrz!not sure how to interpret line %r)rnrsr+rzrrr-r)rr.rrZflenrreadsreads_mergedrbytesrtimewrites
writes_mergedwbyteswtimerrUr:r:r;read_procfss&

:
=
%z%disk_io_counters.<locals>.read_procfscssxtjdD]}xtjtjjd|D]\}}}d|krSq5ttjj|d}|jjj}WdQRXtjj	|}t
t|\}}}	}
}}}
}}}}||||	|
|
||||f
Vq5WqWdS)Nz
/sys/blockstat)rxrwalkrWrrnrrrzrr-r)blockrootrfilesrrrr8r9r:r;r<r=r>r?rUr:r:r;
read_sysfsFs.0z$disk_io_counters.<locals>.read_sysfsz%s/diskstatsz
/sys/blockzC%s/diskstats nor /sys/block filesystem are available on this system)rxrWrrsrrDISK_SECTOR_SIZE)Zperdiskr@rFgenr/rrr8r<r:r>r;r?r9r=rUr:r:r;disk_io_counterss&(


$

rIc
Cs%t}tdtu}xk|D]c}|j}|jds]|j|jq&|jdd}|dkr&|jdq&WWdQRXg}tj}xx|D]p}|\}}	}}
|dkrd}|s|dks||krqt	j
||	||
}|j|qW|S)	z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodev	rZzfsNZnoner)r"rnrsrrr#rzrdisk_partitionsrZ	sdiskpartr)rZfstypesrrZfstyperetlistZ
partitions	partitionZdeviceZ
mountpointZoptsntupler:r:r;rKvs*	

rKc
$Cstjt}tjd}|jtjdttdd|D}x|D]}yW|d}tt|d}t	j
jt	j
j|d}t|dd	}WnKt
ttfk
r}z"tjd
||ftwZWYdd}~XnXt|dd
d}t|dd
d}t|dd
ddd	}	|dk	ryt|d}Wntk
rd}YnX|dk	ryt|d}Wntk
rd}YnX||j|	|||fqZW|S)aReturn 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*_*cSs#g|]}|jddqS)rr)rz)rrCr:r:r;rs	z(sensors_temperatures.<locals>.<listcomp>_inputg@@rrFzignoring %r for file %rNZ_maxrZ_crit_labelr)collectionsrrrextendsortedr"rrrxrWrdirnamerrrrrrr)
r	basenamesbaserWcurrent	unit_namerhighcriticallabelr:r:r;sensors_temperaturess:


!	

!r\cCs2tjt}tjd}|s3tjd}ttdd|D}x|D]}ytt|d}WnBtt	fk
r}zt
jd|twYWYdd}~XnXtt
jjt
jj|dd	d
}t|ddd
d	d
}||jtj||qYWt|S)aReturn 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*_*cSs#g|]}|jddqS)rr)rz)rrCr:r:r;rs	z sensors_fans.<locals>.<listcomp>rOzignoring %rNrrFrPrr)rQrrrrSr"rrrrrrrrxrWrrTrrZsfandict)rrUrVrWrrXr[r:r:r;sensors_fanss 

$	!r^cstfdd}ddtjtD}|sAdStjjtt|d}||d|d}||d	|d
}||d|d}|dks|dkrdS|dk	ryd
||}Wq)tk
rd}Yq)Xn,tt	|ddd}|dkr)dSd}|tjjtdtjjtd}|dk	rw|dk}nIt	|dddddj
}	|	dkrd}n|	dkrd}|rtj}
n6yt||d}
Wntk
rtj
}
YnXtj||
|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
    csMxF|D]>}t|d}|kr|jrAt|S|SqWdS)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rN)risdigitr)pathsrWr)nullr:r;	multi_cats

z"sensors_battery.<locals>.multi_catcSs%g|]}|jdr|qS)ZBAT)r)rrCr:r:r;rs	z#sensors_battery.<locals>.<listcomp>Nrz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullgY@gz	/capacityrrz
AC0/onlinez	AC/onlinez/statusrrFZdischargingchargingfullTirr)rcrd)objectrxrPOWER_SUPPLY_PATHrWrrSZeroDivisionErrorrrrrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)rbZbatsrDZ
energy_nowZ	power_nowZenergy_fullrKZ
power_pluggedZonlinerZsecsleftr:)rar;sensors_batterysV	




"	
rhc
Csg}tj}xo|D]g}|\}}}}}}|s@q|dkrRd}tj||pdd|||}	|j|	qW|S)z:Return currently connected users as a list of namedtuples.:0.0:0	localhostN)rirj)rusersrZsuserr)
rLZrawlistitemrZttyhostnameZtstampZuser_processrntr:r:r;rlKs
!rlcCs}dt}t|]}xC|D];}|jdr#t|jjd}|a|Sq#Wtd|WdQRXdS)zAReturn the system boot time expressed in seconds since the epoch.z%s/statsbtimerzline 'btime' not found in %sN)rsrjrrrrz	BOOT_TIMEr)rWrrrr:r:r;	boot_time]s

rqcCs#ddtjttDS)z7Returns a list of PIDs currently running on the system.cSs(g|]}|jrt|qSr:)r_r)rrCr:r:r;rrs	zpids.<locals>.<listcomp>)rxrrrsr:r:r:r;rpsrcCstj|sdSy}dt|f}t|W}x=|D]5}|jdr?t|jd}||kSq?Wtd|WdQRXWn%ttfk
r|t	kSYnXdS)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fz%s/%s/statussTgid:rz'Tgid' line not found in %sN)
r
pid_existsrsrjrrrzrEnvironmentErrorr)rrWrrZtgidr:r:r;rrus

rrc	Csi}t}xtD]}y0td||f}|j}WdQRXWnCtk
r}z#|jtjtjfkrWYdd}~XqX|jd}||ddj	}t
|d}|||<qW|S)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    z
%s/%s/statN)r5r)rsrrjrrsrrrr,rzr)	rrrrdatarrparZdsetppidr:r:r;ppid_maps	rxcs%tjfdd}|S)zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    csy|||SWntk
r}z|jtjtjfkrYt|j|j|jtjkrt|j|j|jtj	krt
jjd|j
|jfrt|j|jWYdd}~XnXdS)Nz%s/%s)rsrrrrr_namerrrrxrWrr)rargsrir)funr:r;wrappersz wrap_exceptions.<locals>.wrapper)	functoolswraps)r{r|r:)r{r;wrap_exceptionss!rc@seZdZdZddddgZddZedd	Zed
dZedd
Z	ddZ
ddZeddZ
ddZeddZeddZeddZejjdejreddZnddZed d!Zed"d#Zed$d%d&Zed'd(Zed)d*Zereejd+ejd,ejd-d.d/ZneZered0d1Z nd2d1Z ed3d4Z!eejd5d6d7Z"eejd8d9d:Z#ed;d<Z$ed=d>Z%ed?d@Z&edAdBZ'ejdCdDdEZ(edFdGZ)e*e+dHredIdJZ,edKdLZ-e.red$dMdNZ/edOdPZ0edQdRZ1edSdTdUZ2edVdWZ3edXdYZ4eejdZd[d\Z5eejd]d^d_Z6d$S)`ProcesszLinux process implementation.rry_ppidrcCs+||_d|_d|_t|_dS)N)rryrrsr)rrr:r:r;rs			zProcess.__init__c
Cstd|j|jf}|j}WdQRX|jd}||jdd|}||ddj}|g|S)a{Parse /proc/{pid}/stat file. Return a list of fields where
        process name is in position 0.
        Using "man proc" as a reference: where "man proc" refers to
        position N, always substract 2 (e.g starttime pos 22 in
        'man proc' == pos 20 in the list returned here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        z
%s/%s/statNrt(rr5)rjrrrr,findrz)rrrurvrZothersr:r:r;_parse_stat_files
zProcess._parse_stat_filec	Cs4td|j|jf}|jSWdQRXdS)zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        z%s/%s/statusN)rjrrr)rrr:r:r;_read_status_fileszProcess._read_status_filec	Cs@td|j|jfdt}|jjSWdQRXdS)Nz%s/%s/smapsr)rjrrrrr)rrr:r:r;_read_smaps_fileszProcess._read_smaps_filecCs+|jj|jj|jjdS)N)rZcache_activaterr)rr:r:r;
oneshot_enters

zProcess.oneshot_entercCs+|jj|jj|jjdS)N)rZcache_deactivaterr)rr:r:r;oneshot_exits

zProcess.oneshot_exitcCs&|jd}tr"t|}|S)Nr)rrro)rrr:r:r;rszProcess.namecCsytd|j|jfSWntk
r}z|jtjtjfkrtjj	d|j|jfrtdSt
|jst|j|jnt
|j|j|j|jtjtjfkrt|j|jWYdd}~XnXdS)Nz	%s/%s/exez%s/%sr)ryrrrrrrrxrWlexistsrrrryrrrrr)rrr:r:r;exes"zProcess.exec
Cstd|j|jf}|j}WdQRX|s<gS|jdrQdnd}|j|rv|dd}dd|j|DS)Nz
%s/%s/cmdlinertrdrcSsg|]}|qSr:r:)rrCr:r:r;r)s	z#Process.cmdline.<locals>.<listcomp>r)rnrrrr{rz)rrrusepr:r:r;cmdlineszProcess.cmdlinec	Cs<td|j|jf}|j}WdQRXt|S)Nz
%s/%s/environ)rnrrrr)rrrur:r:r;environ+szProcess.environcCsKt|jd}tj}y||SWntk
rFdSYnXdS)N)rrrZget_terminal_mapr)rZtty_nrrr:r:r;terminal1s
zProcess.terminalz/proc/%s/iocCsd|j|jf}i}t|O}xE|D]=}|j}|r2|jd\}}t|||<q2WWdQRX|std|t|d|d|d|d|d|d	S)
Nz%s/%s/ios: z%s file was emptyssyscrssyscws
read_bytesswrite_bytessrcharswchar)rrrjrrzrrre)rrhrrrrrr:r:r;io_counters;s"
zProcess.io_counterscCstd|jdS)Nz+couldn't find /proc/%s/io (kernel too old?))rr)rr:r:r;rQscCsr|j}t|dt}t|dt}t|dt}t|dt}tj||||S)N
r7r6)rrrrZ	pcputimes)rrutimestimeZchildren_utimeZchildren_stimer:r:r;rUszProcess.cpu_timescCst|jdS)zWhat CPU the process is on.%)rr)rr:r:r;cpu_num^szProcess.cpu_numNcCstj|j||jS)N)rZwait_pidrry)rtimeoutr:r:r;waitcszProcess.waitcCs1|j}tpt}t|dt|S)N)rrprqrr)rrZbtr:r:r;create_timegszProcess.create_timec	Cstd|j|jfE}dd|jjddD\}}}}}}}WdQRXt|||||||S)Nz%s/%s/statmcSs g|]}t|tqSr:)rr)rrCr:r:r;rs	z'Process.memory_info.<locals>.<listcomp>r)rjrrrrzr[)	rrZvmsrarRtextlibruZdirtyr:r:r;memory_infors
EzProcess.memory_infos\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c	Cs|j}|j}ttt|j|d}ttt|j|d}ttt|j|d}t||||fS)Ni)rrrr-rfindallr\)	rZ_private_reZ_pss_reZ_swap_reZ	basic_memZ
smaps_datar]r^r_r:r:r;memory_full_infos
"""zProcess.memory_full_infocCsdd}|j}|s"gS|jd}g}|jd}|g}x|||D]w\}}|jdd}y|\}	}
}}}
}Wn1tk
r|dg\}	}
}}}
}YnX|sd}nJtrt|}|j}|jd	r&t|r&|dd}|j	t|	t|
||d|j
dd|j
d
d|j
dd|j
dd|j
dd|j
dd|j
dd|j
dd|j
ddf
q_W|S)zReturn 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
            cssi}x|D]}|jdd}|djdsY|j|fV|j|q
y t|dd||d<Wq
tk
r|djdrw
ntd|Yq
Xq
W|j|fVdS)Nrr:risVmFlags:z#don't know how to interpret line %r)rzr{poprrrr)r.
current_blockrurrr:r:r;
get_blockss
 
z'Process.memory_maps.<locals>.get_blockss
rNrrz[anon]z
 (deleted)rusRss:sSize:sPss:s
Shared_Clean:s
Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:sReferenced:s
Anonymous:sSwap:i)rrzrrrrorr{rrr)rrrur.rZ
first_linerheaderZhfieldsr	ZpermsoffsetZdevrrWr:r:r;memory_mapssF	
$	
zProcess.memory_mapscCstd|jdS)Nzn/proc/%s/smaps does not exist on kernels < 2.6.14 or if CONFIG_MMU kernel configuration option is not enabled.)rr)rr:r:r;rscCsytd|j|jfSWntk
r}ze|jtjtjfkrt|jsut|j|j	nt
|j|j	|jWYdd}~XnXdS)Nz	%s/%s/cwd)ryrrrrrrrrrryrr)rrr:r:r;cwdszProcess.cwdsctxt_switches:\t(\d+)cCsh|j}|j|}|s@td|j|jfn$tjt|dt|dSdS)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)rrrrrrZpctxswr)rZ	_ctxsw_reruZctxswr:r:r;num_ctx_switchesszProcess.num_ctx_switchessThreads:\t(\d+)cCs#|j}t|j|dS)Nr)rrr)rZ_num_threads_rerur:r:r;num_threadsszProcess.num_threadsc
Csttjd|j|jf}|jg}d}x|D]
}d|j|j|f}y,t|}|jj}WdQRXWnCtk
r}z#|j	t	j
krd}w<WYdd}~XnX||jddd}|jd}	t
|	dt}
t
|	d	t}tjt||
|}|j|q<W|rptjd
|j|jf|S)Nz
%s/%s/taskFz%s/%s/task/%s/statTrtr5rrz%s/%s)rxrrrrrjrrrrrrrzrrrZpthreadrrrA)
rZ
thread_idsrL
hit_enoentZ	thread_idrhrstrrrrrNr:r:r;threadss0

zProcess.threadscCstj|jS)N)r2getpriorityr)rr:r:r;nice_get3szProcess.nice_getcCstj|j|S)N)r2setpriorityr)rrr:r:r;nice_set<szProcess.nice_setcCstj|jS)N)rZproc_cpu_affinity_getr)rr:r:r;cpu_affinity_get@szProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsq|j}|j|}|rTttt|ddt|dddSttttSdS)Nrr)rrrrangerrr)r_rerurr:r:r;_get_eligible_cpusDs
3zProcess._get_eligible_cpuscCsytj|j|Wnttfk
r}zt|tsS|jtjkr|j}t	t
tt}xR|D]J}||krtd||f||krtd||fqWWYdd}~XnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s)
rZproc_cpu_affinity_setrrrrvrrrtuplerrr)rrrZ
eligible_cpusZall_cpusZcpur:r:r;cpu_affinity_setNs !
zProcess.cpu_affinity_setproc_ioprio_getcCs@tj|j\}}tdk	r0t|}tj||S)N)rrrenumr6rZpionice)rioclassrr:r:r;
ionice_getdszProcess.ionice_getcCs"|dk	rgtr?t|ttfr?d|}t|d|koVdknsgtd|tdfkr|rd|}t|t}d}nh|tkr|rd|}t|d}n7|tt	fkr|dkrd}ntd|t
j|j||S)	Nz)value argument is not an integer (gor %r)rrz0value argument range expected is between 0 and 7z3can't specify value with IOPRIO_CLASS_NONE (got %r)z3can't specify value with IOPRIO_CLASS_IDLE (got %r)rzinvalid ioclass argument %r)
rrvrr	TypeErrorrr r#r!r"rZproc_ioprio_setr)rrrrr:r:r;
ionice_setks2
				zProcess.ionice_setcCs|jdkrtdyp|dkr=tj|j|St|dkretdt||\}}tj|j|||Wngtk
r}zG|jtjkrt	|jrt
|j|j|jnWYdd}~XnXdS)Nrz)can't use prlimit() against PID 0 processr5z4second argument must be a (soft, hard) tuple, got %s)
rrrr/rr!rrZENOSYSrrrryr)rZresourceZlimitsZsoftZhardrr:r:r;rlimits!zProcess.rlimitcCs2|jd}tr"|j}tj|dS)Nr?)rrro
PROC_STATUSESr)rZletterr:r:r;rszProcess.statusc
Csg}tjd|j|jf}d}x|D]}d|j|j|f}yt|}Wngtk
r}zG|jtjtjfkrd}w2n|jtj	krw2nWYdd}~Xq2X|j
dr2t|r2d|j|j|f}yUt|B}t
|jjd}	t
|jjdd}
WdQRXWnCtk
r}z#|jtjkrd}nWYdd}~Xq2Xt|
}t|t
|t
|	||
}|j|q2W|rtjd	|j|jf|S)
Nz%s/%s/fdFz%s/%s/fd/%sTrz%s/%s/fdinfo/%srrz%s/%s)rxrrrryrrrrrrrrjrrrzrrrVrrA)
rrLrErrXrrWrrposrZrYrNr:r:r;
open_filess@
*	!zProcess.open_filesrcCs6tj||j}tjd|j|jf|S)Nz%s/%s)r)r&rrxrAr)rr$rr:r:r;connectionsszProcess.connectionscCs#ttjd|j|jfS)Nz%s/%s/fd)rrxrrr)rr:r:r;num_fdsszProcess.num_fdscCst|jdS)Nr5)rr)rr:r:r;rwszProcess.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCsM|j}|j|d\}}}tjt|t|t|S)Nr)rrrZpuidsr)rZ_uids_rerureal	effectivesavedr:r:r;uidsszProcess.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCsM|j}|j|d\}}}tjt|t|t|S)Nr)rrrZpgidsr)rZ_gids_rerurrrr:r:r;gidsszProcess.gids)7r7r8r9r'	__slots__rrrrrrrrrrrrrrxrWrgetpidrrrrrr	HAS_SMAPSrrrrrrrrrrrrrhasattrrrrHAS_PRLIMITrrrrrrwrrr:r:r:r;rst			B
		!2r)rrr)r]r^r_)r'Z
__future__rrrQrr}rrxrrrrq	tracebackrrrrrrrrr	r2r
rrr
rrrrrrrrZ_compatrrrr_exceptionsrrrversion_inforZ__extra__all__rfrWrrrrrrerdirrrrrrrrpr	byteorderrrG	AF_PACKETr4IntEnumrr3r r!r"r#r6globalsr__members__ZSTATUS_RUNNINGZSTATUS_SLEEPINGZSTATUS_DISK_SLEEPZSTATUS_STOPPEDZSTATUS_TRACING_STOPZ
STATUS_ZOMBIEZSTATUS_DEADZSTATUS_WAKE_KILLZ
STATUS_WAKINGZSTATUS_IDLEZ
STATUS_PARKEDrr$r%r&r'r(r)r*r+r,r-r.rrHrTrVr[rr\r`rrcrerjrnrorsryrrrr	Exception	print_excrrrrrrrrrrZnet_if_addrsrrr)r*r0r5
disk_usagerIrKr\r^rhrlrqrrrrxrrr:r:r:r;<module>sJ		
																								
	


 5z:*		%	\!< X 
Back to Directory File Manager