
    gZ                    	   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j5        6                    d' ej7                    z            Z8ej5        6                    d( ej7                    z            Z9 e:ed)          Z; e:ed*          Z< ej=        d+          Z> ej?                    Z@daAejB        d,k    ZCd-ZDe2e
jE        ZFn( e2jG        d.d/ eHe
jE                  i          ZIeIjF        ZFe2	dZJdZKd0ZLd1ZMn5 G d2 d3e2jG                  ZN eO            P                    eNjQ                   ejR        ejS        ejT        ejU        ejV        ejW        ejX        ejX        ejY        ejZ        ej[        ej\        d4Z]ej^        ej_        ej`        eja        ejb        ejc        ejd        eje        ejf        ejg        ejh        d5Zi ed6g d7          Zj ed8g d9          Zk ed:g d;          Zl ed<d=          Zm ed>emjn        d?z             Zo ed@g dA          Zp edBdCdDq                    epjn                  z             Zr edEg dF          Zs edGg dH          ZtdI ZudJ ZvdK Zwe#dL             Zx	  exdM           n7# ey$ r/Zz edNezz               edOdP          dQdQdQ          a{Y dZz[zndZz[zww xY wdZ|	 ddRl}m|Z| n1# e~$ r) ddlZ ej        ddST          Z e:edU          rd}dVZ|Y nw xY we|(e3                    dW  ee          D                        dX ZdY ZdZ Zd[ Zd\ Zd] Zd^ Zd_ Zd` Zej5        6                    da          sej5        6                    db          rdc Zndd Zej        Z G de dfey          Z G dg dh          Z e            Zd~djZdk Zdl Zej        ZddnZ G do dp          ZddqZdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Z G d{ d|          ZdS )zLinux platform implementation.    )divisionN)defaultdict)
namedtuple   )_common)_psposix)_psutil_linux)_psutil_posix)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN)AccessDenied)NoSuchProcess)ZombieProcess)bcat)cat)debug)decode)get_procfs_path)isfile_strict)memoize)memoize_when_activated)open_binary)	open_text)parse_environ_block)path_exists_strict)supports_ipv6)usage_percent)PY3)FileNotFoundError)PermissionError)ProcessLookupError)b)
basestring)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dS )
IOPriorityr   r   r;   r<   N)__name__
__module____qualname__r&   r'   r(   r)        K/var/www/html/ai-engine/env/lib/python3.11/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        |           } |                     d          d         } |                     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+C DSDzKrC   c                 (   t           j        dt           j        dt           j        di}|| t           j        t           j        z  t           j        z  z           }| t           j        z  r|                    ddd          }|                    dd          }|S )zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    rwzw+ar   zr+)r   O_RDONLYO_WRONLYO_RDWRO_APPENDreplace)rw   	modes_maprv   s      rD   file_flags_to_moder      sw     c2;RYEIUbkBK7")CDEDr{ )||Ca((<<d##DKrC   c                     |                      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      sO     <<S!!D -%%,9T27###rC   c                    t          d| z            5 }|                                                                dd         }ddd           n# 1 swxY w Y   g d}t          |          }|dk    r|                    d           |dk    r|                    d           |d	k    r|                    d
           t          d|          adS )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,	-	- *##%%abb)* * * * * * * * * * * * * * *KKKFv;;Dqyygqyygrzzl###;//IIIs   /AAA/procz ignoring exception on import: %rr   zuser system idle        )prlimitT)	use_errnor   c                     G d dt           j                  } |            }|0t                              | |d t          j        |                    }ne |            }|d         |_        |d         |_        t                              | |t          j        |          t          j        |                    }|dk    r5t          j                    }t          |t          j
        |                    |j        |j        fS )Nc                   2    e Zd Zdej        fdej        fgZdS )prlimit.<locals>.StructRlimitrlim_currlim_maxN)r?   r@   rA   ctypes
c_longlong_fields_rB   rC   rD   StructRlimitr   >  s+        !23!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/    #lnnG~ll3	4g9N9NOO #lnn%ay%ayllFL$5$5v|G7L7L  axx)++fbk&&9&9:::$g&677rC   c                 d    g | ]-}|                     d           |                                +|.S )RLIM)
startswithisupper.0rL   s     rD   
<listcomp>r   Y  s6    FFFqf!5!5F!))++FFFFrC   c                    | d         }||                      dd          z   }	 | d         }| d         }| d         }n6# t          $ r)}t          d|j        d         z             |cY d}~S d}~ww xY w	 t	          d	t                      z            }n# t          $ r |cY S w xY wd}|5  |D ]U}	|	                                }	|	                    d
          r*|t          |	
                                d                   z  }V	 ddd           n# 1 swxY w Y   |t          z  }||z
  }
||z   }|t          |dz  |          z  }|
|z  }
|
|t          |dz  |          z
  z  }
t          |
          S )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stripr   intr   PAGESIZEmin)memsra   fallbacklru_active_filelru_inactive_fileslab_reclaimableerrr   watermark_lowlineavail	pagecaches               rD   calculate_avail_vmemr   b  s   < Ddhhz1---H
