
BQc           @  s  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 j
 j d  Z y d  d l m Z e   Z Wn e Z n Xe Z e s e re d  e d  e s e d  n  e s e d  n  e j d	  n  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 d e  f d     YZ! d e! f d     YZ" d	 Z# d	 Z$ d Z% d	 Z& d Z' d e  f d     YZ( d   Z) d   Z* d   Z+ d e! f d     YZ, d e! f d     YZ- d e! f d     YZ. d S(   i(   t   print_functionNs   /proc/self/io(   t   VmStats<   Could not run iotop as some of the requirements are not met:s   - Linux >= 2.6.20 withs`     - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING)s0     - VM event counters (CONFIG_VM_EVENT_COUNTERS)i   (   t   iopriot   vmstat(   t
   Connectiont   NETLINK_GENERICt   U32Attrt   NLM_F_REQUEST(   t
   Controllert   GeNlMessaget   DumpableObjectc           B  s   e  Z d  Z d   Z RS(   sF   Base class for all objects that allows easy introspection when printedc         C  s*   d t  t |    d  t j |  j  f S(   Ns   %s: %s>i(   t   strt   typet   pprintt   pformatt   __dict__(   t   self(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   __repr__?   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR
   =   s   t   Statsc           B  sY   e  Z d d d d d g Z e Z d
   Z d d  Z d   Z d   Z e	 d    Z
 RS(   t   blkio_delay_totali(   t   swapin_delay_totali8   t
   read_bytesi   t   write_bytesi   t   cancelled_write_bytesi  c         C  sp   |  j  } xB t j D]7 \ } } | | | d !} t j d |  d | | <q Wt j sl |  j d k t _ n  d  S(   Ni   t   Qi    (   R   R   t   members_offsetst   structt   unpackt   has_blkio_delay_totalR   (   R   t   task_stats_buffert   sdt   namet   offsett   data(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   __init__R   s    		i   c   	      C  sS   | j  } |  j  } | j  } x1 t j D]& \ } } | | | | | | | <q% Wd S(   s3   Update destination from operator(self, other_stats)N(   R   R   R   (	   R   t   other_statst   destinationt   coefft   ddR!   t   odt   memberR#   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt
   accumulate]   s
    			c         C  s   |  j  | | d d S(   s*   Update destination with self - other_statsR(   i(   R,   (   R   R&   R'   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   deltae   s    c         C  s;   |  j  } x+ t j D]  \ } } | | d k r t Sq Wt S(   Ni    (   R   R   R   t   Falset   True(   R   R!   R"   R#   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   is_all_zeroi   s
    	c          C  s@   t  j t   }  |  j } x! t  j D] \ } } d | | <q" W|  S(   Ni    (   R   t   __new__R   R   (   t   statst   stdR"   R#   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   build_all_zerop   s
    	(   s   blkio_delay_totali(   (   s   swapin_delay_totali8   (   s
   read_bytesi   (   s   write_bytesi   (   R   i  (   R   R   R   R.   R   R%   R,   R-   R0   t   staticmethodR4   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR   G   s   				i   i   t   TaskStatsNetlinkc           B  s#   e  Z d    Z d   Z d   Z RS(   c         C  s=   | |  _  t t  |  _ t |  j  } | j d  |  _ d  S(   Nt	   TASKSTATS(   t   optionsR   R   t
   connectionR   t   get_family_idt	   family_id(   R   R8   t
   controller(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR%      s    	c         C  s+   t  |  j d t d t t |  g d t S(   Nt   cmdt   attrst   flags(   R	   R;   t   TASKSTATS_CMD_GETR   t   TASKSTATS_CMD_ATTR_PIDR   (   R   t   tid(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   build_request   s    c         C  s   | j  j |  j  y t j |  j  } Wn, t k
 rW } | j t j k rQ d  S  n Xx= | j j	   D]( \ } } | t
 k rh | j   } Pqh qh Wd  S| t j } t |  d k  r d  St j d | d   d } | d k s t  t |  S(   Ni  t   Hi   i    i   (   t   task_stats_requestt   sendR9   R	   t   recvt   OSErrort   errnot   ESRCHR>   t   itemst   TASKSTATS_TYPE_AGGR_PIDt   nestedt   TASKSTATS_TYPE_STATSR$   t   lenR   R   t   AssertionErrorR   (   R   t   threadt   replyt   et	   attr_typet
   attr_valuet   taskstats_datat   taskstats_version(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_single_task_stats   s$    (   R   R   R%   RC   RX   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR6      s   		c         C  s   g  |  _  t } x |  j p g  D] } y t |  } Wn] t k
 r y t j |  } Wn- t k
 r t d | d t	 j
 t } q X| j } n X| s |  j  j |  q q W| r t	 j d  n  d S(   sD   Build options.uids from options.users by resolving usernames to UIDss   Unknown user:t   filei   N(   t   uidsR.   t   userst   intt
   ValueErrort   pwdt   getpwnamt   KeyErrort   printt   syst   stderrR/   t   pw_uidt   appendt   exit(   R8   t   errort   ut   uidt   passwd(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt	   find_uids   s     	
c         C  se   i  } yG x@ t  d |   D]. } | j d d  \ } } | j   | | <q WWn t k
 r` n X| S(   Ns   /proc/%d/statuss   :	i   (   t   opent   splitt   stript   IOError(   t   pidt   result_dictt   linet   keyt   value(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   parse_proc_pid_status   s    c         C  sD   y |  j  d  SWn, t k
 r. |  j d  St k
 r? |  SXd  S(   Ns   utf-8t   string_escape(   t   decodet   UnicodeDecodeErrort   encodet   AttributeError(   t   s(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   safe_utf8_decode   s    t
   ThreadInfoc           B  s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   s   Stats for a single threadc         C  sC   | |  _  t |  _ d  |  _ t j t  |  _ | j |  |  _	 d  S(   N(
   RB   R/   t   markt   Nonet   stats_totalR   R1   t   stats_deltaRC   RE   (   R   RB   t   taskstats_connection(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR%      s
    			c         C  s   t  j |  j  S(   N(   R   t   getRB   (   R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt
   get_ioprio   s    c         C  s   t  j t  j |  j | |  S(   N(   R   t
   set_iopriot   IOPRIO_WHO_PROCESSRB   (   R   t   ioprio_classt   ioprio_data(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR      s    c         C  s8   |  j  s | |  _  n  | j |  j  |  j  | |  _  d  S(   N(   R   R-   R   (   R   R2   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   update_stats   s    	(   R   R   R   R%   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR}      s
   			t   ProcessInfoc           B  sq   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 RS(   s   Stats 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         C  sU   | |  _  d  |  _ d  |  _ i  |  _ t j   |  _ t j   |  _ t	 j	   |  _
 d  S(   N(   Rp   R   Ri   t   usert   threadsR   R4   R   t   stats_accumt   timet   stats_accum_timestamp(   R   Rp   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR%      s    				c         C  sO   | j  r) | j r) |  j | j  k r) t S| j rK |  j   | j k rK t St S(   N(   t   pidst	   processesRp   R.   RZ   t   get_uidR/   (   R   R8   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   is_monitored   s    c         C  ss   |  j  r |  j  Sy! t j d |  j  t j } Wn t k
 rJ d  } n X| |  j  k ro d  |  _ | |  _  n  | S(   Ns   /proc/%d(   Ri   t   ost   statRp   t   ST_UIDRH   R   R   (   R   Ri   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR     s    	!
	c         C  sz   |  j    } | d  k	 rm |  j rm y t t j |  j  |  _ Wqm t t f k
 ri t	 |  |  _ qm Xn  |  j py d S(   Ns   {none}(
   R   R   R   R|   R^   t   getpwuidt   pw_nameR`   Rz   R   (   R   Ri   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_user  s    c         C  sj  y& t  d |  j  } | j d  } Wn t k
 r: d SXt |  j  } | s | j d d  } | ru d | } n d } | Sd } t | j d |  j   } | |  j k r t |  j d d  } | j d d  } | | k r | d	 | 7} q n  | j d
  }	 |	 d j d  rG|	 d j	 d  d }
 |	 d |
 |	 d <n  d j
 |	  j   } t | |  S(   Ns   /proc/%d/cmdlinei   s   {no such process}t   Namet    s   [%s]s	   {no name}t   Tgids    [%s]t    i    t   /i   t    (   Rl   Rp   t   readRo   Ru   R   R\   Rm   t
   startswitht   rfindt   joinRn   R|   (   R   t   proc_cmdlinet   cmdlinet   proc_statust   proc_status_namet   suffixt   tgidt	   tgid_namet   thread_namet   partst   first_command_char(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_cmdline  s2    c         C  sE   | r |  j  j   Sx* |  j j   D] } | j j   s$ t Sq$ Wt S(   N(   R   R0   R   t   valuesR   R/   R.   (   R   t   accumulatedt   t(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   did_some_io<  s    c         C  s?   t  d   |  j j   D  } t |  d k r; | j   Sd S(   Nc         s  s   |  ] } | j    Vq d  S(   N(   R   (   t   .0R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pys	   <genexpr>E  s    i   s   ?dif(   t   setR   R   RO   t   pop(   R   t
   priorities(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR   D  s    
c         C  s.   x' |  j  j   D] } | j | |  q Wd  S(   N(   R   R   R   (   R   R   R   RQ   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR   J  s    c         C  s   t  j |  j    S(   N(   R   t   sort_keyR   (   R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   ioprio_sort_keyN  s    c         C  s>   |  j  j | d   } | s: t | |  } | |  j  | <n  | S(   N(   R   R   R   R}   (   R   RB   R   RQ   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt
   get_threadQ  s
    c         C  s   t  j   } x< |  j j   D]+ \ } } | j s | j | j |  q q Wt g  |  j j   D]! \ } } | j s^ | | f ^ q^  |  _ t |  j  } | s t	 S| j
 | :_
 | j | :_ | |  _ |  j j |  j |  j  t S(   N(   R   R4   R   RK   R~   R,   R   t   dictRO   R.   R   R   R   R/   (   R   R   RB   RQ   t
   nr_threads(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR   X  s    	:	(   R   R   R   R%   R   R   R   R   R   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR      s   												t   ProcessListc           B  sG   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   c         C  sG   i  |  _  | |  _ | |  _ t j   |  _ t j   |  _ |  j   d  S(   N(   R   R   R8   R   t	   timestampR   R   t   update_process_counts(   R   R   R8   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR%   m  s    			c         C  sQ   |  j  j | d  } | s7 t |  } | |  j  | <n  | j |  j  rM | Sd S(   sy   Either 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   R   R8   (   R   Rp   t   process(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_processx  s    c         C  s   |  j  j r |  j  j St j d  } |  j  j rn g  | D]2 } d | d k oY d k n r8 t |  ^ q8 Sg  } xp | D]h } d | d k o d k n r{ y+ | j t t t j d | d    Wq t k
 r q Xq{ q{ W| S(   Ns   /proct   0i    t   9s   /proc/s   /task(	   R8   R   R   t   listdirR   R\   t   extendt   mapRH   (   R   t   tgidsR   t   tids(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt
   list_tgids  s    
= +c         C  s   |  j  j s | g Sy& t t t t j d |    } Wn t k
 rM g  SX|  j  j r t t	 |  j  j  j
 t	 |    } n  | S(   Ns   /proc/%d/task(   R8   R   t   listR   R\   R   R   RH   R   R   t   intersection(   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt	   list_tids  s    &*c   
      C  s   t  j    } | |  j |  _ | |  _ d } } x |  j   D] } |  j |  } | s] q< n  x |  j |  D]o } | j | |  j  } |  j j |  } | rm | j	 |  | j
 }	 | |	 j 7} | |	 j 7} t | _ qm qm Wq< W| | f |  j j   f S(   Ni    (   R   R   t   durationR   R   R   R   R   RX   R   R   R   R   R.   R~   R   R-   (
   R   t   new_timestampt
   total_readt   total_writeR   R   RB   RQ   R2   R-   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR     s$    	
	c         C  s   x: |  j  j   D]) } x  | j j   D] } t | _ q& Wq W|  j   } t g  |  j  j   D]$ \ } } | j   r\ | | f ^ q\  |  _  | S(   N(	   R   R   R   R/   R~   R   R   RK   R   (   R   R   RQ   t   total_read_and_writeRp   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   refresh_processes  s    $c         C  s   i  |  _  d  S(   N(   R   (   R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   clear  s    (	   R   R   R%   R   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR   l  s   						(/   t
   __future__R    RI   R   R   R^   R   R   Rb   R   t   patht   existst   ioaccountingt   iotop.vmstatR   t   vmstat_fR.   t   vm_event_countersR/   Ra   Rf   t   iotopR   R   t   iotop.netlinkR   R   R   R   t   iotop.genetlinkR   R	   t   objectR
   R   R@   RA   RL   t   TASKSTATS_TYPE_PIDRN   R6   Rk   Ru   R|   R}   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   <module>   sP   


"
5)			