
    gZ                    
   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)        D/var/www/openai/venv/lib/python3.12/site-packages/psutil/_pslinux.pyr>   r>   y   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   b  se   < Ddhhz1--H
/0 !34 01(99: M	
D::<Dv&TZZ\!_!55  

 XM= E"33IY]M22I	YE	$4s$:M JJJEu:3  +hhqk	

    
s@   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)"a7  Report virtual memory stats.
    This implementation mimics 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!DZZ\F!&)nt3DO  
7 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 
7	6  )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!DZZ\F!&)nt3DO  
7 ]#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 
7	6   373E3E3G01aE4  & Q   ;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  c  s     "#K%	Y,	-##% 
.AI--.23F.45feAh$fF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  s  s     "#K%D	Y,	-	

Dv&C	(9(9$:Q$>?:@A&Q%([0&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9QD::c?1-D||D)q  :99 !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    sT    
B 
EB	JB		".2.!FF1668>>#$  / WF{ GL	\O$55	6!D::<%%'D<H$=GL89
  "!?@!ZZ2
U$'JS!  
7" !"F>T7 $    
7	6sB   	.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	3q
Dw'"4::<?3) a1
,"%djjl1o"6(#/* 	 
4" Hj/8 % 
4	3s   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    sq    
C	\O$55	6!Dzz|&&z2

5D!!4Q!789  
7 J	 
7 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      }|kt         ||d	      d      }|Ud
j                  |      }t        |d      dk(  r'|j                  t        j                  d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!ErC   )r6  i  scaling_cur_freqNr   cpuinfo_cur_freqz$/sys/devices/system/cpu/cpu{}/onlinez0
r   z!can't find current frequency filescaling_max_freqscaling_min_freq)rB  r,  sortr   rs   r   	enumerater   r   formatr   r   r   scpufreqNotImplementedErrorr   )cpuinfo_freqspathsr   pjoinirs   curronline_pathr  max_min_s              rD   cpu_freqrZ    sy   
 ./		:
 DYYBC 	 	

E
F 'GAt5zS// %Q'$.E$(:;dK| E$(:;dK<>EEaH   ;6%?

7#3#3Cc#BC =C-c22t9t#DtE$(:;<=DDtE$(:;<=DDJJw''dD9:1 (2 
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   rZ  rZ    s1     8M7NO7N!  C-7N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)NetConnectionsaw  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)allra  tcp4rb  rc  udp4rd  re  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfrg  rb  rh  rd  re  s         rD   __init__zNetConnections.__init__=  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   listdirrs  r   r   r   r   r    r"   r   errnoEINVALENAMETOOLONGr   )rt  r   inodesrt   inoder   s         rD   get_proc_inodeszNetConnections.get_proc_inodesT  s    T"**4+<+<cBCB9 $2C2CS"!MN  ##J/!!"IcrNE5M((#s2w8+ D, ' &'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!   )rt  r  r   s      rD   get_all_inodeszNetConnections.get_all_inodesn  sT    6C
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   asciiNry  z>4Iz<4I)r   r   r   encoderl  rm  LITTLE_ENDIAN	inet_ntopbase64	b16decodero  structpackunpackr   r   r]  r   addr)r  familyipports       rD   decode_addresszNetConnections.decode_address~  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   Nry  )r   r   rs   existsr   r   rN  r   r   RuntimeErrorrl  rn  TCP_STATUSESr   	CONN_NONEr_  r  r]  )filer  type_r  
filter_pidr   linenor   r  laddrraddrstatusr  r   rt   s                  rD   process_inetzNetConnections.process_inet  sa     ==bggnnT&:t_JJL )!Q

