
    YfW                    
   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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+m/Z/ dd#l+m0Z0 dd$l+m1Z1 e,rddl2Z2ndZ2g d%Z3d&Z4ejj                  jm                  d' ejn                         z        Z8ejj                  jm                  d( ejn                         z        Z9 e:ed)      Z; e:ed*      Z< ejz                  d+      Z> ej~                         Z@daAej                  d,k(  ZCd-ZDe2e
j                  ZFn1 e2j                  d.d/ eHe
j                        i      ZIeIj                  ZFe2	dZJdZKd0ZLd1ZMn5 G d2 d3e2j                        ZN eO       j                  eNj                         ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  d4Z]ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  d5Zi ed6g d7      Zj ed8g d9      Zk ed:g d;      Zl ed<d=      Zm ed>emj                  d?z         Zo ed@g dA      Zp edBdCdDj                  epj                        z         Zr edEg dF      Zs edGg dH      ZtdI ZudJ ZvdK Zwe#dL        Zx	  exdM       dZ|	 ddRl}m|Z| e|Ke3j                   ee      D  cg c])  } | j	                  dW      s| j                         s(| + c}        dX ZdY ZdZ Zd[ Zd\ Zd] Zd^ Zd_ Zd` Zejj                  jm                  da      sejj                  jm                  db      rdc Zndd Zej                   Z G de dfey      Z G dg dh      Z e       Zd|diZdj Zdk Zej.                  Zd}dlZ G dm dn      Zd}doZdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Z G dy dz      Zy# ey$ r'Zz edNezz           edOdP      dQdQdQ      a{Y dZz[zMdZz[zww xY w# e~$ r* ddlZ ej                   ddST      Z e:edU      rd{dVZ|Y zw xY wc c} w )~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)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      c                       e Zd ZdZdZdZdZy)
IOPriorityr   r   r;   r<   N)__name__
__module____qualname__r&   r'   r(   r)        O/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/psutil/_pslinux.pyr>   r>   z   s    rC   r>   )RSDTtZXxKWIP)0102030405060708090A0Bsvmem)total	availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskio)	
read_countwrite_count
read_byteswrite_bytes	read_time
write_timeread_merged_count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)rs   rsssizer{   shared_cleanshared_dirtyprivate_cleanprivate_dirty
referenced	anonymousr|   	pmmap_extzaddr perms  pio)ri   rj   rk   rl   
read_charswrite_chars	pcputimes)usersystemchildren_userchildren_systemiowaitc                     t        | t              sJ |        t        j                  |       } | j	                  d      d   } | j                  d      rt        |       s| dd } | S )zWrapper around os.readlink(). r   
 (deleted)N)
isinstancer$   osreadlinksplitendswithr   )rs   s    rD   r   r      s`    dJ'--';;tD ::fa D }}\"+=d+CDSzKrC   c                 J   t         j                  dt         j                  dt         j                  di}|| t         j                  t         j                  z  t         j                  z  z     }| t         j                  z  r|j                  ddd      }|j                  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)rw   	modes_maprv   s      rD   file_flags_to_moder      sz     c2;;RYYEIUbkkBKK7"))CDEDr{{||Ca(<<d#DKrC   c                     | j                  dd      } d}|rd| z  }nd| z  }t        j                  |t        j                        S )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)r   r   accessF_OK)nameincluding_virtualrs   s      rD   is_storage_devicer      sF     <<S!D%%,99T277##rC   c                 F   t        d| z        5 }|j                         j                         dd }ddd       g d}t              }|dk\  r|j	                  d       |dk\  r|j	                  d       |d	k\  r|j	                  d
       t        d|      ay# 1 sw Y   gxY w)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.
    %s/statr   N)r   nicer   idler   irqsoftirq   steal	   guest
   
guest_nice	scputimes)r   readliner   lenappendr   r   )procfs_pathfvaluesfieldsvlens        rD   set_scputimes_ntupler   	  s     
Y,	- *##%ab)*KFv;Dqygqygrzl#;/I* *s   "BB /procz ignoring exception on import: %rr   zuser system idle        )prlimitT)	use_errnor   c                     G d dt         j                        } |       }|,t        j                  | |d t        j                  |            }nY |       }|d   |_        |d   |_        t        j                  | |t        j                  |      t        j                  |            }|dk7  r3t        j                         }t        |t        j                  |            |j
                  |j                  fS )Nc                   D    e Zd Zdej                  fdej                  fgZy)prlimit.<locals>.StructRlimitrlim_currlim_maxN)r?   r@   rA   ctypes
c_longlong_fields_rB   rC   rD   StructRlimitr   ?  s%    !2!23!2!23rC   r   r   r   )r   	Structurelibcr   byrefr   r   	get_errnoOSErrorr   strerror)pid	resource_limitsr   currentretnewerrno_s           rD   r   r   >  s    v//  #nG~ll3	4g9NO #n%ay%ayllFLL$5v||G7L ax))+fbkk&&9::$$g&6&677rC   RLIMc                 d   | d   }|| j                  dd      z   }	 | d   }| d   }| d   }	 t	        d	t               z        }d}|5  |D ]C  }	|	j                         }	|	j                  d
      s%|t        |	j                         d         z  }E 	 ddd       |t        z  }||z
  }
||z   }|t        |dz  |      z  }|
|z  }
|
|t        |dz  |      z
  z  }
t        |
      S # t        $ r'}t        d|j                  d   z         |cY d}~S d}~ww xY w# t        $ r |cY S w xY w# 1 sw Y   xY w)ay  Fallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", 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

    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).

    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
       MemFree:   Cached:r   s   Active(file):s   Inactive(file):   SReclaimable:zY%s is missing from /proc/meminfo; using an approximation for calculating available memoryNz%s/zoneinfos   lowr   r;   g       @)getKeyErrorr   argsr   r   IOErrorstrip
startswithintr   PAGESIZEmin)memsra   fallbacklru_active_filelru_inactive_fileslab_reclaimableerrr   watermark_lowlineavail	pagecaches               rD   calculate_avail_vmemr   c  sr   < Ddhhz1--H
/0 !34 01(99: M	
 6 	6D::<Dv&TZZ\!_!55	66
 XM= E"33IY]M22I	YE	$4s$:M JJJEu:3  +hhqk	

   6 6s@   C" D 'D&.!D&"	D+DDDD#"D#&D/c                     g } i }t        dt               z        5 }|D ])  }|j                         }t        |d         dz  ||d   <   + 	 ddd       |d   }|d   }	 |d   }	 |d
   }||j                  dd      z  }	 |d   }		 |d   }
	 |d   }	 |d   }||z
  |z
  |z
  }|dk  r||z
  }	 |d   }|dk(  rt        |      }	 |dk  rd}| j                  d       n||kD  r|}t        ||z
  |d      }| rCdj                  |       dt        |       dk(  rdndd}t        j                  |t        d !       t        ||||||
||||	|      S # 1 sw Y   xY w# t        $ r d}| j                  d	       Y w xY w# t        $ r d}| j                  d       Y w xY w# t        $ r- 	 |d   }	n"# t        $ r d}	| j                  d       Y nw xY wY Qw xY w# t        $ r d}
| j                  d       Y nw xY w# t        $ r9 	 |d   |d   z   |d   z   }n"# t        $ r d}| j                  d       Y nw xY wY w xY w# t        $ r d}Y w xY w# t        $ r t        |      }Y w xY w)"a8  Report virtual memory stats.
    This implementation mimicks procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    
%s/meminfor      r   Ns	   MemTotal:r   s   Buffers:rd   r   r   re   s   Shmem:s
   MemShared:rf   s   Active:rb   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:rc   s   Slab:s   MemAvailable:r^   round_, z) memory stats couldn't be determined and waswerez	 set to 0r;   
stacklevel)r   r   r   r   r   r   r   r   r   joinr   warningswarnRuntimeWarningr\   )missing_fieldsr   r   r   r   r]   ra   rd   re   rf   rb   rc   rg   r`   r   r_   msgs                    rD   virtual_memoryr    s    ND	\O$55	6 4! 	4DZZ\F!&)nt3DO	44 ED){#
0j! 	$((+Q//,i(j!
.%H~ 4<& 7*Dax t|
/%& A:
 ).Eqyk*	 UU]U1=G IIn%(A-E69
 	c>a8 Y4 4  )i()  (h'(  ,	,-(F 	,F!!(+	,,  (h'(  	.	._%'(()* 
  	.H!!*-	.	.  $  +$T*+s   /EE $E= ?F  G G< I ,I EE:9E:=FF 	G*F0/G0GGGGGG98G9<	H>HH>H74H>6H77H>=H>III+*I+c                     i } t        dt               z        5 }|D ])  }|j                         }t        |d         dz  | |d   <   + 	 ddd       	 | d   }| d   }||z
  }t        ||d      }		 t        d	t               z        }|5  dx}
}|D ]r  }|j                  d
      r$t        |j                  d      d         dz  dz  }
