
    XhP                    	   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl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+ g dZ, e-e	d       rHe,j]                   e/e      D  cg c]'  } | ja                  d!      s| jc                         s&| ) c}        d"Z2ejf                  ji                  d# ejj                          d$      Z6ejf                  ji                  d# ejj                          d%      Z7 e-ed&      Z8 e-ed'      Z9 ejt                  d(      Z; ejx                         Z=da>ej~                  d)k(  Z@d*ZA ej                  d+d, eCe
j                        i      ZEeEj                  ZF G d- d.ej                        ZG eH       j                  eGj                         ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  d/ZVej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  d0Zb ed1g d2      Zc ed3g d4      Zd ed5g d6      Ze ed7d8      Zf ed9efj                  d:z         Zh ed;g d<      Zi ed=d>d?j                  eij                        z         Zk ed@g dA      Zl edBg dC      ZmdD ZndE ZodF Zpe$dG        Zq	  eqdH       dM ZudN ZvdO ZwdP ZxdQ ZydR ZzdS Z{dT Z|dU Z}ejf                  ji                  dV      sejf                  ji                  dW      rdX Z~ndY Z~ej                  Z G dZ d[er      Z G d\ d]      Z e       Zdpd^Zd_ Zd` Zej                  ZdqdaZ G db dc      ZdqddZde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Z G dn do      Zyc c} w # er$ r&Zs e dIes         edJdK      dLdLdL      atY dZs[sdZs[sww xY w)rzLinux platform implementation.    N)defaultdict)
namedtuple   )_common)_psposix)_psutil_linux)_psutil_posix)ENCODING)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)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_CLOSINGprlimitRLIMz/sys/class/power_supply/proc//smaps/smaps_rollupproc_ioprio_getproc_cpu_affinity_get
SC_CLK_TCKlittlei   AddressFamilyAF_LINKc                       e Zd ZdZdZdZdZy)
IOPriorityr   r         N)__name__
__module____qualname__r    r!   r"   r#        [/var/www/html/cjf29f/d23bf782/d32178f2/venv/lib/python3.12/site-packages/psutil/_pslinux.pyr;   r;   k   s    OOrB   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)rr   rsssizerz   shared_cleanshared_dirtyprivate_cleanprivate_dirty
referenced	anonymousr{   	pmmap_extzaddr perms  pio)rh   ri   rj   rk   
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)
isinstancestrosreadlinksplitendswithr   )rr   s    rC   r   r      s`    dC &$& ;;tD ::fa D }}\"+=d+CDSzKrB   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)rv   	modes_mapru   s      rC   file_flags_to_moder      sz     c2;;RYYEIUbkkBKK7"))CDEDr{{||Ca(<<d#DKrB   c                     | j                  dd      } d}|rd|  }nd|  d}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/z/device)r   r   accessF_OK)nameincluding_virtualrr   s      rC   is_storage_devicer      sL     <<S!DTF#TF'*99T277##rB   c                 F   t        |  d      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.
    /statr   N)r   nicer   idler   irqsoftirq   steal	   guest
   
guest_nice	scputimes)r   readliner   lenappendr   r   )procfs_pathfvaluesfieldsvlens        rC   set_scputimes_ntupler      s     
}E*	+ *q##%ab)*KFv;Dqygqygrzl#;/I* *s   "BB /proczignoring exception on import: r   zuser system idle        c                 d   | d   }|| j                  dd      z   }	 | d   }| d   }| d   }	 t	        t                d	      }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        |j                  d    d       |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:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfos   lowr   r<   g       @)getKeyErrorr   argsr   r   OSErrorstrip
startswithintr   PAGESIZEmin)memsr`   fallbacklru_active_filelru_inactive_fileslab_reclaimableerrr   watermark_lowlineavail	pagecaches               rC   calculate_avail_vmemr   !  sw   < Ddhhz1--H	/0 !34 01?,-Y78 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:1  xx{m > >	
   6 6s@   C" D 'D&.!D&"	D+DDDD#"D#&D/c                     g } i }t        t                d      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      }| rMdj                  dj                  |       t        |       dk(  rdn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 [w xY w# t        $ r d}
| j                  d       Y xw 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.
    /meminfor      r   Ns	   MemTotal:r   s   Buffers:rc   r   r   rd   s   Shmem:s
   MemShared:re   s   Active:ra   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:rb   s   Slab:s   MemAvailable:r]   round_z6{} memory stats couldn't be determined and {} set to 0z, waswerer<   
stacklevel)r   r   r   r   r   r   r   r   r   formatjoinr   warningswarnRuntimeWarningr[   )missing_fieldsr   r   r   r   r\   r`   rc   rd   re   ra   rb   rf   r_   r   r^   msgs                    rC   virtual_memoryr   `  s%    ND	)*(3	4 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 FMMIIn%(A-E6
 	c>a8 Y4 4  )i()  (h'(  ,	,-(F 	,F!!(+	,,  (h'(  	.	._%'(()* 
  	.H!!*-	.	.  $  +$T*+s   /EE$ $F ?F* G# H I ,I E!$FFF'&F'*	G 4F:9G :GG GG G #HH	IH"!I"I>I IIIIII54I5c                     i } t        t                d      5 }|D ])  }|j                         }t        |d         dz  | |d   <   + 	 ddd       	 | d   }| d   }||z
  }t        ||d      }		 t        t                d	      }|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        $ r0}d| d}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/vmstats   pswpin       s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r<   r   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 ())r   r   r   r   r   cextlinux_sysinfor   r   r   r   r   r   r   sswap)r   r   r   r   r\   r`   _unit_multiplierr_   r^   sinsoutr   r   s                 rC   swap_memoryr     s   D	)*(3	4 4 	4DZZ\F!&)nt3DO	44 ]#L! 4<DD%2G?,-W56  	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  &	 	  003uA7 	 	c>a8dsN   /E