Sb) BAueVQ1aE F? %UmA.GC&GC)jC.? 2 22!-f!5!(!2!2! . = =eV L . = =eV L vueUFCHHA !0 _ " &/ 2 1 ! !A _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   ry   )
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NetConnections.process_unix  s     t_JJL	281+/Aq!Qq% F? #5ME'LE$GC!-*2C -0[A-=vbz2 ' 8 8U D !#!(!2!2!65$vsKK  %%  _ " $ &' 	 _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                  h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  )rr  r   r   reprr   rs  r  r  r+  rl  rm  ro  r  r  r   pconnsconnr-  rz  )rt  kindr   rL   r  r   
proto_namer  r  rs   r0  rt   r  r  r  	bound_pidconns                    rD   retrievezNetConnections.retrieve  su   tyy TYY#?YDGY#?@B  ,-?))#.F	((*Fe)-4%J"&"3"3Z@D&..&//::&&&%C '  &&tVV&LFHBFE5%"==FE5%D #==FE5%D  GI *9$ Cy; $@s   E*r  )r?   r@   rA   __doc__ru  r  r  staticmethodr  r  r  r  rB   rC   rD   r_  r_  1  s^    	!.4  2& 2&h 'I 'IR !L !LF!rC   r_  c                 ,    t         j                  |       S )z$Return system-wide open connections.)_net_connectionsr  )r  s    rD   net_connectionsr  (  s    $$T**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 
5Gab	

3qy$$t*$yFU|!!#eaik"((*002* V'	
 	
7 J NQ 
5	4s   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   r|  ENODEVr   )
duplex_mapnamesr   r   mturw   duplexspeedoutput_flagsisupr   s              rD   net_if_statsr  \  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  sN    " ~(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   r{  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-E"$''"'',,|U*K"La&rww||D&9:aVVX^^-335F ;ww''- 47sF3BK3H1feV]E1iUFFFElM9F F #M . ;:s   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   rQ  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 ).	&ufffeUL906 """"u%}i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  )rt  devs     rD   ru  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  )rt  r   r   r   r
  r  r   s          rD   ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions  s    )::;qab)v;?*0)*;*;*=F1I4*0)*;*;*=F1I4ayDJJ&5DJJ+>(4// <;) <;;s$   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)rt  rs   r   r   r   s        rD   ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block  sk    04

DJJGt_??:.::<22:>qAD(4// _ __s   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    )rt  needler  r  r   datar   s          rD   ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block  s     JJ

3

34D	0dO 668>>+Dv~!ww//0EF(4/	 Q% Q  Q % 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  )rt  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__ru  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 ]b  }	|	\  }
}}}|
d
k(  rd}
|
dv rt               j                         xs |
}
| s|
r||vr:t        j                   |
|||      }|j#                  |       d |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  >   	/dev/rootrootfs)r+  r   r   r   r   r-  r   r   rs   isfilerealpathr
  disk_partitionsr	  r  r   	sdiskpartr   )rf  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsntuples                 rD   r(  r(  4  sf   eG!#K'+56!zz|w/KK

- "ZZ-a0FE*  7 g"''.."=gg&&{3gg&&'7+'EFG%%k2J	+4(
FDVF,,')..0:FFV72""6:vtDv   N? 76s   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   rz  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  `  s$    
!
!$
'C		;<I TYYGHIsY?YAGGCLOY?@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>*	Dww||D&1T
+f4ww||D&1IOO-	
 4.#89J##A ))!,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 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   rz  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?YAGGCLOY?@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   )rS  rs   r   nulls      rD   
multi_bcatz#sensors_battery.<locals>.multi_bcat  sR     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	/capacityry  rI  z
AC0/onlinez	AC/onliner   /statusr  dischargingF>   fullchargingTi  <   )objectr   r{  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    sO    8D -..A<<)qwwy"8 	
. 	 
  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  T  sY    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	aDx(DJJL..034	
 
	
 9D@AA 
	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   r{  r#   r   r  r   rF  s    rD   r  r  q  s9    JJq):';<L<q		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|  v  s     s#	! &5%6<DT"aDx0"4::<?3  $s{* #" !!>!EFF #" !*- 	!$&= 	!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        $ rk | j                          t        j                  j                  | j                  d| j                  d      s t        | j                  | j                         w xY w)Nr   r  )r!   r   r   _namer"   _raise_if_zombier   r    r   rs   r  rs  )rt  r   kwargsfuns      rD   wrapperz wrap_exceptions.<locals>.wrapper  s    	t-d-f-- 	5txx44! 	6!!#$**55  		!!# 77>> $ 1 1488< $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.)_cacher  _ppidrs  r   c                 L    || _         d | _        d | _        t               | _        y r  )r   r  r  r   rs  )rt  r   s     rD   ru  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   rs  r   r  r   r   )rt  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  rt  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  rs  r   r  s    rD   _raise_if_not_alivezProcess._raise_if_not_alive  s     	4,,dhh78rC   c                    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 # t        $ r t        d       d	|d<   Y |S w xY w)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_ticksz&can't get blkio_ticks, set iowait to 0)r   rs  r   r  r  r   
IndexErrorr   )rt  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	#!'C 
  	#:;!"C
	#s   4B> >CC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   rs  r   r.  rt  r   s     rD   _read_status_filezProcess._read_status_file  s3     4+<+<dhhGHA668 IHHs   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   rs  r   r.  r   r  s     rD   _read_smaps_filezProcess._read_smaps_file  s:     $*;*;TXXFG1668>># HGGs   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   )rt  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   rs  r   r    r"   r  r   rs   lexistsr  s    rD   exezProcess.exe6  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   ry  r   )r   rs  r   r.  r  r   r   r   )rt  r   r  sepcmdlines        rD   r  zProcess.cmdlineC  s    $*;*;TXXFG1668D H!!#I f-f3==9D**S/ &=S\Q.3$;jjoG- HGs   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   rs  r   r.  r   )rt  r   r  s      rD   environzProcess.environ]  sI    $*;*;TXXFG1668D H"4(( H"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   )rt  tty_nrrr  s      rD   terminalzProcess.terminalc  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 )rs  r   r   r   r   r   r   r  r   r   r   )rt  fnamer   r   r   r   r7  r   s           rD   io_counterszProcess.io_counterso  s   "&"3"3TXX>EFU#qD::<D6*.**U*;KD%
 ,/u:F4L  $ "#6#>??8$8$=)>*8$8$   * %$% $#.   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   )rt  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  )rt  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  )rt  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+CaA!+Cs   r  )r   rs  r   r   r   rx   )	rt  r   vmsr~   rf   textlibr  dirtys	            rD   memory_infozProcess.memory_info  sz     $*;*;TXXFG18+,::<+=+=+?+C84CfdCu H CfdCu==	 HGs   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   rO  rs  r   r   r   r   )rt  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)rt  _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   )rt  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                 l   d }| j                         }|s| j                          g S |j                  d      }g }|j                  d      }|g} |||      D ];  \  }}|j                  dd      }	 |\  }	}
}}}}|sd}nBt
        rt        |      }|j                         }|j                  d      rt        |      s|dd	 }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}|j                  |       > |S # t        $ r |dgz   \  }	}
}}}}Y 7w 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   )rt  r  r  r  r0  
first_liner  headerhfieldsr  perms_offset_dev_inoders   rr  s                   rD   memory_mapszProcess.memory_maps
  s   2, ((*D %%'	JJu%EB1J'LM *5- @ ,,tQ/N?F<D%$ #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) 		$? !A@ I9 " N?F"~<D%$Ns   2	FF32F3c                 L    t        | j                  d| j                  d      S )Nr   z/cwd)r   rs  r   r  s    rD   cwdzProcess.cwdV  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  rQ  rs  r   r   pctxswr   )rt  	_ctxsw_rer  ctxsws       rD   num_ctx_switcheszProcess.num_ctx_switchesZ  sl     %%'!!$'% 150A0A488M  >>#eAh-U1X??rC   s   Threads:\t(\d+)c                 \    | j                         }t        |j                  |      d         S Nr   )r  r   r  )rt  _num_threads_rer  s      rD   num_threadszProcess.num_threadsi  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   r{  rs  r   rM  r   r.  r   r    r"   r  r   r  r  r   pthreadr   r   r  )rt  
thread_idsr-  
hit_enoent	thread_idr  r   str   r  r  r3  s               rD   threadszProcess.threadsq  s+   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   )rt  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  rz  ranger   r   r  )rt  _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   r|  r}  r  tupler  r   r  )rt  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)rt  ioclassr7  s      rD   
ionice_getzProcess.ionice_get  s;    !11$((;NGU$W-??7E22rC   c                     |d}|r|t         t        h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   )rt  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   r|  ENOSYSr  )rt  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   )rt  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   rw  Frx  z/fdinfo/r   r   T)r   r{  rs  r   r   r   r   r   r   r   r   r   rr   r   r    r"   r   r|  r}  r~  r   r  )rt  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
/(.!"%ajjl&8&8&:1&=">C$'

(:(:(<Q(?$CE /  2%8!* #b'3s8T5"  v.U V $$& /. ./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  )rt  r  r   s      rD   r  zProcess.net_connections3	  s)    ''dhh7  "
rC   c                 r    t        t        j                  | j                  d| j                  d            S )Nr   rw  )r   r   r{  rs  r   r  s    rD   num_fdszProcess.num_fds9	  s%    2::D,=,=txxHIJJrC   c                 :    t        | j                         d         S )Nr  r  r  s    rD   r  zProcess.ppid=	  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   )rt  _uids_rer  real	effectivesaveds         rD   uidszProcess.uidsA	  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   )rt  _gids_rer  r8  r9  r:  s         rD   gidszProcess.gidsG	  r<  rC   r  ri  )=r?   r@   rA   r  r  ru  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  r0  r  r3  r  r;  r@  rB   rC   rD   r  r    s   'CI." B9 #  #J    $  $3
5
   
 
  2 ) )
   
ww~~mibiik12		 
	@ O O 7 7 @ @ * * > >$ 	$. 
 #

#;<BJJ23RZZ 45	$ 
	$< 
		; 
		; '	I	 
I	V 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  rA  )F)r  
__future__r   r  r?  r|  r  r,  r   r"  rl  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  rB  rC  r  hasattrrE  rD  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  rZ  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>rd     ss  
 %       	 	   
  # "   # ) $ $ ' ! " "     $ "  +    ( ' " "  & $ '   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FIqf!5!))+IF=@BJ4@x (:'T2 77>>;<*A%RP &&	I 	q qh "# +
,^D   
ePH HV$Xsl>W>~
B$M
!@,8C
D C
DK-  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