\c@ sdZddlmZddlZddlZddlZddlZddlZddlZddl 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%ddl&m'Z'ddl&m(Z(ddl&m)Z)e j*dkr4ddl+Z+ndZ+ddd d!d"d#d$d%d&d'd(d)d*d+d,d-gZ-d.Z.ej/j0d/ej1Z2e3ed0Z4e3ed1Z5e6Z7e4rx6e8eD]%Z9e9j:d2re-j;e9qqWnej<d3Z=ej<d4Z>da?e)r(dnd5Z@e jAd6kZBd7ZCe+dkr[e jDZEn+e+jFd8ieGe jDd96ZHeHjEZEe+dkrd:ZIdZJd;ZKdZLn,d<e+jFfd=YZMeNjOeMjPi ejQd>6ejRd?6ejSd@6ejTdA6ejUdB6ejVdC6ejWdD6ejWdE6ejXdF6ejYdG6ejZdH6ej[dI6Z\i ej]dJ6ej^dK6ej_dL6ej`dM6ejadN6ejbdO6ejcdP6ejddQ6ejedR6ejfdS6ejgdT6ZhdZidZjdZkdZledUdVdWdXdYdZd[d\d]d^d_d`g Zmedadbdcdddedfdgdhdidjg ZnedkdldmdndodpgZoedqdrZpedsepjqdZredwdldxdydudzd{d|d}d~ddvg ZsedddjtesjqZueddbdcdddeddgZvdZwdZxdZyedZze7e{dZ|yezdWn6e}k roe j~edddddanXdZdZdZdZdZdZdZdZej/j0dsej/j0drdZn'ej/j0drdZn dZejZde}fdYZdddYZeZddZdZdZejZedZedZdZdZdZdZdZdZdZdZdZde6fdYZdS(sLinux platform implementation.i(tdivisionN(t defaultdict(t namedtuplei(t_common(t_psposix(t _psutil_linux(t _psutil_posix(tdecode(tget_procfs_path(t isfile_strict(tmemoize(tmemoize_when_activated(tNIC_DUPLEX_FULL(tNIC_DUPLEX_HALF(tNIC_DUPLEX_UNKNOWN(t open_binary(t open_text(tparse_environ_block(tpath_exists_strict(t supports_ipv6(t usage_percent(tb(t basestring(tPY3iit PROCFS_PATHtIOPRIO_CLASS_NONEtIOPRIO_CLASS_RTtIOPRIO_CLASS_BEtIOPRIO_CLASS_IDLEtCONN_ESTABLISHEDt CONN_SYN_SENTt CONN_SYN_RECVtCONN_FIN_WAIT1tCONN_FIN_WAIT2tCONN_TIME_WAITt CONN_CLOSEtCONN_CLOSE_WAITt CONN_LAST_ACKt CONN_LISTENt CONN_CLOSINGs/sys/class/power_supplys/proc/%s/smapst linux_prlimittproc_ioprio_gettRLIMt SC_CLK_TCKt SC_PAGE_SIZEi tlittleit AddressFamilytAF_LINKiit IOPrioritycB s eZdZdZdZdZRS(iiii(t__name__t __module__RRRR(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR0vstRtStDtTtttZtXtxtKtWtItPt01t02t03t04t05t06t07t08t09t0At0Btsvmemttotalt availabletpercenttusedtfreetactivetinactivetbufferstcachedtsharedtslabtsdiskiot read_countt write_countt read_bytest write_bytest read_timet write_timetread_merged_counttwrite_merged_countt busy_timet popenfiletpathtfdtpositiontmodetflagstpmems"rss vms shared text lib data dirtytpfullmemtusstpsstswapt pmmap_groupedtrsstsizet shared_cleant shared_dirtyt private_cleant private_dirtyt referencedt anonymoust pmmap_exts addr perms t tpiot read_charst write_charscC sjt|tst|tj|}|jdd}|jdrft| rf|d }n|S(sWrapper around os.readlink().tis (deleted)i(t isinstanceRtAssertionErrortostreadlinktsplittendswithR(Ra((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR}s  cC s~idtj6dtj6dtj6}||tjtjBtjB@}|tj@rh|jddd}n|jdd}|S(sZConvert file's open() flags into a readable string. Used by Process.open_files(). trtwsw+taisr+(R|tO_RDONLYtO_WRONLYtO_RDWRtO_APPENDtreplace(Ret modes_mapRd((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytfile_flags_to_modes $ cC sH|jdd}t}|r+d|}n d|}tj|tjS(sReturn 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. t/t!s /sys/block/%ss/sys/block/%s/device(RtTrueR|taccesstF_OK(tnametincluding_virtualRa((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytis_storage_devices   cC std|}|jjd}WdQXdddddd d g}t|}|d krr|jd n|d kr|jdn|dkr|jdntd|adS(sSet 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%s/statiNtusertnicetsystemtidletiowaittirqtsoftirqitsteali tguesti t guest_nicet scputimes(RtreadlineR~tlentappendRR(t procfs_pathtftvaluestfieldstvlen((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytset_scputimes_ntuples     cC sly;|rt|n t|}|jjSWdQXWn*ttfk rg|tk ra|SnXdS(sReturn 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(RRtreadtstriptIOErrortOSErrort_DEFAULT(tfnametfallbacktbinaryR((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcats! s/procRsuser system idlegc C sI|d}||jdd}y"|d}|d}|d}Wntk rV|SXytdt}Wntk r|SXd}|NxF|D]>}|j}|jdr|t|jd 7}qqWWd QX|t 9}|}||} ||} | t | d |8} | | 7} | |t |d |7} t| S( sFallback 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:is Active(file):sInactive(file):s SReclaimable:s %s/zoneinfotlowiNig@( tgettKeyErrorRRRRt startswithtintR~tPAGESIZEtmin( tmemsRORtlru_active_filetlru_inactive_filetslab_reclaimableRt watermark_lowtlinetavailt pagecache((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytcalculate_avail_vmem<s4       '    c C s+g}i}tdt@}x6|D].}|j}t|dd||d ("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 t:itasciiNis>4Is<4I((R~RRtencodeRRt LITTLE_ENDIANt inet_ntoptbase64t b16decodeRtstructtpacktunpackRRR Rtaddr(R=tfamilytiptport((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytdecode_address+s0+$%   cc s|jdr&tjj| r&dSt|dt[}|jxGt|dD]6\}}y2|jd \ }} } } }}}}}} Wn*t k rt d|||fnX| |kr|| d\} }n d \} }|dk r || kr qUqU|t j kr)t| } n tj} y(tj| |} tj| |} Wntk rpqUnX|||| | | | fVqUWWdQXdS( s.Parse /proc/net/tcp* and /proc/net/udp* files.t6Nt bufferingii s,error while parsing %s; malformed line %s %rii(Ni(RR|RaRRtBIGFILE_BUFFERINGRt enumerateR~Rt RuntimeErrorRRRt TCP_STATUSESRt CONN_NONERRAR (tfileR>ttype_R+t filter_pidRtlinenoRRtladdrtraddrtstatusR,R*Rb((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt process_inetbs2" 2      cc sYt|dtA}|jx-|D]%}|j}y&|dd!\}}}}}}} Wn9tk rd|krq&ntd||fnX| |kr|| } n d g} x| D]\} } |d k r|| krqqt|dkr |d} nd} t|}d}t j }| ||| ||| fVqWq&WWd QXd S( sParse /proc/net/unix files.RCiiRus)error while parsing %s; malformed line %riitN(Ni( RRDRR~RRFRRRRRH(RIR>R+RKRRttokensRRJR,tpairsR*RbRaRNRO((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt process_unixs2   &        c C s||jkrMtd|djg|jD]}t|^q(fnt|_|dk r|j|}|sgSn |j}t }x|j|D]\}}}|t j t j fkr|j d|j|f|||d|} n(|jd|j|f||d|} xx| D]p\} }}} } } }|rjtj| ||| | | }n!tj| ||| | | |}|j|q(WqWt|S(Ns+invalid %r kind argument; choose between %ss, s %s/net/%sRK(R RRtreprRR!RR-R2RRRRRPRTRtpconntsconnRR$(R"tkindR*R:R+RRR>RJtlsRbRMRNROt bound_pidtconn((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytretrieves48    "  N( R1R2t__doc__R#R-R2t staticmethodRARRPRTR\(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyRs    7'%RcC s tj|S(s$Return system-wide open connections.(t _connectionsR\(RX((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytnet_connectionsscC stdt}|j}WdQXi}x|dD]}|jd}|dksltt||| j}||djj}tt |\}}} } } } } }}}}}}}}}||||| || |f||          $cC s6tjt}tjd}|s6tjd}nttg|D]}|jdd^qC}x|D]}ytt|d}Wn0t t fk r}t j d|t qonXttjjtjj|ddt}t|d d d dt}||jtj||qoWt|S( sReturn 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 s/sys/class/hwmon/hwmon*/fan*_*s%/sys/class/hwmon/hwmon*/device/fan*_*RiRs ignoring %rRRRRRQ(RRR$RRRR~RRRRRRRR|RaRRRRRtsfanR(RRR:RRRRR((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt sensors_fans s 2 $ !c  s.tfd}gtjtD]}|jdr(|^q(}|sSdStjjtt|d}||d|d}||d|d}||d|d }|dks|dkrdS|dk ryd ||}Wq:t k r d }q:Xn,t t |d d d}|dkr:dSd}|tjjtdtjjtd} | dk r| dk}nLt |dd ddt j } | dkrt }n| dkrt}n|rtj} n5yt ||d} Wnt k rtj} nXtj|| |S(sReturn 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 sMxF|D]>}t|d}|kr|jrAt|S|SqWdS(svAttempt to read the content of multiple files which may not exist. If none of them exist return None. RN(RtisdigitRR(tpathsRaR(tnull(s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt multi_cat2s   tBATis /energy_nows /charge_nows /power_nows /current_nows /energy_fulls /charge_fullgY@gs /capacityRis AC0/onlines AC/onlineis/statusRQRt dischargingtchargingtfulliN(RR(tobjectR|R%tPOWER_SUPPLY_PATHRRRaRRtZeroDivisionErrorRRRRRRtPOWER_TIME_UNLIMITEDtPOWER_TIME_UNKNOWNtsbattery( RR:tbatsRt energy_nowt power_nowt energy_fullRMt power_pluggedtonlineROtsecsleft((Rs5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytsensors_battery)sV  1        "       c C sg}tj}xu|D]m}|\}}}}}}|sCqn|dkrXd}ntj||pjd|||} |j| qW|S(s:Return currently connected users as a list of namedtuples.s:0.0s:0t localhost(s:0.0s:0N(RtusersRtsuserRR( RtrawlisttitemRtttythostnamettstampt user_processR*tnt((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyRs    !cC s|dt}t|]}xC|D];}|jdr#t|jjd}|a|Sq#Wtd|WdQXdS(sAReturn the system boot time expressed in seconds since the epoch.s%s/stattbtimeisline 'btime' not found in %sN(RRRRRR~t BOOT_TIMERF(RaRRR((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyt boot_times  cC s;gtjttD]}|jrt|^qS(s7Returns a list of PIDs currently running on the system.(R|R%RRRR(R:((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyR.scC stj|stSy|dt|f}t|W}x=|D]5}|jdr?t|jd}||kSq?Wtd|WdQXWn!t tfk r|t kSXdS(scCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). s %s/%s/statussTgid:is'Tgid' line not found in %sN( Rt pid_existsRRRRRR~RtEnvironmentErrorR.(R*RaRRttgid((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyRs  c C si}t}xtD]}y/td||f}|j}WdQXWn4tk r}|jtjtjfkrqqX|jd}||dj }t |d}|||R?RCRERLRNRPRRRTRYtHAS_PROC_IO_PRIORITYR]R_t HAS_PRLIMITReRORjRkRlRRrRu(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pyRsx  !         D     0(ii(sussspsssswap((R]t __future__RR8RR&RRR|RRR:tsyst tracebackRRRRQRRRRRR|RRR R R R R RRRRRRRt_compatRRRt version_infoRZRt__extra__all__RRaRRwRxthasattrRzRyRRtdirRRRRRRRRDt byteorderR6Rt AF_PACKETR/tIntEnumRR.RRRRR0tglobalsR/t __members__tSTATUS_RUNNINGtSTATUS_SLEEPINGtSTATUS_DISK_SLEEPtSTATUS_STOPPEDtSTATUS_TRACING_STOPt STATUS_ZOMBIEt STATUS_DEADtSTATUS_WAKE_KILLt STATUS_WAKINGt STATUS_IDLEt STATUS_PARKEDRgRRRR R!R"R#R$R%R&R'RGRRRtTimeoutExpiredRJRVR`RfRRgRkRRtRvR}RRRRRt Exceptiont print_excRRRRRRRRRR t net_if_addrsR RR_R`RwRt disk_usageRRRRRRRRR.RRRR(((s5/usr/lib64/python2.7/site-packages/psutil/_pslinux.pytsN                                                       5 z :    $      %   ^ ( h X