n4|j                  d      r#t        |j                  d      d         dz  dz  }|
o|r n( d}|dz  }t        j                  |t        d       dx}
}ddd       t        j                  ||||	
      S # 1 sw Y   xY w# t        $ r* t        j                         \  }}}}}}}||z  }||z  }Y 0w xY w# 1 sw Y   fxY w# t        $ r;}ddt        |      z  z   }t        j                  |t        d       dx}
}Y d}~d}~ww xY w)zReturn swap memory metrics.r   r   r   r   Ns
   SwapTotal:s	   SwapFree:r   z	%s/vmstats   pswpin       s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r;   r   z$be determined and were set to 0 (%s))r   r   r   r   r   cextlinux_sysinfor   r   r  r  r  r   strr   sswap)r   r   r   r   r]   ra   _unit_multiplierr`   r_   sinsoutr  r   s                 rD   swap_memoryr  (  s   D	\O$55	6 4! 	4DZZ\F!&)nt3DO	44 ]#L! 4<DD%2Go&778  	C$  ??9-djj.q12Q6=C__Z0tzz$/23a7$>D?t'7 E88c>a@d%	& ==dGS$??c4 4   373E3E3G01aE4  &	 	   ;4s3x?@ 	 	c>a8dsN   /E
E 0F A5F>F*FE/FFF	G %1GG c                  D   t               } t        |        t        d| z        5 }|j                         j	                         }ddd       dt        t        j                        dz    }|D cg c]  }t        |      t        z   }}t        | S # 1 sw Y   OxY wc c}w )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.
    r   Nr   )
r   r   r   r   r   r   r   _fieldsfloatCLOCK_TICKS)r   r   r   r   rL   s        rD   	cpu_timesr  d  s     "#K%	Y,	- &##%&AI--.23F.45eAh$5F5f	& & 6s   B.BBc                     t               } t        |        g }t        d| z        5 }|j                          |D ]{  }|j	                  d      s|j                         }|dt        t        j                        dz    }|D cg c]  }t        |      t        z   }}t        | }|j                  |       } |cddd       S c c}w # 1 sw Y   yxY w)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    r   s   cpur   N)r   r   r   r   r   r   r   r   r  r  r  r   )r   cpusr   r   r   r   rL   entrys           rD   per_cpu_timesr  t  s     "#K%D	Y,	- 
	

 	#Dv&C	(9(9$:Q$>?:@AQ%([0AA!6*E"	# 
 
 B
 
s#   'C3CCCCCc                     	 t        j                  d      S # t        $ r d} t        dt	               z        5 }|D ]'  }|j                         j                  d      s#| dz  } ) 	 ddd       n# 1 sw Y   nxY w| dk(  rtt        j                  d      }t        dt	               z        5 }|D ]-  }|j                  d	      d   }|j                  |      s)| dz  } / 	 ddd       n# 1 sw Y   nxY w| dk(  rY y| cY S w xY w)
z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNr   
%s/cpuinfos	   processorr   Nzcpu\dr   r   )r   sysconf
ValueErrorr   r   lowerr   recompiler   r   match)numr   r   searchs       rD   cpu_count_logicalr'    s   zz/00 (99: 	a ::<**<81HC	 	 	 !8ZZ)F9'889 !Q !D::c?1-D||D)q!! ! ! !8
-sP    !D %A/A/&	D /A8	47D ++C(C(	D (C1	-D ;D ?D c                     t               } d}d}t        j                  |      xs t        j                  |      D ]C  }t        |      5 }| j                  |j	                         j                                ddd       E t        |       }|dk7  r|S i }i }t        dt               z        5 }|D ]f  }|j                         j                         }|s	 |d   ||d   <   i }2|j                  d      sD|j                  d	d
      \  }	}
t        |
      ||	<   h 	 ddd       t        |j                               }|xs dS # 1 sw Y   xY w# t        $ r Y zw xY w# 1 sw Y   DxY w)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p2rs   r   resultmappingcurrent_infor   keyvalues              rD   cpu_count_coresr8    sm    
B 
EB	JB		".2 % 	%!FF1668>>#$	% 	%% WF{ GL	\O$55	6 3! 	3D::<%%'D<H$=GL89
  " ??#AB!%FA!6JC(+E
L%	33$ !"F>T9	% 	%$   3 3sB   	.E-&EEE4%EE		EEEEE&c                     t        dt               z        5 } d}d}d}| D ]  }|j                  d      rt        |j	                         d         }n[|j                  d      rt        |j	                         d         }n-|j                  d      rt        |j	                         d         }||| n ddd       d}t        j                  |      S # 1 sw Y   #xY w)z*Return various CPU stats as a named tuple.r   Ns   ctxtr   s   intrs   softirqr   )r   r   r   r   r   r   	scpustats)r   ctx_switches
interruptssoft_interruptsr   syscallss         rD   	cpu_statsr?    s    	Y!22	3 q
 	Dw'"4::<?3) a1
,"%djjl1o"6(#/*		" Hj/8 % s   BC/C2C5CC#c            
         g } t        dt               z        5 }|D ]O  }|j                         j                  d      s#| j	                  t        |j                  dd      d                Q 	 ddd       | S # 1 sw Y   | S xY w)z7Return current CPU frequency from cpuinfo if available.r  s   cpu mhz   :r   N)r   r   r!  r   r   r  r   )r   r   r   s      rD   _cpu_get_cpuinfo_freqrB    s{    
C	\O$55	6 :! 	:Dzz|&&z2

5D!!4Q!789	:: J	: Js   %A9/A99Bz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	         t               } t        j                  d      xs t        j                  d      }|j                  d        g }t        j                  j
                  }t        |      D ]  \  }}t        |      t        |       k(  r	| |   dz  }nt         ||d      d      }|#t         ||d	      d      }|d
}t        |      t        |      dz  }t        t         ||d                  dz  }t        t         ||d                  dz  }	|j                  t        j                  ||	|              |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[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc                 \    t        t        j                  d|       j                               S )Nz[0-9]+)r   r"  r&  grouprL   s    rD   <lambda>zcpu_freq.<locals>.<lambda>   s    RYYy!%<%B%B%D!E rC   )r6  i  scaling_cur_freqNr   cpuinfo_cur_freqz!can't find current frequency filescaling_max_freqscaling_min_freq)rB  r,  sortr   rs   r   	enumerater   r   NotImplementedErrorr   r   r   scpufreq)
cpuinfo_freqspathsr   pjoinirs   currr  max_min_s
             rD   cpu_freqrX    s<   
 ./		:
 DYYBC 	 	

E
F ' 	;GAt5zS// %Q'$.E$(:;dK| E$(:;dK<=C-c22t9t#DtE$(:;<=DDtE$(:;<=DDJJw''dD9:#	;$ 
rC   c                  f    t               D  cg c]  } t        j                  | dd       c} S c c} w )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        r   )rB  r   rP  rF  s    rD   rX  rX    s+     8M7NO!  C-OOOs   .c                       e Zd Zy)_Ipv6UnsupportedErrorN)r?   r@   rA   rB   rC   rD   r[  r[  (  s    rC   r[  c                   ^    e Zd ZdZd Zd Zd Zed        Zed
d       Z	ed
d       Z
d
d	Zy)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                    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 | _        y )Ntcptcp6udpudp6unix)allr_  tcp4r`  ra  udp4rb  rc  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfre  r`  rf  rb  rc  s         rD   __init__zConnections.__init__8  s     v~~v'9'9:););<v~~v'8'89):):;-$dD1$<GG$<GGG4t,D\D\
	 !rC   c                    t        t              }t        j                  | j                  d|d      D ]Y  }	 t        | j                  d|d|      }|j                  d      s3|dd  d d }||   j                  |t        |      f       [ |S # t        t        f$ r Y ot        $ rU}|j                  t        j                  k(  rY d }~|j                  t        j                  k(  rt        |       Y d }~Ƃ d }~ww xY w)Nr   /fd/fd/zsocket:[r   )r   listr   listdirrq  r   r   r   r   r    r"   r   errnoEINVALENAMETOOLONGr   )rr  r   inodesrt   inoder   s         rD   get_proc_inodeszConnections.get_proc_inodesO  s    T"**4+<+<cBC 	9B9 $2C2CS"!MN  ##J/!!"IcrNE5M((#s2w8+	9, ' &'9:   99,99 2 22#Js)   BD$D,C<(C<;C<<Dc                     i }t               D ]#  }	 |j                  | j                  |             % |S # t        t        t
        f$ r Y >w xY wN)pidsupdater  r    r"   r!   )rr  r}  r   s      rD   get_all_inodeszConnections.get_all_inodesi  sY    6 	C
d22378	  &'9?K  s    5AAc           
      .   | j                  d      \  }}t        |d      }|syt        r|j                  d      }|t        j
                  k(  r`t        r0t	        j                  |t        j                  |      ddd         }nt	        j                  |t        j                  |            }nt        j                  |      }	 t        rMt	        j                  t        j                  t        j                  dgt        j                  d|             }nLt	        j                  t        j                  t        j                  dgt        j                  d|             }t#        j$                  ||      S # t        $ r t               st          w xY w)	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
        :   rB   asciiNrw  z>4Iz<4I)r   r   r   encoderj  rk  LITTLE_ENDIAN	inet_ntopbase64	b16decoderm  structpackunpackr   r   r[  r   addr)r  familyipports       rD   decode_addresszConnections.decode_addressy  s=   " ::c?D4} 7#BV^^#%%ff.>.>r.B4R4.HI%%ff.>.>r.BC!!"%B ))EEFMM%,DEB
  ))EEFMM%,DEB ||B%%  $//s   BE9 9FNc              #     K   | j                  d      r t        j                  j                  |       syt	        |       5 }|j                          t        |d      D ]  \  }}	 |j                         dd \
  }}	}
}}}}}}}||v r||   d   \  }}nd	\  }}|||k7  rB|t        j                  k(  r
t        |   }nt        j                  }	 t        j!                  |	|      }	t        j!                  |
|      }
||||	|
||f  	 ddd       y# t        $ r t        d| d|d|      w xY w# t"        $ r Y w xY w# 1 sw Y   yxY ww)
z.Parse /proc/net/tcp* and /proc/net/udp* files.6Nr   r   error while parsing ; malformed line r   r   Nrw  )r   r   rs   existsr   r   rN  r   r   RuntimeErrorrj  rl  TCP_STATUSESr   	CONN_NONEr]  r  r[  )filer  type_r}  
filter_pidr   linenor   r  laddrraddrstatusr~  r   rt   s                  rD   process_inetzConnections.process_inet  sx     ==bggnnT&:t_ "	IJJL )!Q  I