E 0F A5F>F*FE/FFF	G%&GGc                  D   t               } t        |        t        |  d      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   rK   s        rC   	cpu_timesr   !  s     "#K%	}E*	+ &q##%&AI--.23F.45eAh$5F5f	& & 6s   B.BBc                     t               } t        |        g }t        |  d      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   rK   entrys           rC   per_cpu_timesr  1  s     "#K%D	}E*	+ 
q	

 	#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        t	                d      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        t	                d      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   /cpuinfos	   processorr   Nzcpu\dr   r   )r   sysconf
ValueErrorr   r   lowerr   recompiler   r   match)numr   r   searchs       rC   cpu_count_logicalr  E  s	   zz/00 O-.h78 	A ::<**<81HC	 	 	 !8ZZ)Fo/067 !1 !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        t                d      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p2rr   r   resultmappingcurrent_infor   keyvalues              rC   cpu_count_coresr  b  sn    
B 
EB	JB		".2 % 	%!FF1668>>#$	% 	%% WF{ GL	)*(3	4 / 	/D::<%%'D<H$=GL89
  "!?@!ZZ2
U$'JS!	//" !"F>T7	% 	%$   / /sB   	.E-&EEE4%EE		EEEEE&c                     t        t                d      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         rC   	cpu_statsr&    s    	)*%0	1 Q
 	Dw'"4::<?3) a1
,"%djjl1o"6(#/*		" Hj/8 % s   BC/C2C5CC#c            
          t        t                d      5 } | D cg c]?  }|j                         j                  d      rt	        |j                  dd      d         A c}cddd       S c c}w # 1 sw Y   y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   s     rC   _cpu_get_cpuinfo_freqr)    sw    	)*(3	4 
 
zz|&&z2 $**T1%a()

 


 
s   A1AA, A1,A11A: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      }|Jd
| d}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rK   s    rC   <lambda>zcpu_freq.<locals>.<lambda>  s    RYYy!%<%B%B%D!E rB   )r  i  scaling_cur_freqNr   cpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r   z!can't find current frequency filescaling_max_freqscaling_min_freq)r)  r  sortr   rr   r   	enumerater   r   r   r   r   scpufreqNotImplementedErrorr   )cpuinfo_freqspathsretpjoinirr   curronline_pathr   max_min_s              rC   cpu_freqrA    sw   
 ./		:
 DYYBC 	 	

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

