a
    áªlclQ ã                   @   sâ  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' ddlm(Z( ddlm)Z) ddlm*Z* ddlm+Z+ ddl,m-Z- dd l,m.Z. dd!l,m/Z/ dd"l,m0Z0 dd#l,m1Z1 dd$l,m2Z2 ej3d%krddl4Z4ndZ4g d&¢Z5d'Z6ej7 8d(e 9¡  ¡Z:ej7 8d)e 9¡  ¡Z;e<ed*ƒZ=e<ed+ƒZ>e ?d,¡Z@e A¡ ZBdaCejDd-kZEd.ZFe4du rˆe
jGZHne4 Id/d0eJe
jGƒi¡ZKeKjHZHe4du rÀdZLdZMd1ZNd2ZOn G d3d4„ d4e4jIƒZPeQƒ  RePjS¡ ejTejUejVejWejXejYejZejZej[ej\ej]ej^d5œZ_ej`ejaejbejcejdejeejfejgejhejiejjd6œZked7g d8¢ƒZled9g d:¢ƒZmed;g d<¢ƒZned=d>ƒZoed?eojpd@ ƒZqedAg dB¢ƒZredCdDdE serjp¡ ƒZtedFg dG¢ƒZuedHg dI¢ƒZvdJdK„ ZwdLdM„ ZxdNdO„ Zye$dPdQ„ ƒZzzezdRƒ W n. e{y*   e |¡  edSdTƒdUdUdUƒa}Y n0 dZ~zddVlm~Z~ W n@ e€y€   ddlZej‚ddWdXZƒe<eƒdYƒr|dšdZdY„Z~Y n0 e~dur¤e5 „d[d\„ e…eƒD ƒ¡ d]d^„ Z†d_d`„ Z‡dadb„ Zˆdcdd„ Z‰dedf„ ZŠdgdh„ Z‹didj„ ZŒdkdl„ Zdmdn„ ZŽej7 8do¡sej7 8dp¡rdqdr„ Zndsdr„ ZejZG dtdu„ due{ƒZ‘G dvdw„ dwƒZ’e’ƒ Z“d›dydz„Z”d{d|„ Z•d}d~„ Z–ej—Z—dœd€d„Z˜G d‚dƒ„ dƒƒZ™dd„d…„Zšd†d‡„ Z›dˆd‰„ ZœdŠd‹„ ZdŒd„ ZždŽd„ ZŸdd‘„ Z d’d“„ Z¡d”d•„ Z¢d–d—„ Z£G d˜d™„ d™e¤ƒZ¥dS )žzLinux 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)é   é   )ZPROCFS_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                   @   s   e Zd ZdZdZdZdZdS )Ú
IOPriorityr   r   r;   r$   N)Ú__name__Ú
__module__Ú__qualname__r&   r'   r(   r)   © r@   r@   úK/var/www/html/django/DPS/env/lib/python3.9/site-packages/psutil/_pslinux.pyr<   v   s   r<   )ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP)Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0BÚsvmem)ÚtotalÚ	availableÚpercentÚusedÚfreeÚactiveÚinactiveÚbuffersÚcachedÚsharedÚslabÚsdiskio)	Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesZ	read_timeZ
write_timeZread_merged_countZwrite_merged_countÚ	busy_timeÚ	popenfile)ÚpathÚfdÚpositionÚmodeÚflagsÚpmemz"rss vms shared text lib data dirtyÚpfullmem)ÚussÚpssÚswapÚpmmap_grouped)ra   ÚrssÚsizeri   Zshared_cleanZshared_dirtyZprivate_cleanZprivate_dirtyZ
referencedZ	anonymousrj   Ú	pmmap_extzaddr perms ú Úpio)r[   r\   r]   r^   Z
read_charsZwrite_charsÚ	pcputimes)ÚuserÚsystemÚchildren_userÚchildren_systemÚiowaitc                 C   sL   t | tƒsJ | ƒ‚t | ¡} |  d¡d } |  d¡rHt| ƒsH| dd… } | S )zWrapper around os.readlink().ú r   ú
 (deleted)Néöÿÿÿ)Ú
isinstancer#   ÚosÚreadlinkÚsplitÚendswithr   )ra   r@   r@   rA   r|   Ï   s    
r|   c                 C   sX   t jdt jdt jdi}|| t jt jB t jB @  }| t j@ rH| ddd¡}| dd¡}|S )zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    ÚrÚwzw+Úar   zr+)r{   ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)re   Z	modes_maprd   r@   r@   rA   Úfile_flags_to_modeã   s    
r‡   c                 C   s4   |   dd¡} d}|rd|  }nd|  }t |tj¡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/device)r†   r{   ÚaccessÚF_OK)ÚnameZincluding_virtualra   r@   r@   rA   Úis_storage_deviceð   s    

r   c                 C   s”   t d|  ƒ$}| ¡  ¡ dd… }W d  ƒ n1 s60    Y  g d¢}t|ƒ}|dkrb| d¡ |dkrt| d¡ |d	kr†| d
¡ td|ƒadS )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/statr   N)rr   Únicers   Úidlerv   ZirqZsoftirqé   Zstealé	   Zguesté
   Z
guest_niceÚ	scputimes)r   Úreadliner}   ÚlenÚappendr   r”   )Úprocfs_pathÚfÚvaluesÚfieldsZvlenr@   r@   rA   Úset_scputimes_ntuple  s    	2


rœ   ú/procr”   zuser system idleç        )ÚprlimitT)Z	use_errnorŸ   c                 C   sš   G dd„ dt jƒ}|ƒ }|d u r8t | |d t  |¡¡}n6|ƒ }|d |_|d |_t | |t  |¡t  |¡¡}|dkrŽt  ¡ }t|t	 
|¡ƒ‚|j|jfS )Nc                   @   s    e Zd ZdejfdejfgZdS )zprlimit.<locals>.StructRlimitÚrlim_curÚrlim_maxN)r=   r>   r?   ÚctypesZ
c_longlongZ_fields_r@   r@   r@   rA   ÚStructRlimit9  s   ÿr£   r   r   )r¢   Z	StructureÚlibcrŸ   Zbyrefr    r¡   Z	get_errnoÚOSErrorr{   Ústrerror)ÚpidÚ	resource_Úlimitsr£   ÚcurrentÚretÚnewÚerrnor@   r@   rA   rŸ   8  s    

ÿc                 C   s"   g | ]}|  d ¡r| ¡ r|‘qS )ZRLIM)Ú
startswithÚisupper©Ú.0rI   r@   r@   rA   Ú
<listcomp>Q  ó    r²   c                 C   s  | d }||   dd¡ }z| d }| d }| d }W n tyJ   | Y S 0 ztdtƒ  ƒ}W n tyt   | Y S 0 d}|@ |D ]*}| ¡ }| d¡r„|t| ¡ d	 ƒ7 }q„W d
  ƒ n1 sÄ0    Y  |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:r   s   Active(file):s   Inactive(file):ó   SReclaimable:z%s/zoneinfos   lowr   Nr;   g       @)ÚgetÚKeyErrorr   r   ÚIOErrorÚstripr®   Úintr}   ÚPAGESIZEÚmin)ÚmemsrS   ÚfallbackZlru_active_fileZlru_inactive_fileZslab_reclaimabler™   Zwatermark_lowÚlineÚavailZ	pagecacher@   r@   rA   Úcalculate_avail_vmemY  s2    


