
FNc           @   sE  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 Z Wn e k
 r e Z n Xe Z y d  d l m Z e   Z Wn e Z n Xe Z e
 s e s e r?d GHe
 s e r!d GHe
 sd GHn  e s!d GHq!n  e s/d GHn  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 e! f d     YZ+ d e! f d     YZ, d e! f d     YZ- d S(   iNs   /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)s4   - Python >= 2.5 or Python 2.4 with the ctypes modulei   (   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__H   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR	   F   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__[   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
   accumulatef   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   deltan   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_zeror   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_zeroy   s
    	(   s   blkio_delay_totali(   (   s   swapin_delay_totali8   (   R   i   (   R   i   (   R   i  (   R   R   R   R-   R   R$   R+   R,   R/   t   staticmethodR3   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR   P   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   R7   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   sendR8   R   t   recvt   OSErrort   errnot   ESRCHR=   t	   iteritemst   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$   RB   RW   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR5      s   		c         C   s   g  |  _  t } x |  j p g  D] } y t |  } WnZ t k
 r y t j |  } Wn* t k
 r t j	 d I| IJt
 } 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:i   N(   t   uidsR-   t   userst   intt
   ValueErrort   pwdt   getpwnamt   KeyErrort   syst   stderrR.   t   pw_uidt   appendt   exit(   R7   t   errort   ut   uidt   passwd(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt	   find_uids   s     	
c         C   s3   y |  j  d  SWn t k
 r. |  j d  SXd  S(   Ns   utf-8t   string_escape(   t   decodet   UnicodeDecodeErrort   encode(   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(
   RA   R.   t   markt   Nonet   stats_totalR   R0   t   stats_deltaRB   RD   (   R   RA   t   taskstats_connection(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR$      s
    			c         C   s   t  j |  j  S(   N(   R   t   getRA   (   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_PROCESSRA   (   R   t   ioprio_classt   ioprio_data(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyRw      s    c         C   s8   |  j  s | |  _  n  | j |  j  |  j  | |  _  d  S(   N(   Rr   R,   Rs   (   R   R1   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   update_stats   s    	(   R   R   R   R$   Rv   Rw   R{   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyRo      s
   			t   ProcessInfoc           B   sz   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 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(   t   pidRq   Rf   t   usert   threadsR   R3   Rs   t   stats_accumt   timet   stats_accum_timestamp(   R   R}   (    (    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	   processesR}   R-   RX   t   get_uidR.   (   R   R7   (    (    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(   Rf   t   ost   statR}   t   ST_UIDRG   Rq   R~   (   R   Rf   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR      s    	!
	c         C   st   |  j    } | d  k	 rg |  j rg y t t j |  j  |  _ Wqg t k
 rc t |  |  _ qg Xn  |  j ps d S(   Ns   {none}(	   R   Rq   R~   Rn   R\   t   getpwuidt   pw_nameR^   R
   (   R   Rf   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_user  s    c         C   s}   y t  d |  j  j   } Wn t k
 r1 d SXd } | j |  rZ | d j   } n d } | rs d | } n d } | S(   Ns   /proc/%d/statuss   {no such process}s   Name:	i   t    s   [%s]s	   {no name}(   t   openR}   t   readlinet   IOErrort
   startswitht   strip(   R   t
   first_linet   prefixR!   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_proc_status_name  s    c         C   s   y& t  d |  j  } | j d  } Wn t k
 r: d SX| sK |  j   S| j d  } | d j d  r | d j d  d } | d | | d <n  d j |  j	   } t
 |  S(	   Ns   /proc/%d/cmdlinei   s   {no such process}t    i    t   /i   t    (   R   R}   t   readR   R   t   splitR   t   rfindt   joinR   Rn   (   R   t   proc_cmdlinet   cmdlinet   partst   first_command_char(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_cmdline(  s    
c         C   sE   | r |  j  j   Sx* |  j j   D] } | j j   s$ t Sq$ Wt S(   N(   R   R/   R   t
   itervaluesRs   R.   R-   (   R   t   accumulatedt   t(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   did_some_io9  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(   Rv   (   t   .0R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pys	   <genexpr>B  s    i   s   ?dif(   t   setR   R   RN   t   pop(   R   t
   priorities(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyRv   A  s    
c         C   s.   x' |  j  j   D] } | j | |  q Wd  S(   N(   R   R   Rw   (   R   Ry   Rz   RP   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyRw   G  s    c         C   s   t  j |  j    S(   N(   R   t   sort_keyRv   (   R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   ioprio_sort_keyK  s    c         C   s>   |  j  j | d   } | s: t | |  } | |  j  | <n  | S(   N(   R   Ru   Rq   Ro   (   R   RA   Rt   RP   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt
   get_threadN  s
    c         C   s   t  j   } xF |  j j   D]5 \ } } | j r> |  j | =q | j | j |  q Wt |  j  } | sn t S| j	 | :_	 | j
 | :_
 | |  _ |  j j |  j |  j  t S(   N(   R   R3   R   t   itemsRp   R+   Rs   RN   R-   R   R   R   R.   (   R   Rs   RA   RP   t
   nr_threads(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR{   U  s    		(   R   R   R   R$   R   R   R   R   R   R   Rv   Rw   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   Rt   R7   R   t	   timestampR   R    t   update_process_counts(   R   Rt   R7   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyR$   j  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   Ru   Rq   R|   R   R7   (   R   R}   t   process(    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   get_processu  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(	   R7   R   R   t   listdirR   RZ   t   extendt   mapRG   (   R   t   tgidst   tgidt   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 j d |   } Wn t k
 rG g  SX|  j  j r~ t t	 |  j  j  j
 t	 |    } n  | S(   Ns   /proc/%d/task(   R7   R   R   RZ   R   R   RG   R   t   listR   t   intersection(   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt	   list_tids  s     *c         C   s   t  j    } | |  j |  _ | |  _ x |  j   D] } |  j |  } | sS q2 n  x] |  j |  D]L } | j | |  j  } |  j j |  } | rc | j	 |  t
 | _ qc qc Wq2 W|  j j   S(   N(   R   R   t   durationR   R   R   R   Rt   RW   R{   R-   Rp   R   R,   (   R   t   new_timestampR   R   RA   RP   R1   (    (    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   } x6 |  j  j   D]% \ } } | j   sY |  j  | =qY qY W| S(   N(   R   R   R   R.   Rp   R   R   R{   (   R   R   RP   t   total_read_and_writeR}   (    (    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   i  s   						(.   RH   R   R   R\   R   R   R_   R   t   patht   existst   ioaccountingt   ctypest   ImportErrorR-   t
   has_ctypesR.   t   iotop.vmstatR    t   vmstat_ft   vm_event_countersRc   t   iotopR   R   t   netlinkR   R   R   R   t	   genetlinkR   R   t   objectR	   R   R?   R@   RK   t   TASKSTATS_TYPE_PIDRM   R5   Rh   Rn   Ro   R|   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/iotop/data.pyt   <module>   s\   

"
5)		