7#3#3Cc#BC =C-c22t9t#DtE$(:;<=DDtE$(:;<=DDJJw''dD9:-	;. 
rB   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   )r)  r   r6  r-  s    rC   rA  rA    s+     8M7NO!  C-OOOs   .c                       e Zd Zy)_Ipv6UnsupportedErrorN)r>   r?   r@   rA   rB   rC   rD  rD    s    rB   rD  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)allrH  tcp4rI  rJ  udp4rK  rL  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfrN  rI  rO  rK  rL  s         rC   __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\
	 !rB   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   listdirrZ  r   r   r   r   FileNotFoundErrorProcessLookupErrorr   errnoEINVALENAMETOOLONGr   )r[  pidinodesrs   inoder   s         rC   get_proc_inodeszNetConnections.get_proc_inodes  s    T"** 1 12!C5<= 	9B9 D$5$5#6auD!EF  ##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updaterk  rc  rd  PermissionError)r[  ri  rh  s      rC   get_all_inodeszNetConnections.get_all_inodes*  sY    6 	C
d22378	  &'9?K  s    5AAc           
      $   | j                  d      \  }}t        |d      }|sy|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        d 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
        :   rA   asciiNr`  z>4Iz<4I)r   r   encoderS  rT  LITTLE_ENDIAN	inet_ntopbase64	b16decoderV  structpackunpackr  r   rD  r   addr)r~  familyipports       rC   decode_addresszNetConnections.decode_address:  s<   " ::c?D4} YYwV^^#%%ff.>.>r.B4R4.HI%%ff.>.>r.BC!!"%B ))EEFMM%,DEB
  ))EEFMM%,DEB ||B%%  $/T9	s   >BE3 3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 d|  d| d|}t        |      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   Nr`  )r   r   rr   existsr   r   r5  r   r  RuntimeErrorrS  rU  TCP_STATUSESr   	CONN_NONErF  r  rD  )filer  type_ri  
filter_pidr   linenor   r   laddrraddrstatusrj  r   rh  rs   s                   rC   process_inetzNetConnections.process_inetm  s     ==bggnnT&:t_ #	IJJL )!Q !I	6