4rÂ   c                  C   s¼  g } i }t dtƒ  ƒ:}|D ]$}| ¡ }t|d ƒd ||d < qW d  ƒ n1 sV0    Y  |d }|d }z|d }W n  tyœ   d}|  d	¡ Y n0 z|d
 }W n  tyÊ   d}|  d¡ Y n0 || dd¡7 }z|d }	W nD ty,   z|d }	W n" ty&   d}	|  d¡ Y n0 Y n0 z|d }
W n" ty\   d}
|  d¡ Y n0 z|d }W nT ty¾   z|d |d  |d  }W n" ty¸   d}|  d¡ Y n0 Y n0 z|d }W n tyä   d}Y n0 || | | }|dk r|| }z|d }W n ty0   t|ƒ}Y n0 |dk rJd}|  d¡ ||krX|}t|| |dd}| r dd 	| ¡t
| ƒdkrŒdndf }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   é   r   Ns	   MemTotal:r´   s   Buffers:rV   rµ   rW   r¶   s   Shmem:s
   MemShared:rX   s   Active:rT   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:rU   s   Slab:s   MemAvailable:rP   ©Zround_z6%s memory stats couldn't be determined and %s set to 0ú, ÚwasÚwere)r   r   r}   r»   r¸   r—   r·   rÂ   r   Újoinr–   ÚwarningsÚwarnÚRuntimeWarningrN   )Zmissing_fieldsr¾   r™   rÀ   r›   rO   rS   rV   rW   rX   rT   rU   rY   rR   rÁ   rQ   Úmsgr@   r@   rA   Úvirtual_memory  sŽ    8ÿþÿ

	


þÿrÎ   c               
   C   sè  i } t dtƒ  ƒ:}|D ]$}| ¡ }t|d ƒd | |d < qW d  ƒ n1 sR0    Y  z| d }| d }W n8 ty¨   t ¡ \}}}}}}}||9 }||9 }Y n0 || }t||dd}	zt d	tƒ  ƒ}W nF ty }
 z,d
t	|
ƒ }t
 |t¡ d }}W Y d}
~
nÄd}
~
0 0 |¤ d }}|D ]n}| d¡rXt| d¡d ƒd d }n&| d¡r~t| d¡d ƒd d }|dur,|dur, q´q,d}t
 |t¡ d }}W d  ƒ n1 sÊ0    Y  t ||||	||¡S )zReturn swap memory metrics.rÃ   r   rÄ   r   Ns
   SwapTotal:s	   SwapFree:rÅ   z	%s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)s   pswpinó    r%   s   pswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)r   r   r}   r»   r¸   ÚcextZlinux_sysinfor   r¹   ÚstrrÊ   rË   rÌ   r®   r   Zsswap)r¾   r™   rÀ   r›   rO   rS   Ú_Zunit_multiplierrR   rQ   ÚerrrÍ   ÚsinZsoutr@   r@   rA   Úswap_memory  sF    8ÿ
(rÕ   c                  C   sr   t ƒ } t| ƒ td|  ƒ}| ¡  ¡ }W d  ƒ n1 s<0    Y  |dttjƒd … }dd„ |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Ž   Nr   c                 S   s   g | ]}t |ƒt ‘qS r@   ©ÚfloatÚCLOCK_TICKSr°   r@   r@   rA   r²   M  r³   zcpu_times.<locals>.<listcomp>)r   rœ   r   r•   r}   r–   r”   Ú_fields)r˜   r™   rš   r›   r@   r@   rA   Ú	cpu_timesA  s    *rÚ   c                  C   s    t ƒ } t| ƒ g }td|  ƒn}| ¡  |D ]L}| d¡r,| ¡ }|dttjƒd … }dd„ |D ƒ}t|Ž }| 	|¡ q,|W  d  ƒ S 1 s’0    Y  dS )zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    rŽ   s   cpur   c                 S   s   g | ]}t |ƒt ‘qS r@   rÖ   r°   r@   r@   rA   r²   _  r³   z!per_cpu_times.<locals>.<listcomp>N)
r   rœ   r   r•   r®   r}   r–   r”   rÙ   r—   )r˜   Úcpusr™   rÀ   rš   r›   Úentryr@   r@   rA   Úper_cpu_timesQ  s    
rÝ   c                  C   sò   zt  d¡W S  tyì   d} tdtƒ  ƒ0}|D ]}| ¡  d¡r2| d7 } q2W d  ƒ n1 sb0    Y  | dkrÖt d¡}t	dtƒ  ƒ:}|D ]$}| 
d	¡d }| |¡r’| d7 } q’W d  ƒ n1 sÌ0    Y  | dkräY dS |  Y S 0 dS )
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNr   ú
%s/cpuinfos	   processorr   Nzcpu\drŽ   ro   )r{   ÚsysconfÚ
ValueErrorr   r   Úlowerr®   ÚreÚcompiler   r}   Úmatch)Únumr™   rÀ   Úsearchr@   r@   rA   Úcpu_count_logicale  s$    (

(rè   c               
   C   s2  t ƒ } d}d}t |¡p t |¡D ]>}t|ƒ"}|  | ¡  ¡ ¡ W d  ƒ q"1 sV0    Y  q"t| ƒ}|dkrv|S i }i }tdtƒ  ƒ~}|D ]h}| ¡  ¡ }|sÔz|d ||d < W n t	yÌ   Y n0 i }q’| 
d¡r’| d	d
¡\}	}
t|
ƒ||	< q’W d  ƒ n1 s0    Y  t| ¡ ƒ}|p0dS )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_listNr   rß   ó	   cpu coresó   physical id)rê   ré   s   	:r   )ÚsetÚglobr   ÚaddÚreadrº   r–   r   râ   r¸   r®   r}   r»   Úsumrš   )ÚlsÚp1Úp2ra   r™   ÚresultÚmappingZcurrent_inforÀ   ÚkeyÚvaluer@   r@   rA   Úcpu_count_cores‚  s4    
2ÿ
.r÷   c                  C   sÆ   t dtƒ  ƒ”} d}d}d}| D ]r}| d¡r@t| ¡ d ƒ}n6| d¡r\t| ¡ d ƒ}n| d¡rvt| ¡ d ƒ}|dur |dur |dur  q”q W d  ƒ n1 s¨0    Y  d}t ||||¡S )z*Return various CPU stats as a named tuple.rŽ   Ns   ctxtr   s   intrs   softirqr   )r   r   r®   r»   r}   r   Z	scpustats)r™   Zctx_switchesZ
interruptsZsoft_interruptsrÀ   Zsyscallsr@   r@   rA   Ú	cpu_stats¬  s&    


ÿ$ÿrø   c               	   C   sh   g } t dtƒ  ƒB}|D ],}| ¡  d¡r|  t| dd¡d ƒ¡ qW d  ƒ n1 sZ0    Y  | S )z<Return current CPU frequency from cpuinfo if available.
    rß   s   cpu mhzó   :r   N)r   r   râ   r®   r—   r×   r}   )r«   r™   rÀ   r@   r@   rA   Ú_cpu_get_cpuinfo_freqÁ  s    :rú   z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	      C   sò   t ƒ } t d¡pt d¡}|jdd„ d g }tjj}t|ƒD ]®\}}t|ƒt| ƒkrd| | d }nt||dƒdd	}|du r t||d
