
    w&b&>                        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		  e
e	d      sd dlmZ ee	_        ej                  j                  d      Z	 d dlmZ  e       ZdZeres6 ed	        ed
       es ed       es ed        ej.                  d       d dlmZmZ d dlmZmZmZmZ d dl m!Z!m"Z"  G d de#      Z$ G d de$      Z%dZ&dZ'dZ(dZ)dZ* G d de#      Z+d Z,d Z-d Z. G d de$      Z/ G d de$      Z0 G d  d!e$      Z1d" Z2y# eef$ r e	j                  e	_        Y w xY w# e$ r dZY w xY w)#    )print_functionN	monotonic)r   z/proc/self/io)VmStatTFz<Could not run iotop as some of the requirements are not met:z- Linux >= 2.6.20 withz~  - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING, kernel.task_delayacct sysctl)z0  - VM event counters (CONFIG_VM_EVENT_COUNTERS)   )iopriovmstat)
ConnectionNETLINK_GENERICU32AttrNLM_F_REQUEST)
ControllerGeNlMessagec                       e Zd ZdZd Zy)DumpableObjectzBBase class for objects that allows easy introspection when printedc                 v    t        t        |             d d dt        j                  | j                        dS )Nz: >)strtypepprintpformat__dict__selfs    ,/usr/lib/python3/dist-packages/iotop/data.py__repr__zDumpableObject.__repr__K   s.    T
OCR0"NN4==9; 	;    N)__name__
__module____qualname____doc__r    r   r   r   r   I   s
    L;r   r   c                   B    e Zd Zg dZdZd Zd	dZd Zd Ze	d        Z
y)
Stats))blkio_delay_total(   )swapin_delay_total8   )
read_bytes   )write_bytes   )cancelled_write_bytesi  Fc                     | j                   }t        j                  D ])  \  }}|||dz    }t        j                  d|      d   ||<   + t        j
                  s| j                  dk7  t        _        y y )N   Qr   )r   r$   members_offsetsstructunpackhas_blkio_delay_totalr%   )r   task_stats_buffersdnameoffsetdatas         r   __init__zStats.__init___   sp    ]]!11 	3LD&$VFQJ7D}}S$/2BtH	3 ***.*@*@A*EE' +r   c                     |j                   }| j                   }|j                   }t        j                  D ]  \  }}||   |||   z  z   ||<    y)z3Update destination from operator(self, other_stats)Nr   r$   r1   )	r   other_statsdestinationcoeffddr6   odmemberr8   s	            r   
accumulatezStats.accumulatej   sU    !!]]!!#33 	9NFFFebj&88BvJ	9r   c                 *    | j                  ||d      S )z*Update destination with self - other_statsr   )r?   )rC   )r   r=   r>   s      r   deltazStats.deltar   s    {KrBBr   c                 `    | j                   }t        j                  D ]  \  }}||   dk7  s y y)Nr   FTr<   )r   r6   r7   r8   s       r   is_all_zerozStats.is_all_zerov   s7    ]]!11 	LD&$x1}	 r   c                      t         j                  t               } | j                  }t         j                  D ]
  \  }}d||<    | S )Nr   )r$   __new__r   r1   )statsstdr7   r8   s       r   build_all_zerozStats.build_all_zero}   s@    e$nn!11 	LD&CI	r   N)r   )r   r   r    r1   r4   r:   rC   rE   rG   staticmethodrL   r"   r   r   r$   r$   T   s;    O "	F9C  r   r$         c                       e Zd Zd Zd Zd Zy)TaskStatsNetlinkc                     || _         t        t              | _        t	        | j                        }|j                  d      | _        y )N	TASKSTATS)optionsr	   r
   
connectionr   get_family_id	family_id)r   rT   
controllers      r   r:   zTaskStatsNetlink.__init__   s5    $_50
#11+>r   c                 b    t        | j                  t        t        t        |      gt
              S )N)cmdattrsflags)r   rW   TASKSTATS_CMD_GETr   TASKSTATS_CMD_ATTR_PIDr   )r   tids     r   build_requestzTaskStatsNetlink.build_request   s)    4>>/@")*@#"F!G!.0 	0r   c                    |j                   j                  | j                         	 t        j                  | j                        }|j                  j                         D ]   \  }}|t        k(  s|j                         } n y |t           j                  }t        |      dk  ry t        j                   d|d d       d   }|dk\  sJ t#        |      S # t
        $ r(}|j                  t        j                  k(  rY d }~y  d }~ww xY w)Ni  H   r   rN   )task_stats_requestsendrU   r   recvOSErrorerrnoESRCHr[   itemsTASKSTATS_TYPE_AGGR_PIDnestedTASKSTATS_TYPE_STATSr9   lenr2   r3   r$   )r   threadreplye	attr_type