Sb) BAueVQ1aE F? %UmA.GC&GC)jC.? 2 22!-f!5!(!2!2! . = =eV L . = =eV L vueUFCHHC!I#	I #	I " 6.tf 5"81TH.  's+564 1 ! !C#	I #	IsY   =E#E#DA
E,D38E	E!D00E3	D?<E>D??E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 d|  d|}
t	        |
      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   r`   )
r   r   r   r  r  r   r   socktype_to_enumr   r  )r  r  ri  r  r   r   tokensr   r  rj  r   pairsrh  rs   rr   r  r  s                    rC   process_unixzNetConnections.process_unix  sB     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 " ,$ .tf4EdXN  's++,	L 	Ls@   C/&C#B=A1C#4	C/=C 
C#C  C##C,(C/c                 6   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 )Nz/net/)r  )r   rZ  rk  rq  r  rY  rS  rT  rV  r  r  r   pconnsconnr  ra  )r[  kindrh  ri  r:  
proto_namer  r  rr   r  rs   r  r  r  	bound_pidconns                   rC   retrievezNetConnections.retrieve  s8   +-?))#.F	((*Fe)-4 	%J''(j\:D&..&//::&&&%C '  &&tVV&LFH 	BFE5%"==FE5%D #==FE5%D 		$ CyrB   rm  )r>   r?   r@   __doc__r\  rk  rq  staticmethodr  r  r  r  rA   rB   rC   rF  rF    s^    	!.4  0& 0&d (I (IT !L !LFrB   rF  c                 ,    t         j                  |       S )z$Return system-wide open connections.)_net_connectionsr  )r  s    rC   net_connectionsr    s    $$T**rB   c                     t        t                d      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/net/devNr<   rs  r   r   )	r   r   	readlinesrfindreprr   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                          rC   net_io_countersr    s    
o'(1	2 a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   re  ENODEVr   )
duplex_mapnamesr:  r   mturv   duplexspeedoutput_flagsisupr   s              rC   net_if_statsr    s     	///J
 ""$E
C 	''-C++D1E 44T:MFE 88E?L%D))j(%lCI  J  	yyELL(#JJ		s   AC	D")DDc                 |   d }d }t         j                  j                  t                d      r |       }n?t         j                  j                  d      r |       }nt                d}t	        |      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        t                d      5 } | j                         }d d d        D ]  }|j                         }t	        |      }|dk(  r2|d   }t        |d         }t        t
        |dd       \
  }}}	}
}}}}}}nl|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d
|}t        |      |||
|||	||||f
  y # 1 sw Y   xY ww)N
/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   flenr   readsreads_mergedrbytesrtimewriteswrites_mergedwbyteswtimer   rp   r   s                    rC   read_procfsz%disk_io_counters.<locals>.read_procfs;  sb    " /+,J78 	"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7x@ o%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   rb  walkrr   r   r   r  r   r   basenamer  r   )blockrootr   filesr   r   r   r  r  r  r  r  r  r  r  rp   s                   rC   
read_sysfsz$disk_io_counters.<locals>.read_sysfsi  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  z6/diskstats nor /sys/block are available on this system)r   rr   r  r   r7  r   DISK_SECTOR_SIZE)perdiskr  r  genr   r  r  r   r  r  r  r  r  r  r  r  rp   s                    rC   disk_io_countersr  6  s    
+;\F 
ww~~*+:67m		%l  ! "  	 "#&&G A ).	&ufffeUL906 """"u%}iA)A0 NrB   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  )r[  devs     rC   r\  zRootFsDeviceFinder.__init__  s3    ggcl!!XXc]
XXc]
rB   c                    t        t                d      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| c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Nz/partitionsr<   r   r   r   r=   /dev/)	r   r   r  r   r   isdigitr   r  r  )r[  r   r   r   r  r  r   s          rC   ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions  s    /+,K89 
	.Qab) 	.v;?*0)*;*;*=F1I4*0)*;*;*=F1I4ayDJJ&5DJJ+>!&tf~-
	. 
	.	.
	. 
	. 
	.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| c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Nz/sys/dev/block/rs  z/ueventzDEVNAME=r<   r  )r  r  r   r   r   
rpartition)r[  rr   r   r   r   s        rC   ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block  s     Adjj\At_ 	. .??:.::<22:>qAD!&tf~-	. 	..	. 	. 	.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| cd d d        c S 	 d d d         y # 1 sw Y   xY w# t        $ r Y w xY w)Nrs  z/sys/class/block/*/devr  )r  r  r  iglobr   r  r   r   rr   r  dirnamerc  )r[  needler  r  r   datar   s          rC   ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block  s    JJ<q-

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


  c


  c

sE   A! B B# !	A?*A::A?	B BB #	C,B<<CN)
r>   r?   r@   r  	__slots__r\  r  r   r  r  rA   rB   rC   r  r    s,     '"I#
...rB   r  c                 (   t               }t               }| st        | d      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	      }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/filesystemsnodev	r   zfsNr   z	/etc/mtabz/self/mountsnoner  >   	/dev/rootrootfs)r  r   r   r   r   r  r   r   rr   isfilerealpathr   disk_partitionsr  r  r   	sdiskpartr   )rM  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsntuples                 rC   r  r    sy   eG!#K+l34 		+ +zz|w/KK

- "ZZ-a0FE*+		+ g"''.."=gg&&{3gg&&+l'CDG%%k2J 
	+4(
FDVF,,')..0:FFV72""6:vtDv
 N?		+ 		+s   A FFFc            	         t        j                  t              } t        j                  d      }|j	                  t        j                  d             t        |D ch 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         }|D ch c]B  }dj                  t        j                  j/                  |      j                  d      dd       D }}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        t1        |       S c c}w # t&        t(        f$ r Y w xY w# t(        $ r d}Y Uw xY w# t(        $ r d}Y Vw xY w# t&        t(        f$ r}t-        |       Y d}~2d}~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   _maxNr0  _crit_labelr  z /sys/class/thermal/thermal_zone*temptypez/trip_point*r=   _typecritical_temphigh)collectionsr   ra  r  extendsortedr   r	  r
  subr   r   r   r   rr   r   r  r   r   r   r  r  r   r  dict)r:  	basenamesrK   
basenames2replr   altnamebaserr   current	unit_namer)  r'  labelr   
trip_pathsptrip_points
trip_point	trip_types                       rC   sensors_temperaturesr<    s(    
!
!$
'C		;<I TYYGHI;AQ;<I ?J ::@AD #((.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 <* $ 		 		$  
      Z( c

* & $#$
 & (#'(s   O
A2OO%!O7<A0P	AP1P6QO"!O"%O43O47PP	P.P))P.6QQQQc                     t        j                  t              } t        j                  d      }|st        j                  d      }t	        |D ch 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        $ 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   r   Nr   r#  r  r0  )r*  r   ra  r  r,  r   r   r   r   r   r   r   rr   r   r  r   r   r   sfanr.  )r:  r/  rK   r3  r4  r   r5  r6  s           rC   sensors_fansr?    s    
!
!$
'C		:;I IIEF	;AQ;<I <	$th/0G RWW__T%:FCDJJL	D8Ob1779Igll5':;< 9 <  	#J	s   D57D::	EEEc                  Z   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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.
        r0  N)r   r   r  r   )r9  rr   r:  nulls      rC   
multi_bcatz#sensors_battery.<locals>.multi_bcat  sW      	'Dtd+Cd{'s8O		'  " '99;&'s   
*AABATbatteryNz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r   z	/capacityr`  r0  z
AC0/onlinez	AC/onliner   /statusr  dischargingF>   fullchargingTi  <   r   )objectr   rb  POWER_SUPPLY_PATHr   r  rr   r   r   ZeroDivisionErrorr   r   r   r   POWER_TIME_UNLIMITEDPOWER_TIME_UNKNOWNsbattery)rC  rK   batsr  
energy_now	power_nowenergy_fulltime_to_emptyr^   power_pluggedonliner  secsleftrB  s                @rC   sensors_batteryrY    sH    8D -.<<)qwwy"8 	
D 
  77<<)3t95D 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)   ,G7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tstamprh  nts	            rC   r[  r[  
  s^    GjjlG +/(c8VS]]4hDr NrB   c                     t                d} t        |       5 }|D ]L  }|j                  d      st        |j	                         j                         d         }|a|c cddd       S  d|  }t        |      # 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 )r   r   r   r   r   r   	BOOT_TIMEr  )rr   r   r   r:  r   s        rC   	boot_timere    s      &D	T	  a 	Dx(DJJL..034	
   	
 +4&13   s   A;/A;*A;;Bc                      t               j                  t              } t        j                  |       D cg c]  }|j                         st        |        c}S c c}w )z7Returns a list of PIDs currently running on the system.)r   rv  r
   r   rb  r  r   )rr   rK   s     rC   rn  rn  (  s>    ##H-DJJt,<q		CF<<<s   AAc                 j   t        j                  |       sy	 t                d|  d}t        |      5 }|D ]?  }|j	                  d      st        |j                         d         }|| k(  c cddd       S  d| }t        |      # 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   rF  s   Tgid:r   Nz'Tgid' line not found in )
r   
pid_existsr   r   r   r   r   r  r   rn  )rh  rr   r   r   tgidr   s         rC   rh  rh  .  s     s#	! &'(#g6DT" &a +Dx0"4::<?3  $s{*& &+ 2$8 o%& & $ 	!$&= 	!s:   B B"B-	B 7BBB B B21B2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   r   N   )r<   r   )	r   rn  r   r  r  r   r   rc  rd  )r:  r   rh  r   r  rpardsetppids           rC   ppid_mapro  O  s     C!#Kv 	}AcU%89  Q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 OSError exceptions
    into NoSuchProcess and AccessDenied.
    c                    | j                   | j                  }}	  | g|i |S # t        $ r}t        ||      |d }~wt        $ r"}| j                          t        ||      |d }~wt        $ rR}| j                          t        j                  j                  | j                   d| d      st        ||      | d }~ww xY w)Nr   r   )rh  _namerp  r   rd  _raise_if_zombier   rc  r   rr   r  rZ  )r[  r   kwargsrh  r   r   funs         rC   wrapperz wrap_exceptions.<locals>.wrapperj  s    HHdjjT	t-d-f-- 	3sD)s2! 	4!!#T*3  	!!# 77>>T%6%6$7qU"CD#C.C7	s+   ' 	C=C	A&&C2AB??C)	functoolswraps)ru  rv  s   ` rC   wrap_exceptionsry  e  s'    
 __S $ NrB   c                   @   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                          d      re	d        Ze	d        Ze	d        Ze	d:d       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.        Z3 e4e5d/      r	e	d:d0       Z6e	d1        Z7e	d2        Z8e	d;d3       Z9e	d4        Z:e	d5        Z;e	 e"jF                  d6      fd7       Z<e	 e"jF                  d8      fd9       Z=y)<ProcesszLinux process implementation.)_cacherr  _ppidrZ  rh  c                 L    || _         d | _        d | _        t               | _        y rm  )rh  rr  r}  r   rZ  )r[  rh  s     rC   r\  zProcess.__init__  s"    

+-rB   c                     	 t        | j                   d| j                   d      }|j                  d      }||dz   |dz    }|dk(  S # t        $ r Y yw xY w)Nr   r   rk  r<   r=      ZF)r   rZ  rh  r  r   )r[  r  rl  r  s       rC   
_is_zombiezProcess._is_zombie  sk    	"4,,-Qtxxj>?D ::d#D$(TAX.FT>!  		s   %A 	AAc                 z    | j                         r+t        | j                  | j                  | j                        y rm  )r  r   rh  rr  r}  r[  s    rC   rs  zProcess._raise_if_zombie  s,    ??$**djjAA rB   c                 `    t        j                  | j                   d| j                          y)z+Raise NSP if the process disappeared on us.r   N)r   r  rZ  rh  r  s    rC   _raise_if_not_alivezProcess._raise_if_not_alive  s&     	4$$%Qtxxj12rB   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   rk     (r   r<   Nr   r   r  rn  r   ttynr   utime   stime   children_utimer  children_stime   create_time$   cpu_num'   blkio_ticksz&can't get blkio_ticks, set iowait to 0)r   rZ  rh  r  r  r   
IndexErrorr   )r[  r  rl  r   r   r:  s         rC   _parse_stat_filezProcess._parse_stat_file  s3    t(()488*E:; 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   rF  N)r   rZ  rh  r  r[  r   s     rC   _read_status_filezProcess._read_status_file  sD     D--.azAB 	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   r2   )r   rZ  rh  r  r   r  s     rC   _read_smaps_filezProcess._read_smaps_file  sK     D--.az@A 	$Q668>>#	$ 	$ 	$s   AAc                     | j                   j                  |        | j                  j                  |        | j                  j                  |        y rm  )r  cache_activater  r  r  s    rC   oneshot_enterzProcess.oneshot_enter  s>    ,,T2--d3,,T2rB   c                     | j                   j                  |        | j                  j                  |        | j                  j                  |        y rm  )r  cache_deactivater  r  r  s    rC   oneshot_exitzProcess.oneshot_exit  s>    ..t4//5..t4rB   c                 :    t        | j                         d         S )Nr   )r   r  r  s    rC   r   zProcess.name  s     d++-f566rB   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   rZ  rh  rc  rd  rs  r   rr   lexistsr  s    rC   exezProcess.exe  sy    		t001488*DABB!#56 	!!# ww$"3"3!4AdhhZ@A	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   r`  r   )r   rZ  rh  r  rs  r   r   r   )r[  r   r  sepcmdlines        rC   r  zProcess.cmdline  s    $++,AdhhZx@A 	Q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   rZ  rh  r  r   )r[  r   r  s      rC   environzProcess.environ  sU    $++,AdhhZx@A 	Q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   )r[  tty_nrrY  s      rC   terminalzProcess.terminal  sI    T**,W56((*	< 		s   7 	AAr1   /ioc           	         | j                    d| j                   d}i }t        |      5 }|D ]8  }|j                         }|s	 |j	                  d      \  }}t        |      ||<   : 	 d d d        |s| d}t        |      	 t        |d   |d   |d   |d   |d	   |d
         S # t        $ r Y w xY w# 1 sw Y   MxY w# t        $ r(}|j                  d   d| d|}t        |      d d }~ww xY w)Nr   r  s   : z file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )rZ  rh  r   r   r   r   r  r  r   r   r   )	r[  fnamer   r   r   r   r  r   r   s	            rC   io_counterszProcess.io_counters$  s@   (()488*C8EFU# 6q 
6D::<D6*.**U*;KD%
 ,/u:F4L
66 /"3''08$8$=)>*8$8$   * %$%6 60  0xx{o%=eW E##)*.  !o4/0sG   B5B&B5!C &	B2/B51B22B55B>	C2
#C--C2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   )r[  r   r  r  r  r  r   s          rC   r   zProcess.cpu_timesG  s    &&(fWo&4fWo&4v&678;Fv&678;Fvm,-;~~vNNrB   c                 :    t        | j                         d         S )zWhat CPU the process is on.r  r   r  r  s    rC   r  zProcess.cpu_numQ  s     4((*9566rB   Nc                 X    t        j                  | j                  || j                        S rm  )r   wait_pidrh  rr  )r[  timeouts     rC   waitzProcess.waitV  s      7DJJ??rB   c                 v    t        | j                         d         }t        xs
 t               }|t        z  |z   S )Nr  )r   r  rd  re  r   )r[  ctimebts      rC   r  zProcess.create_timeZ  s8    d++-m<= %)+#r))rB   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rm  )r   r   ).0rK   s     rC   	<genexpr>z&Process.memory_info.<locals>.<genexpr>s  s      8&'A!8s   r  )r   rZ  rh  r   r   rw   )	r[  r   vmsr}   re   textlibr  dirtys	            rC   memory_infozProcess.memory_infoe  s     D--.az@A 	Q8+,::<+=+=+?+C84CfdCu	 CfdCu==		 	s   1A00A9c                    dx}x}}t        | j                   d| j                   d      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   r   r3   s   Private_r   r      Pss:   Swap:)r   rZ  rh  r   r   r   )r[  ry   rz   r{   r   r   s         rC   _parse_smaps_rollupzProcess._parse_smaps_rollupz  s      ! C #$$%Qtxxj> 