/0 !34 01   +hqk	
 	
 	

 (9(99::    M	
 6 6 	6 	6D::<<Dv&& 6TZZ\\!_!5!55	66 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 XM= E"33IY]M222I	YE	$4s$:M J JJJEu::s@   < 
A/A*$A/*A/3B B! B!(ADDDc                     g } i }t          dt                      z            5 }|D ]7}|                                }t          |d                   dz  ||d         <   8	 ddd           n# 1 swxY w Y   |d         }|d         }	 |d         }n'# t          $ r d}|                     d	           Y nw xY w	 |d
         }||                    dd          z  }n'# t          $ r d}|                     d           Y nw xY w	 |d         }	nA# t          $ r4 	 |d         }	n'# t          $ r d}	|                     d           Y nw xY wY nw xY w	 |d         }
n'# t          $ r d}
|                     d           Y nw xY w	 |d         }nS# t          $ rF 	 |d         |d         z   |d         z   }n'# t          $ r d}|                     d           Y nw xY wY nw xY w	 |d         }n# t          $ r d}Y nw xY w||z
  |z
  |z
  }|dk     r||z
  }	 |d         }|dk    rt          |          }n# t          $ r t          |          }Y nw xY w|dk     rd}|                     d           n||k    r|}t          ||z
  |d          }| rLd	                    |           dt          |           dk    rdndd}t          j        |t          d !           t          ||||||
||||	|          S )"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    ss    ND	\O$5$55	6	6 4! 	4 	4DZZ\\F!&)nnt3DOO	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ED){# ) ) )i((((()0j! 	$((+Q///  ( ( (h'''''(,i , , ,	,-(FF 	, 	, 	,F!!(+++++	,,(j! ( ( (h'''''(.% 	. 	. 	.	._%'(()* H
  	. 	. 	.H!!*-----	.	.H~    4<& 7*Daxx t|
/%& A::
 )..E  + + +$T**+ qyyk****	 UU]U1===G  9IIn%%%%((A--EE699
 	c>a8888  s   ;A++A/2A/B !B43B48C !C>=C>D 
E	DE	!E E	EE	E	E !E:9E:>F 
GF-,G-!GGGGGG$ $G32G3H+ +IIc                  \   i } t          dt                      z            5 }|D ]7}|                                }t          |d                   dz  | |d         <   8	 ddd           n# 1 swxY w Y   	 | d         }| d         }n5# t          $ r( t          j                    \  }}}}}}}||z  }||z  }Y nw xY w||z
  }t          ||d          }		 t          d	t                      z            }|5  dx}
}|D ]}|                    d
          r/t          |                    d          d                   dz  dz  }
nC|                    d          r.t          |                    d          d                   dz  dz  }|
| n(d}|dz  }t          j
        |t          d           dx}
}ddd           n# 1 swxY w Y   nL# t          $ r?}ddt          |          z  z   }t          j
        |t          d           dx}
}Y d}~nd}~ww xY wt          j        ||||	|
|          S )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5	6	6 4! 	4 	4DZZ\\F!&)nnt3DOO	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ]#L!      373E3G3G01aE4  
 4<DD%222Go&7&7788  	 	C$   ??9-- ?djj..q122Q6=CC__Z00 ?tzz$//233a7$>D?t'7E
 E88c>a@@@@d%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	     ;4s3xx?@ 	 	c>a8888dddddd8 =dGS$???sN   ;A))A-0A-5B /B87B8G	 3B>F==GG	
H5HHc                  N   t                      } t          |            t          d| z            5 }|                                                                }ddd           n# 1 swxY w Y   |dt          t          j                  dz            }d |D             }t          | S )zReturn a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    r   Nr   c                 <    g | ]}t          |          t          z  S rB   floatCLOCK_TICKSr   s     rD   r   zcpu_times.<locals>.<listcomp>o  s#    555eAhh$555rC   )r   r   r   r   r   r   r   _fields)r   r   r   r   s       rD   	cpu_timesr  c  s     "##K%%%	Y,	-	- &##%%& & & & & & & & & & & & & & &AI-..223F55f555Ffs   'A##A'*A'c                     t                      } t          |            g }t          d| z            5 }|                                 |D ]y}|                    d          rb|                                }|dt          t          j                  dz            }d |D             }t          | }|	                    |           z|cddd           S # 1 swxY w Y   dS )zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    r   s   cpur   c                 <    g | ]}t          |          t          z  S rB   r  r   s     rD   r   z!per_cpu_times.<locals>.<listcomp>  s#    AAAQ%(([0AAArC   N)
r   r   r   r   r   r   r   r   r  r   )r   cpusr   r   r   r   entrys          rD   per_cpu_timesr#  s  s%    "##K%%%D	Y,	-	- 
	

 	# 	#Dv&& #C	(9$:$:Q$> >?AA&AAA!6*E"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   BCCCc                  N   	 t          j        d          S # t          $ r d} t          dt	                      z            5 }|D ].}|                                                    d          r| dz  } /	 ddd           n# 1 swxY w Y   | dk    rt          j        d          }t          dt	                      z            5 }|D ]7}|
                    d	          d         }|                    |          r| dz  } 8	 ddd           n# 1 swxY w Y   | dk    rY dS | 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   z/000   (9(99:: 	a  ::<<**<88 1HC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !88Z))F9'8'8899 !Q ! !D::c??1-D||D)) !q!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !8844


-s]    +D$2B 4D$ B	D$B	;D$;D?D$D	D$D		D$D$#D$c                  P   t                      } d}d}t          j        |          pt          j        |          D ]b}t          |          5 }|                     |                                                                           ddd           n# 1 swxY w Y   ct          |           }|dk    r|S i }i }t          dt                      z            5 }|D ]}|                                                                }|s&	 |d         ||d         <   n# t          $ r Y nw xY wi }P|
                    d          r+|                    d	d
          \  }	}
t          |
          ||	<   	 ddd           n# 1 swxY w Y   t          |                                          }|pdS )z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNr   r&  	   cpu cores   physical id)r2  r1  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_coresr@    s2    
B 
EB	JB	".2 % % 	%!FF16688>>##$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%WWF{{ GL	\O$5$55	6	6 3! 	3 	3D::<<%%''D 3<H$=GL899     D! ??#ABB 3!%FA!6!6JC(+E

L%	33 3 3 3 3 3 3 3 3 3 3 3 3 3 3$ !!""F>TsI   :BB	B	-E8DE8
D$!E8#D$$AE88E<?E<c                  2   t          dt                      z            5 } d}d}d}| D ]}|                    d          r(t          |                                d                   }ny|                    d          r(t          |                                d                   }n<|                    d          r't          |                                d                   }||| nddd           n# 1 swxY w Y   d}t          j        ||||          S )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_statsrG    sS   	Y!2!22	3	3 q
 	 	Dw'' 7"4::<<?33)) 7 a11

,, 7"%djjll1o"6"6(#/*!              " Hj/8  s   C
C55C9<C9c            
      H   g } t          dt                      z            5 }|D ]e}|                                                    d          r<|                     t          |                    dd          d                              f	 ddd           n# 1 swxY w Y   | S )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_freqrJ    s    
C	\O$5$55	6	6 :! 	: 	:Dzz||&&z22 :

5D!!4!4Q!788999	:: : : : : : : : : : : : : : : Js   A)BBBz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	         t                      } t          j        d          pt          j        d          }|                    d            g }t          j        j        }t          |          D ]^\  }}t          |          t          |           k    r| |         dz  }nt           ||d          d          }|t           ||d	          d          }|ed
	                    |          }t          |d          dk    r*|                    t          j        ddd                     d}t          |          t          |          dz  }t          t           ||d                              dz  }	t          t           ||d                              dz  }
|                    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                 j    t          t          j        d|                                                     S )Nz[0-9]+)r   r*  r.  group)rL   s    rD   <lambda>zcpu_freq.<locals>.<lambda>  s&    RYy!%<%<%B%B%D%D!E!E rC   )r>  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)rJ  r4  sortr   rs   r  	enumerater   r   formatr   r   r   scpufreqNotImplementedErrorr   )cpuinfo_freqspathsr   pjoinirs   curronline_pathr
  max_min_s              rD   cpu_freqra    s   
 .//	:
 
 DYBCC 	 	

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

7#3Cc#B#BCCC =C-c222t99t#DtEE$(:;;<<==DDtEE$(:;;<<==DDJJw'dD99::::
rC   c                  2    d t                      D             S )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        c                 :    g | ]}t          j        |d d           S )r   )r   rW  r   s     rD   r   zcpu_freq.<locals>.<listcomp>#  s'    OOO! C--OOOrC   )rJ  rB   rC   rD   ra  ra    s      PO7L7N7NOOOOrC   c                       e Zd ZdS )_Ipv6UnsupportedErrorN)r?   r@   rA   rB   rC   rD   re  re  .  s        DrC   re  c                   r    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dS )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                 L   dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        d f}|||||f||f|f|f||f|f|f|f||||f||f||fd| _        d | _        d S )Ntcptcp6udpudp6unix)allri  tcp4rj  rk  udp4rl  rm  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfro  rj  rp  rl  rm  s         rD   __init__zNetConnections.__init__>  s     v~v'9:);<v~v'89):;-$dD1$<GG$<GGG4t,D\D\
 
	 !rC   c                    t          t                    }t          j        | j        d|d          D ]}	 t          | j        d|d|          }|                    d          r<|dd          d d         }||                             |t          |          f           q# t          t          f$ r Y t          $ rI}|j        t          j        k    rY d }~|j        t          j        k    rt          |           Y d }~Ђ d }~ww xY w|S )Nr   /fd/fd/zsocket:[r   )r   listr   listdirr{  r   r   r   r   r    r"   r   errnoEINVALENAMETOOLONGr   )r|  r   inodesrt   inoder   s         rD   get_proc_inodeszNetConnections.get_proc_inodesU  s<   T""*4+<+<+<cccBCC 	9 	9B9 $2C2C2CSSS""!MNN  ##J// 9!!""IcrcNE5M((#s2ww888% &'9:       9,,HHHH9 222#JJJHHHH s)   B%%D
8	D
D$DDD
c                     i }t                      D ]H}	 |                    |                     |                     ,# t          t          t
          f$ r Y Ew xY w|S N)pidsupdater  r    r"   r!   )r|  r  r   s      rD   get_all_inodeszNetConnections.get_all_inodeso  ss    66 	 	C
d223778888%'9?K     s   (=AAc           
      (   |                      d          \  }}t          |d          }|sdS t          r|                    d          }|t          j        k    r`t          r1t	          j        |t          j	        |          ddd                   }nt	          j        |t          j	        |                    }nt          j	        |          }	 t          rCt	          j        t          j
        t          j        dgt          j        d|          R            }nBt	          j        t          j
        t          j        dgt          j        d|          R            }n$# t          $ r t                      st            w xY wt#          j        ||          S )	a  Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:

        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.

        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        :   rB   asciiNr  z>4Iz<4I)r   r   r   encodert  ru  LITTLE_ENDIAN	inet_ntopbase64	b16decoderw  structpackunpackr(  r   re  r   addr)r  familyipports       rD   decode_addresszNetConnections.decode_address  s   " ::c??D4}}  	2 	$7##BV^## D%ff.>r.B.B44R4.HII%ff.>r.B.BCC!"%%B  	)EEFM%,D,DEEE BB
  )EEFM%,D,DEEE B    $ // |B%%%s   BE !E<Nc              #     K   |                      d          r!t          j                            |           sdS t	          |           5 }|                                 t          |d          D ]\  }}	 |                                dd         \
  }}	}
}}}}}}}n&# t          $ r t          d| d|d|          w xY w||v r||         d         \  }}nd	\  }}|||k    rx|t          j        k    rt          |         }nt          j        }	 t                              |	|          }	t                              |
|          }
n# t"          $ r Y w xY w||||	|
||fV  	 ddd           dS # 1 swxY w Y   dS )
z.Parse /proc/net/tcp* and /proc/net/udp* files.6Nr   r   error while parsing ; malformed line r   r   Nr  )r   r   rs   existsr   r   rU  r   r(  RuntimeErrorrt  rv  TCP_STATUSESr   	CONN_NONErg  r  re  )filer  type_r  
filter_pidr   linenor   r  laddrraddrstatusr  r   rt   s                  rD   process_inetzNetConnections.process_inet  s1      == 	bgnnT&:&: 	Ft__ "	IJJLLL )!Q  I  I

SbS) BAueVQ1aEE "   &,44/  
 F?? %UmA.GC&GC)jC.?.? 222!-f!5!(!2! . = =eV L L . = =eV L L0 ! ! ! !vueUFCHHHHHA I"	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	I "	IsO   *E13'BE1#B>>AE16EE1
EE1EE11E58E5c           
   #      K   t          |           5 }|                                 |D ]}|                                }	 |dd         \  }}}}}}}	n)# t          $ r d|vrY :t	          d| d|          w xY w|	|v r	||	         }
ndg}
|
D ]e\  }}|||k    rt          |          dk    r|d	         nd
}t          j        t          |                    }d
}t          j	        }|||||||fV  f	 ddd           dS # 1 swxY w Y   dS )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  r  r  r   r   tokensr  r  r  pairsr   rt   rs   r  r  s                   rD   process_unixzNetConnections.process_unix  s      t__ 	LJJLLL L L	281+/Aq!Qq%%!   $ &,44'  	 F?? #5MEE'LE$ L LGC!-*2C2C -0[[A-=-=vbzz2 ' 8U D D !#!(!2!65$vsKKKKKL%L	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls6   -D ADA9!D#A99A<DD
Dc                    || j         vr7t          d|dd                    d | j         D                                 t                      | _        ||                     |          }|sg S n|                                 }t                      }| j         |         D ]\  }}}| j        d|}|t          j	        t          j
        fv r|                     |||||          }	n|                     ||||          }	|	D ]U\  }
}}}}}}|rt          j        |
|||||          }nt          j        |
||||||          }|                    |           Vt#          |          S )Nzinvalid z kind argument; choose between r   c                 ,    g | ]}t          |          S rB   )reprr   s     rD   r   z+NetConnections.retrieve.<locals>.<listcomp>  s    #?#?#?DGG#?#?#?rC   z/net/)r  )rz  r(  r  r   r{  r  r  r3  rt  ru  rw  r  r  r   pconnsconnr5  r  )r|  kindr   r  r   
proto_namer  r  rs   r8  rt   r  r  r  	bound_pidconns                   rD   retrievezNetConnections.retrieve  s   ty  *44#?#?TY#?#?#?@@@B   ,--?))#..F 	 ((**Fee)-4 	 	%J"&"3"3"3ZZ@D&.&/:::&&&%C '   &&tVV&LLFH 	 	BFE5% "=FE5% DD #=FE5% D 	 CyyrC   r  )r?   r@   rA   __doc__r}  r  r  staticmethodr  r  r  r  rB   rC   rD   rg  rg  2  s        	 	! ! !.  4    2& 2& \2&h 'I 'I 'I \'IR !L !L !L \!LF! ! ! ! ! !rC   rg  rq  c                 6    t                               |           S )z$Return system-wide open connections.)_net_connectionsr  )r  s    rD   net_connectionsr  )  s    $$T***rC   c                     t          dt                      z            5 } |                                 }ddd           n# 1 swxY w Y   i }|dd         D ]}|                    d          }|dk    sJ t	          |                      |d|                                         }||dz   d                                                                         }t          t          |          \  }}}	}
}}}}}}}}}}}}|||||	||
|f||<   |S )zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z
%s/net/devNr;   r  r   r   )	r   r   	readlines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  .  su    
</"3"33	4	4               Gabb	 $
 $


3qyyy$t**yyyFUF|!!##eaikk"((**0022* V'	
 	
 Ns   A  AAc                  *   t           j        t          t           j        t          t           j        t          i} t                                                      }i }|D ]}	 t          j
        |          }t          j        |          }t          j        |          \  }}d                    |          }d|v }	t          j        |	| |         |||          ||<   }# t           $ r/}
|
j        t"          j        k    r t'          |
           Y d}
~
d}
~
ww xY w|S )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11E 4T::MFE 88E??L%D)j(%l CII  	 	 	yEL((c







	 Js   ?C
D!%DDFc                    d }d }t           j                            dt                      z            r |            }nHt           j                            d          r |            }nt	          dt                      z            i }|D ]C}|\
  }}}}	}
}}}}}| st          |          s!|	t          z  }	|
t          z  }
|||	|
|||||f	||<   D|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 } |                                 }d d d            n# 1 swxY w Y   |D ]}|                                }t	          |          }|dk    rF|d         }t          |d                   }t          t
          |dd                   \
  }}}	}
}}}}}}n|dk    s|dk    r2|d         }t          t
          |dd                   \  }}}}	}
}}}}}}nM|dk    r5|d         }t          t
          |dd                    \  }}}
}d	x}	x}x}x}}nt          d
|z            |||
|||	||||f
V  d S )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  s     " ~(9(99:: 	"aKKMME	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	; 	;DZZ\\Fv;;DrzzayF1I69#vad|6L6L4vufmE1itrzzay69#vad|6L6L4feV]E1iay03C0D0D-vvvKLLLLL}yy !Dt!KLLLu	; ; ; ; ;-	; 	;s   AA	Ac               3   \  K   t          j        d          D ]} t          j        t           j                            d|                     D ]\  }}}d|vrt          t           j                            |d                    5 }|                                                                                                }d d d            n# 1 swxY w Y   t           j        	                    |          }t          t          |d d                   \
  }}}	}
}}}}}}||||	||
||||f
V  ސd S )N
/sys/blockstatr   )r   r  walkrs   r  r   r6  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     Z-- 	F 	FE"$'"',,|U*K*K"L"L 
F 
Fa&&rw||D&99:: 6aVVXX^^--3355F6 6 6 6 6 6 6 6 6 6 6 6 6 6 6w''-- 47sF3B3K3H3H1feV]E1iUFFFElM9F F F F F
F	F 	Fs   9C		CCr  r  zC%s/diskstats nor /sys/block filesystem are available on this system)r   rs   r  r   rX  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 F F 
w~~n'8'8899 	
kmm		%	% 
jll! 
 
 	
 G A A ).	&ufffeUL9 	066 	 """"u%}iA NrC   c                   8    e Zd ZdZddgZd Zd Zd Zd Zd Z	d	S )
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        |          | _        d S Nr   )r   r  st_devr  r  )r|  devs     rD   r}  zRootFsDeviceFinder.__init__  s4    gcll!Xc]]
Xc]]


rC   c                 .   t          dt                      z            5 }|                                dd          D ]}|                                }t	          |          dk     r*|d                                         rt          |d                   nd }|d                                         rt          |d                   nd }|d         }|| j        k    r || j        k    r|rd|z  c cd d d            S 	 d d d            d S # 1 swxY w Y   d S )Nz%s/partitionsr;   r  r   r   r<   /dev/%s)	r   r   r  r   r   isdigitr   r  r  )r|  r   r   r   r  r  r   s          rD   ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions  sq   ):)::;; 
	0qabb) 	0 	0v;;??*0)*;*;*=*=GF1I4*0)*;*;*=*=GF1I4ayDJ&&5DJ+>+> 0(4///
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0	0
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0s   CD
;D

DDc                 6   d| j         d| j        d}t          |          5 }|D ]Y}|                    d          rB|                                                    d          d         }|rd|z  c cd d d            S Z	 d d d            d S # 1 swxY w Y   d S )Nz/sys/dev/block/r  z/ueventzDEVNAME=r;   r  )r  r  r   r   r   
rpartition)r|  rs   r   r   r   s        rD   ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block  s    04


DJJJGt__ 	0 0 0??:.. 0::<<22:>>qAD 0(4///	0 	0 	0 	0 	0 	0 	0 	00	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   AB?BBBc                    | j         d| j        }t          j        d          }|D ]}	 t	          |          }|5  |                                                                }||k    rOt          j        	                    t          j        
                    |                    }d|z  cd d d            c S 	 d d d            n# 1 swxY w Y   # t          $ r Y w xY wd S )Nr  z/sys/class/block/*/devr  )r  r  r4  iglobr   r6  r   r   rs   r  dirnamer    )r|  needler  r  r   datar   s          rD   ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block  sO    JJJ