attr_valuetaskstats_datataskstats_versions           r   get_single_task_statsz&TaskStatsNetlink.get_single_task_stats   s    !!&&t7	$$T__5E &+[[%6%6%8 	!Iz33"))+	
 3499~$"MM#~bq/AB1E A%%%^$$#  	ww%++%		s   C 	DD ?D  DN)r   r   r    r:   r`   rv   r"   r   r   rQ   rQ      s    ?0
%r   rQ   c                    g | _         d}| j                  xs g D ],  }	 t        |      }|r| j                   j                         . |rt        j                  d       yy# t        $ rS 	 t	        j
                  |      }|j                  }n-# t        $ r! t        d|t        j                         d}Y nw xY wY w xY w)zDBuild options.uids from options.users by resolving usernames to UIDsFzUnknown user:)fileTr   N)uidsusersint
ValueErrorpwdgetpwnampw_uidKeyErrorprintsysstderrappendexit)rT   erroruuidpasswds        r   	find_uidsr      s    GLE]] b %		$a&C LL$%    	$$a
 mm	  oqszz:	$s5   A""	B>,BB>'B85B>7B88B>=B>c                     i }	 t        d| z  d      D ]+  }	 |j                  dd      \  }}|j                         ||<   - 	 |S # t        $ r Y <w xY w# t        $ r Y |S w xY w)Nz/proc/%d/statusreplace)errors:r   )opensplitr|   stripIOError)pidresult_dictlinekeyvalues        r   parse_proc_pid_statusr      s    K*S0C 	-D!ZZQ/