; ;D{3s4::<?3d::1!$**,q/2T92"4::<?3d:;
; d##
; 
;s   A<C)!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)r[  _private_re_pss_re_swap_re
smaps_datary   rz   r{   s           rC   _parse_smapszProcess._parse_smaps  s    * ..0J c#{22:>?@4GCc#wz:;<tCCs3 0 0 <=>EDd##rB   c                     t         r	 | j                         \  }}}n| j	                         \  }}}| j                         }t        ||||fz    S # t        t        f$ r | j	                         \  }}}Y Cw xY wrm  )HAS_PROC_SMAPS_ROLLUPr  rd  rc  r  r  rx   )r[  ry   rz   r{   	basic_mems        rC   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                 `   d }| j                         }|s| j                          g S |j                  d      }g }|j                  d      }|g} |||      D ]5  \  }}|j                  dd      }	 |\  }	}
}}}}|sd}n<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                  |       8 |S # t        $ r |dgz   \  }	}
}}}}Y 1w xY w)a  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: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c              3   v  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 d|}t        |      d w xY ww)N   r   r(  r   r   s   VmFlags:z!don't know how to interpret line )r   r   popr   r   r  r   )r  current_blockr  r   r   r   s         rC   
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@ ($EdX"NC",S/t;<s*   AB9B.B9B6"B9$B66B9   
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  rs  r   r  r  r   r   r   r   r   r   )r[  r  r  r  r  
first_liner  headerhfieldsr~  perms_offset_dev_inoderr   r^  s                   rC   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) 		$= > I7 " N?F"~<D%$Ns   2	FF-,F-c                 L    t        | j                   d| j                   d      S )Nr   z/cwd)r   rZ  rh  r  s    rC   cwdzProcess.cwd  s%    4,,-Qtxxj=>>rB   s   ctxt_switches:\t(\d+)c                     | j                         }|j                  |      }|s(d| j                   d| j                   d}t	        |      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  rZ  rh  r7  r   pctxswr   )r[  	_ctxsw_rer  ctxswr   s        rC   num_ctx_switcheszProcess.num_ctx_switches  s}     %%'!!$'%%&az 2..  &c**~~c%(mSq];;rB   s   Threads:\t(\d+)c                 \    | j                         }t        |j                  |      d         S Nr   )r  r   r  )r[  _num_threads_rer  s      rC   num_threadszProcess.num_threads  s-     %%'?**40344rB   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   Trk  r<   r   r  r  )r   rb  rZ  rh  r4  r   r  r   rc  rd  r  r   r   r   r   pthreadr   r   r  )r[  
thread_idsr  
hit_enoent	thread_idr  r   str   r  r  r  s               rC   threadszProcess.threads!  sI   ZZ4#4#4"5Qtxxj FG

# 	#I(()488*F9+UKE ' *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 rm  )r  getpriorityrh  r  s    rC   nice_getzProcess.nice_get<  s     %%dhh//rB   c                 B    t        j                  | j                  |      S rm  )r  setpriorityrh  )r[  r  s     rC   nice_setzProcess.nice_setE  s    %%dhh66rB   c                 @    t        j                  | j                        S rm  )r   r5   rh  r  s    rC   cpu_affinity_getzProcess.cpu_affinity_getL  s    --dhh77rB   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  ra  ranger   r   r  )r[  _rer  r  s       rC   _get_eligible_cpuszProcess._get_eligible_cpusP  sk     ))+DKK%EE#eAhqk"2Ca4Dq4HIJJE#mo"6788rB   c           	         	 t        j                  | j                  |       y # t        t        f$ r}t        |t              s|j                  t        j                  k(  rl| j                         }t        t        t        t                                 }|D ]2  }||vrd|d|}t	        |      d ||vs d| d| }t	        |      |  d }~ww xY w)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )r   proc_cpu_affinity_setrh  r   r  r   re  rf  r  tupler   r   r  )r[  r   r   eligible_cpusall_cpuscpur   s          rC   cpu_affinity_setzProcess.cpu_affinity_set[  s    **488T:Z( c:.#))u||2K$($;$;$=M$U3}+?%@AH# ;h.".sg 6$$1#4!6   #-S/t;m3"-cU 3,,9?!<   #-S/s:; #s    # CBC6CCc                     t        j                  | j                        \  }}t        |      }t	        j
                  ||      S rm  )r   r4   rh  r;   r   pionice)r[  ioclassr  s      rC   
ionice_getzProcess.ionice_getu  s5    !11$((;NGU )G??7E22rB   c                     |d}|r2|t         j                  t         j                  hv r|d}t        |      |dk  s|dkD  rd}t        |      t	        j
                  | j                  ||      S )Nr   z ioclass accepts no valuer  zvalue not in 0-7 range)r;   r#   r    r  r   proc_ioprio_setrh  )r[  r  r  r   s       rC   