3
344 
	0 
	0D	0dOO  0 06688>>++Dv~~!w//0E0EFF(4/	0 0 0 0 0 0 0 0 0 0%0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 %   
	0 
	0s#   CA-CC		C		
CCc                    d }|C	 |                                  }n-# t          t          f$ r}t          |           Y d }~nd }~ww xY w|C	 |                                 }n-# t          t          f$ r}t          |           Y d }~nd }~ww xY w|C	 |                                 }n-# t          t          f$ r}t          |           Y d }~nd }~ww xY w|!t          j                            |          r|S d S d S r  )	r  r   r   r   r  r%  r   rs   r  )r|  rs   r   s      rD   findzRootFsDeviceFinder.find  s7   <//11W%   c







<--//W%   c







<//11W%   c







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

---- "ZZ--a0FE***+		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ g"'.."="=g&&{33g&&'7+'EFFG%k22J 
 
	+4(
FDVF,,,'))..00:FF 	 V722"6:vtDDvNs   BCCCc            	      8	   t          j        t                    } t          j        d          }|                    t          j        d                     t          t          d |D                                 }t          j        d          }t          j        d          }|D ]1}|	                    d|          }||vr|
                    |           2|D ]a}	 |dz   }t          t          |                    dz  }t          j                            t          j                            |          d	          }t#          |                                          }	n# t&          t(          t*          f$ r Y w xY wt          |d