U  %{{}K	-    	  s3   A AA 	AA AA 	A! A!c                 ~    	 | j                  d      S # t        $ r | j                  d      cY S t        $ r | cY S w xY w)Nzutf-8string_escape)decodeUnicodeDecodeErrorencodeAttributeError)ss    r   safe_utf8_decoder      sA    xx   )xx(( s    <
<<c                   (    e Zd ZdZd Zd Zd Zd Zy)
ThreadInfozStats for a single threadc                     || _         d| _        d | _        t        j	                  t              | _        |j                  |      | _        y NT)r_   markstats_totalr$   rI   stats_deltar`   rd   )r   r_   taskstats_connections      r   r:   zThreadInfo.__init__   s<    	 ==/"6"D"DS"Ir   c                 @    t        j                  | j                        S N)r   getr_   r   s    r   
get_iopriozThreadInfo.get_ioprio   s    zz$((##r   c                 b    t        j                  t         j                  | j                  ||      S r   )r   
set_ioprioIOPRIO_WHO_PROCESSr_   )r   ioprio_classioprio_datas      r   r   zThreadInfo.set_ioprio   s(      !:!:DHH!-{< 	<r   c                     | j                   s|| _         |j                  | j                   | j                         || _         y r   )r   rE   r   )r   rJ   s     r   update_statszThreadInfo.update_stats   s5    $DD$$d&6&67 r   N)r   r   r    r!   r:   r   r   r   r"   r   r   r   r      s    #J$<!r   r   c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)ProcessInfozStats for a single process (a single line in the output): if
    options.processes is set, it is a collection of threads, otherwise a single
    thread.c                     || _         d | _        d | _        i | _        t        j                         | _        t        j                         | _        t        j                         | _
        y r   )r   r   userthreadsr$   rL   r   stats_accumtimer   stats_accum_timestamp)r   r   s     r   r:   zProcessInfo.__init__  sO    	 //1 //1%)^^%5"r   c                     |j                   r%|j                  s| j                  |j                   vry|j                  r| j	                         |j                  vryyNFT)pids	processesr   ry   get_uid)r   rT   s     r   is_monitoredzProcessInfo.is_monitored  sB    LL!2!2HHGLL(<<DLLN',,>r   c                     | j                   r| j                   S 	 t        j                  d| j                  z        t        j                     }|| j                   k7  rd | _        || _         |S # t
        $ r d }Y ,w xY w)Nz/proc/%d)r   osstatr   ST_UIDrg   r   r   r   s     r   r   zProcessInfo.get_uid  sm    8888O	''*txx/0=C $((?DIDH
  	C	s   3A, ,A:9A:c                    | j                         }|:| j                  s.	 t        t        j                  |      j
                        | _        | j                  xs dS # t        t        f$ r t        |      | _        Y 1w xY w)Nz{none})	r   r   r   r}   getpwuidpw_namer   r   r   r   s     r   get_userzProcessInfo.get_user*  sj    lln?499%,S\\#->-F-FG	 yy$H$ n- %H	%s   -A A?>A?c                    	 t        d| j                  z        }|j                  d      }t	        | j                        }|s|j                  dd      }|rd|z  }|S d}|S d}t        |j                  d| j                              }|| j                  k7  r:t	        |      j                  dd      }|j                  dd      }||k7  r|d	|z  z  }|j                  d
      }	|	d   j                  d      r"|	d   j                  d      dz   }
|	d   |
d  |	d<   dj                  |	      j                         }t        ||z         S # t        $ r Y yw xY w)Nz/proc/%d/cmdlinei   z{no such process}Name z[%s]z	{no name}Tgidz [%s] r   /r    )r   r   readr   r   r   r{   r   
startswithrfindjoinr   r   )r   proc_cmdlinecmdlineproc_statusproc_status_namesuffixtgid	tgid_namethread_namepartsfirst_command_chars              r   get_cmdlinezProcessInfo.get_cmdline3  sd   	' 2TXX =>L"''-G ,DHH5*vr:#),<#<  $# $/ ##;??648845488-d377CI%//&"5Ki''K//d#8s#!&q!4q!8Qx 2 34E!H((5/'')& 0111  	'&	's   )E 	EEc                     |r| j                   j                          S | j                  j                         D ]  }|j                  j                         r y y)NTF)r   rG   r   valuesr   )r   accumulatedts      r   did_some_iozProcessInfo.did_some_ioR  sQ    ''33555$$& 	A==,,.	 r   c                     t        d | j                  j                         D              }t        |      dk(  r|j	                         S y)Nc              3   <   K   | ]  }|j                           y wr   )r   ).0r   s     r   	<genexpr>z)ProcessInfo.get_ioprio.<locals>.<genexpr>[  s     GAGs   r   z?dif)setr   r   rn   pop)r   
prioritiess     r   r   zProcessInfo.get_ioprioZ  s;    G1D1D1FGG
z?a>>##r   c                 f    | j                   j                         D ]  }|j                  ||        y r   )r   r   r   )r   r   r   ro   s       r   r   zProcessInfo.set_ioprio`  s.    ll))+ 	9FlK8	9r   c                 H    t        j                  | j                               S r   )r   sort_keyr   r   s    r   ioprio_sort_keyzProcessInfo.ioprio_sort_keyd  s    t011r   c                 x    | j                   j                  |d       }|st        ||      }|| j                   |<   |S r   )r   r   r   )r   r_   r   ro   s       r   
get_threadzProcessInfo.get_threadg  s;    !!#t,%9:F &DLLr   c                 R   t         j                         }| j                  j                         D ].  \  }}|j                  r|j                  |j                  |       0 t        | j                  j                         D cg c]  \  }}|j                  s||f c}}      | _        t        | j                        }|sy|xj                  |z  c_	        |xj                  |z  c_
        || _        | j                  j                  | j                  | j                         yc c}}w r   )r$   rL   r   rj   r   rC   r   dictrn   r%   r'   r   )r   r   r_   ro   
