JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrB =_@@s@dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddl*m+Z+ddl*m,Z,ddl*m-Z-dd l*m.Z.dd!l*m/Z/dd"l*m0Z0e j1d#krddl2Z2ndZ2d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3gZ3d4Z4ej56d5e7Z8e9ed6Z:e9ed7Z;e<Z=e>d8Z?e@ZAdaBe0rhd9nd:ZCe jDd;kZEdeJe jGiZKeKjHZHe2dkrdZLdZMd?ZNd@ZOn GdAdBdBe2jIZPeQRePjSejTejUejVejWejXejYejZejZej[ej\ej]ej^dC Z_ej`ejaejbejcejdejeejfejgejhejiejjdD ZkedEdFdGdHdIdJdKdLdMdNdOdPg ZledQdRdSdTdUdVdWdXdYdZg Zmed[d\d]d^d_d`gZnedadbZoedceojpddZqeded\dfdgdhdidjdkdldmdndog ZredpdqdrserjpZtedsdRdSdTdUdtdugZuedvdwdxdydzd{gZvd|d}Zwd~dZxddZyeddZze=dfddZ{y ezdWn0e|k re }eddddda~YnXdZyddlmZWnBek rddlZejdddZe9edrdddZYnXedk re3ddeeDddZddZddZddZddZddZddZddZej56ds\ej56drfddZn ej56dr~ddZnddZejZGddde|ZGdddZeZdddZddZddZejZdddZdddZddZddZddZddZddZddÄZddńZddDŽZddɄZGdd˄de<ZdS)zLinux platform implementation.)divisionN) defaultdict) namedtuple)_common)_psposix) _psutil_linux) _psutil_posix) AccessDenied)debug)decode)get_procfs_path) isfile_strict)memoize)memoize_when_activated)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN) NoSuchProcess) open_binary) open_text)parse_environ_block)path_exists_strict) supports_ipv6) usage_percent) ZombieProcess)b) basestring)FileNotFoundError)PermissionError)ProcessLookupError)PY3) PROCFS_PATHIOPRIO_CLASS_NONEIOPRIO_CLASS_RTIOPRIO_CLASS_BEIOPRIO_CLASS_IDLECONN_ESTABLISHED CONN_SYN_SENT CONN_SYN_RECVCONN_FIN_WAIT1CONN_FIN_WAIT2CONN_TIME_WAIT CONN_CLOSECONN_CLOSE_WAIT CONN_LAST_ACK CONN_LISTEN CONN_CLOSINGz/sys/class/power_supplyz/proc/%s/smapsproc_ioprio_getproc_cpu_affinity_get SC_CLK_TCKi littlei AddressFamilyAF_LINKr"c@seZdZdZdZdZdZdS) IOPriorityrrr;r"N)__name__ __module__ __qualname__r%r&r'r(r@r@B/opt/alt/python37/lib64/python3.7/site-packages/psutil/_pslinux.pyr<wsr<) RSDTtZXxKWIP) Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0Bsvmemtotal availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskio read_count write_count read_bytes write_bytes read_time write_timeZread_merged_countZwrite_merged_count busy_time popenfilepathfdpositionmodeflagspmemz"rss vms shared text lib data dirtypfullmem)usspssswap pmmap_groupedrsssizerkZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousrl pmmap_extz addr perms  pioZ read_charsZ write_chars pcputimesusersystem children_userchildren_systemiowaitcCsLt|tst|t|}|dd}|drHt|sH|dd}|S)zWrapper around os.readlink().rz (deleted)Ni) isinstancerAssertionErrorosreadlinksplitendswithr)rcr@r@rAr}s   r}cCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH|ddd}|dd}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). rwzw+arzr+)r|O_RDONLYO_WRONLYO_RDWRO_APPENDreplace)rgZ modes_maprfr@r@rAfile_flags_to_modes   rcCs4|dd}d}|rd|}nd|}t|tjS)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)rr|accessF_OK)nameZincluding_virtualrcr@r@rAis_storage_devices  rc Cstd|}|dd}WdQRXdddddd d g}t|}|d krX|d |d krj|d|dkr||dtd|adS)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. z%s/statrNrtniceruidlerxZirqZsoftirqZsteal Zguest Z guest_nice scputimes)rreadliner~lenappendrr) procfs_pathfvaluesfieldsZvlenr@r@rAset_scputimes_ntuples    rTc CsXy,|rt|nt|}|SQRXWn&ttfk rR|tk rL|SYnXdS)zReturn file content. fallback: the value returned in case the file does not exist or cannot be read binary: whether to open the file in binary or text mode. N)rrreadstripIOErrorOSError_DEFAULT)fnamefallbackbinaryrr@r@rAcatsrz/procrzuser system idleg)prlimit) use_errnorcCsGdddtj}|}|dkr8t||dt|}n6|}|d|_|d|_t||t|t|}|dkrt}t|t ||j|jfS)Nc@s eZdZdejfdejfgZdS)zprlimit..StructRlimitrlim_currlim_maxN)r=r>r?ctypes c_longlong_fields_r@r@r@rA StructRlimitJsrrr) r Structurelibcrbyrefrr get_errnorr|strerror)pid resource_limitsrcurrentretnewerrnor@r@rArIs  cCs"g|]}|dr|r|qS)ZRLIM) startswithisupper).0rIr@r@rA bsrc Cs |d}||dd}y|d}|d}|d}Wntk rH|SXytdt}Wntk rp|SXd}|:x2|D]*}|}|dr|t|d 7}qWWd QRX|t 9}||} ||} | t | d |8} | | 7} | |t |d |7} t| S) aFallback for kernels < 3.14 where /proc/meminfo does not provide "MemAvailable:" column, see: https://blog.famzah.net/2014/09/24/ This code reimplements the algorithm outlined here: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 XXX: on recent kernels this calculation differs by ~1.5% than "MemAvailable:" as it's calculated slightly differently, see: https://gitlab.com/procps-ng/procps/issues/42 https://github.com/famzah/linux-memavailable-procfs/issues/2 It is still way more realistic than doing (free + cached) though. sMemFree:sCached:rs Active(file):sInactive(file):s SReclaimable:z %s/zoneinfoslowrNr;g@) getKeyErrorrr rrrintr~PAGESIZEmin) memsrSrZlru_active_fileZlru_inactive_fileZslab_reclaimablerZ watermark_lowlineavailZ pagecacher@r@rAcalculate_avail_vmemjs2   "rc Csg}i}tdt4}x,|D]$}|}t|dd||d<qWWdQRX|d}|d}y |d}Wn"tk rd}|d YnXy |d }Wn"tk rd}|d YnX||d d7}y |d } WnHtk r$y |d} Wn$tk rd} |dYnXYnXy |d} Wn$tk rVd} |dYnXy |d} WnXtk ry|d|d|d} Wn$tk rd} |dYnXYnXy |d} Wntk rd} YnX||||} | dkr||} y |d}Wntk r2t|}YnX|dkrLd}|d||krZ|}t|||dd}|rdd |t |dkrdndf}t |t t|||| || | ||| | S)aReport virtual memory stats. This implementation matches "free" and "vmstat -s" cmdline utility values and procps-ng-3.3.12 source was used as a reference (2016-09-18): https://gitlab.com/procps-ng/procps/blob/ 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c For reference, procps-ng-3.3.10 is the version available on Ubuntu 16.04. Note about "available" memory: up until psutil 4.3 it was calculated as "avail = (free + buffers + cached)". Now "MemAvailable:" column (kernel 3.14) from /proc/meminfo is used as it's more accurate. That matches "available" column in newer versions of "free". z %s/meminforirNs MemTotal:sMemFree:sBuffers:rVsCached:rWs SReclaimable:sShmem:s MemShared:rXsActive:rTs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rUsSlab:s MemAvailable:rP)round_z6%s memory stats couldn't be determined and %s set to 0z, waswere)rr r~rrrrrrjoinrwarningswarnRuntimeWarningrN)Zmissing_fieldsrrrrrOrSrVrWrXrTrUrYrRrrQmsgr@r@rAvirtual_memorys &                rc Csi}tdt4}x,|D]$}|}t|dd||d<qWWdQRXy|d}|d}Wn:tk rt\}}}}}}}||9}||9}YnX||}t||dd} ytd t}WnDtk r} z$d t | } t | t d} } Wdd} ~ XYnX|d} } x|D]j}| d rJt|d dd d} n&| drpt|d dd d} | dk r| dk rPqWd} t | t d} } WdQRXt|||| | | S)zReturn swap memory metrics.z %s/meminforirNs SwapTotal:s SwapFree:)rz %s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)spswpin r#spswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)rr r~rrcextZ linux_sysinforrstrrrrrrsswap)rrrrrOrS_Zunit_multiplierrRrQerrrsinsoutr@r@rA swap_memorysD &       rc Cs^t}t|td|}|}WdQRX|dttjd}dd|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. z%s/statNrcSsg|]}t|tqSr@)float CLOCK_TICKS)rrIr@r@rAr^szcpu_times..)r rrrr~rr_fields)rrrrr@r@rA cpu_timesRsrc Cst}t|g}td|d}|xT|D]L}|dr.|}|dttjd}dd|D}t|}| |q.W|SQRXdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. z%s/statscpurcSsg|]}t|tqSr@)rr)rrIr@r@rArpsz!per_cpu_times..N) r rrrrr~rrrr)rcpusrrrrentryr@r@rA per_cpu_timesbs  rc Csy tdStk rd}tdt*}x"|D]}|dr4|d7}q4WWdQRX|dkrtd}t dt4}x,|D]$}| d d}| |r|d7}qWWdQRX|dkrdS|SXdS) z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNrz %s/cpuinfos processorrNzcpu\dz%s/statrq) r|sysconf ValueErrorrr lowerrrecompilerr~match)numrrsearchr@r@rAcpu_count_logicalvs$     rc Cst}d}d}xBt|p"t|D]*}t|}||WdQRXq$Wt|}|dkrf|Si}i}tdtz}xr|D]j}|}|sy|d||d<Wnt k rYnXi}q| dr| d d \} } t | || <qWWdQRXt |}|pdS) z2Return the number of physical 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_listNrz %s/cpuinfos cpu coress physical id)s physical ids cpu coress :r)setglobraddrrrr rrrr~rsumr) lsp1p2rcrresultmappingZ current_inforkeyvaluer@r@rAcpu_count_physicals2      rc Cstdt}d}d}d}xx|D]p}|drBt|d}n6|dr^t|d}n|drxt|d}|dk r"|dk r"|dk r"Pq"WWdQRXd}t||||S)z*Return various CPU stats as a named tuple.z%s/statNsctxtrsintrssoftirqr)rr rrr~r scpustats)r ctx_switches interruptssoft_interruptsrsyscallsr@r@rA cpu_statss"    rz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqcCsdd}g}xttD]}||}|s*qtjj}t||ddd}|dkrnt||ddd}|dkrntdt|d}tt||d d}tt||d d}|t |||qW|S) zReturn frequency metrics for all CPUs. Contrarily to other OSes, Linux updates these values in real-time. cSs.x(d|d|fD]}tj|r|SqWdS)Nz(/sys/devices/system/cpu/cpufreq/policy%sz%/sys/devices/system/cpu/cpu%s/cpufreq)r|rcexists)rpr@r@rAget_paths zcpu_freq..get_pathZscaling_cur_freqN)rZcpuinfo_cur_freqz!can't find current frequency fileiZscaling_max_freqZscaling_min_freq) rangerr|rcrrNotImplementedErrorrrrscpufreq)rrnrcZpjoincurrZmax_Zmin_r@r@rAcpu_freqs$ rz /proc/cpuinfoc Csfg}tdtJ}xB|D]:}|dr|dd\}}|tt|ddqWWdQRX|S)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. z %s/cpuinfoscpu mhz:rgN) rr rrr~rrrr)rrrrrr@r@rArs &cCsgS)zGDummy implementation when none of the above files are present. r@r@r@r@rArsc@s eZdZdS)_Ipv6UnsupportedErrorN)r=r>r?r@r@r@rArsrc@sZeZdZdZddZddZddZedd Zedd d Z edd dZ dddZ d S) ConnectionsawA 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 Csdtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd |_d|_dS)Ntcptcp6udpudp6unix) allrtcp4r r udp4r r inetinet4inet6)socketAF_INET SOCK_STREAMAF_INET6 SOCK_DGRAMAF_UNIXtmap _procfs_path)selfrr rr r r@r@rA__init__ s"   zConnections.__init__c Cstt}xtd|j|fD]}ytd|j||f}WnJttfk rTwYqtk r}z|j t j krrwWdd}~XYqX| dr|dddd}|| |t |fqW|S)Nz%s/%s/fdz %s/%s/fd/%szsocket:[rr7)rlistr|listdirrr}rr rrEINVALrrr)rrinodesrdinoderr@r@rAget_proc_inodes7s  zConnections.get_proc_inodesc CsJi}x@tD]6}y|||Wq tttfk r@w Yq Xq W|S)N)pidsupdater"rr r)rr rr@r@rAget_all_inodesMs  zConnections.get_all_inodesc Cs|d\}}t|d}|s dStr.|d}|tjkrntrZt|t |ddd}qt|t |}nxt |}yJtrttj t j d t d|}n ttj t j d t d|}Wn"tk rtstnYnXt||S) aAccept an "ip:port" address as displayed in /proc/net/* and convert it into a human readable form, like: "0500000A:0016" -> ("10.0.0.5", 22) "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521) The IP address portion is a little or big endian four-byte hexadecimal number; that is, the least significant byte is listed first, so we need to reverse the order of the bytes to convert it to an IP address. The port is represented as a two-byte hexadecimal number. Reference: http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html :r@asciiNr7>4I<4I)r))r*)r~rr!encoderr LITTLE_ENDIAN inet_ntopbase64 b16decoderstructpackunpackrrrraddr)r3familyipportr@r@rAdecode_address]s0    zConnections.decode_addressNc csD|drtj|sdSt|td}|xt|dD]\}}y(|dd\ }} } } }}}}}} Wn&t k rt d|||fYnX| |kr|| d\} }nd\} }|dk r|| krq@q@|t j krt | } ntj} yt| |} t| |} Wntk rw@YnX|||| | | | fVq@WWdQRXdS) z.Parse /proc/net/tcp* and /proc/net/udp* files.6N) bufferingrrz,error while parsing %s; malformed line %s %rr)Nr7)rr|rcrrBIGFILE_BUFFERINGr enumerater~r RuntimeErrorrr TCP_STATUSESr CONN_NONErr7r)filer4type_r  filter_pidrlinenorrladdrraddrstatusr!rrdr@r@rA process_inets2(   zConnections.process_inetc cs t|td}|x|D]}|}y|dd\}}}}}}} Wn.tk rtd|kr`wtd||fYnX| |kr|| } ndg} xj| D]b\} } |dk r|| krqqt|dkr|d } nd } tt |}d }tj }| ||| ||| fVqWqWWdQRXdS) zParse /proc/net/unix files.)r9rrqz)error while parsing %s; malformed line %r)Nr7Nrr7) rr:rr~rr<rrsocktype_to_enumrr>)r?r4r rArrtokensrr@r!pairsrrdrcrDrEr@r@rA process_unixs2    zConnections.process_unixc Cs||jkr,td|ddd|jDft|_|dk rP||}|sXgSn|}t}x|j|D]\}}}d|j|f}|tj tj fkr|j |||||d} n|j ||||d} xT| D]L\} }}} } } }|rt | ||| | | }nt | ||| | | |}||qWqjWt|S)Nz+invalid %r kind argument; choose between %sz, cSsg|] }t|qSr@)repr)rrIr@r@rArsz(Connections.retrieve..z %s/net/%s)rA)rrrr rr"r%rrrrrFrLrpconnsconnrr)rkindrr rZ proto_namer4r@rcrrdrCrDrEZ bound_pidZconnr@r@rAretrieves2  zConnections.retrieve)N)N)N) r=r>r?__doc__rr"r% staticmethodr7rFrLrQr@r@r@rArs  3 ' %rrcCs t|S)z$Return system-wide open connections.) _connectionsrQ)rPr@r@rAnet_connectionssrUcCstdt}|}WdQRXi}x|ddD]}|d}|dksVtt||d|}||dd}tt |\}}} } } } } }}}}}}}}}||||| || |f||<q4W|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&rr) rr readlinesrfindr{rMrr~mapr)rlinesretdictrcolonrr bytes_recv packets_recverrindropinZfifoinZframeinZ compressedinZ multicastin bytes_sent packets_senterroutdropoutZfifooutZ collisionsoutZ carrieroutZ compressedoutr@r@rAnet_io_counterss *rdc Cstjttjttjti}t}i}x||D]t}y&t |}t |}t |\}}Wn0t k r}z|jtjkrtWdd}~XYq*Xt|||||||<q*W|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rZ DUPLEX_FULLrZ DUPLEX_HALFrZDUPLEX_UNKNOWNrrdkeys cext_posixZ net_if_mtuZnet_if_is_runningZnet_if_duplex_speedrrZENODEVr snicstats) Z duplex_mapnamesrrmtuisupduplexspeedrr@r@rA net_if_stats+s      rmFc Csdd}dd}tjdtr*|}n"tjdr>|}ntdti}x\|D]T}|\ }}}} } } } } }}|st|sqV| t9} | t9} ||| | | | | ||f ||<qVW|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c ss6tdt}|}WdQRXx |D]}|}t|}|dkr|d}t|d}tt|dd\ }}} } } } } }}}n|dks|dkr|d}tt|dd\ }}}} } } } } }}}nN|dkr|d}tt|dd\}}} } d } } }} }n td |||| || | | || |f Vq*WdS) Nz %s/diskstatsr"r;r#rGrz!not sure how to interpret line %r)rr rVr~rrrXr)rrYrrZflenrreads reads_mergedrbytesrtimewrites writes_mergedwbyteswtimerrar@r@rA read_procfsLs& (*  z%disk_io_counters..read_procfsc ssxtdD]}xttjd|D]\}}}d|kr:q&ttj|d}|}WdQRXtj |}t t |dd\ }}} } } } } }}}||| | | | ||| |f Vq&Wq WdS)Nz /sys/blockstatr) r|rwalkrcrrrrr~basenamerXr)blockrootrfilesrrrrqrrrsrtrurvrwrxrar@r@rA read_sysfsws  & z$disk_io_counters..read_sysfsz %s/diskstatsz /sys/blockzC%s/diskstats nor /sys/block filesystem are available on this system)r|rcrr rrDISK_SECTOR_SIZE)ZperdiskryrgenrZrrrqrursrwrtrxrrrvrar@r@rAdisk_io_countersHs&+      rc Cst}t}td|V}xN|D]F}|}|dsF||q |dd}|dkr |dq WWdQRX|dkrtj drtj d}ntj d |}g}t |}x`|D]X} | \} } }} | d krd } |s| d ks||krqd} }t | | || | |}||qW|S) z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodev rZzfsNz/procz /etc/mtabz%s/self/mountsZnonerH)rr rrrrr~r|rcisfilerealpathrdisk_partitionsr sdiskpartr)r ZfstypesrrrfstypeZ mounts_pathretlist partitions partitiondevice mountpointoptsmaxfilemaxpathntupler@r@rArs6      rc Csttt}td}|tdttdd|D}td}td}x*|D]"}| d|}||krT| |qTWx|D]}y>|d}t t |d }t jt j|d }t |d d } Wntttfk rwYnXt |d dd} t |ddd} t |ddd d} | dk rLyt | d } Wntk rJd} YnX| dk ryt | d } Wntk rd} YnX||  | || | fqW|sltd}tt|}x|D]}ytttfk r@} ztd| |fwWdd} ~ XYnXt|d}tdd|D}d} d} x|D]}t j||d}t |dd d}|dkrt t j||ddd} n$|dkrt t j||ddd} | dk ryt | d } Wntk rd} YnX| dk rpyt | d } Wntk rHd} YnXqpW||  d|| | fqWt|S)aReturn 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*_*cSsg|]}|ddqS)rr)r~)rrIr@r@rArsz(sensors_temperatures..z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg@@rF)rZ_maxN)rZ_crit_labelrH)rrz /sys/class/thermal/thermal_zone*temptypezignoring %r for file %rz /trip_point*cSs,g|]$}dtj|dddqS)rrr")rr|rcr|r~)rrr@r@rAr%sZ_typecritical_temphigh) collectionsrrrextendsortedrrrsubrrrr|rcrdirnamerrrr dict)r basenamesZ basenames2replrZaltnamebasercr unit_namerrlabelrZ trip_pathsZ trip_pointsZ trip_pointZ trip_typer@r@rAsensors_temperaturess                    rc Cstt}td}|s"td}ttdd|D}x|D]}ytt|d}Wn8tt fk r}zt d|t w>Wdd}~XYnXtt jt j|dd d }t|d d d d }||t||q>Wt|S)aReturn 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*_*cSsg|]}|ddqS)rr)r~)rrIr@r@rArTsz sensors_fans..rz ignoring %rNrF)rrrH)rr)rrrrrrrrrrrrrr|rcrrrrsfanr)rrrrrrrr@r@rA sensors_fansCs    rc stfdd}ddttD}|s.dStjtt|d}||d|d}||d |d }||d |d }||d }|dk r|dk ryd||}Wqtk rd}YqXn tt |ddd}|dkrdSd}|tjtdtjtd} | dk r| dk}n4t |dddd } | dkr>d}n| dkrLd}|rZt j } nv|dk r|dk ryt||d} Wntk rt j } YnXn.|dk rt|d} | dkrt j } nt j } t || |S)aReturn 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 cs:x4|D],}t|d}|kr|r.t|S|SqWdS)zvAttempt to read the content of multiple files which may not exist. If none of them exist return None. )rN)risdigitr)pathsrcr)nullr@rA multi_catls   z"sensors_battery..multi_catcSs&g|]}|dsd|kr|qS)ZBATZbattery)rr)rrIr@r@rArvs z#sensors_battery..Nrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@gz /capacityr7)rz AC0/onlinez AC/onlinerz/statusrHF)rrZ discharging)ZchargingfullTi<)objectr|rPOWER_SUPPLY_PATHrcrrZeroDivisionErrorrrrrPOWER_TIME_UNLIMITEDPOWER_TIME_UNKNOWNsbattery) rZbatsr~Z energy_nowZ power_nowZ energy_fullZ time_to_emptyrQ power_pluggedZonlinerEsecsleftr@)rrAsensors_batterycs`              rc Cs`g}t}xN|D]F}|\}}}}}}|s,q|dkr8d}t||pDd|||} || qW|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Z localhostN)rusersrsuserr) rZrawlistitemrtttyhostnameZtstampZ user_processrntr@r@rArs rc Csbdt}t|F}x2|D]*}|drt|d}|a|SqWtd|WdQRXdS)zAReturn the system boot time expressed in seconds since the epoch.z%s/statsbtimerzline 'btime' not found in %sN)r rrrrr~ BOOT_TIMEr<)rcrrrr@r@rA boot_times    rcCsddtttDS)z7Returns a list of PIDs currently running on the system.cSsg|]}|rt|qSr@)rr)rrIr@r@rArszpids..)r|rrr r@r@r@rAr#sr#c Cst|sdSybdt|f}t|B}x.|D]&}|dr.t|d}||kSq.Wtd|WdQRXWnttfk r|t kSXdS)zcCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). Fz %s/%s/statussTgid:rz'Tgid' line not found in %sN) r pid_existsr rrrr~rEnvironmentErrorr#)rrcrrZtgidr@r@rArs      rc Csi}t}xtD]x}y(td||f}|}WdQRXWnttfk rVYqX|d}||dd}t|d}|||<qW|S)zsObtain a {pid: ppid, ...} dict for all running processes in one shot. Used to speed up Process.children(). z %s/%s/statN)r;r) r r#rrrr rWr~r)rrrrdatarparZdsetppidr@r@rAppid_map s    rcstfdd}|S)zlDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. csy|f||Stk r2t|j|jYn\tk rRt|j|jYn<tk rtj d|j |jfst|j|jYnXdS)Nz%s/%s) rr r_namer rrr|rcrr)rargskwargs)funr@rAwrapper%sz wrap_exceptions..wrapper) functoolswraps)rrr@)rrAwrap_exceptions!src@steZdZdZdddddgZddZd d Zeed d Z eed dZ eeddZ ddZ ddZ eddZddZeddZeddZeddZejdered d!Zed"d#Zed$d%Zed`d'd(Zed)d*Zed+d,Zer.eed-ed.ed/fd0d1Z neZ erDed2d3Z!ed4d5Z"eed6fd7d8Z#eed9fd:d;Z$edd?Z&ed@dAZ'e(redBdCZ)edDfdEdFZ*edGdHZ+e,redIdJZ-edKdLZ.e/d&k redadMdNZ0edOdPZ1edQdRZ2edbdTdUZ3edVdWZ4edXdYZ5eedZfd[d\Z6eed]fd^d_Z7d&S)cProcesszLinux process implementation.rr_ppidr_cachecCs||_d|_d|_t|_dS)N)rrrr r)rrr@r@rAr;szProcess.__init__cCstd|j|jfdS)z+Raise NSP if the process disappeared on us.z%s/%sN)r|rzrr)rr@r@rA _assert_aliveAszProcess._assert_alivec Cstd|j|jf}|}WdQRX|d}||dd|}||dd}i}||d<|d|d <|d|d <|d |d <|d |d<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|S)aZParse /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 substract 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. z %s/%s/statNr(rr;rrrErr#ttynr utime stime children_utimerochildren_stime create_time$cpu_num' blkio_ticks)rrrrrWfindr~)rrrrrrrr@r@rA_parse_stat_fileGs$            zProcess._parse_stat_filec Cs(td|j|jf }|SQRXdS)zRead /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. z %s/%s/statusN)rrrr)rrr@r@rA_read_status_filejszProcess._read_status_filec Cs0td|j|jftd}|SQRXdS)Nz %s/%s/smaps)r9)rrrr:rr)rrr@r@rA_read_smaps_filets zProcess._read_smaps_filecCs(|j||j||j|dS)N)rcache_activaterr)rr@r@rA oneshot_enter{s  zProcess.oneshot_entercCs(|j||j||j|dS)N)rcache_deactivaterr)rr@r@rA oneshot_exits  zProcess.oneshot_exitcCs|d}trt|}|S)Nr)rr!r )rrr@r@rArs z Process.namec Csytd|j|jfSttfk rttjd|j|jfrDdSt|js^t |j|j nt |j|j |j Yn"t k rt|j|j YnXdS)Nz %s/%s/exez%s/%srH)r}rrrr r|rclexistsrrrrrrr )rr@r@rAexes z Process.exec Cstd|j|jf}|}WdQRX|s0gS|dr>dnd}||rX|dd}||}|dkrt|dkrd|kr|d}|S)Nz %s/%s/cmdlineryrqr7r)rrrrrr~r)rrrsepcmdliner@r@rArs    zProcess.cmdlinec Cs0td|j|jf}|}WdQRXt|S)Nz %s/%s/environ)rrrrr)rrrr@r@rAenvironszProcess.environcCs:t|d}t}y||Stk r4dSXdS)Nr)rrrZget_terminal_mapr)rZtty_nrrr@r@rAterminals zProcess.terminalz /proc/%s/ioc Csd|j|jf}i}t|V}xN|D]F}|}|r$y|d\}}Wntk r\w$Yq$Xt|||<q$WWdQRX|std|y*t|d|d|d|d|d|d St k r}ztd |d ||fWdd}~XYnXdS) Nz%s/%s/ios: z%s file was emptyssyscrssyscws read_bytess write_bytessrcharswcharz1%r field was not found in %s; found fields are %rr) rrrrr~rrr<rrr)rrrrrrrrr@r@rA io_counterss0    zProcess.io_counterscCsh|}t|dt}t|dt}t|dt}t|dt}t|dt}t|||||S)Nrrrrr)rrrrs)rrrrrrrxr@r@rArszProcess.cpu_timescCst|dS)zWhat CPU the process is on.r)rr)rr@r@rArszProcess.cpu_numNcCst|j||jS)N)rZwait_pidrr)rtimeoutr@r@rAwaitsz Process.waitcCs&t|d}tpt}|t|S)Nr)rrrrr)rctimeZbtr@r@rArs zProcess.create_timec Cs`td|j|jf2}dd|ddD\}}}}}}}WdQRXt|||||||S)Nz %s/%s/statmcSsg|]}t|tqSr@)rr)rrIr@r@rArsz'Process.memory_info..rG)rrrrr~rh) rrZvmsrnrXtextlibrZdirtyr@r@rA memory_infos 6zProcess.memory_infos\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c Csj|}|}ttt||d}ttt||d}ttt||d}t||||fS)Ni)rrrrXrfindallri) rZ _private_reZ_pss_reZ_swap_reZ basic_memZ smaps_datarjrkrlr@r@rAmemory_full_infos  zProcess.memory_full_infocCsZdd}|}|sgS|d}g}|d}|g}x|||D] \}}|dd}y|\} } } } } }Wn*tk r|dg\} } } } } }YnX|sd}n2trt|}|}|d rt|s|dd }| t| t| || d d| d d| d d| dd| dd| dd| dd| dd| dd| ddf qDW|S)aPReturn 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 ssi}x|D]}|dd}|ddsB||fV||q yt|dd||d<Wq tk r|ddrw n td|Yq Xq W||fVdS)NrrrisVmFlags:z#don't know how to interpret line %r)r~rpoprrrr)rY current_blockrrrr@r@rA get_blocksEs   z'Process.memory_maps..get_blocks rNrrHz[anon]z (deleted)isRss:sSize:sPss:s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:sSwap:) rr~rrr!r rrrrr)rrrrYr first_linerheaderZhfieldsr3Zpermsoffsetdevr!rcr@r@rA memory_maps<sF               zProcess.memory_mapsc Cs^ytd|j|jfSttfk rXt|jsBt|j|jnt|j|j|j YnXdS)Nz %s/%s/cwd) r}rrrr rrrrr)rr@r@rAcwds  z Process.cwdsctxt_switches:\t(\d+)cCsL|}||}|s,td|j|jfntt|dt|dSdS)Nz'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in %s/%s/status; the kernel is probably older than 2.6.23rr)rrrrrrpctxswr)rZ _ctxsw_rerZctxswr@r@rAnum_ctx_switchess zProcess.num_ctx_switchessThreads:\t(\d+)cCs|}t||dS)Nr)rrr)rZ_num_threads_rerr@r@rA num_threadsszProcess.num_threadsc Cstd|j|jf}|g}d}x|D]}d|j|j|f}y$t|}|}WdQRXWntk rd}w,YnX|| ddd}| d}t |dt } t |d t } t t|| | } || q,W|r||S) Nz %s/%s/taskFz%s/%s/task/%s/statTrr;rrr)r|rrrsortrrrrrr~rrrpthreadrrr) rZ thread_idsr hit_enoentZ thread_idrrstrrrrr@r@rAthreadss,   zProcess.threadscCs t|jS)N)rf getpriorityr)rr@r@rAnice_getszProcess.nice_getcCst|j|S)N)rf setpriorityr)rrr@r@rAnice_setszProcess.nice_setcCs t|jS)N)rr5r)rr@r@rAcpu_affinity_getszProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsV|}||}|r@ttt|ddt|dddSttttSdS)Nrr)rrrrrrr)r_rerrr@r@rA_get_eligible_cpuss  *zProcess._get_eligible_cpusc Csyt|j|Wnttfk r}ztt|ts>|jtjkr|}t t t t }x<|D]4}||krztd||f||kr^td||fq^WWdd}~XYnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s) rZproc_cpu_affinity_setrrrrzrrrtuplerrr)rrrZ eligible_cpusZall_cpusZcpur@r@rAcpu_affinity_sets   zProcess.cpu_affinity_setcCs,t|j\}}tdk r t|}t||S)N)rr4renumr<rpionice)rioclassrr@r@rA ionice_getszProcess.ionice_getcCsP|dkr d}|r(|ttfkr(td||dks8|dkr@tdt|j||S)Nrz%r ioclass accepts no valuerGzvalue not in 0-7 range)r(r%rrZproc_ioprio_setr)rrrr@r@rA ionice_sets zProcess.ionice_setc Cs|jdkrtdyB|dkr(t|j|St|dkrDtdt|t|j||WnNtk r}z0|jtjkrt|jrt |j|j |j nWdd}~XYnXdS)Nrz)can't use prlimit() against PID 0 processr;z4second argument must be a (soft, hard) tuple, got %s) rrrrrMrrZENOSYSrrrr)rrrrr@r@rArlimits    zProcess.rlimitcCs$|d}tr|}t|dS)NrE?)rr!r PROC_STATUSESr)rletterr@r@rArEs zProcess.statusc Cs\g}td|j|jf}d}x(|D]}d|j|j|f}y t|}WnNttfk rhd}w&Yq&tk r}z|jtj krw&Wdd}~XYq&X| dr&t |r&d|j|j|f}yBt |0}t |d} t |dd} WdQRXWntk rd}Yq&Xt| } t|t |t | | | } || q&W|rX||S) Nz%s/%s/fdFz %s/%s/fd/%sTrz%s/%s/fdinfo/%srr)r|rrrr}rr rrrrrrrrr~rrbrr) rrrrrdr?rcrrposrgrfrr@r@rA open_files&s<   $ zProcess.open_filesrcCst||j}||S)N)rTrQrr)rrPrr@r@rA connectionsRszProcess.connectionscCsttd|j|jfS)Nz%s/%s/fd)rr|rrr)rr@r@rAnum_fdsXszProcess.num_fdscCst|dS)Nr)rr)rr@r@rAr\sz Process.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6|}||d\}}}tt|t|t|S)Nr)rrrpuidsr)rZ_uids_rerreal effectivesavedr@r@rAuids`sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6|}||d\}}}tt|t|t|S)Nr)rrrpgidsr)rZ_gids_rerr"r#r$r@r@rAgidsfsz Process.gids)N)N)r)8r=r>r?rR __slots__rrrrrrrrrrrrrrr|rcrgetpidrrrrrr HAS_SMAPSrrrrrrrr r rHAS_CPU_AFFINITYrrrHAS_PROC_IO_PRIORITYrrrrrErrr rr%r'r@r@r@rAr6sz"          D           ,   r)N)r)F)F)rR __future__rr.rrrrr|rrr0sys tracebackrrrrHrrrrr rfr r r r rrrrrrrrrrrrrr_compatrrrrr r! version_inforZ__extra__all__rrcrr)r*hasattrr,r+rrrrZ getpagesizerrr: byteorderr,r AF_PACKETr:IntEnumrr9r%r&r'r(r<globalsr$ __members__STATUS_RUNNINGSTATUS_SLEEPINGSTATUS_DISK_SLEEPSTATUS_STOPPEDSTATUS_TRACING_STOP STATUS_ZOMBIE STATUS_DEADSTATUS_WAKE_KILL STATUS_WAKING STATUS_IDLE STATUS_PARKEDrr)r*r+r,r-r.r/r0r1r2r3r=rNrZrbrhrrirmrrprrrsr}rrrr Exception print_excrrresource ImportErrorrCDLLrrdirrrrrrrrrrZ net_if_addrsrrrTrUrdrm disk_usagerrrrrrrr#rrrrr@r@r@rAsf                                                    4z:*   k % _ +q ^