z   d          }
t          |dz   d          }t#          |dz   d                                          }|
&	 t          |
          dz  }
n# t*          $ r d}
Y nw xY w|&	 t          |          dz  }n# t*          $ r d}Y nw xY w| |	         
                    |||
|f           c|sNt          j        d          }t          t          |                    }|D ]}	 t          j                            |d          }t          t          |                    dz  }t          j                            |d          }t#          |                                          }	n3# t&          t(          t*          f$ r}t-          |           Y d}~d}~ww xY wt          j        |dz             }t          d |D                       }d}d}
|D ]}t          j                            ||dz             }t#          |d                                          }|dk    r3t          t          j                            ||dz             d          }n8|dk    r2t          t          j                            ||dz             d          }
|
&	 t          |
          dz  }
n# t*          $ r d}
Y nw xY w|'	 t          |          dz  }# t*          $ r d}Y w xY w| |	         
                    d||
|f           t/          |           S )a  Return hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*c                 D    g | ]}|                     d           d         S r  r   r   r   s     rD   r   z(sensors_temperatures.<locals>.<listcomp>t  &    ???AGGCLLO???rC   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg     @@r   _maxNrP  _crit_labelr  z /sys/class/thermal/thermal_zone*temptypez/trip_point*c                     g | ]O}d                      t          j                            |                              d           dd                   PS )r  r   r<   )r  r   rs   r  r   )r   ps     rD   r   z(sensors_temperatures.<locals>.<listcomp>  s[        ))!,,22377!<==  rC   _typecritical_temphigh)collectionsr   r  r4  extendsortedr3  r*  r+  subr   r  r   r   rs   r  r"  r   r   r   r   r(  r   dict)r   	basenames
basenames2replr   altnamebasers   r   	unit_namerM  rK  labelr   
trip_pathstrip_points
trip_point	trip_types                     rD   sensors_temperaturesr^  a  s    
!$
'
'C	;<<I TYGHHIIIs??Y???@@AAI ? J :?@@D # #((.55)##T"""  @  @	(?DDJJ''&0G7<< 5 5v>>DD		))II*- 		 		 		 H		 D6MD111w666D8Ob1117799T{{V+     ??V3        	IugtX>????  ,AI@AA	3y>>**	 (	A (	ADw||D&11T