nr_threadss        r   r   zProcessInfo.update_statsn  s    **,<<--/ 	HKC;;&&v'9'9;G	H !\\//1F{sF9? "6] F G &
%%3%&&*4&&##D$4$4d6F6FGFs   D#
N)r   r   r    r!   r:   r   r   r   r   r   r   r   r   r   r   r"   r   r   r   r      s>    6
"%2>92r   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	ProcessListc                     i | _         || _        || _        t        j                         | _        t        j                         | _        | j                          y r   )	r   r   rT   r   r   	timestampr   r   update_process_counts)r   r   rT   s      r   r:   zProcessList.__init__  sA    $8!)mmo 	""$r   c                     | j                   j                  |d      }|st        |      }|| j                   |<   |j                  | j                        r|S y)zyEither get the specified PID from self.processes or build a new
        ProcessInfo if we see this PID for the first timeN)r   r   r   r   rT   )r   r   processs      r   get_processzProcessList.get_process  sQ     ..$$S$/!#&G")DNN3-N .r   c           
         | j                   j                  r| j                   j                  S t        j                  d      }| j                   j                  r+|D cg c]  }d|d   cxk  rdk  sn nt        |      ! c}S g }|D ]M  }d|d   cxk  rdk  sn 	 |j                  t        t
        t        j                  d|z   dz                      O |S c c}w # t        $ r Y bw xY w)Nz/proc0r   9z/proc/z/task)	rT   r   r   listdirr   r{   extendmaprg   )r   tgidsr   tidss       r   
list_tgidszProcessList.list_tgids  s    <<<<$$$

7#<<!!*/I$3$q'3HS3HCIII 	Dd1g$$KKC$&JJx$/H$I!K L	  J  s   C0C8C	C*)C*c           	      f   | j                   j                  s|gS 	 t        t        t        t        j                  d|z                    }| j                   j                  r@t        t        | j                   j                        j                  t        |                  }|S # t        $ r g cY S w xY w)Nz/proc/%d/task)rT   r   listr  r{   r   r  rg   r   r   intersection)r   r   r  s      r   	list_tidszProcessList.list_tids  s    ||%%6M	COd,B!CDED <<DLL--.;;CIFGD  	I	s   /B" "B0/B0c                    t        j                         }|| j                  z
  | _        || _        dx}}| j	                         D ]  }| j                  |      }|s| j                  |      D ]~  }|j                  || j                        }| j                  j                  |      }|s=|j                  |       |j                  }	||	j                  z  }||	j                  z  }d|_          ||f| j                  j!                         fS )Nr   F)r   r   r   durationr  r   r
  r   r   rv   r   r   r)   r+   r   r   rE   )
r   new_timestamp
total_readtotal_writer   r   r_   ro   rJ   rE   s
             r   r   z!ProcessList.update_process_counts  s   (%6&#$$
[OO% 	(D&&t,G~~d+ ( ++C1J1JK11GGO''."..E%"2"22J5#4#44K"'FK(		( K($++*;*;*===r   c                 V   | j                   j                         D ](  }|j                  j                         D ]	  }d|_         * | j	                         }t        | j                   j                         D cg c]  \  }}|j                         r||f c}}      | _         |S c c}}w r   )r   r   r   r   r   r   rj   r   )r   r   ro   total_read_and_writer   s        r   refresh_processeszProcessList.refresh_processes  s    ~~,,. 	#G!//002 #"#	#  $99;#~~3357,#w&335 !$W~ 7 8 $#	7s   8B%
c                     i | _         y r   )r   r   s    r   clearzProcessList.clear  s	    r   N)
r   r   r    r:   r   r  r
  r   r  r  r"   r   r   r   r     s%    	%	&>,$r   r   c                      	 t        d      5 } t        t        | j                         j	                                     cd d d        S # 1 sw Y   y xY w# t
        $ r Y y w xY w)Nz/proc/sys/kernel/task_delayacct)r   boolr{   r   r   FileNotFoundError)fs    r   sysctl_task_delayacctr    sR    34 	/AFFHNN,-.	/ 	/ 	/ s-   A 0A	A AA A 	AA)3
__future__r   rh   r   r   r}   r   r2   r   r   hasattrr   ImportErrorRuntimeErrorpathexistsioaccountingiotop.vmstatr   vmstat_fvm_event_countersr   r   r   iotopr   r   iotop.netlinkr	   r
   r   r   iotop.genetlinkr   r   objectr   r$   r]   r^   rk   TASKSTATS_TYPE_PIDrm   rQ   r   r   r   r   r   r   r  r"   r   r   <module>r)     ss  ( &  	  
   
 4%'" ww~~o.#xH ,	
HI	
"# E 	F @ACHHQK   M M 3;V ;/N /j      #%v #%T*"! !.@. @F\. \~w 	\" YYDN  s#   D D6 D32D36E ?E 