Ñò
A¡KKc           @   sý  d  d k  Z  d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k	 Z	 e i
 i d ƒ Z y d  d k Z Wn e j
 o e Z n Xe Z e p e o= d „  Z d GHd Ge e ƒ GHd Ge e ƒ GHe i d ƒ n d  d k l Z l Z d  d	 k l Z l Z l Z l Z d  d
 k l Z l Z d e f d „  ƒ  YZ  d e  f d „  ƒ  YZ! 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(   iÿÿÿÿNs   /proc/self/ioc         C   s   |  o d p d S(   Nt   Founds	   Not found(    (   t   boolean(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   boolean2string   s    s<   Could not run iotop as some of the requirements are not met:st   - Linux >= 2.6.20 with I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING):s5   - Python >= 2.5 or Python 2.4 with the ctypes module: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 i |  i ƒ f S(   Ns   %s: %s>iÿÿÿÿ(   t   strt   typet   pprintt   pformatt   __dict__(   t   self(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   __repr__,   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    s*   /usr/lib/pymodules/python2.6/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   sr   |  i  } xB t i D]7 \ } } | | | d !} t i d | ƒ d | | <q Wt i p |  i d j 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/pymodules/python2.6/iotop/data.pyt   __init__?   s    	
 
i   c   	      C   sS   | i  } |  i  } | i  } x1 t i 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/pymodules/python2.6/iotop/data.pyt
   accumulateJ   s    			
 c         C   s   |  i  | | d d ƒS(   s*   Update destination with self - other_statsR)   iÿÿÿÿ(   R-   (   R   R'   R(   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   deltaR   s    c         C   s=   |  i  } x- t i D]" \ } } | | d j o t Sq Wt S(   Ni    (   R   R   R   t   Falset   True(   R   R"   R#   R$   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   is_all_zeroV   s    	
 	c          C   s@   t  i t  ƒ }  |  i } x! t  i D] \ } } d | | <q" W|  S(   Ni    (   R   t   __new__R   R   (   t   statst   stdR#   R$   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   build_all_zero]   s    	
 (   s   blkio_delay_totali(   (   s   swapin_delay_totali8   (   R   iø   (   R   i   (   R   i  (   R   R   R   R/   R    R&   R-   R.   R1   t   staticmethodR5   (    (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR   4   s   				t   TaskStatsNetlinkc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s=   | |  _  t t ƒ |  _ t |  i ƒ } | i d ƒ |  _ d  S(   Nt	   TASKSTATS(   t   optionsR   R   t
   connectionR	   t   get_family_idt	   family_id(   R   R9   t
   controller(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR&   o   s    	c         C   s+   t  |  i 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/pymodules/python2.6/iotop/data.pyt   build_requestu   s    c      
   C   s  | i  i |  i ƒ y |  i i ƒ  } Wn0 t j
 o$ } | i t i j o d  S‚  n Xt | i ƒ d j  o d  S| i d } t	 i
 d | i d d !ƒ \ } } t	 i
 d | i d d !ƒ d } | d	 j p t ‚ | t d
 j p t ‚ | d j p t ‚ t | ƒ S(   Ni$  i   t   HHi   i   t   Hi   i    i   i   (   t   task_stats_requestt   sendR:   t   recvt   OSErrort   errnot   ESRCHt   lent   payloadR   R   t   AssertionErrorRB   R   (   R   t   threadt   replyt   et
   reply_datat   reply_lengtht
   reply_typet   reply_version(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   get_single_task_statsz   s     " (   R   R   R&   RD   RW   (    (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR7   l   s   		c         C   sÒ   g  |  _  t } x¤ |  i p g  D]’ } y t | ƒ } Wn^ t j
 oR y t i | ƒ } Wn, t j
 o  t i	 d I| IJt
 } q— X| i } n X| p |  i  i | ƒ q  q  W| o t i 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   stderrR0   t   pw_uidt   appendt   exit(   R9   t   errort   ut   uidt   passwd(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt	   find_uids“   s"    	 c         C   s5   y |  i  d ƒ SWn t j
 o |  i d ƒ SXd  S(   Ns   utf-8t   string_escape(   t   decodet   UnicodeDecodeErrort   encode(   t   s(    (    s*   /usr/lib/pymodules/python2.6/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 i t ƒ |  _ | i | ƒ |  _	 d  S(   N(
   RC   R0   t   markt   Nonet   stats_totalR   R2   t   stats_deltaRD   RG   (   R   RC   t   taskstats_connection(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR&   ¯   s
    			c         C   s   t  i |  i ƒ S(   N(   R   t   getRC   (   R   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt
   get_ioprio¶   s    c         C   s   t  i t  i |  i | | ƒ S(   N(   R   t
   set_iopriot   IOPRIO_WHO_PROCESSRC   (   R   t   ioprio_classt   ioprio_data(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyRw   ¹   s    c         C   s:   |  i  p | |  _  n | i |  i  |  i ƒ | |  _  d  S(   N(   Rr   R.   Rs   (   R   R3   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   update_stats½   s    
(   R   R   R   R&   Rv   Rw   R{   (    (    (    s*   /usr/lib/pymodules/python2.6/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  |  _ h  |  _ t i ƒ  |  _ t i ƒ  |  _ t	 i	 ƒ  |  _
 d  S(   N(   t   pidRq   Rf   t   usert   threadsR   R5   Rs   t   stats_accumt   timet   stats_accum_timestamp(   R   R}   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR&   È   s    				c         C   sV   | i  o# | i o |  i | i  j o t S| i o |  i ƒ  | i j o t St S(   N(   t   pidst	   processesR}   R/   RX   t   get_uidR0   (   R   R9   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   is_monitoredÑ   s     c         C   sy   |  i  o |  i  Sy! t i d |  i ƒ t i } Wn t j
 o d  } n X| |  i  j o d  |  _ | |  _  n | S(   Ns   /proc/%d(   Rf   t   ost   statR}   t   ST_UIDRJ   Rq   R~   (   R   Rf   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR…   Ý   s    
!	c         C   sz   |  i  ƒ  } | d  j	 oS |  i oH y t t i | ƒ i ƒ |  _ Wql t j
 o t | ƒ |  _ ql Xn |  i p d S(   Ns   {none}(	   R…   Rq   R~   Rn   R\   t   getpwuidt   pw_nameR^   R   (   R   Rf   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   get_userî   s    c         C   sƒ   y t  d |  i ƒ i ƒ  } Wn t j
 o d SXd } | i | ƒ o | d i ƒ  } n d } | o 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/pymodules/python2.6/iotop/data.pyt   get_proc_status_name÷   s    c         C   s¾   y& t  d |  i ƒ } | i d ƒ } Wn t j
 o d SX| p |  i ƒ  S| i d ƒ } | d i d ƒ o- | d i d ƒ d } | d | | d <n d i | ƒ i	 ƒ  } 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/pymodules/python2.6/iotop/data.pyt   get_cmdline  s    c         C   sI   | o |  i  i ƒ  Sx, |  i i ƒ  D] } | i i ƒ  p t Sq& Wt S(   N(   R€   R1   R   t
   itervaluesRs   R0   R/   (   R   t   accumulatedt   t(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   did_some_io  s     	c         C   sA   t  d „  |  i i ƒ  Dƒ ƒ } t | ƒ d j o | i ƒ  Sd S(   Nc         s   s   x |  ] } | i  ƒ  Vq Wd  S(   N(   Rv   (   t   .0R¤   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pys	   <genexpr>!  s   	 i   s   ?dif(   t   setR   R¢   RM   t   pop(   R   t
   priorities(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyRv      s    c         C   s.   x' |  i  i ƒ  D] } | i | | ƒ q Wd  S(   N(   R   R¢   Rw   (   R   Ry   Rz   RP   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyRw   &  s     c         C   s   t  i |  i ƒ  ƒ S(   N(   R   t   sort_keyRv   (   R   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   ioprio_sort_key*  s    c         C   s@   |  i  i | d  ƒ } | p  t | | ƒ } | |  i  | <n | S(   N(   R   Ru   Rq   Ro   (   R   RC   Rt   RP   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt
   get_thread-  s
    c         C   s¶   t  i ƒ  } xH |  i i ƒ  D]7 \ } } | i o |  i | =q | i | i | ƒ q Wt |  i ƒ } | p t S| i	 | :_	 | i
 | :_
 | |  _ |  i i |  i |  i ƒ t S(   N(   R   R5   R   t   itemsRp   R-   Rs   RM   R/   R   R   R€   R0   (   R   Rs   RC   RP   t
   nr_threads(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR{   4  s     
	(   R   R   R   R&   R†   R…   RŒ   R•   R¡   R¥   Rv   Rw   R«   R¬   R{   (    (    (    s*   /usr/lib/pymodules/python2.6/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   h  |  _  | |  _ | |  _ t i ƒ  |  _ t i ƒ  |  _ |  i ƒ  d  S(   N(   R„   Rt   R9   R   t	   timestampR   t   VmStatt   update_process_counts(   R   Rt   R9   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR&   I  s    			c         C   sU   |  i  i | d ƒ } | p t | ƒ } | |  i  | <n | i |  i ƒ o | Sd 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†   R9   (   R   R}   t   process(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   get_processT  s    c         C   s  |  i  i o |  i  i St i d ƒ } |  i  i oL g  } | D]9 } d | d j o
 d j n o | t | ƒ q? q? ~ Sg  } xu | D]m } d | d j o
 d j n oE y+ | i t t t i d | d ƒ ƒ ƒ Wqú t j
 o qú Xq q W| S(   Ns   /proct   0i    t   9s   /proc/s   /task(	   R9   Rƒ   R‡   t   listdirR„   RZ   t   extendt   mapRJ   (   R   t   tgidst   _[1]t   tgidt   tids(    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt
   list_tgids_  s    L "+c         C   sˆ   |  i  i p | g Sy  t t t i d | ƒ ƒ } Wn t j
 o g  SX|  i  i o+ t t	 |  i  i ƒ i
 t	 | ƒ ƒ ƒ } n | S(   Ns   /proc/%d/task(   R9   R„   R¹   RZ   R‡   R·   RJ   Rƒ   t   listR§   t   intersection(   R   R¼   R½   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt	   list_tidsq  s     +c         C   sÈ   t  i  ƒ  } | |  i |  _ | |  _ x“ |  i ƒ  D]… } |  i | ƒ } | p q2 n x_ |  i | ƒ D]N } | i | |  i ƒ } |  i i | ƒ } | o | i	 | ƒ t
 | _ qe qe Wq2 W|  i i ƒ  S(   N(   R   R°   t   durationR¾   R´   RÁ   R¬   Rt   RW   R{   R/   Rp   R   R.   (   R   t   new_timestampR¼   R³   RC   RP   R3   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR²     s     	  c         C   sˆ   x: |  i  i ƒ  D]) } x  | i i ƒ  D] } t | _ q& Wq W|  i ƒ  } x8 |  i  i ƒ  D]' \ } } | i ƒ  p |  i  | =qY qY W| S(   N(   R„   R¢   R   R0   Rp   R²   R­   R{   (   R   R³   RP   t   total_read_and_writeR}   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   refresh_processes‘  s       c         C   s   h  |  _  d  S(   N(   R„   (   R   (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   clearž  s    (	   R   R   R&   R´   R¾   RÁ   R²   RÅ   RÆ   (    (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyR¯   H  s   						(*   RK   t   globR‡   R   R\   t   socketRˆ   R   R_   R   t   patht   existst   ioaccountingt   ctypest   ImportErrorR/   t
   has_ctypesR0   R   Rc   t   iotopR   R   t   netlinkR   R   R   R   t	   genetlinkR	   R
   t   objectR   R   RA   RB   R7   Rh   Rn   Ro   R|   R¯   (    (    (    s*   /usr/lib/pymodules/python2.6/iotop/data.pyt   <module>   sH   	"
5'		„