++f4w||D&11IIOO--		Wj1   c


 4.#899J  #    K HD) ( (
w||D*w*>??r22288::	
**#T:+?@@4     HH &((T:+?@@4  D #$$T{{V3% $ $ $#$'(#(??V#;% ( ( (#'( ( 	N!!2wh"?@@@@99st   BE  E:9E:G!!G0/G06H		HH5B K66L&L!!L&P//P>=P>QQ'&Q'c                     t          j        t                    } t          j        d          }|st          j        d          }t	          t          d |D                                 }|D ]}	 t          t          |dz                       }n-# t          t          f$ r}t          |           Y d}~Id}~ww xY wt          t          j                            t          j                            |          d                                                    }t          |dz   d	                                          }| |                             t%          j        ||                     t)          |           S )
a  Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*c                 D    g | ]}|                     d           d         S r?  r@  r   s     rD   r   z sensors_fans.<locals>.<listcomp>  rA  rC   rB  Nr   rE  r  rP  )rN  r   r  r4  rP  r3  r   r   r   r   r   r   r   rs   r  r"  r   r   r   sfanrR  )r   rS  rW  r   r   rX  rY  s          rD   sensors_fansrb    sZ    
!$
'
'C	:;;I G IEFF	s??Y???@@AAI < <	$th//00GG! 	 	 	#JJJHHHH	 RW__T%:%:FCCDDJJLL	D8Ob1117799Igl5'::;;;;99s   0BB:!B55B:c                  h   t                      fd} d t          j        t                    D             }|sdS t          j                            t          t          |          d                   } | |dz   |dz             } | |dz   |dz             } | |d	z   |d
z             } | |dz             }||	 d|z  |z  }n;# t          $ r d}Y n-w xY wt          t          |dz   d                    }|dk    rdS d} | t          j                            t          d          t          j                            t          d                    }	|	|	dk    }nGt          |dz   d          
                                                                }
|
dk    rd}n|
dv rd}|rt          j        }nj|5|3	 t          ||z  dz            }nO# t          $ r t          j        }Y n7w xY w|%t          |dz            }|dk     rt          j        }nt          j        }t          j        |||          S )a  Return battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    c                      | D ]Q}t          |          }|k    r8	 t          |          c S # t          $ r |                                cY c S w xY wRdS )zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rP  N)r   r   r(  r   )rZ  rs   r   nulls      rD   
multi_bcatz#sensors_battery.<locals>.multi_bcat  s      	' 	'Dtd+++Cd{{'s88OOO! ' ' '99;;&&&&&' 
 ts   /AAc                 h    g | ]/}|                     d           sd|                                v -|0S )BATbattery)r   r)  r   s     rD   r   z#sensors_battery.<locals>.<listcomp>  sK       << #,qwwyy"8"8 	
"8"8"8rC   Nr   z/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r   z	/capacityr  rP  z
AC0/onlinez	AC/onliner   /statusr  dischargingF)chargingfullTi  <   )objectr   r  POWER_SUPPLY_PATHrs   r  rP  ZeroDivisionErrorr   r   r   r)  r   POWER_TIME_UNLIMITEDPOWER_TIME_UNKNOWNsbattery)rf  batsr
  
energy_now	power_nowenergy_fulltime_to_emptyr_   power_pluggedonliner  secsleftre  s               @rD   sensors_batteryr}    s    88D     -..  D
  t 7<<)6$<<?;;D D=0$2FGGJ
4,.~0EFFI*TN2D>4IJJKJt&::;;M :#9	j(;6GG  	 	 	GGG	 c$,r:::;;b==4
 MZ
&55
&44 F !TI%33399;;AACC]""!MM+++ M  ./		I$9	2:	1D899HH  	2 	2 	21HHH	2		"}r)**a<<1H-GX}===s$   =C CC9G G('G(c                      g } t          j                    }|D ]9}|\  }}}}}t          j        ||pd|||          }|                     |           :| S )z:Return currently connected users as a list of namedtuples.N)r  usersr   suserr   )	r6  rawlistitemr   ttyhostnametstampr   nts	            rD   r  r  U  sf    GjllG  +/(c8VS]4hDDrNrC   c                  L   dt                      z  } t          |           5 }|D ]b}|                    d          rKt          |                                                                d                   }|a|c cddd           S ct          d| z            # 1 swxY w Y   dS )zAReturn the system boot time expressed in seconds since the epoch.r   s   btimer   Nzline 'btime' not found in %s)r   r   r   r  r   r   	BOOT_TIMEr  )rs   r   r   r   s       rD   	boot_timer  `  s    (((D	T		 Ba 	 	Dx(( DJJLL..00344	

B B B B B B B B 9D@AAAB B B B B B B B B Bs   ABBB Bc                  p    d t          j        t          t                                          D             S )z7Returns a list of PIDs currently running on the system.c                 T    g | ]%}|                                 t          |          &S rB   )r  r   r   s     rD   r   zpids.<locals>.<listcomp>t  s+    LLLq		LCFFLLLrC   )r   r  r#   r   rB   rC   rD   r  r  r  s.    LLBJq):):';';<<LLLLrC   c                    t          j        |           sdS 	 t                      d| d}t          |          5 }|D ]R}|                    d          r;t          |                                d                   }|| k    c cddd           S St          d|z            # 1 swxY w Y   dS # 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   rj  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  w  s[    s## !u	! &5%6%6%6%6<DT"" Ga + +Dx00 +"4::<<?33  $s{**G G G G G G G G+
 !!>!EFFFG G G G G G G G G G !*- 	! 	! 	!$&&=   	!s;   #B0 AB#B0 B##B''B0 *B'+B0 0!CCc                     i } t                      }t                      D ]}	 t          |d|d          5 }|                                }ddd           n# 1 swxY w Y   |                    d          }||dz   d                                         }t          |d                   }|| |<   # t          t          f$ r Y w xY w| S )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   r6  r  r   r   r    r"   )r   r   r   r   r$  rpardsetppids           rD   ppid_mapr    s"    C!##Kvv  	[[[###>??  1vvxx                              ::d##Dq