ƒdd	}|du r t	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]*/cpufreqc                 S   s   t t d| ¡ ¡ ƒS )Nz[0-9]+)r»   rã   rç   Úgroup)rI   r@   r@   rA   Ú<lambda>×  r³   zcpu_freq.<locals>.<lambda>)rõ   iè  Zscaling_cur_freqN©r¿   Zcpuinfo_cur_freqz!can't find current frequency fileZscaling_max_freqZscaling_min_freq)rú   rì   Úsortr{   ra   rÉ   Ú	enumerater–   r   ÚNotImplementedErrorr»   r—   r   Úscpufreq)	Zcpuinfo_freqsÚpathsr«   ÚpjoinÚira   ÚcurrZmax_Zmin_r@   r@   rA   Úcpu_freqÎ  s,    
þÿr  c                   C   s   dd„ t ƒ D ƒS )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        c                 S   s   g | ]}t  |d d ¡‘qS )rž   )r   r  r°   r@   r@   rA   r²   ó  r³   zcpu_freq.<locals>.<listcomp>)rú   r@   r@   r@   rA   r  ï  s    c                   @   s   e Zd ZdS )Ú_Ipv6UnsupportedErrorN)r=   r>   r?   r@   r@   r@   rA   r  þ  s   r  c                   @   sZ   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZeddd„ƒZ	eddd„ƒZ
ddd„Zd
S )ÚConnectionsaw  A 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                 C   s˜   dt jt jf}dt jt jf}dt jt jf}dt jt jf}dt jd f}|||||f||f|f|f||f|f|f|f||||f||f||fdœ| _d | _d S )NÚtcpÚtcp6ÚudpÚudp6Úunix)Úallr	  Útcp4r
  r  Úudp4r  r  ÚinetZinet4Zinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)Úselfr  r
  r  r  r  r@   r@   rA   Ú__init__  s$    
õzConnections.__init__c                 C   sê   t tƒ}t d| j|f ¡D ]È}ztd| j||f ƒ}W nv ttfyR   Y qY q ty® } zF|j	t	j
krxW Y d }~q|j	t	jkr˜t|ƒ W Y d }~q‚ W Y d }~qd }~0 0 | d¡r|dd … d d… }||  |t|ƒf¡ q|S )Nú%s/%s/fdú%s/%s/fd/%szsocket:[r‘   éÿÿÿÿ)r   Úlistr{   Úlistdirr  r|   r   r!   r¥   r­   ÚEINVALÚENAMETOOLONGr   r®   r—   r»   )r  r§   Úinodesrb   ÚinoderÓ   r@   r@   rA   Úget_proc_inodes%  s"    
zConnections.get_proc_inodesc                 C   sF   i }t ƒ D ]6}z| |  |¡¡ W q
 tttfy>   Y q
Y q
0 q
|S ©N)ÚpidsÚupdater%  r   r!   r    )r  r#  r§   r@   r@   rA   Úget_all_inodes?  s    
zConnections.get_all_inodesc              	   C   sø   |   d¡\}}t|dƒ}|s dS tr.| d¡}|tjkrntrZt |t 	|¡ddd… ¡}qìt |t 	|¡¡}n~t 	|¡}zRtr¤t tj
tjdgt d|¡¢R Ž ¡}n$t tj
tjdgt d|¡¢R Ž ¡}W n  tyê   tƒ sät‚n‚ Y n0 t ||¡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   Úencoder  r  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoder  ÚstructÚpackÚunpackrá   r   r  r   Úaddr)r5  ÚfamilyÚipÚportr@   r@   rA   Údecode_addressO  s4    



þþzConnections.decode_addressNc                 c   sN  |   d¡rtj | ¡sdS t| ƒ}| ¡  t|dƒD ]ð\}}z(| ¡ dd… \
}}	}
}}}}}}}W n$ tyŒ   t	d| ||f ƒ‚Y n0 ||v r¨|| d \}}nd\}}|durÄ||krÄq8q8|t
jkrØt| }ntj}zt |	|¡}	t |
|¡}
W n ty   Y q8Y n0 ||||	|
||fV  q8W d  ƒ n1 s@0    Y  dS )z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nr   r“   z,error while parsing %s; malformed line %s %rr   ©Nr  )r~   r{   ra   Úexistsr   r•   rÿ   r}   rá   ÚRuntimeErrorr  r  ÚTCP_STATUSESr   Ú	CONN_NONEr  r9  r  )Úfiler6  Útype_r#  Ú
filter_pidr™   ÚlinenorÀ   rÒ   ÚladdrÚraddrÚstatusr$  r§   rb   r@   r@   rA   Úprocess_inet‚  s8    ÿÿÿ



zConnections.process_inetc              
   c   s  t | ƒø}| ¡  |D ]Ú}| ¡ }z|dd… \}}}}}}}	W n. tyn   d|vrZY qtd| |f ƒ‚Y n0 |	|v r‚||	 }
ndg}
|
D ]b\}}|dur¨||kr¨qŒqŒt|ƒdkr¾|d }nd	}t t|ƒ¡}d	}tj	}|||||||fV  qŒqW d  ƒ n1 s0    Y  dS )
zParse /proc/net/unix files.r   é   ro   z)error while parsing %s; malformed line %rr;  Nr‘   r  Ú )
r   r•   r}   rá   r=  r–   r   Zsocktype_to_enumr»   r?  )r@  r6  r#  rB  r™   rÀ   ÚtokensrÒ   rA  r$  Úpairsr§   rb   ra   rE  rF  r@   r@   rA   Úprocess_unixª  s6    
ÿÿ


zConnections.process_unixc                 C   s  || j vr,td|d dd„ | j D ƒ¡f ƒ‚tƒ | _|d urP|  |¡}|sXg S n|  ¡ }tƒ }| j | D ]¢\}}}d| j|f }|tj	tj
fv r¦| j|||||d}	n| j||||d}	|	D ]L\}
}}}}}}|rèt |
|||||¡}nt |
||||||¡}| |¡ q¼qht|ƒS )Nz+invalid %r kind argument; choose between %srÆ   c                 S   s   g | ]}t |ƒ‘qS r@   )Úreprr°   r@   r@   rA   r²   Ó  r³   z(Connections.retrieve.<locals>.<listcomp>z	%s/net/%s)rB  )r  rá   rÉ   r   r  r%  r)  rë   r  r  r  rG  rL  r   ÚpconnZsconnrí   r  )r  Úkindr§   r#  r«   Z
proto_namer6  rA  ra   rð   rb   rD  rE  rF  Z	bound_pidÚconnr@   r@   rA   ÚretrieveÐ  s<    
ÿ