ionice_setzProcess.ionice_set{  s{    },,,,%  !#<= o%qyEAI. o%'''5AArB   r/   c                 ~   | j                   dk(  rd}t        |      	 | t        j                  | j                   |      S t	        |      dk7  rd|}t        |      t        j                  | 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<   z2second argument must be a (soft, hard) tuple, got )	rh  r  resourcer/   r   r   re  ENOSYSrs  )r[  	resource_limitsr   r   s        rC   rlimitzProcess.rlimit  s    
 xx1}A o%>#++DHHi@@ 6{a'**05  )o-$$TXXy&A 99, ))+s   !B   ?B   	B<	.B77B<c                 t    | j                         d   }|j                         }t        j                  |d      S )Nr  ?)r  r   PROC_STATUSESr   )r[  letters     rC   r  zProcess.status  s3    &&(2  --rB   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   r^  Fr_  z/fdinfo/r   r   T)r   rb  rZ  rh  r   r   r   r   r   r   r   r   rq   r   rc  rd  r   re  rf  rg  r   r  )r[  r  r  r  rs   r  rr   r   posrv   ru   r  r   s                rC   
open_fileszProcess.open_files  s   

d//0$((3?@
 &	/B''($((4t<D$/~& ??3'M$,?"//0$((8B4HD/(. D!"%ajjl&8&8&:1&=">C$'

(:(:(<Q(?$CED  2%8!* #b'3s8T5"  v.M&	/N $$&D D ./AB * &*
*3 &'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 rm  )r  r  rh  r  )r[  r  r:  s      rC   r  zProcess.net_connections  s)    ''dhh7  "
rB   c                 r    t        t        j                  | j                   d| j                   d            S )Nr   r^  )r   r   rb  rZ  rh  r  s    rC   num_fdszProcess.num_fds  s.    2::!2!2 31TXXJcBCDDrB   c                 :    t        | j                         d         S )Nrn  r  r  s    rC   rn  zProcess.ppid  s    4((*6233rB   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                     | j                         }|j                  |      d   \  }}}t        j                  t	        |      t	        |      t	        |            S r  )r  r  r   puidsr   )r[  _uids_rer  real	effectivesaveds         rC   uidszProcess.uids  K    %%'!)!1!1$!7!:i}}SYIE
CCrB   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     | j                         }|j                  |      d   \  }}}t        j                  t	        |      t	        |      t	        |            S r  )r  r  r   pgidsr   )r[  _gids_rer  r%  r&  r'  s         rC   gidszProcess.gids  r)  rB   rm  rP  )>r>   r?   r@   r  r	  r\  r  rs  r  ry  r   r  r  r  r  r  r   r  r  r  r  r   rr   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  hasattrr  r  r  r  r  r   rn  r(  r-  rA   rB   rC   r{  r{    s   'CI." B3 #  #J    $  $3
5
 7 7 
 
  2 ) )
   