Sb) BAueVQ1aE F? %UmA.GC&GC)jC.? 2 22!-f!5!(!2!2! + : :5& I + : :5& I vueUFCHHA I"	I "	I " &/ 2 1 ! !A"	I "	IsY   =E#D?#DA
D?,D08D?	ED--D?0	D<9D?;D<<D??EEc           
   #     K   t        |       5 }|j                          |D ]  }|j                         }	 |dd \  }}}}}}}	|	|v r||	   }
ndg}
|
D ]]  \  }}|||k7  rt        |      dk(  r|d	   nd
}t        j                  t        |            }d
}t        j                  }|||||||f _  	 ddd       y# t        $ r d|vrY t	        d| d|      w xY w# 1 sw Y   yxY ww)zParse /proc/net/unix files.r      r   r  r  r  Nr   rw   )
r   r   r   r   r  r   r   socktype_to_enumr   r  )r  r  r}  r  r   r   tokensr  r  r~  pairsr   rt   rs   r  r  s                   rD   process_unixzConnections.process_unix  s6     t_ 	LJJL L	281+/Aq!Qq% F? #5ME'LE$ LGC!-*2C -0[A-=vbz2 ' 8 8U D !#!(!2!2!65$vsKKL%L	L 	L " $ &' 		L 	Ls@   C-&C!B=A1C!4	C-=C
C!CC!!C*&C-c                    || j                   vrAt        d|ddj                  | j                   D cg c]  }t        |       c}            t	               | _        || j                  |      }|sg S | j                         }t               }| j                   |   D ]  \  }}}| j
                  d|}	|t        j                  t        j                  fv r| j                  |	||||      }
n| j                  |	|||      }
|
D ]S  \  }}}}}}}|rt        j                  ||||||      }nt        j                   |||||||      }|j#                  |       U  t%        |      S c c}w )Nzinvalid z kind argument; choose between r   z/net/)r  )rp  r   r   reprr   rq  r  r  r+  rj  rk  rm  r  r  r   pconnsconnr-  rx  )rr  kindr   rL   r}  r   
proto_namer  r  rs   r0  rt   r  r  r  	bound_pidconns                    rD   retrievezConnections.retrieve  sy   tyy TYY#?DG#?@B  ,-?))#.F	((*Fe)-4 	%J"&"3"3Z@D&..&//::&&&%C '  &&tVV&LFH 	BFE5%"==FE5%D #==FE5%D 		$ Cy; $@s   E*r  )r?   r@   rA   __doc__rs  r  r  staticmethodr  r  r  r  rB   rC   rD   r]  r]  ,  s^    	!.4  2& 2&h 'I 'IR !L !LF!rC   r]  c                 ,    t         j                  |       S )z$Return system-wide open connections.)_connectionsr  )r  s    rD   net_connectionsr  #  s      &&rC   c                     t        dt               z        5 } | j                         }ddd       i }dd D ]  }|j                  d      }|dkD  sJ t	        |             |d| j                         }||dz   d j                         j                         }t        t        |      \  }}}	}
}}}}}}}}}}}}|||||	||
|f||<    |S # 1 sw Y   xY w)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rfindr  r   r   mapr   )r   linesretdictr   colonr   r   
bytes_recvpackets_recverrindropinfifoinframeincompressedinmulticastin
bytes_sentpackets_senterroutdropoutfifooutcollisionsout
carrieroutcompressedouts                          rD   net_io_countersr  (  s    
</"33	4 Gab	 $


3qy$$t*$yFU|!!#eaik"((*002* V%	
 	
7$
J NQ s   C		Cc                  0   t         j                  t        t         j                  t        t         j
                  t        i} t               j                         }i }|D ]y  }	 t        j                  |      }t        j                  |      }t        j                  |      \  }}dj                  |      }d|v }	t        j                  |	| |   |||      ||<   { |S # t         $ r3}
|
j"                  t"        j$                  k7  r t'        |
       Y d}