ÿÿÿÿzConnections.retrieve)N)N)N)r=   r>   r?   Ú__doc__r  r%  r)  Ústaticmethodr9  rG  rL  rQ  r@   r@   r@   rA   r    s   
2'%r  r  c                 C   s
   t  | ¡S )z$Return system-wide open connections.)Ú_connectionsrQ  )rO  r@   r@   rA   Únet_connectionsó  s    rU  c                  C   sØ   t dtƒ  ƒ} |  ¡ }W d  ƒ n1 s,0    Y  i }|dd… D ]Œ}| d¡}|dkshJ t|ƒƒ‚|d|…  ¡ }||d d…  ¡  ¡ }tt|ƒ\}}}	}
}}}}}}}}}}}}|||||	||
|f||< qF|S )zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z
%s/net/devNr;   r*  r   r   )	r   r   Ú	readlinesÚrfindrM  rº   r}   Úmapr»   )r™   ÚlinesÚretdictrÀ   ÚcolonrŒ   r›   Z
bytes_recvZpackets_recvZerrinZdropinZfifoinZframeinZcompressedinZmulticastinZ
bytes_sentZpackets_sentZerroutZdropoutZfifooutZcollisionsoutZ
carrieroutZcompressedoutr@   r@   rA   Únet_io_countersø  s:    &
ðÿ
r\  c                  C   sÂ   t jtt jtt jti} tƒ  ¡ }i }|D ]”}z&t	 
|¡}t	 |¡}t  |¡\}}W n< tyŽ } z$|jtjkrr‚ nt|ƒ W Y d}~q(d}~0 0 d |¡}	d|v }
t |
| | |||	¡||< q(|S )z)Get NIC stats (isup, duplex, speed, mtu).Nú,Úrunning)rÐ   ZDUPLEX_FULLr
   ZDUPLEX_HALFr   ZDUPLEX_UNKNOWNr   r\  ÚkeysÚ
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedr¥   r­   ZENODEVr   rÉ   r   Z	snicstats)Z
duplex_mapÚnamesr«   rŒ   Zmture   ZduplexÚspeedrÓ   Zoutput_flagsZisupr@   r@   rA   Únet_if_stats  s*    þ



ÿ
rc  Fc                 C   s®   dd„ }dd„ }t j dtƒ  ¡r*|ƒ }n"t j d¡r>|ƒ }ntdtƒ  ƒ‚i }|D ]T}|\
}}}}	}
}}}}}| s~t|ƒs~qT|	t9 }	|
t9 }
|||	|
|||||f	||< qT|S )zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c                  s   sD  t dtƒ  ƒ} |  ¡ }W d   ƒ n1 s,0    Y  |D ]}| ¡ }t|ƒ}|dkr”|d }t|d ƒ}tt|dd… ƒ\
}}}	}
}}}}}}n|dks¤|dkrÖ|d }tt|dd… ƒ\}}}}	}
}}}}}}nN|dkr|d }tt|dd … ƒ\}}}
}d	 }	 } } }}ntd
| ƒ‚|||
|||	||||f
V  q:d S )Nú%s/diskstatsé   r$   r;   r%   é   é   rH  r   z!not sure how to interpret line %r)r   r   rV  r}   r–   r»   rX  rá   )r™   rY  rÀ   r›   ZflenrŒ   ÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚwrites_mergedÚwbytesÚwtimerÒ   r_   r@   r@   rA   Úread_procfsC  s4    &
ÿ
ÿÿ
ÿ
ÿz%disk_io_counters.<locals>.read_procfsc                  s   sÌ   t  d¡D ]¼} t  t j d| ¡¡D ]¢\}}}d|vr6q"tt j |d¡ƒ }| ¡  ¡  ¡ }W d   ƒ n1 sn0    Y  t j 	|¡}t
t|d d… ƒ\
}}}	}
}}}}}}||||	||
||||f
V  q"q
d S )Nú
/sys/blockÚstatr“   )r{   r   Úwalkra   rÉ   r   rî   rº   r}   ÚbasenamerX  r»   )ÚblockÚrootrÒ   Úfilesr™   r›   rŒ   rh  ri  rj  rk  rl  rm  rn  ro  r_   r@   r@   rA   Ú
read_sysfsn  s    .ÿÿz$disk_io_counters.<locals>.read_sysfsrd  rq  zC%s/diskstats nor /sys/block filesystem are available on this system)r{   ra   r<  r   r   r   ÚDISK_SECTOR_SIZE)Zperdiskrp  rx  ÚgenrZ  rÜ   rŒ   rh  rl  rj  rn  rk  ro  ri  rm  r_   r@   r@   rA   Údisk_io_counters?  s0    +ÿÿÿÿ
r{  c                   @   s@   e Zd ZdZddgZdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚRootFsDeviceFinderaE  disk_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Úminorc                 C   s(   t  d¡j}t  |¡| _t  |¡| _d S )Nrˆ   )r{   rr  Úst_devr}  r~  )r  Údevr@   r@   rA   r  §  s    zRootFsDeviceFinder.__init__c                 C   sÐ   t dtƒ  ƒ®}| ¡ dd … D ]Œ}| ¡ }t|ƒdk r:q |d  ¡ rRt|d ƒnd }|d  ¡ rnt|d ƒnd }|d }|| jkr || jkr |r d|   W  d   ƒ S q W d   ƒ n1 sÂ0    Y  d S )Nz%s/partitionsr;   r%   r   r   r$   ú/dev/%s)	r   r   rV  r}   r–   Úisdigitr»   r}  r~  )r  r™   rÀ   r›   r}  r~  rŒ   r@   r@   rA   Úask_proc_partitions¬  s    z&RootFsDeviceFinder.ask_proc_partitionsc                 C   s€   d| j | jf }t|ƒT}|D ]>}| d¡r| ¡  d¡d }|rd|   W  d   ƒ S qW d   ƒ n1 sr0    Y  d S )Nz/sys/dev/block/%s:%s/ueventzDEVNAME=r;   r  )r}  r~  r   r®   rº   Ú
rpartition)r  ra   r™   rÀ   rŒ   r@   r@   rA   Úask_sys_dev_block¹  s    