ww~~yryy{m3/0	 	0 
 	0D O O 7 7 @ @ * * > >$ 	$. 
 #

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

#<=< < *4"**5H*I 5 5
  4 0 0 7 7 		8 
	8 !bjj!DE		9 
	 
	. 		3 
	3
 
	B 
	B x#		 
	6 . . - -^  
 E E 4 4 &BJJ'DE D D
 &BJJ'DE D DrB   r{  r.  )F)r  ry  r*  enumre  rw  r  r   r	  r  rS  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   r   __extra__all__r3  r+  dirr   isupperrL  rr   r  r/  r0  r  r2  r1  r  r   getpagesizer   rd  	byteorderrw  r  IntEnumr   	AF_PACKETr8   r9   r;   globalsro  __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)   r*   r+   r,   r-   r.   r  r[   rg   rq   rw   r   rx   r|   r   r   r   r   r   r   r   r   	Exceptionr   r   r   r   r   r   r  r  r  r&  r)  rA  net_if_addrsrD  rF  r  r  r  r  
disk_usager  r  r  r<  r?  rY  r[  re  rn  rh  ro  ry  r{  r-  s   0rC   <module>rM     s  
 %       	 	    
  # "   # )  $ $ ' ! " "     $ "  +    ( ' " "	 8YIFqf!5!))+F . &V <=			}M'JK t%67 4!89  bjj&!:!!#	)  iV%5%5!67 

  	  '' ( 
				 	 		"	"					$	$											!	!									" 
"
"







 
 

 
 

 
 




!
!








, 	 K	L   <>	 &>?j$,,1G"GHJK
 -*?*?!@@B	  6 7 {"#	(
$& 	0 	00K!<~BJ4@x (:'T2
 77>>;<*A#NP &&	I 	k k\ "# +
,^B   
fRH HV$Xsl>W>~ &=!B,6w	D w	D1 	Gj  K	*3'
23;
;(:;CcJIKs*   ;R,R,#R,R1 1S6SS