#))++DtAw<<DCHH "#56 	 	 	 D	 Js4   B2AB2A	B2A	 B22CCc                 F     t          j                    fd            }|S )zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    c                    	  | g|R i |S # t           $ r t          | j        | j                  t          $ r/ |                                  t          | j        | j                  t          $ r^ |                                  t          j	        
                    | j        d| j                  st          | j        | j                   w xY wr  )r!   r   r   _namer"   _raise_if_zombier   r    r   rs   r  r{  )r|  r   kwargsfuns      rD   wrapperz wrap_exceptions.<locals>.wrapper  s    	3t-d---f--- 	5 	5 	5tx444! 	6 	6 	6!!###$*555  	 	 	!!###7>>T->->->"IJJ :#DHdj999		s
    CC)	functoolswraps)r  r  s   ` rD   wrap_exceptionsr    s:    
 _S     NrC   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                            d ej                    z            re	d             Ze	d             Ze	d             Ze	d9d            Ze	d             Ze	d             Zese rHd Z!e	 e"j#        d           e"j#        d           e"j#        d          fd            Z$e	d             Z%neZ%e re	d             Z&e	d              Z'e	 e"j#        d!          fd"            Z(e	 e"j#        d#          fd$            Z)e	d%             Z*e	d&             Z+e	d'             Z,e-r)e	d(             Z. e"j#        d)          fd*Z/e	d+             Z0e1re	d,             Z2e	d-             Z3e4e	d9d.            Z5e	d/             Z6e	d0             Z7e	d:d2            Z8e	d3             Z9e	d4             Z:e	 e"j#        d5          fd6            Z;e	 e"j#        d7          fd8            Z<dS );ProcesszLinux process implementation.)_cacher  _ppidr{  r   c                 V    || _         d | _        d | _        t                      | _        d S r  )r   r  r  r   r{  )r|  r   s     rD   r}  zProcess.__init__  s+    

+--rC   c                     	 t          | j        d| j        d          }|                    d          }||dz   |dz            }|dk    S # t          t
          f$ r Y dS w xY w)Nr   r  r  r;   r<      ZF)r   r{  r   r  r   r   )r|  r$  r  r  s       rD   
_is_zombiezProcess._is_zombie  s    	"(9(9(94888DEED ::d##D$(TAX-.FT>! ! 	 	 	55	s   A A! A!c                 n    |                                  r t          | j        | j        | j                  d S r  )r  r   r   r  r  r|  s    rD   r  zProcess._raise_if_zombie  s9    ?? 	B$*djAAA	B 	BrC   c                 L    t          j        | j        d| j                   dS )z+Raise NSP if the process disappeared on us.r   N)r   r  r{  r   r  s    rD   _raise_if_not_alivezProcess._raise_if_not_alive  s,     	4,,,dhh788888rC   c                 "   t          | j        d| j        d          }|                    d          }||                    d          dz   |         }||dz   d                                         }i }||d<   |d	         |d
<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   	 |d         |d<   n$# t          $ r t          d           d	|d<   Y nw xY w|S )aY  Parse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        r   r  r     (r   r;   Nr   r   r  r  r  ttynr   utime   stime   children_utimer  children_stime   create_time$   cpu_num'   blkio_ticksz&can't get blkio_ticks, set iowait to 0)r   r{  r   r  r'  r   
IndexErrorr   )r|  r$  r  r   r   r   s         rD   _parse_stat_filezProcess._parse_stat_file  sS    D$5$5$5txxx@AA zz$DIIdOOa'$./dQhjj!''))Fq	HQiFayGbzGbzG &r
 &r
#BZMI	#!'C 	# 	# 	#:;;;!"C	#
 
s   C+ +DDc                     t          | j        d| j        d          5 }|                                cddd           S # 1 swxY w Y   dS )zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        r   rj  N)r   r{  r   r6  r|  r   s     rD   _read_status_filezProcess._read_status_file  s     4+<+<+<dhhhGHH 	A6688	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                     t          | j        d| j        d          5 }|                                                                cd d d            S # 1 swxY w Y   d S )Nr   z/smaps)r   r{  r   r6  r   r  s     rD   _read_smaps_filezProcess._read_smaps_file  s     $*;*;*;TXXXFGG 	$16688>>##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   &AAAc                     | j                             |            | j                            |            | j                            |            d S r  )r  cache_activater  r  r  s    rD   oneshot_enterzProcess.oneshot_enter   sM    ,,T222--d333,,T22222rC   c                     | j                             |            | j                            |            | j                            |            d S r  )r  cache_deactivater  r  r  s    rD   oneshot_exitzProcess.oneshot_exit%  sM    ..t444//555..t44444rC   c                 f    |                                  d         }t          rt          |          }|S )Nr   )r  r   r   )r|  r   s     rD   r   zProcess.name*  s0    $$&&v. 	 $<<DrC   c                     	 t          | j        d| j        d          S # t          t          f$ rG |                                  t          j                            | j        d| j                  rY dS  w xY w)Nr   z/exer  )	r   r{  r   r    r"   r  r   rs   lexistsr  s    rD   exezProcess.exe2  s    		4+<+<+<dhhhGHHH!#56 	 	 	!!### w$*;*;*;TXXFGG rr	s   ! AA97A9c                    t          | j        d| j        d          5 }|                                }d d d            n# 1 swxY w Y   |s|                                  g S |                    d          rdnd}|                    |          r
|d d         }|                    |          }|dk    r,t          |          dk    rd|v r|                    d          }|S )Nr   z/cmdliner   r   r  r   )r   r{  r   r6  r  r   r   r   )r|  r   r$  sepcmdlines        rD   r  zProcess.cmdline?  s%   $*;*;*;TXXXFGG 	16688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	!!###I f--6ff3== 	9D**S// &==S\\Q..3$;;jjooG   AAAc                     t          | j        d| j        d          5 }|                                }d d d            n# 1 swxY w Y   t	          |          S )Nr   z/environ)r   r{  r   r6  r   )r|  r   r$  s      rD   environzProcess.environY  s    $*;*;*;TXXXFGG 	16688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	"4(((r  c                     t          |                                 d                   }t          j                    }	 ||         S # t          $ r Y d S w xY w)Nr  )r   r  r   get_terminal_mapr   )r|  tty_nrrz  s      rD   terminalzProcess.terminal_  s_    T**,,W566(**	< 	 	 	44	s   A 
AAz/proc/%s/ioc           	      *   | j         d| j        d}i }t          |          5 }|D ]T}|                                }|r<	 |                    d          \  }}t          |          ||<   D# t          $ r Y Pw xY wU	 d d d            n# 1 swxY w Y   |st          d|z            	 t          |d         |d         |d         |d         |d	         |d
                   S # 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 )r{  r   r   r   r   r   r(  r  r   r   r   )r|  fnamer   r   r   r   r?  r   s           rD   io_counterszProcess.io_countersk  s   "&"3"3"3TXXX>EFU## 6q 
6 
6D::<<D 66*.**U*;*;KD%
 ,/u::F4LL	  * % % %$H%6
66 6 6 6 6 6 6 6 6 6 6 6 6 6 6  @"#6#>???8$8$=)>*8$8$       x{{{EEE663  sM   B	 A+B	+
A85B	7A88B		BB)7C! !
D+"DDc                 r   |                                  }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          rD   r  zProcess.cpu_times  s    &&((fWo&&4fWo&&4v&6788;Fv&6788;Fvm,--;~~vNNNrC   c                 P    t          |                                 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66rC   Nc                 B    t          j        | j        || j                  S r  )r   wait_pidr   r  )r|  timeouts     rD   waitzProcess.wait  s     7DJ???rC   c                     t          |                                 d                   }t          pt                      }|t          z  |z   S )Nr  )r  r  r  r  r  )r|  ctimebts      rD   r  zProcess.create_time  s@    d++--m<== %)++#r))rC   c           	         t          | j        d| j        d          5 }d |                                                                d d         D             \  }}}}}}}d d d            n# 1 swxY w Y   t          |||||||          S )Nr   z/statmc              3   D   K   | ]}t          |          t          z  V  d S r  )r   r   r   s     rD   	<genexpr>z&Process.memory_info.<locals>.<genexpr>  s>       8 8&'A!8 8 8 8 8 8rC   r  )r   r{  r   r   r   rx   )	r|  r   vmsr~   rf   textlibr$  dirtys	            rD   memory_infozProcess.memory_info  s     $*;*;*;TXXXFGG 	18 8+,::<<+=+=+?+?+C8 8 84CfdCu	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 CfdCu===s   AA--A14A1c                 2   dx}x}}t          d                    | j        | j                            5 }|D ]}|                    d          r.|t          |                                d                   dz  z  }E|                    d          r+t          |                                d                   dz  }|                    d          r*t          |                                d                   dz  }	 d d d            n# 1 swxY w Y   |||fS )Nr   z{}/{}/smaps_rollups   Private_r   r      Pss:   Swap:)r   rV  r{  r   r   r   r   )r|  rz   r{   r|   r   r   s         rD   _parse_smaps_rollupzProcess._parse_smaps_rollup  sQ     ! C #$++D,=txHH  
; ; ;D{33 ;s4::<<?33d::11 ;!$**,,q/22T922 ;"4::<<?33d:;
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; d##s   CD		DDs   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                    |                                  }t          t          t          |                    |                              dz  }t          t          t          |                    |                              dz  }t          t          t          |                    |                              dz  }|||fS )Nr   )r  r7  r  r   findall)r|  _private_re_pss_re_swap_re
smaps_datarz   r{   r|   s           rD   _parse_smapszProcess._parse_smaps  s    . ..00J c#{22:>>??@@4GCc#wz::;;<<tCCs3 0 0 < <==>>EDd##rC   c                    t           rI	 |                                 \  }}}nG# t          t          f$ r |                                 \  }}}Y nw xY w|                                 \  }}}|                                 }t          ||||fz    S r  )HAS_PROC_SMAPS_ROLLUPr  r"   r    r  r  ry   )r|  rz   r{   r|   	basic_mems        rD   memory_full_infozProcess.memory_full_info  s    $ 59%)%=%=%?%?NCdd*,=> 9 9 9%)%6%6%8%8NCddd9 "&!2!2!4!4S$((**IY#sD)99::s   " )AAc                 ,   d }|                                  }|s|                                  g S |                    d          }g }|                    d          }|g} |||          D ]\  }}|                    dd          }	 |\  }	}
}}}}n# t          $ r |dgz   \  }	}
}}}}Y nw xY w|sd}nXt
          rt          |          }|                                }|                    d          rt          |          s
|dd	         }t          |	          t          |
          ||
                    d
d          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          f}|                    |           |S )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     K   i }| D ]}|                     d d          }|d                             d          s.|                                |fV  |                    |           a	 t	          |d                   dz  ||d         <   # t
          $ r0 |d                             d          rY t          d|z            w xY w|                                |fV  d S )N   r   rI  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00F!!9--d33 ",0022D9999%,,T2222
".1&)nnt.CDOO) " " "%ay33K@@ " (&0$I&*%+'" '" !"" %((**D111111s   )!B%C2C   
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   )r|  r  r$  r  r8  
first_liner   headerhfieldsr  perms_offset_dev_inoders   r  s                   rD   memory_mapszProcess.memory_maps  sA   2 2 2, ((**D  %%'''	JJu%%EB1J'LM *
5- @ @     ,,tQ//N?F<D%$! N N N?F"~<D%$N 	*#DD ,%d||::<<D}}\22 *;M< < *  $DSDz4LL5MMHHWa((HHXq))HHWa((HH-q11HH-q11HH.22HH.22HH^Q//HH]A..HHXq)) 		$Is   	BB,+B,c                 @    t          | j        d| j        d          S )Nr   z/cwd)r   r{  r   r  s    rD   cwdzProcess.cwdR  s$    t'8'8'8$(((CDDDrC   s   ctxt_switches:\t(\d+)c                    |                                  }|                    |          }|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  rX  r{  r   r   pctxswr   )r|  	_ctxsw_rer$  ctxsws       rD   num_ctx_switcheszProcess.num_ctx_switchesV  s     %%''!!$'' 	@%% 150A0A0A4888M   >#eAh--U1X???rC   s   Threads:\t(\d+)c                 z    |                                  }t          |                    |          d                   S Nr   )r  r   r  )r|  _num_threads_rer$  s      rD   num_threadszProcess.num_threadse  s6    
 %%''?**4003444rC   c                     t          j        | j        d| j        d          }|                                 g }d}|D ]'}| j        d| j        d|d}	 t          |          5 }|                                                                }d d d            n# 1 swxY w Y   n# t          t          f$ r d}Y |w xY w||
                    d          dz   d          }|                    d	          }t          |d
                   t          z  }	t          |d                   t          z  }
t          j        t!          |          |	|
          }|                    |           )|r|                                  |S )Nr   z/taskFz/task/r  Tr  r;   r  r  r  )r   r  r{  r   rT  r   r6  r   r    r"   r'  r   r  r  r   pthreadr   r   r  )r|  
thread_idsr6  
hit_enoent	thread_idr  r   str   r  r  r<  s               rD   threadszProcess.threadsm  s   Z0A0A0A4888 LMM

# 	# 	#I!!!		E
 '' *1))B* * * * * * * * * * * * * * *%'9:    "
	 BGGDMMA%''(BXXd^^F&*%%3E&*%%3E_S^^UEBBFNN6"""" 	'$$&&&s6   B&''BB&B	B&!B	"B&&B<;B<c                 4    t          j        | j                  S r  )r  getpriorityr   r  s    rD   nice_getzProcess.nice_get  s     %dh///rC   c                 6    t          j        | j        |          S r  )r  setpriorityr   )r|  r?  s     rD   nice_setzProcess.nice_set  s    %dh666rC   c                 4    t          j        | j                  S r  )r  r6   r   r  s    rD   cpu_affinity_getzProcess.cpu_affinity_get  s    -dh777rC   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      f   |                                  }|                    |          }|rRt          t          t	          |d         d                   t	          |d         d                   dz                       S t          t          t          t                                                    S )Nr   r   )r  r  r  ranger   r   r#  )r|  _rer$  r,  s       rD   _get_eligible_cpuszProcess._get_eligible_cpus  s     ))++DKK%%E 9E#eAhqk"2"2Ca4D4Dq4HIIJJJE#moo"6"677888rC   c           	         	 t          j        | j        |           d S # t          t          f$ r}t          |t                    s|j        t          j        k    r|                                 }t          t          t          t                                                    }|D ]4}||vrt	          d|d|          ||vrt	          d|d|          5 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#  )r|  r!  r   eligible_cpusall_cpuscpus         rD   cpu_affinity_setzProcess.cpu_affinity_set  s   *48T:::::Z(   c:.. #)u|2K2K$($;$;$=$=M$U3}+?+?%@%@AAH# 
 
h..",*#&33!7# #  m33",*03]]!D# #  4
 s    CB+CCc                     t          j        | j                  \  }}t          t	          |          }t          j        ||          S r  )r  r5   r   enumr>   r   pionice)r|  ioclassr?  s      rD   
ionice_getzProcess.ionice_get  s=    !1$(;;NGU$W--?7E222rC   c                     |d}|r"|t           t          fv rt          d|z            |dk     s|dk    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   )r|  r3  r?  r
  s       rD   
ionice_setzProcess.ionice_set  ss    } J%68I$JJJ !>!HIIIqyyEAII. oo%''5AAArC   c                    | j         dk    rd}t          |          	 |t          | j         |          S t          |          dk    r$ddt	          |          z  z   }t          |          t          | j         ||           d S # t
          $ r/}|j        t          j        k    r|                                   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  )r|  r   r   r
  r   s        rD   rlimitzProcess.rlimit  s    
 x1}}A oo%>"48Y777 6{{a''E-V<=  )oo-DHi88888   9,, ))+++s   B AB 
B=*B88B=c                     |                                  d         }t          r|                                }t                              |d          S )Nr  ?)r  r   r   PROC_STATUSESr   )r|  letters     rD   r  zProcess.status  sC    &&((2 	%]]__F  ---rC   c                 6   g }t          j        | j        d| j        d          }d}|D ]}| j        d| j        d|}	 t	          |          }|                    d          r,t          |          r| j        d| j        d|}	 t          |          5 }t          |	                                
                                d                   }t          |	                                
                                d         d          }	d d d            n# 1 swxY w Y   t          |	          }
t          |t          |          t          |          |
|	          }|                    |           O# t          t          f$ r d}Y ew xY wk# t          t          f$ r d}Y t           $ rK}|j        t"          j        k    rY d }~|j        t"          j        k    rt)          |           Y d }~ς d }~ww xY w|r|                                  |S )	Nr   r  Fr  z/fdinfo/r   r   T)r   r  r{  r   r   r   r   r   r   r   r   r   rr   r   r    r"   r   r  r  r  r   r  )r|  r6  r  r  rt   r  rs   r   posrw   rv   r<  r   s                rD   
open_fileszProcess.open_files  s   
):):):DHHHEFF
 *	/ *	/B$($5$5$5txxxDD(/~~& ??3'' /M$,?,? / )))D
/(.. D!"%ajjll&8&8&:&:1&=">">C$'

(:(:(<(<Q(?$C$CED D D D D D D D D D D D D D D  2%88!* #b''3s88T5" "  v.... ./AB * * * &*


*; &'9:   !
   9,,HHHH9 222#JJJHHHHF  	'$$&&&sa   FE:A4DE:D 	 E:#D 	$E::FFH ,	H 5G;$G;:G;;H rq  c                 n    t                               || j                  }|                                  |S r  )r  r  r   r  )r|  r  r   s      rD   r  zProcess.net_connections/	  s0    ''dh77  """
rC   c                 d    t          t          j        | j        d| j        d                    S )Nr   r  )r   r   r  r{  r   r  s    rD   num_fdszProcess.num_fds5	  s.    2:D,=,=,=txxxHIIJJJrC   c                 P    t          |                                 d                   S )Nr  r  r  s    rD   r  zProcess.ppid9	  s!    4((**62333rC   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r  )r  r  r   puidsr   )r|  _uids_rer$  real	effectivesaveds         rD   uidszProcess.uids=	  X    %%''!)!1!1$!7!7!:i}SYYIE

CCCrC   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r  )r  r  r   pgidsr   )r|  _gids_rer$  rI  rJ  rK  s         rD   gidszProcess.gidsC	  rM  rC   r  rq  )=r?   r@   rA   r  r(  r}  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_PRIORITYr4  r7  r   r:  r  rA  r  rD  r  rL  rQ  rB   rC   rD   r  r    s       ''CCCI. . ." " " B B B9 9 9 # #  _#J    _ $ $  _$3 3 3
5 5 5
   _ 
 
 _
   _2 ) ) _)
   _ 
w~~mibikk122 !		 	 
	@ O O _O 7 7 _7 @ @ @ _@ * * _* > > _>$  E' E'	$ 	$ 	$. 
 #
#;<<BJ233RZ 455	$ 	$ 	$ 
	$< 
		; 		; 
		; 		; ' L	I	 I	 
I	V E E _E "
#<==@ @ @ _@ *4"*5H*I*I 5 5 5 _5   _< 0 0 _0 7 7 _7  $		8 	8 
	8 !bj!DEE		9 		9 		9 		9 
	 	 
	*  B		3 	3 
	3 
	B 	B 
	B 		 	 	 
	6 . . _. 1 1 _1f    _
 K K _K 4 4 _4 &BJ'DEE D D D _D
 &BJ'DEE D D D _D D DrC   r  r  rR  )F)r  
__future__r   r  rN  r  r  r4  r   r*  rt  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$   r1  __extra__all__rp  rs   r  rS  rT  r  hasattrrV  rU  r'  r  getpagesizer   r  	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   rO  dirr   r  r  r  r#  r/  r@  rG  rJ  ra  net_if_addrsre  rg  r  r  r  r  
disk_usager  r  r1  r^  rb  r}  r  r  r  r  r  r  r  rB   rC   rD   <module>rt     s
  
 % $                  				 				   



  # # # # # # " " " " " "             # # # # # # ) ) ) ) ) ) $ $ $ $ $ $ $ $ $ $ $ $ ' ' ' ' ' ' ! ! ! ! ! ! " " " " " " " " " " " "                         $ $ $ $ $ $ " " " " " "       + + + + + +                   ( ( ( ( ( ( ' ' ' ' ' ' " " " " " " " " " " " "       & & & & & & $ $ $ $ $ $ ' ' ' ' ' '              KKKKD	 	 	$ .  0929;; >??'>'LMM wt%677 74!899  bj&&!:!##	)  <GG DL)SS)9%:%:; M #G <OO    T\    GIIZ+,,, 
			 		"				$								!						 " 
"





 

 

 



!





 , 	
 K K K	L 	L *     J<<<> >	 z&>??:j$,1G"GHH
J J JK K
 J-*?!@!@@B B	 j 6 6 6 7 7 J{" " "# #	  (
 
 
$ $ $& 	0 0 	00K!!!! K K K	E
,s
2333;

;(:;;CcJJIIIIIIK   8        8 8 8MMM6;tt,,,DwtY 8	8 	8 	8 	88B FFCCIIFFF  = = =@B B BJ4@ 4@ 4@x     (  :( ( (V  2   7>>;<< 1P*A A 1P% % % %RP P P &	 	 	 	 	I 	 	 	q q q q q q q qh ">## + + + +
, , ,^  D  
e e e ePH H H H H H H HV$ $ $ $Xs s sl  >W> W> W>~  
B 
B 
B$M M M
! ! !@  ,  .C
D C
D C
D C
D C
D C
D C
D C
D C
D C
Ds*   M N!%NNN +O
O