z$RootFsDeviceFinder.ask_sys_dev_blockc              	   C   s²   d| j | jf }t d¡}|D ]Ž}zt|ƒ}W n tyD   Y qY q0 |R | ¡  ¡ }||krŽtj	 
tj	 |¡¡}d| W  d   ƒ   S W d   ƒ q1 s¢0    Y  qd S )Nz%s:%sz/sys/class/block/*/devr  )r}  r~  rì   Úiglobr   r   rî   rº   r{   ra   rt  Údirname)r  Úneedlerw  r@  r™   ÚdatarŒ   r@   r@   rA   Úask_sys_class_blockÂ  s    

z&RootFsDeviceFinder.ask_sys_class_blockc              
   C   sò   d }|d u rJz|   ¡ }W n0 ttfyH } zt|ƒ W Y d }~n
d }~0 0 |d u rz|  ¡ }W n0 ttfyŽ } zt|ƒ W Y d }~n
d }~0 0 |d u rÖz|  ¡ }W n0 ttfyÔ } zt|ƒ W Y d }~n
d }~0 0 |d urîtj |¡rî|S d S r&  )	rƒ  r¹   r¥   r   r…  rŠ  r{   ra   r<  )r  ra   rÓ   r@   r@   rA   ÚfindÑ  s$    zRootFsDeviceFinder.findN)
r=   r>   r?   rR  Ú	__slots__r  rƒ  r…  rŠ  r‹  r@   r@   r@   rA   r|  ž  s   	r|  c              	   C   s@  t ƒ }tƒ }td| ƒ\}|D ]F}| ¡ }| d¡sD| | ¡ ¡ q| d¡d }|dkr| d¡ qW d  ƒ n1 sz0    Y  |dkr¦tj 	d¡r¦tj 
d¡}ntj 
d	| ¡}g }t |¡}|D ]r}	|	\}
}}}|
d
kräd}
|
dv rútƒ  ¡ pø|
}
| s|
dksÈ||vrqÈd }}t |
|||||¡}| |¡ qÈ|S )z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodevú	r   ZzfsNr   z	/etc/mtabz%s/self/mountsÚnonerI  )z	/dev/rootZrootfs)rë   r   r   rº   r®   rí   r}   r{   ra   ÚisfileÚrealpathrÐ   Údisk_partitionsr|  r‹  r   Z	sdiskpartr—   )r  Zfstypesr˜   r™   rÀ   ZfstypeZmounts_pathÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointÚoptsZmaxfileZmaxpathÚntupler@   r@   rA   r‘  è  s<    
*
ÿr‘  c                  C   s`  t  t¡} t d¡}| t d¡¡ ttdd„ |D ƒƒƒ}t d¡}t d¡}|D ]"}| 	d|¡}||vrR| 
|¡ qR|D ]}z>|d }tt|ƒƒd	 }tj tj |¡d
¡}t|ƒ ¡ }	W n tttfyÚ   Y qzY n0 t|d dd}
t|d dd}t|d dd ¡ }|
durDzt|
ƒd	 }
W n tyB   d}
Y n0 |durxzt|ƒd	 }W n tyv   d}Y n0 | |	  
|||
|f¡ qz|sXt d¡}tt|ƒƒ}|D ]¤}z<tj |d¡}tt|ƒƒd	 }tj |d¡}t|ƒ ¡ }	W nB tttfy4 } z"t|ƒ W Y d}~q°W Y d}~n
d}~0 0 t |d ¡}tdd„ |D ƒƒ}d}d}
|D ]Ú}tj ||d ¡}t|dd ¡ }|dkr®ttj ||d ¡dd}n$|dkrÒttj ||d ¡dd}
|
durzt|
ƒd	 }
W n ty   d}
Y n0 |durbzt|ƒd	 }W n ty8   d}Y n0 qb| |	  
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*_*c                 S   s   g | ]}|  d ¡d ‘qS ©rÒ   r   ©r}   r°   r@   r@   rA   r²   (  r³   z(sensors_temperatures.<locals>.<listcomp>z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @@rŒ   Ú_maxNrý   Z_critÚ_labelrI  z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*c                 S   s,   g | ]$}d   tj |¡ d ¡dd… ¡‘qS )rÒ   r   r$   )rÉ   r{   ra   rt  r}   )r±   Úpr@   r@   rA   r²   h  s   ÿÿÚ_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   r  rì   ÚextendÚsortedrë   rã   rä   Úsubr—   r×   r   r{   ra   rÉ   r‡  r   rº   r¹   r¥   rá   r   Údict)r«   Ú	basenamesZ
basenames2ÚreplrŒ   ZaltnameÚbasera   rª   Ú	unit_namer¡  rŸ  ÚlabelrÓ   Z
trip_pathsZtrip_pointsZ
trip_pointZ	trip_typer@   r@   rA   Úsensors_temperatures  s–    

ÿ

	






$ÿ
ÿ
ÿ


r¬  c                  C   sä   t  t¡} t d¡}|s"t d¡}ttdd„ |D ƒƒƒ}|D ]ž}ztt|d ƒƒ}W n< tt	fy } z t
|ƒ W Y d}~q<W Y d}~n
d}~0 0 ttj tj |¡d¡ƒ ¡ }t|d d	d
 ¡ }| |  t ||¡¡ q<t| ƒ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*_*c                 S   s   g | ]}|  d ¡d ‘qS r–  r—  r°   r@   r@   rA   r²   —  r³   z sensors_fans.<locals>.<listcomp>r˜  NrŒ   rš  rI  rý   )r¢  r   r  rì   r¤  rë   r»   r   r¹   r¥   r   r   r{   ra   rÉ   r‡  rº   r—   r   Zsfanr¦  )r«   r§  r©  rª   rÓ   rª  r«  r@   r@   rA   Úsensors_fans†  s    



"r­  c                     sÜ  t ƒ ‰ ‡ fdd„} dd„ t t¡D ƒ}|s.dS tj tt|ƒd ¡}| |d |d ƒ}| |d	 |d
 ƒ}| |d |d ƒ}| |d ƒ}|durÀ|durÀzd| | }W qà ty¼   d}Y qà0 n tt	|d ddƒ}|dkràdS d}| tj td¡tj td¡ƒ}	|	dur|	dk}n6t	|d dd 
¡  ¡ }
|
dkr>d}n|
dv rLd}|rZtj}nt|dur |dur zt|| d ƒ}W n tyœ   tj}Y n0 n.|durÈt|d ƒ}|dk rÎtj}ntj}t |||¡S )a  Return 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 ]F}t |ˆ d}|ˆ krzt|ƒW   S  tyH   | ¡  Y   S 0 qdS )zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rý   N)r   r»   rá   rº   )r  ra   r«   ©Únullr@   rA   Ú
multi_bcat®  s    z#sensors_battery.<locals>.multi_bcatc                 S   s&   g | ]}|  d ¡sd| ¡ v r|‘qS )ZBATÚbattery)r®   râ   r°   r@   r@   rA   r²   »  s   ÿz#sensors_battery.<locals>.<listcomp>Nr   z/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@rž   z	/capacityr  rý   z
AC0/onlinez	AC/onliner   z/statusrI  ZdischargingF)ZchargingÚfullTi  é<   )Úobjectr{   r   ÚPOWER_SUPPLY_PATHra   rÉ   r¤  ÚZeroDivisionErrorr»   r   rº   râ   r   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)r°  Zbatsrv  Z
energy_nowZ	power_nowZenergy_fullZtime_to_emptyrQ   Zpower_pluggedZonlinerF  Zsecsleftr@   r®  rA   Úsensors_battery¥  sh    þþþþ





r·  c            
      C   s\   g } t  ¡ }|D ]F}|\}}}}}}|s*q|dv r6d}t ||pBd|||¡}	|  |	¡ q| S )z:Return currently connected users as a list of namedtuples.)z:0.0z:0Ú	localhostN)rÐ   Úusersr   Zsuserr—   )
r’  ZrawlistÚitemrr   ÚttyÚhostnameZtstampZuser_processr§   Úntr@   r@   rA   r¹    s    r¹  c                  C   s„   dt ƒ  } t| ƒ^}|D ]<}| d¡rt| ¡  ¡ d ƒ}|a|  W  d  ƒ S qtd|  ƒ‚W d  ƒ n1 sv0    Y  dS )zAReturn the system boot time expressed in seconds since the epoch.rŽ   s   btimer   Nzline 'btime' not found in %s)r   r   r®   r×   rº   r}   Ú	BOOT_TIMEr=  )ra   r™   rÀ   r«   r@   r@   rA   Ú	boot_time  s    


ÿr¿  c                   C   s   dd„ t  ttƒ ƒ¡D ƒS )z7Returns a list of PIDs currently running on the system.c                 S   s   g | ]}|  ¡ rt|ƒ‘qS r@   )r‚  r»   r°   r@   r@   rA   r²   -  r³   zpids.<locals>.<listcomp>)r{   r   r"   r   r@   r@   r@   rA   r'  +  s    r'  c              	   C   sº   t  | ¡sdS z†dtƒ | f }t|ƒ\}|D ]:}| d¡r,t| ¡ d ƒ}|| k  W  d  ƒ W S q,td| ƒ‚W d  ƒ n1 sˆ0    Y  W n  ttfy´   | t	ƒ v  Y S 0 dS )zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fú%s/%s/statuss   Tgid:r   Nz'Tgid' line not found in %s)
r   Ú
pid_existsr   r   r®   r»   r}   rá   ÚEnvironmentErrorr'  )r§   ra   r™   rÀ   Ztgidr@   r@   rA   rÁ  0  s    



.rÁ  c               
   C   s    i } t ƒ }tƒ D ]Š}z<td||f ƒ}| ¡ }W d  ƒ n1 sD0    Y  W n ttfyf   Y q0 | d¡}||d d…  ¡ }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   )	r   r'  r   rî   r   r!   rW  r}   r»   )r«   r˜   r§   r™   r‰  ÚrparZdsetÚppidr@   r@   rA   Úppid_mapP  s    
*

rÇ  c                    s   t  ˆ ¡‡ fdd„ƒ}|S )zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    c                    s”   zˆ | g|¢R i |¤ŽW S  t y8   t| j| jƒ‚Y nX tyV   t| j| jƒ‚Y n: tyŽ   tj 	d| j
| jf ¡sˆt| j| jƒ‚‚ Y n0 d S )Nú%s/%s)r    r   r§   Ú_namer!   r   r   r{   ra   r<  r  )r  ÚargsÚkwargs©Úfunr@   rA   Úwrapperj  s    z wrap_exceptions.<locals>.wrapper)Ú	functoolsÚwraps)rÍ  rÎ  r@   rÌ  rA   Úwrap_exceptionsf  s    rÑ  c                   @   sˆ  e Zd ZdZg d¢Zdd„ Zdd„ Zeedd„ ƒƒZ	eed	d
„ ƒƒZ
eedd„ ƒƒZdd„ Zdd„ Zedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZej de ¡  ¡r¼edd„ ƒZedd„ ƒZed d!„ ƒZed`d#d$„ƒZed%d&„ ƒZed'd(„ ƒZeserBed)d*„ ƒZee  !d+¡e  !d,¡e  !d-¡fd.d/„ƒZ"d0d1„ Z#neZ#erXed2d3„ ƒZ$ed4d5„ ƒZ%ee  !d6¡fd7d8„ƒZ&ee  !d9¡fd:d;„ƒZ'ed<d=„ ƒZ(ed>d?„ ƒZ)ed@dA„ ƒZ*e+räedBdC„ ƒZ,e  !dD¡fdEdF„Z-edGdH„ ƒZ.e/redIdJ„ ƒZ0edKdL„ ƒZ1e2d"uredadMdN„ƒZ3edOdP„ ƒZ4edQdR„ ƒZ5edbdTdU„ƒZ6edVdW„ ƒZ7edXdY„ ƒZ8ee  !dZ¡fd[d\„ƒZ9ee  !d]¡fd^d_„ƒZ:d"S )cÚProcesszLinux process implementation.)r§   rÉ  Ú_ppidr  Ú_cachec                 C   s   || _ d | _d | _tƒ | _d S r&  )r§   rÉ  rÓ  r   r  )r  r§   r@   r@   rA   r  €  s    zProcess.__init__c                 C   s   t  d| j| jf ¡ dS )z+Raise NSP if the process disappeared on us.rÈ  N)r{   rr  r  r§   ©r  r@   r@   rA   Ú_assert_alive†  s    zProcess._assert_alivec                 C   sÐ   t d| j| jf ƒ}| d¡}|| d¡d |… }||d d…  ¡ }i }||d< |d |d	< |d |d
< |d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |S )aY  Parse /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Ä  ó   (r   r;   NrŒ   r   rF  rÆ  r%   Úttynré   Úutimeé   Ústimeé   Úchildren_utimerf  Úchildren_stimeé   Úcreate_timeé$   Úcpu_numé'   Úblkio_ticks)r   r  r§   rW  r‹  r}   )r  r‰  rÅ  rŒ   r›   r«   r@   r@   rA   Ú_parse_stat_fileŒ  s"    
zProcess._parse_stat_filec                 C   s@   t d| j| jf ƒ}| ¡ W  d  ƒ S 1 s20    Y  dS )zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rÀ  N)r   r  r§   rî   ©r  r™   r@   r@   rA   Ú_read_status_file®  s    zProcess._read_status_filec                 C   sD   t d| j| jf ƒ}| ¡  ¡ W  d   ƒ S 1 s60    Y  d S )Nz%s/%s/smaps)r   r  r§   rî   rº   rç  r@   r@   rA   Ú_read_smaps_file¸  s    zProcess._read_smaps_filec                 C   s(   | j  | ¡ | j | ¡ | j | ¡ d S r&  )ræ  Zcache_activaterè  ré  rÕ  r@   r@   rA   Úoneshot_enter¾  s    zProcess.oneshot_enterc                 C   s(   | j  | ¡ | j | ¡ | j | ¡ d S r&  )ræ  Zcache_deactivaterè  ré  rÕ  r@   r@   rA   Úoneshot_exitÃ  s    zProcess.oneshot_exitc                 C   s   |   ¡ d }trt|ƒ}|S )NrŒ   )ræ  r   r   )r  rŒ   r@   r@   rA   rŒ   È  s    zProcess.namec              	   C   sš   zt d| j| jf ƒW S  ttfyv   tj d| j| jf ¡rFY dS t| jƒs`t	| j| j
ƒ‚nt| j| j
| jƒ‚Y n  ty”   t| j| j
ƒ‚Y n0 d S )Nz	%s/%s/exerÈ  rI  )r|   r  r§   r   r!   r{   ra   ÚlexistsrÁ  r   rÉ  r   rÓ  r    r   rÕ  r@   r@   rA   ÚexeÐ  s    
zProcess.exec                 C   s    t d| j| jf ƒ}| ¡ }W d   ƒ n1 s20    Y  |sDg S | d¡rRdnd}| |¡rl|d d… }| |¡}|dkrœt|ƒdkrœd|v rœ| d¡}|S )Nz%s/%s/cmdlinerw   ro   r  r   )r   r  r§   rî   r~   r}   r–   )r  r™   r‰  ÚsepÚcmdliner@   r@   rA   rï  á  s    &


zProcess.cmdlinec                 C   sD   t d| j| jf ƒ}| ¡ }W d   ƒ n1 s20    Y  t|ƒS )Nz%s/%s/environ)r   r  r§   rî   r   )r  r™   r‰  r@   r@   rA   Úenvironú  s    &zProcess.environc                 C   s<   t |  ¡ d ƒ}t ¡ }z
|| W S  ty6   Y d S 0 d S )NrØ  )r»   ræ  r   Zget_terminal_mapr¸   )r  Ztty_nrr  r@   r@   rA   Úterminal   s    
zProcess.terminalz/proc/%s/ioc              
   C   s  d| j | jf }i }t|ƒ\}|D ]F}| ¡ }|r"z| d¡\}}W n tyZ   Y q"Y q"0 t|ƒ||< q"W d   ƒ n1 s~0    Y  |s˜td| ƒ‚z,t|d |d |d |d |d |d	 ƒW S  t	y  } z"td
|d ||f ƒ‚W Y d }~n
d }~0 0 d S )Nz%s/%s/ios   : z%s file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharz1%r field was not found in %s; found fields are %rr   )
r  r§   r   rº   r}   rá   r»   r=  rp   r¸   )r  Úfnamer›   r™   rÀ   rŒ   rö   rÓ   r@   r@   rA   Úio_counters  s4    

,úÿzProcess.io_countersc                 C   sh   |   ¡ }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Ø   rq   )r  rš   rÚ  rÜ  rÞ  rß  rv   r@   r@   rA   rÚ   *  s    zProcess.cpu_timesc                 C   s   t |  ¡ d ƒS )zWhat CPU the process is on.rã  ©r»   ræ  rÕ  r@   r@   rA   rã  4  s    zProcess.cpu_numNc                 C   s   t  | j|| j¡S r&  )r   Zwait_pidr§   rÉ  )r  Útimeoutr@   r@   rA   Úwait9  s    zProcess.waitc                 C   s&   t |  ¡ d ƒ}tptƒ }|t | S )Nrá  )r×   ræ  r¾  r¿  rØ   )r  ÚctimeZbtr@   r@   rA   rá  =  s    
zProcess.create_timec           	      C   st   t d| j| jf ƒ<}dd„ | ¡  ¡ d d… D ƒ\}}}}}}}W d   ƒ n1 sV0    Y  t|||||||ƒS )Nz%s/%s/statmc                 S   s   g | ]}t |ƒt ‘qS r@   )r»   r¼   r°   r@   r@   rA   r²   W  r³   z'Process.memory_info.<locals>.<listcomp>rH  )r   r  r§   r•   r}   rf   )	r  r™   Zvmsrl   rX   ÚtextÚlibr‰  Zdirtyr@   r@   rA   Úmemory_infoH  s    ÿ.zProcess.memory_infoc                 C   sú   d } }}z¤t d | j| j¡ƒ|}|D ]f}| d¡rP|t| ¡ d ƒd 7 }q(| d¡rpt| ¡ d ƒd }q(| d¡r(t| ¡ d ƒd }q(W d   ƒ n1 s¤0    Y  W n> tyî   t| jƒsØt	| j| j
ƒ‚nt| j| j
| jƒ‚Y n0 |||fS )Nr   z{}/{}/smaps_rollups   Private_r   rÄ   ó   Pss:ó   Swap:)r   Úformatr  r§   r®   r»   r}   r!   rÁ  r   rÉ  r   rÓ  )r  rh   ri   rj   r™   rÀ   r@   r@   rA   Ú_parse_smaps_rollup\  s$    ÿ


8
zProcess._parse_smaps_rollups   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 C   sZ   |   ¡ }ttt| |¡ƒƒd }ttt| |¡ƒƒd }ttt| |¡ƒƒd }|||fS )NrÄ   )ré  rï   rX  r»   Úfindall)r  Z_private_reZ_pss_reZ_swap_reZ
smaps_datarh   ri   rj   r@   r@   rA   Ú_parse_smapst  s
    zProcess._parse_smapsc                 C   s<   t r|  ¡ \}}}n|  ¡ \}}}|  ¡ }t||||f Ž S r&  )ÚHAS_PROC_SMAPS_ROLLUPrþ  r   rú  rg   )r  rh   ri   rj   Z	basic_memr@   r@   rA   Úmemory_full_info’  s
    zProcess.memory_full_infoc                 C   sR  dd„ }|   ¡ }|sg S | d¡}g }| d¡}|g}|||ƒD ]
\}}| dd¡}z|\}	}
}}}}W n( ty’   |dg \}	}
}}}}Y n0 |sžd}n2trªt|ƒ}| ¡ }| d	¡rÐt|ƒsÐ|dd
… }| 	t|	ƒt|
ƒ|| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡| 
dd¡f¡ q@|S )aP  Return 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              	   s   s¤   i }| D ]ˆ}|  d d¡}|d  d¡s@| ¡ |fV  | |¡ qzt|d ƒd ||d < W q tyŽ   |d  d¡r~Y qntd| ƒ‚Y q0 q| ¡ |fV  d S )Né   r   rù   r   rÄ   s   VmFlags:z#don't know how to interpret line %r)r}   r~   Úpopr—   r»   rá   r®   )rY  Úcurrent_blockr‰  rÀ   r›   r@   r@   rA   Ú
get_blocks¨  s    ÿz'Process.memory_maps.<locals>.get_blocksó   
r   Nr  rI  z[anon]rx   ry   s   Rss:s   Size:rû  s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:rü  )ré  r}   r  rá   r   r   rº   r~   r   r—   r·   )r  r  r‰  rY  rð   Ú
first_liner  ÚheaderZhfieldsr5  ZpermsÚoffsetr€  r$  ra   r@   r@   rA   Úmemory_mapsŸ  sL    	

ÿ
ÿ









õzProcess.memory_mapsc              	   C   s^   zt d| j| jf ƒW S  ttfyX   t| jƒsBt| j| jƒ‚nt| j| j| j	ƒ‚Y n0 d S )Nz	%s/%s/cwd)
r|   r  r§   r   r!   rÁ  r   rÉ  r   rÓ  rÕ  r@   r@   rA   Úcwdã  s    
zProcess.cwds   ctxt_switches:\t(\d+)c                 C   sL   |   ¡ }| |¡}|s,td| j| jf ƒ‚nt t|d ƒt|d ƒ¡S 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.23r   r   )rè  rÿ  r   r  r§   r   Zpctxswr»   )r  Z	_ctxsw_rer‰  Zctxswr@   r@   rA   Únum_ctx_switchesî  s    
ÿþÿzProcess.num_ctx_switchess   Threads:\t(\d+)c                 C   s   |   ¡ }t| |¡d ƒS ©Nr   )rè  r»   rÿ  )r  Z_num_threads_rer‰  r@   r@   rA   Únum_threadsü  s    zProcess.num_threadsc              
   C   s  t  d| j| jf ¡}| ¡  g }d}|D ]Ê}d| j| j|f }z8t|ƒ}| ¡  ¡ }W d   ƒ n1 sl0    Y  W n tt	fy–   d}Y q*Y n0 || 
d¡d d … }| 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§   rþ   r   rî   rº   r   r!   r‹  r}   r×   rØ   r   Zpthreadr»   r—   rÖ  )r  Z
thread_idsr’  Ú
hit_enoentÚ	thread_idrò  r™   Ústrš   rÚ  rÜ  r•  r@   r@   rA   Úthreads  s.    
ÿ
.

zProcess.threadsc                 C   s   t  | j¡S r&  )r`  Úgetpriorityr§   rÕ  r@   r@   rA   Únice_get   s    zProcess.nice_getc                 C   s   t  | j|¡S r&  )r`  Úsetpriorityr§   )r  rö   r@   r@   rA   Únice_set)  s    zProcess.nice_setc                 C   s   t  | j¡S r&  )rÐ   r6   r§   rÕ  r@   r@   rA   Úcpu_affinity_get0  s    zProcess.cpu_affinity_gets   Cpus_allowed_list:\t(\d+)-(\d+)c                 C   sV   |   ¡ }| |¡}|r@ttt|d d ƒt|d d ƒd ƒƒS ttttƒ ƒƒƒS d S )Nr   r   )rè  rÿ  r  Úranger»   r–   rÝ   )r  Ú_rer‰  rå   r@   r@   rA   Ú_get_eligible_cpus4  s
    
*zProcess._get_eligible_cpusc              
   C   s¬   zt  | j|¡ W n” ttfy¦ } zxt|tƒs<|jtjkr|  ¡ }t	t
ttƒ ƒƒƒ}|D ]4}||vrvtd||f ƒ‚||vrZtd||f ƒ‚qZ‚ W Y d }~n
d }~0 0 d S )Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s)rÐ   Zproc_cpu_affinity_setr§   r¥   rá   rz   r­   r!  r  Útupler  r–   rÝ   )r  rÛ   rÓ   Zeligible_cpusZall_cpusÚcpur@   r@   rA   Úcpu_affinity_set>  s(    ÿÿÿÿzProcess.cpu_affinity_setc                 C   s,   t  | j¡\}}td ur t|ƒ}t ||¡S r&  )rÐ   r5   r§   Úenumr<   r   Zpionice©r  Zioclassrö   r@   r@   rA   Ú
ionice_getT  s    zProcess.ionice_getc                 C   sP   |d u rd}|r(|t tfv r(td| ƒ‚|dk s8|dkr@tdƒ‚t | j||¡S )Nr   z%r ioclass accepts no valuerH  zvalue not in 0-7 range)r)   r&   rá   rÐ   Zproc_ioprio_setr§   r   r@   r@   rA   Ú
ionice_set[  s    zProcess.ionice_setc              
   C   s¬   | j dkrtdƒ‚zD|d u r*t| j |ƒW S t|ƒdkrFtdt|ƒ ƒ‚t| j ||ƒ W nP ty¦ } z8|jtjkrt| j ƒrt	| j | j
| jƒ‚n‚ W Y d }~n
d }~0 0 d S )Nr   z)can't use prlimit() against PID 0 processr;   z4second argument must be a (soft, hard) tuple, got %s)r§   rá   rŸ   r–   rM  r¥   r­   ZENOSYSrÁ  r   rÉ  rÓ  )r  r¨   r©   rÓ   r@   r@   rA   Úrlimitg  s     
ÿÿzProcess.rlimitc                 C   s$   |   ¡ d }tr| ¡ }t |d¡S )NrF  ú?)ræ  r   r   ÚPROC_STATUSESr·   )r  Úletterr@   r@   rA   rF    s    zProcess.statusc                 C   sš  g }t  d| j| jf ¡}d}|D ]b}d| j| j|f }zt|ƒ}W nz ttfyd   d}Y q"Y q" tyÀ } zF|jtj	krŠW Y d }~q"|jtj
krªt|ƒ W Y d }~q"‚ W Y d }~q"d }~0 0 | d¡r"t|ƒr"d| j| j|f }zXt|ƒ:}t| ¡  ¡ d ƒ}	t| ¡  ¡ d dƒ}
W d   ƒ n1 s20    Y  W n ttfyZ   d}Y q"0 t|
ƒ}t|t|ƒt|	ƒ||
ƒ}| |¡ q"|r–|  ¡  |S )	Nr  Fr  Trˆ   z%s/%s/fdinfo/%sr   r‘   )r{   r   r  r§   r|   r   r!   r¥   r­   r!  r"  r   r®   r   r   r»   r•   r}   r‡   r`   r—   rÖ  )r  r’  rw  r  rb   r@  ra   rÓ   r™   Úposre   rd   r•  r@   r@   rA   Ú
open_files‰  sF    

ÿ
:
ÿzProcess.open_filesr  c                 C   s   t  || j¡}|  ¡  |S r&  )rT  rQ  r§   rÖ  )r  rO  r«   r@   r@   rA   Úconnections¹  s    zProcess.connectionsc                 C   s   t t d| j| jf ¡ƒS )Nr  )r–   r{   r   r  r§   rÕ  r@   r@   rA   Únum_fds¿  s    zProcess.num_fdsc                 C   s   t |  ¡ d ƒS )NrÆ  rô  rÕ  r@   r@   rA   rÆ  Ã  s    zProcess.ppids   Uid:\t(\d+)\t(\d+)\t(\d+)c                 C   s6   |   ¡ }| |¡d \}}}t t|ƒt|ƒt|ƒ¡S r  )rè  rÿ  r   Zpuidsr»   )r  Z_uids_rer‰  ÚrealÚ	effectiveÚsavedr@   r@   rA   ÚuidsÇ  s    zProcess.uidss   Gid:\t(\d+)\t(\d+)\t(\d+)c                 C   s6   |   ¡ }| |¡d \}}}t t|ƒt|ƒt|ƒ¡S r  )rè  rÿ  r   Zpgidsr»   )r  Z_gids_rer‰  r+  r,  r-  r@   r@   rA   ÚgidsÍ  s    zProcess.gids)N)N)r  );r=   r>   r?   rR  rŒ  r  rÖ  rÑ  r   ræ  rè  ré  rê  rë  rŒ   rí  rï  rð  rñ  r{   ra   r<  Úgetpidró  rÚ   rã  rö  rá  rú  r  ÚHAS_PROC_SMAPSrþ  rã   rä   r   r  r  r  r  r  r  r  r  ÚHAS_CPU_AFFINITYr  r  r  ÚHAS_PROC_IO_PRIORITYr!  r"  rŸ   r#  rF  r(  r)  r*  rÆ  r.  r/  r@   r@   r@   rA   rÒ  {  s¸    



	

	




û
	
C

ÿ



ÿ




	


/

rÒ  )N)r  )F)F)¦rR  Ú
__future__r   r0  r¢  r­   rÏ  rì   r{   rã   r  r2  ÚsysÚ	tracebackrÊ   r   r   rI  r   r   r   rÐ   r	   r`  r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_compatr   r   r    r!   r"   r#   Úversion_infor  Z__extra__all__rµ  ra   r<  r0  r1  r  Úhasattrr3  r2  rà   rØ   Zgetpagesizer¼   r¾  Ú	byteorderr.  ry  Ú	AF_PACKETr:   ÚIntEnumr»   r9   r&   r'   r(   r)   r<   Úglobalsr(  Ú__members__ZSTATUS_RUNNINGZSTATUS_SLEEPINGZSTATUS_DISK_SLEEPZSTATUS_STOPPEDZSTATUS_TRACING_STOPZSTATUS_ZOMBIEZSTATUS_DEADZSTATUS_WAKE_KILLZSTATUS_WAKINGZSTATUS_IDLEZSTATUS_PARKEDr%  r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r>  rN   rZ   r`   rf   rÙ   rg   rk   rÉ   rn   rp   rq   r|   r‡   r   rœ   Ú	ExceptionÚ	print_excr”   rŸ   ÚresourceÚImportErrorr¢   ÚCDLLr¤   r£  ÚdirrÂ   rÎ   rÕ   rÚ   rÝ   rè   r÷   rø   rú   r  Znet_if_addrsr  r  rT  rU  r\  rc  Ú
disk_usager{  r|  r‘  r¬  r­  r·  r¹  r¿  r'  rÁ  rÇ  rÑ  r´  rÒ  r@   r@   r@   rA   Ú<module>   sb  





ÿ
ôõÿÿÿ
þÿÿ


ÿ	4z:*
ÿ
! o
%
_J
-qa 