U ¯Zd+<ã @sÔddlmZddlZddlZddlZddlZddlZddlZddlZddl Z z e e dƒsjddl m Z e e _ Wn e e fk rŒe j e _ YnXej d¡ZzddlmZeƒZWnek rÈdZYnXdZerØes ed ƒed ƒesôed ƒesed ƒe d ¡ddlmZmZddlmZmZmZmZddl m!Z!m"Z"Gdd„de#ƒZ$Gdd„de$ƒZ%d Z&d Z'dZ(d Z)dZ*Gdd„de#ƒZ+dd„Z,dd„Z-dd„Z.Gdd „d e$ƒZ/Gd!d"„d"e$ƒZ0Gd#d$„d$e$ƒZ1dS)%é)Úprint_functionNÚ monotonic)rz /proc/self/io)ÚVmStatFTz= 2.6.20 withz` - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING)z0 - VM event counters (CONFIG_VM_EVENT_COUNTERS)é)ÚioprioÚvmstat)Ú ConnectionÚNETLINK_GENERICÚU32AttrÚ NLM_F_REQUEST)Ú ControllerÚ GeNlMessagec@seZdZdZdd„ZdS)ÚDumpableObjectzBBase class for objects that allows easy introspection when printedcCs$dtt|ƒƒdd…t |j¡fS)Nz%s: %s>éÿÿÿÿ)ÚstrÚtypeÚpprintZpformatÚ__dict__©Úself©rú,/usr/lib/python3/dist-packages/iotop/data.pyÚ__repr__Ks ÿzDumpableObject.__repr__N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrrrrIsrc@sLeZdZdddddgZdZdd„Zdd d „Zd d „Zdd„Ze dd„ƒZ dS)ÚStats)Úblkio_delay_totalé()Úswapin_delay_totalé8)Ú read_byteséø)Ú write_bytesé)Zcancelled_write_bytesiFcCsP|j}tjD],\}}|||d…}t d|¡d||<q tjsL|jdkt_dS)NéÚQr)rrÚmembers_offsetsÚstructÚunpackÚhas_blkio_delay_totalr)rZtask_stats_bufferÚsdÚnameÚoffsetÚdatarrrÚ__init___s zStats.__init__rc Cs>|j}|j}|j}tjD] \}}|||||||<qdS)z3Update destination from operator(self, other_stats)N©rrr() rÚ other_statsÚ destinationÚcoeffZddr,ZodÚmemberr.rrrÚ accumulatejs zStats.accumulatecCs|j||ddS)z*Update destination with self - other_statsr)r4)r6)rr2r3rrrÚdeltarsz Stats.deltacCs,|j}tjD]\}}||dkr dSq dS)NrFTr1)rr,r-r.rrrÚ is_all_zerovs  zStats.is_all_zerocCs,t t¡}|j}tjD]\}}d||<q|S)Nr)rÚ__new__rr()ÚstatsZstdr-r.rrrÚbuild_all_zero}s   zStats.build_all_zeroN)r) rrrr(r+r0r6r7r8Ú staticmethodr;rrrrrTsû rééc@s$eZdZdd„Zdd„Zdd„ZdS)ÚTaskStatsNetlinkcCs*||_ttƒ|_t|jƒ}| d¡|_dS)NZ TASKSTATS)Úoptionsrr Ú connectionr Z get_family_idÚ family_id)rr@Z controllerrrrr0“s  zTaskStatsNetlink.__init__cCst|jttt|ƒgtdS)N)ÚcmdÚattrsÚflags)r rBÚTASKSTATS_CMD_GETr ÚTASKSTATS_CMD_ATTR_PIDr )rÚtidrrrÚ build_request™s þzTaskStatsNetlink.build_requestc CsÌ|j |j¡zt |j¡}Wn:tk rX}z|jtjkrFWY¢ dS‚W5d}~XYnX|j  ¡D]\}}|t krd|  ¡}q†qddS|t j }t|ƒdkr dSt d|dd…¡d}|dksÄt‚t|ƒS)NiÚHérr=)Útask_stats_requestÚsendrAr ZrecvÚOSErrorÚerrnoZESRCHrDÚitemsÚTASKSTATS_TYPE_AGGR_PIDÚnestedÚTASKSTATS_TYPE_STATSr/Úlenr)r*ÚAssertionErrorr)rÚthreadZreplyÚeZ attr_typeZ attr_valueZtaskstats_dataZtaskstats_versionrrrÚget_single_task_statsžs$     z&TaskStatsNetlink.get_single_task_statsN)rrrr0rIrXrrrrr?sr?c Csœg|_d}|jpgD]t}z t|ƒ}WnRtk rvzt |¡}Wn(tk rjtd|tj dd}YnX|j }YnX|s|j  |¡q|r˜t  d¡dS)zDBuild options.uids from options.users by resolving usernames to UIDsFz Unknown user:)ÚfileTrN) ÚuidsZusersÚintÚ ValueErrorÚpwdÚgetpwnamÚKeyErrorÚprintÚsysÚstderrZpw_uidÚappendÚexit)r@ÚerrorÚuÚuidZpasswdrrrÚ find_uidsºs    rhcCsTi}z6td|ddD] }| dd¡\}}| ¡||<qWntk rNYnX|S)Nz/proc/%d/statusÚreplace)Úerrorsú:r)ÚopenÚsplitÚstripÚIOError)ÚpidZ result_dictÚlineÚkeyÚvaluerrrÚparse_proc_pid_statusÏsrtcCsFz | d¡WStk r*| d¡YStk r@|YSXdS)Nzutf-8Z string_escape)ÚdecodeÚUnicodeDecodeErrorÚencodeÚAttributeError)ÚsrrrÚsafe_utf8_decodeÚs  rzc@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) Ú ThreadInfozStats for a single threadcCs.||_d|_d|_t t¡|_| |¡|_dS)NT)rHÚmarkÚ stats_totalrr9Ú stats_deltarIrL)rrHÚtaskstats_connectionrrrr0ås  zThreadInfo.__init__cCs t |j¡S©N)rÚgetrHrrrrÚ get_ioprioìszThreadInfo.get_iopriocCst tj|j||¡Sr€)rÚ set_ioprioZIOPRIO_WHO_PROCESSrH)rÚ ioprio_classÚ ioprio_datarrrrƒïs ÿzThreadInfo.set_iopriocCs&|js ||_| |j|j¡||_dSr€)r}r7r~)rr:rrrÚ update_statsószThreadInfo.update_statsN)rrrrr0r‚rƒr†rrrrr{ãs r{c@sheZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„ZdS)Ú ProcessInfoz˜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.cCs:||_d|_d|_i|_t ¡|_t ¡|_t  ¡|_ dSr€) rprgÚuserÚthreadsrr;r~Ú stats_accumÚtimerZstats_accum_timestamp)rrprrrr0þs  zProcessInfo.__init__cCs8|jr|js|j|jkrdS|jr4| ¡|jkr4dSdS)NFT)ÚpidsÚ processesrprZÚget_uid)rr@rrrÚ is_monitoreds  ÿzProcessInfo.is_monitoredcCsZ|jr |jSzt d|j¡tj}Wntk r>d}YnX||jkrVd|_||_|S)Nz/proc/%d)rgÚosÚstatrpÚST_UIDrNrˆ©rrgrrrrŽs  zProcessInfo.get_uidc CsZ| ¡}|dk rP|jsPztt |¡jƒ|_Wn"ttfk rNt|ƒ|_YnX|jpXdS)Nz{none}) rŽrˆrzr]ÚgetpwuidZpw_namer_rxrr“rrrÚget_user$szProcessInfo.get_userc Cs ztd|jƒ}| d¡}Wntk r2YdSXt|jƒ}|sd| dd¡}|r\d|}nd}|Sd}t| d|j¡ƒ}||jkr´t|ƒ dd¡}| dd¡}||kr´|d |7}| d ¡} | d  d ¡rò| d   d ¡d } | d | d…| d <d  | ¡  ¡}t ||ƒS)Nz/proc/%d/cmdlineiz{no such process}ÚNameÚz[%s]z {no name}ZTgidz [%s]úrú/rú ) rlrpÚreadrortrr[rmÚ startswithÚrfindÚjoinrnrz) rZ proc_cmdlineZcmdlineZ proc_statusZproc_status_nameÚsuffixÚtgidZ tgid_nameZ thread_nameÚpartsZfirst_command_charrrrÚ get_cmdline-s2       zProcessInfo.get_cmdlinecCs4|r|j ¡ S|j ¡D]}|j ¡sdSqdS)NTF)rŠr8r‰Úvaluesr~)rZ accumulatedÚtrrrÚ did_some_ioLs   zProcessInfo.did_some_iocCs0tdd„|j ¡Dƒƒ}t|ƒdkr,| ¡SdS)Ncss|]}| ¡VqdSr€)r‚)Ú.0r¤rrrÚ Usz)ProcessInfo.get_ioprio..rz?dif)Úsetr‰r£rTÚpop)rZ prioritiesrrrr‚Ts zProcessInfo.get_iopriocCs |j ¡D]}| ||¡q dSr€)r‰r£rƒ)rr„r…rVrrrrƒZszProcessInfo.set_iopriocCst | ¡¡Sr€)rZsort_keyr‚rrrrÚioprio_sort_key^szProcessInfo.ioprio_sort_keycCs*|j |d¡}|s&t||ƒ}||j|<|Sr€)r‰rr{)rrHrrVrrrÚ get_threadas   zProcessInfo.get_threadcCs”t ¡}|j ¡D]\}}|js| |j|¡qtdd„|j ¡Dƒƒ|_t|jƒ}|s\dS|j |_ |j |_ ||_|j  |j|j ¡dS)NcSsg|]\}}|js||f‘qSr)r|)r¦rHrVrrrÚ msÿz,ProcessInfo.update_stats..FT) rr;r‰rPr|r6r~ÚdictrTrr rŠ)rr~rHrVZ nr_threadsrrrr†hsÿ  zProcessInfo.update_statsN)rrrrr0rrŽr•r¢r¥r‚rƒrªr«r†rrrrr‡ús   r‡c@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)Ú ProcessListcCs2i|_||_||_t ¡|_t ¡|_| ¡dSr€) rrr@r‹rÚ timestamprrÚupdate_process_counts)rrr@rrrr0~s   zProcessList.__init__cCs8|j |d¡}|s$t|ƒ}||j|<| |j¡r4|SdS)zyEither get the specified PID from self.processes or build a new ProcessInfo if we see this PID for the first timeN)rrr‡rr@)rrpÚprocessrrrÚ get_process‰s   zProcessList.get_processc Cs–|jjr|jjSt d¡}|jjr0dd„|DƒSg}|D]X}d|dkrTdkr8nq8z"| ttt d|d¡ƒ¡Wq8tk rŽYq8Xq8|S) Nz/proccSs0g|](}d|dkr dkrnqt|ƒ‘qS)Ú0rÚ9)r[)r¦r rrrr¬šs  z*ProcessList.list_tgids..r³rr´z/proc/z/task) r@rŒrÚlistdirrÚextendÚmapr[rN)rZtgidsÚtidsr rrrÚ list_tgids”s ÿ zProcessList.list_tgidscCsj|jjs|gSztttt d|¡ƒƒ}Wntk rBgYSX|jjrftt |jjƒ  t |ƒ¡ƒ}|S)Nz /proc/%d/task) r@rÚlistr·r[rrµrNrŒr¨Ú intersection)rr r¸rrrÚ list_tids§s zProcessList.list_tidsc Csªt ¡}||j|_||_d}}| ¡D]l}| |¡}|s>q*| |¡D]L}| ||j¡}|j  |¡}|rH|  |¡|j } || j 7}|| j 7}d|_qHq*||f|j ¡fS)NrF)r‹rr¯Zdurationr¹r²r¼r«rrXr†r~r"r$r|rr7) rZ new_timestampZ total_readZ total_writer r±rHrVr:r7rrrr°µs$        z!ProcessList.update_process_countscCsL|j ¡D]}|j ¡D] }d|_qq | ¡}tdd„|j ¡Dƒƒ|_|S)NTcSs g|]\}}| ¡r||f‘qSr)r†)r¦rpr±rrrr¬Òsþz1ProcessList.refresh_processes..)rr£r‰r|r°r­rP)rr±rVZtotal_read_and_writerrrÚrefresh_processesËs ÿ zProcessList.refresh_processescCs i|_dSr€)rrrrrÚclearØszProcessList.clearN) rrrr0r²r¹r¼r°r½r¾rrrrr®}s   r®)2Z __future__rrOrrr]r‘r)rar‹ÚhasattrrÚ ImportErrorÚ RuntimeErrorÚpathÚexistsZ ioaccountingZ iotop.vmstatrZvmstat_froZvm_event_countersr`rdZiotoprrZ iotop.netlinkrr r r Ziotop.genetlinkr r ÚobjectrrrFrGrQZTASKSTATS_TYPE_PIDrSr?rhrtrzr{r‡r®rrrrÚs^           5*