~
d}
~
ww xY w)z)Get NIC stats (isup, duplex, speed, mtu).,runningN)r
  DUPLEX_FULLr   DUPLEX_HALFr   DUPLEX_UNKNOWNr   r  keys
cext_posix
net_if_mtunet_if_flagsnet_if_duplex_speedr   r   	snicstatsr   rz  ENODEVr   )
duplex_mapnamesr   r   mturw   duplexspeedoutput_flagsisupr   s              rD   net_if_statsr  W  s     	///J
 ""$E
C 	''-C++D1E 44T:MFE 88E?L%D))j(%lCI" J  	yyELL(c

	s   AC	D")DDc                 x   d }d }t         j                  j                  dt               z        r |       }n=t         j                  j                  d      r |       }nt	        dt               z        i }|D ]=  }|\
  }}}}	}
}}}}}| st        |      s|	t        z  }	|
t        z  }
|||	|
|||||f	||<   ? |S )zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c               3   $  K   t        dt               z        5 } | j                         }d d d        D ]  }|j                         }t	        |      }|dk(  r2|d   }t        |d         }t        t
        |dd       \
  }}}	}
}}}}}}nj|dk(  s|dk\  r%|d   }t        t
        |dd       \  }}}}	}
}}}}}}n;|dk(  r(|d   }t        t
        |dd        \  }}}
}d	x}	x}x}x}}nt        d
|z        |||
|||	||||f
  y # 1 sw Y   xY ww)N%s/diskstats   r<   r;   r	        r  r   z!not sure how to interpret line %r)r   r   r  r   r   r   r  r   )r   r  r   r   flenr   readsreads_mergedrbytesrtimewriteswrites_mergedwbyteswtimer  rq   s                   rD   read_procfsz%disk_io_counters.<locals>.read_procfs  sZ    " ~(99: 	"aKKME	" 	;DZZ\Fv;DrzayF1I69#va|6L4vufmE1itrzay69#va|6L4feV]E1iay03C0D-vvvKLLLLL}y !Dt!KLLu	; ;-	;	" 	"s   DDCDD	Dc               3   ,  K   t        j                  d      D ]  } t        j                  t         j                  j	                  d|             D ]  \  }}}d|vrt        t         j                  j	                  |d            5 }|j                         j                         j                         }d d d        t         j                  j                  |      }t        t        d d       \
  }}}	}
}}}}}}||||	||
||||f
   y # 1 sw Y   YxY ww)N
/sys/blockstatr   )r   ry  walkrs   r   r   r.  r   r   basenamer  r   )blockrootr  filesr   r   r   r  r  r  r  r  r  r  r  rq   s                   rD   
read_sysfsz$disk_io_counters.<locals>.read_sysfs  s    ZZ- 	FE"$''"'',,|U*K"L 
Fa&rww||D&9: 6aVVX^^-335F6ww''- 47sF3BK3H1feV]E1iUFFFElM9F F
F	F6 6s   BD-D0ADDDr  r  zC%s/diskstats nor /sys/block filesystem are available on this system)r   rs   r  r   rO  r   DISK_SECTOR_SIZE)perdiskr  r  genr  r  r   r  r  r  r  r  r  r  r  rq   s                   rD   disk_io_countersr  |  s    
*;ZF 
ww~~n'889m		%l! 
 	
 G A ).	&ufffeUL906 """"u%}iA)A0 NrC   c                   6    e Zd ZdZddgZd Zd Zd Zd Zd Z	y	)
RootFsDeviceFinderaF  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                     t        j                  d      j                  }t        j                  |      | _        t        j                  |      | _        y Nr   )r   r  st_devr  r	  )rr  devs     rD   rs  zRootFsDeviceFinder.__init__  s3    ggcl!!XXc]
XXc]
rC   c                    t        dt               z        5 }|j                         dd  D ]  }|j                         }t	        |      dk  r"|d   j                         rt        |d         nd }|d   j                         rt        |d         nd }|d   }|| j                  k(  s}|| j                  k(  s|sd|z  c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Nz%s/partitionsr;   r	  r   r   r<   /dev/%s)	r   r   r  r   r   isdigitr   r  r	  )rr  r   r   r   r  r	  r   s          rD   ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions  s    )::; 
	0qab) 	0v;?*0)*;*;*=F1I4*0)*;*;*=F1I4ayDJJ&5DJJ+>(4//
	0 
	0	0
	0 
	0 
	0s$   BC(C8C;CCCc                    d| j                   d| j                  d}t        |      5 }|D ]H  }|j                  d      s|j	                         j                  d      d   }|s:d|z  c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Nz/sys/dev/block/r  z/ueventzDEVNAME=r;   r  )r  r	  r   r   r   
rpartition)rr  rs   r   r   r   s        rD   ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block   s    04

DJJGt_ 	0 0??:.::<22:>qAD(4//	0 	00	0 	0 	0s   B$B&B6BB
c                    | j                   d| j                  }t        j                  d      }|D ]  }	 t	        |      }|5  |j                         j                         }||k(  rLt        j                  j                  t        j                  j                  |            }d|z  cd d d        c S 	 d d d         y # 1 sw Y   xY w# t        $ r Y w xY w)Nr  z/sys/class/block/*/devr  )r  r	  r,  iglobr   r.  r   r   rs   r  dirnamer    )rr  needler   r  r   datar   s          rD   ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block	  s     JJ

3

34 
	0D	0dO  0668>>+Dv~!ww//0EF(4/	0 0%0 0
	00 0 % s   CA$C  C			CCc                    d }|	 | j                         }|	 | j	                         }|	 | j                         }|"t        j                  j                  |      r|S y y # t        t        f$ r}t        |       Y d }~jd }~ww xY w# t        t        f$ r}t        |       Y d }~~d }~ww xY w# t        t        f$ r}t        |       Y d }~d }~ww xY wr  )	r  r   r   r   r  r  r   rs   r  )rr  rs   r   s      rD   findzRootFsDeviceFinder.find  s    <//1 <--/ <//1
 t 4K !5 W% c


 W% c


 W% c

sE   A! B B/ !B0B  BB,B''B,/C>CCN)
r?   r@   rA   r  	__slots__rs  r  r  r  r  rB   rC   rD   r  r    s,     '"I#
000rC   r  c           	      :   t               }t               }| st        d|z        5 }|D ]n  }|j                         }|j	                  d      s |j                  |j                                D|j                  d      d   }|dk(  s^|j                  d       p 	 ddd       |dk(  r?t        j                  j                  d      r t        j                  j                  d      }n"t        j                  j                  d	|z        }g }t        j                  |      }|D ]k  }	|	\  }
}}}|
d
k(  rd}
|
dv rt               j                         xs |
}
| s
|
dk(  s||vr=dx}}t        j                   |
|||||      }|j#                  |       m |S # 1 sw Y   xY w)z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsnodev	r   zfsNr   z	/etc/mtabz%s/self/mountsnoner  )z	/dev/rootrootfs)r+  r   r   r   r   r-  r   r   rs   isfilerealpathr
  disk_partitionsr  r  r   	sdiskpartr   )rd  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsmaxfilemaxpathntuples                   rD   r&  r&  /  s   eG!#K'+56 		+! +zz|w/KK

- "ZZ-a0FE*+		+ g"''.."=gg&&{3gg&&'7+'EFG%%k2J 	+4(
FDVF,,')..0:FF|vW4  '""Jgw
 	v NE		+ 		+s   A FFFc                     t        j                  t              } t        j                  d      }|j	                  t        j                  d             t        t        |D cg c]  }|j                  d      d    c}            }t        j                  d      }t        j                  d      }|D ]*  }|j                  d|      }||vs|j                  |       , |D ]  }	 |dz   }t        t        |            d	z  }	t        j                  j!                  t        j                  j#                  |      d
      }t%        |      j'                         }
t        |dz   d      }t        |dz   d      }t%        |dz   d      j'                         }|	 t        |      d	z  }|	 t        |      d	z  }| |
   j                  ||	||f        |st        j                  d      }t        t        |            }|D ]  }	 t        j                  j!                  |d      }t        t        |            d	z  }	t        j                  j!                  |d      }t%        |      j'                         }
t        j                  |dz         }t        |D cg c]B  }dj!                  t        j                  j1                  |      j                  d      dd       D c}      }d}d}|D ]  }t        j                  j!                  ||dz         }t%        |d      j'                         }|dk(  r/t        t        j                  j!                  ||dz         d      }n3|dk(  r.t        t        j                  j!                  ||dz         d      }|	 t        |      d	z  }|	 t        |      d	z  } | |
   j                  d|	||f        t3        |       S c c}w # t(        t*        t,        f$ r Y w xY w# t,        $ r d}Y dw xY w# t,        $ r d}Y ew xY w# t(        t*        t,        f$ r}t/        |       Y d}~Fd}~ww xY wc c}w # t,        $ r d}Y w xY w# t,        $ r d}Y w xY w)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*_*r  r   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg     @@r   _maxNrI  _crit_labelr  z /sys/class/thermal/thermal_zone*temptypez/trip_point*r<   _typecritical_temphigh)collectionsr   rx  r,  extendsortedr+  r   r"  r#  subr   r  r   r   rs   r   r  r   r   r   r   r   r   r  dict)r   	basenamesrL   
basenames2replr   altnamebasers   r   	unit_namer>  r<  labelr   
trip_pathsptrip_points
trip_point	trip_types                       rD   sensors_temperaturesrP  ^  s3    
!
!$
'C		;<I TYYGHIsY?AGGCLO?@AI ?J ::?@D #((.5)#T"#
   @	(?DDJ'&0G77<< 5v>DD	)I D6MD1w6D8Ob1779T{V+   ?V3 	IugtX>?A @F II@A	3y>*	 (	ADww||D&1T
+f4ww||D&1IOO-	
 4.#89J# ))!,2237!<= K HD) (
ww||D*w*>?r288:	
*#T:+?@4 H &(T:+?@4D #$$T{V3 '(#(?V#;'(. 	N!!2wh"?@Q(	AT 9A @* *- 		 		$  
      Wj1 c

* & $#$
 & (#'(s   !O&A2O"O=*PA0P!AQ
Q'Q$"O:9O:=PPPP!Q5QQQ! Q!$Q32Q3c            
         t        j                  t              } t        j                  d      }|st        j                  d      }t	        t        |D cg c]  }|j                  d      d    c}            }|D ]  }	 t        t        |dz               }t        t        j                  j                  t        j                  j!                  |      d            j#                         }t        |dz   d	
      j#                         }| |   j%                  t'        j(                  ||              t+        |       S c c}w # t        t        f$ r}t        |       Y d}~d}~ww xY w)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*_*r  r   r5  Nr   r8  r  rI  )r?  r   rx  r,  rA  r+  r   r   r   r   r   r   r   r   rs   r   r  r   r   r   sfanrC  )r   rD  rL   rH  r   r   rI  rJ  s           rD   sensors_fansrS    s    
!
!$
'C		:;I IIEF	sY?AGGCLO?@AI <	$th/0G RWW__T%:FCDJJL	D8Ob1779Igll5':;< 9 @ ! 	#J	s   D> EE'E""E'c                  `   t               fd} t        j                  t              D cg c]'  }|j	                  d      sd|j                         v r|) }}|syt        j                  j                  t        t        |      d         } | |dz   |dz         } | |dz   |d	z         } | |d
z   |dz         } | |dz         }||
	 d|z  |z  }nt        t        |dz   d            }|dk(  ryd}	 | t        j                  j                  t        d      t        j                  j                  t        d            }
|
|
dk(  }	n:t        |dz   d      j                         j                         }|dk(  rd}	n|dv rd}	|	rt        j                  }nM||	 t        ||z  dz        }n6|$t        |dz        }|dk  r!t        j                  }nt        j                  }t        j                   |||	      S c c}w # t        $ r d}Y w xY w# t        $ r t        j                  }Y Iw xY w)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                      | D ]"  }t        |      }|k7  s	 t        |      c S  y# t        $ r |j                         cY c S w xY w)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rI  N)r   r   r   r   )rR  rs   r   nulls      rD   
multi_bcatz#sensors_battery.<locals>.multi_bcat  sW      	'Dtd+Cd{'s8O		'  " '99;&'s   
*AABATbatteryNr   z/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r   z	/capacityrw  rI  z
AC0/onlinez	AC/onliner   /statusr  dischargingF)chargingfullTi  <   )objectr   ry  POWER_SUPPLY_PATHr   r!  rs   r   rA  ZeroDivisionErrorr   r   r   r   POWER_TIME_UNLIMITEDPOWER_TIME_UNKNOWNsbattery)rW  rL   batsr  
energy_now	power_nowenergy_fulltime_to_emptyr_   power_pluggedonliner  secsleftrV  s                @rD   sensors_batteryrm    sL    8D -.<<)qwwy"8 	
D 
  77<<)6$<?;D D=0$2FGJ4,.~0EFITN2D>4IJKt&::;M :#9	j(;6G c$,r:;b=
 M
&5
&4F !TI%399;AAC]"!M++ M //		I$9	2:	1D89H 
	"}r)*a<11H--GX}==C. ! 	G	B ! 	211H	2s)   ,G:
G? H ?HHH-,H-c                      g } t        j                         }|D ]8  }|\  }}}}}t        j                  ||xs d|||      }| j	                  |       : | S )z:Return currently connected users as a list of namedtuples.N)r
  usersr   suserr   )	r+  rawlistitemr   ttyhostnametstampr   nts	            rD   ro  ro  R  s^    GjjlG +/(c8VS]]4hDr NrC   c                  
   dt               z  } t        |       5 }|D ]L  }|j                  d      st        |j	                         j                         d         }|a|c cddd       S  t        d| z        # 1 sw Y   yxY w)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  )rs   r   r   r   s       rD   	boot_timery  ]  s     ((D	T	 Ba 	Dx(DJJL..034	
B B	
 9D@AAB Bs   A9/A9*A99Bc                      t        j                  t        t                           D  cg c]  } | j	                         st        |         c} S c c} w )z7Returns a list of PIDs currently running on the system.)r   ry  r#   r   r  r   rF  s    rD   r  r  o  s3    JJq):';<Lq		CFLLLs
   AAc                 f   t        j                  |       sy	 t               d| d}t        |      5 }|D ]?  }|j	                  d      st        |j                         d         }|| k(  c cddd       S  t        d|z        # 1 sw Y   yxY w# t        t        f$ r | t               v cY S w xY w)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fr   rZ  s   Tgid:r   Nz'Tgid' line not found in %s)
r   
pid_existsr   r   r   r   r   r   EnvironmentErrorr  )r   rs   r   r   tgids        rD   r|  r|  t  s     s#	! &5%6<DT" Ga +Dx0"4::<?3  $s{*G G+ !!>!EFFG G !*- 	!$&= 	!s:   B B"B-	B 7BBB B B0/B0c                  H   i } t               }t               D ]g  }	 t        |d|d      5 }|j                         }ddd       j	                  d      }||dz   d j                         }t        |d         }|| |<   i | S # 1 sw Y   GxY w# t        t        f$ r Y w xY w)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    r   /statN   )r;   r   )	r   r  r   r.  r  r   r   r    r"   )r   r   r   r   r  rpardsetppids           rD   ppid_mapr    s     C!#Kv 	[#>?  1vvx  ::d#Dq
#))+DtAw<DCH J   !#56 	 	s'   BBBB	BB! B!c                 B     t        j                          fd       }|S )zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    c                    	  | g|i |S # t         $ r! t        | j                  | j                        t        $ r1 | j                          t        | j                  | j                        t        $ rj | j                          t        j                  j                  | j                  d| j                        s t        | j                  | j                         w xY wr  )r!   r   r   _namer"   _raise_if_zombier   r    r   rs   r  rq  )rr  r   kwargsfuns      rD   wrapperz wrap_exceptions.<locals>.wrapper  s    	t-d-f-- 	5txx44! 	6!!#$**55  	!!#77>>T->->"IJ#DHHdjj99		s
    CC")	functoolswraps)r  r  s   ` rD   wrap_exceptionsr    s'    
 __S  NrC   c                   0   e Zd ZdZg dZd Zd Zd Zd Ze	e
d               Ze	e
d               Ze	e
d	               Zd
 Zd Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Zej,                  j/                  d ej0                         z        re	d        Ze	d        Ze	d        Ze	d8d       Ze	d        Ze	d        Zese rHd Z!e	 e"jF                  d       e"jF                  d       e"jF                  d      fd       Z$e	d        Z%neZ%e re	d        Z&e	d         Z'e	 e"jF                  d!      fd"       Z(e	 e"jF                  d#      fd$       Z)e	d%        Z*e	d&        Z+e	d'        Z,e-r%e	d(        Z. e"jF                  d)      fd*Z/e	d+        Z0e1re	d,        Z2e	d-        Z3e4	e	d8d.       Z5e	d/        Z6e	d0        Z7e	d9d1       Z8e	d2        Z9e	d3        Z:e	 e"jF                  d4      fd5       Z;e	 e"jF                  d6      fd7       Z<y):ProcesszLinux process implementation.)r   r  _ppidrq  _cachec                 L    || _         d | _        d | _        t               | _        y r  )r   r  r  r   rq  )rr  r   s     rD   rs  zProcess.__init__  s"    

+-rC   c                     	 t        | j                  d| j                  d      }|j                  d      }||dz   |dz    }|dk(  S # t        t
        f$ r Y yw xY w)Nr   r  r  r;   r<      ZF)r   rq  r   r  r   r   )rr  r  r  r  s       rD   
_is_zombiezProcess._is_zombie  sg    	"(9(9488DED ::d#D$(TAX.FT>! ! 		s   %A AAc                 z    | j                         r+t        | j                  | j                  | j                        y r  )r  r   r   r  r  rr  s    rD   r  zProcess._raise_if_zombie  s,    ??$**djjAA rC   c                 `    t        j                  | j                  d| j                         y)z+Raise NSP if the process disappeared on us.r   N)r   r  rq  r   r  s    rD   _raise_if_not_alivezProcess._raise_if_not_alive  s     	4,,dhh78rC   c                 z   t        | j                  d| j                  d      }|j                  d      }||j	                  d      dz   | }||dz   d j                         }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   r;   Nr   r   r  r  r	  ttynr   utime   stime   children_utimer  children_stime   create_time$   cpu_num'   blkio_ticks)r   rq  r   r  r  r   )rr  r  r  r   r   r   s         rD   _parse_stat_filezProcess._parse_stat_file  s     D$5$5txx@A zz$DIIdOa'$/dQhj!'')Fq	HQiFayGbzGbzG &r
 &r
#BZMI#BZM
rC   c                     t        | j                  d| j                  d      5 }|j                         cddd       S # 1 sw Y   yxY w)zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        r   rZ  N)r   rq  r   r.  rr  r   s     rD   _read_status_filezProcess._read_status_file  s;     4+<+<dhhGH 	A668	 	 	s   A  A	c                     t        | j                  d| j                  d      5 }|j                         j	                         cd d d        S # 1 sw Y   y xY w)Nr   z/smaps)r   rq  r   r.  r   r  s     rD   _read_smaps_filezProcess._read_smaps_file  sB     $*;*;TXXFG 	$1668>>#	$ 	$ 	$s   AAc                     | j                   j                  |        | j                  j                  |        | j                  j                  |        y r  )r  cache_activater  r  r  s    rD   oneshot_enterzProcess.oneshot_enter  s>    ,,T2--d3,,T2rC   c                     | j                   j                  |        | j                  j                  |        | j                  j                  |        y r  )r  cache_deactivater  r  r  s    rD   oneshot_exitzProcess.oneshot_exit  s>    ..t4//5..t4rC   c                 N    | j                         d   }t        rt        |      }|S )Nr   )r  r   r   )rr  r   s     rD   r   zProcess.name"  s&    $$&v.$<DrC   c                 
   	 t        | j                  d| j                  d      S # t        t        f$ rL | j                          t        j                  j                  | j                  d| j                        rY y w xY w)Nr   z/exer  )	r   rq  r   r    r"   r  r   rs   lexistsr  s    rD   exezProcess.exe*  si    		4+<+<dhhGHH!#56 	!!# ww$*;*;TXXFG	s   $' AB Bc                    t        | j                  d| j                  d      5 }|j                         }d d d        s| j	                          g S |j                  d      rdnd}|j                  |      r|d d }|j                  |      }|dk(  r#t        |      dk(  rd|v r|j                  d      }|S # 1 sw Y   xY w)Nr   z/cmdliner   r   rw  r   )r   rq  r   r.  r  r   r   r   )rr  r   r  sepcmdlines        rD   r  zProcess.cmdline7  s    $*;*;TXXFG 	1668D	!!#I f-f3==9D**S/ &=S\Q.3$;jjoG-	 	s   B99Cc                     t        | j                  d| j                  d      5 }|j                         }d d d        t	        |      S # 1 sw Y   t	              S xY w)Nr   z/environ)r   rq  r   r.  r   )rr  r   r  s      rD   environzProcess.environQ  sL    $*;*;TXXFG 	1668D	"4((	"4((s   A

Ac                     t        | j                         d         }t        j                         }	 ||   S # t        $ r Y y w xY w)Nr  )r   r  r   get_terminal_mapr   )rr  tty_nrrp  s      rD   terminalzProcess.terminalW  sI    T**,W56((*	< 		s   7 	AAz/proc/%s/ioc           	         | j                   d| j                  d}i }t        |      5 }|D ]8  }|j                         }|s	 |j	                  d      \  }}t        |      ||<   : 	 d d d        |st        d|z        	 t        |d   |d   |d   |d   |d	   |d
         S # t        $ r Y w xY w# 1 sw Y   KxY w# t        $ r%}t        |j                  d   d|d|      d }~ww xY w)Nr   z/ios   : z%s file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )rq  r   r   r   r   r   r   r  r   r   r   )rr  fnamer   r   r   r   r7  r   s           rD   io_counterszProcess.io_countersc  s   "&"3"3TXX>EFU# 6q 
6D::<D6*.**U*;KD%
 ,/u:F4L
66 "#6#>??8$8$=)>*8$8$   * %$%6 6.   xx{E63 sG   B3B$B3!B? $	B0-B3/B00B33B<?	C- C((C-c                    | j                         }t        |d         t        z  }t        |d         t        z  }t        |d         t        z  }t        |d         t        z  }t        |d         t        z  }t        |||||      S )Nr  r  r  r  r  )r  r  r  r   )rr  r   r  r  r  r  r   s          rD   r  zProcess.cpu_times  s    &&(fWo&4fWo&4v&678;Fv&678;Fvm,-;~~vNNrC   c                 :    t        | j                         d         S )zWhat CPU the process is on.r  r   r  r  s    rD   r  zProcess.cpu_num  s     4((*9566rC   Nc                 X    t        j                  | j                  || j                        S r  )r   wait_pidr   r  )rr  timeouts     rD   waitzProcess.wait  s      7DJJ??rC   c                 v    t        | j                         d         }t        xs
 t               }|t        z  |z   S )Nr  )r  r  rx  ry  r  )rr  ctimebts      rD   r  zProcess.create_time  s8    d++-m<= %)+#r))rC   c           	          t        | j                  d| j                  d      5 }d |j                         j	                         d d D        \  }}}}}}}d d d        t              S # 1 sw Y   xY w)Nr   z/statmc              3   @   K   | ]  }t        |      t        z    y wr  )r   r   ).0rL   s     rD   	<genexpr>z&Process.memory_info.<locals>.<genexpr>  s      8&'A!8s   r  )r   rq  r   r   r   rx   )	rr  r   vmsr~   rf   textlibr  dirtys	            rD   memory_infozProcess.memory_info  s     $*;*;TXXFG 	18+,::<+=+=+?+C84CfdCu	 CfdCu==		 	s   1A00A9c                    dx}x}}t        dj                  | j                  | j                              5 }|D ]  }|j	                  d      r#|t        |j                         d         dz  z  }7|j	                  d      r t        |j                         d         dz  }h|j	                  d      szt        |j                         d         dz  } 	 d d d        |||fS # 1 sw Y   xY w)Nr   z{}/{}/smaps_rollups   Private_r   r      Pss:   Swap:)r   formatrq  r   r   r   r   )rr  rz   r{   r|   r   r   s         rD   _parse_smaps_rollupzProcess._parse_smaps_rollup  s      ! C #$++D,=,=txxH 
; ;D{3s4::<?3d::1!$**,q/2T92"4::<?3d:;
; d##
; 
;s   A<C"3!C""C+s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 .   | j                         }t        t        t        |j	                  |                  dz  }t        t        t        |j	                  |                  dz  }t        t        t        |j	                  |                  dz  }|||fS )Nr   )r  r/  r  r   findall)rr  _private_re_pss_re_swap_re
smaps_datarz   r{   r|   s           rD   _parse_smapszProcess._parse_smaps  s    . ..0J c#{22:>?@4GCc#wz:;<tCCs3 0 0 <=>EDd##rC   c                     t         r	 | j                         \  }}}n| j	                         \  }}}| j                         }t        ||||fz    S # t        t        f$ r | j	                         \  }}}Y Cw xY wr  )HAS_PROC_SMAPS_ROLLUPr  r"   r    r  r  ry   )rr  rz   r{   r|   	basic_mems        rD   memory_full_infozProcess.memory_full_info  s    $9%)%=%=%?NCd "&!2!2!4S$((*IY#sD)99:: +,=> 9%)%6%6%8NCd9s   A #A54A5c                 h   d }| j                         }|s| j                          g S |j                  d      }g }|j                  d      }|g} |||      D ]9  \  }}|j                  dd      }	 |\  }	}
}}}}|sd}nBt
        rt        |      }|j                         }|j                  d      rt        |      s|dd	 }|j                  t        |	      t        |
      ||j                  d
d      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      f       < |S # t        $ r |dgz   \  }	}
}}}}Y 5w xY w)aQ  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              3   p  K   i }| D ]f  }|j                  d d      }|d   j                  d      s&|j                         |f |j                  |       O	 t	        |d         dz  ||d   <   h |j                         |f y # t
        $ r% |d   j                  d      rY t        d|z        w xY ww)N   r   rA  r   r   s   VmFlags:z#don't know how to interpret line %r)r   r   popr   r   r   r   )r  current_blockr  r   r   s        rD   
get_blocksz'Process.memory_maps.<locals>.get_blocks  s     ! "D!ZZa0F!!9--d3,002D99%,,T2
".1&)nt.CDO"$ %((*D11  * "%ay33K@ (&0$I&*%+'" !""s*   AB6B.B6B3"B6$B33B6   
r   Nr  r  z[anon]r   r   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   )rr  r  r  r  r0  
first_liner  headerhfieldsr  permsoffsetr  r~  rs   s                  rD   memory_mapszProcess.memory_maps  s   2, ((*D %%'	JJu%EB1J'LM *5- @  ,,tQ/K<C9D%eT #D%d|::<D}}\2;M<  $DSz		4L5MHHWa(HHXq)HHWa(HH-q1HH-q1HH.2HH.2HH^Q/HH]A.HHXq) !> I7 " K<CrdN9D%eTKs   2	FF10F1c                 L    t        | j                  d| j                  d      S )Nr   z/cwd)r   rq  r   r  s    rD   cwdzProcess.cwdI  s    t'8'8$((CDDrC   s   ctxt_switches:\t(\d+)c                     | j                         }|j                  |      }|s&t        d| j                  d| j                  d      t        j                  t        |d         t        |d               S )NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in r   z1/status; the kernel is probably older than 2.6.23r   r   )r  r  rO  rq  r   r   pctxswr   )rr  	_ctxsw_rer  ctxsws       rD   num_ctx_switcheszProcess.num_ctx_switchesM  sl     %%'!!$'% 150A0A488M  >>#eAh-U1X??rC   s   Threads:\t(\d+)c                 \    | j                         }t        |j                  |      d         S Nr   )r  r   r  )rr  _num_threads_rer  s      rD   num_threadszProcess.num_threads\  s-    
 %%'?**40344rC   c                    t        j                  | j                  d| j                  d      }|j	                          g }d}|D ]  }| j                  d| j                  d|d}	 t        |      5 }|j                         j                         }d d d        |j                  d      dz   d  }|j                  d	      }t        |d
         t        z  }	t        |d         t        z  }
t        j                  t!        |      |	|
      }|j#                  |        |r| j%                          |S # 1 sw Y   xY w# t        t        f$ r d}Y w xY w)Nr   z/taskFz/task/r  Tr  r;   r  r  r  )r   ry  rq  r   rM  r   r.  r   r    r"   r  r   r  r  r   pthreadr   r   r  )rr  
thread_idsr+  
hit_enoent	thread_idr  r   str   r  r  r3  s               rD   threadszProcess.threadsd  s7   ZZ0A0A488 LM

# 	#I!!E
 ' *1)B* BGGDMA%'(BXXd^F&*%3E&*%3E__S^UEBFNN6")	#* $$&!* *%'9:  "
	s*   )E 4D4E 4D=	9E  EEc                 @    t        j                  | j                        S r  )r  getpriorityr   r  s    rD   nice_getzProcess.nice_get  s     %%dhh//rC   c                 B    t        j                  | j                  |      S r  )r  setpriorityr   )rr  r7  s     rD   nice_setzProcess.nice_set  s    %%dhh66rC   c                 @    t        j                  | j                        S r  )r
  r6   r   r  s    rD   cpu_affinity_getzProcess.cpu_affinity_get  s    --dhh77rC   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	          | j                         }|j                  |      }|r6t        t        t	        |d   d         t	        |d   d         dz               S t        t        t        t                                 S )Nr   r   )r  r  rx  ranger   r   r  )rr  _rer  r$  s       rD   _get_eligible_cpuszProcess._get_eligible_cpus  sk     ))+DKK%EE#eAhqk"2Ca4Dq4HIJJE#mo"6788rC   c           	         	 t        j                  | j                  |       y # t        t        f$ r}t        |t              s|j                  t        j                  k(  rf| j                         }t        t        t        t                                 }|D ],  }||vrt	        d|d|      ||vst	        d|d|        d }~ww xY w)Nzinvalid CPU number z; choose between zCPU number z! is not eligible; choose between )r
  proc_cpu_affinity_setr   r   r   r   rz  r{  r  tupler  r   r  )rr  r  r   eligible_cpusall_cpuscpus         rD   cpu_affinity_setzProcess.cpu_affinity_set  s    **488T:Z( c:.#))u||2K$($;$;$=M$U3}+?%@AH# 
h.",#&!7#  m3",03]!D# 
 s    # CB C3CCc                     t        j                  | j                        \  }}t        t	        |      }t        j                  ||      S r  )r
  r5   r   enumr>   r   pionice)rr  ioclassr7  s      rD   
ionice_getzProcess.ionice_get  s;    !11$((;NGU$W-??7E22rC   c                     |d}|r|t         t        fv rt        d|z        |dk  s|dkD  rd}t        |      t        j                  | j
                  ||      S )Nr   z%r ioclass accepts no valuer  zvalue not in 0-7 range)r)   r&   r   r
  proc_ioprio_setr   )rr  r   r7  r  s       rD   
ionice_setzProcess.ionice_set  sc    }%68I$JJ !>!HIIqyEAI. o%'''5AArC   c                 n   | j                   dk(  rd}t        |      	 |t        | j                   |      S t        |      dk7  rddt	        |      z  z   }t        |      t        | j                   ||       y # t
        $ r3}|j                  t        j                  k(  r| j                           d }~ww xY w)Nr   z)can't use prlimit() against PID 0 processr;   z'second argument must be a (soft, hard) ztuple, got %s)	r   r   r   r   r  r   rz  ENOSYSr  )rr  r   r   r  r   s        rD   rlimitzProcess.rlimit  s    
 xx1}A o%>"488Y77 6{a'E-V<=  )o-DHHi8 99, ))+s   A8 AA8 8	B4.B//B4c                     | j                         d   }t        r|j                         }t        j	                  |d      S )Nr  ?)r  r   r   PROC_STATUSESr   )rr  letters     rD   r  zProcess.status  s6    &&(2]]_F  --rC   c                    g }t        j                  | j                  d| j                  d      }d}|D ]  }| j                  d| j                  d|}	 t	        |      }|j                  d      s@t        |      sL| j                  d| j                  d|}	 t        |      5 }t        |j                         j                         d         }t        |j                         j                         d   d      }	d d d        t        	      }
t        |t        |      t              |
|	      }|j                  |        |r| j+                          |S # 1 sw Y   ]xY w# t        t        f$ r d}Y Hw xY w# t        t        f$ r d}Y `t         $ rW}|j"                  t"        j$                  k(  rY d }~|j"                  t"        j&                  k(  rt)        |       Y d }~ d }~ww xY w)	Nr   ru  Frv  z/fdinfo/r   r   T)r   ry  rq  r   r   r   r   r   r   r   r   r   rr   r   r    r"   r   rz  r{  r|  r   r  )rr  r+  r   r  rt   r  rs   r   posrw   rv   r3  r   s                rD   
open_fileszProcess.open_files  s   

):):DHHEF
 *	/B$($5$5txxDD(/~& ??3'M$,? ))D
/(. D!"%ajjl&8&8&:1&=">C$'

(:(:(<Q(?$CED  2%8!* #b'3s8T5"  v.U*	/V $$&D D ./AB * &*
*; &'9: !
 99,99 2 22#JsU   F!E*,AEE*E'	#E**E?>E?G5G5G0(G0/G00G5c                 f    t         j                  || j                        }| j                          |S r  )r  r  r   r  )rr  r  r   s      rD   connectionszProcess.connections&	  s)    ##D$((3  "
rC   c                 r    t        t        j                  | j                  d| j                  d            S )Nr   ru  )r   r   ry  rq  r   r  s    rD   num_fdszProcess.num_fds,	  s%    2::D,=,=txxHIJJrC   c                 :    t        | j                         d         S )Nr  r  r  s    rD   r  zProcess.ppid0	  s    4((*6233rC   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                     | j                         }|j                  |      d   \  }}}t        j                  t	        |      t	        |      t	        |            S r   )r  r  r   puidsr   )rr  _uids_rer  real	effectivesaveds         rD   uidszProcess.uids4	  K    %%'!)!1!1$!7!:i}}SYIE
CCrC   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     | j                         }|j                  |      d   \  }}}t        j                  t	        |      t	        |      t	        |            S r   )r  r  r   pgidsr   )rr  _gids_rer  r7  r8  r9  s         rD   gidszProcess.gids:	  r;  rC   r  rg  )=r?   r@   rA   r  r  rs  r  r  r  r  r   r  r  r  r  r  r   r  r  r  r  r   rs   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'  r  r.  r0  r2  r  r:  r?  rB   rC   rD   r  r    s   'CI." B9   @    $  $3
5
   
 
  2 ) )
   
ww~~mibiik12		 
	@ O O 7 7 @ @ * * > >$ 	$. 
 #

#;<BJJ23RZZ 45	$ 
	$< 
		; 
		; '	H	 
H	T E E "

#<=@ @ *4"**5H*I 5 5  < 0 0 7 7 		8 
	8 !bjj!DE		9 
	 
	* 		3 
	3 
	B 
	B 		 
	6 . . 1 1f  
 K K 4 4 &BJJ'DE D D
 &BJJ'DE D DrC   r  r  r@  )F)r  
__future__r   r  r?  rz  r  r,  r   r"  rj  r  sysr  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   r   r   r   _compatr   r    r!   r"   r#   r$   r  __extra__all__r`  rs   r  rA  rB  r  hasattrrD  rC  r  r  getpagesizer   rx  	byteorderr  r  	AF_PACKETr:   IntEnumr   r9   r&   r'   r(   r)   r>   globalsr  __members__STATUS_RUNNINGSTATUS_SLEEPINGSTATUS_DISK_SLEEPSTATUS_STOPPEDSTATUS_TRACING_STOPSTATUS_ZOMBIESTATUS_DEADSTATUS_WAKE_KILLSTATUS_WAKINGSTATUS_IDLESTATUS_PARKEDr*  r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r  r\   rh   rr   rx   r  ry   r}   r   r   r   r   r   r   r   r   	Exceptionr   r   r   resourceImportErrorr   CDLLr   r@  dirr   isupperr   r  r  r  r  r'  r8  r?  rB  rX  net_if_addrsr[  r]  r  r  r  r  
disk_usager  r  r&  rP  rS  rm  ro  ry  r  r|  r  r  r  rF  s   0rD   <module>rc     sm  
 %       	 	   
  # "   # ) $ $ ' ! " "     $ "  +    ( ' " "  & $ '   D
& .  09299; >?'>'LM t%67 4!89  bjj&!:!!#	)  <G DLL)S)9)9%:;M ##G <OOT\\  IZ++, 
				 	 		"	"					$	$											!	!									" 
"
"







 
 

 
 

 
 




!
!








, 	 K	L   <>	 &>?j$,,1G"GHJK
 -*?*?!@@B	  6 7 {"#	(
$& 	0 	00K!"  8 D IFqf!5!))+F=@BJ4@x (:(V2 77>>;<*ADP &&	I 	q qh }'
,^D   
ePH HV'^sl>W>~
B$M
!@,.}	D }	D{,  K	
,s
23;
;(:;CcJIK&  86;;tt,DtY	88F 	Gs<   S/ T *UUU/T4TT+UU