3 JZK@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl m Z ddl mZdd l mZdd l mZdd l mZdd l mZdd l mZddl mZddl mZddl mZddl mZddlmZddlmZddlmZddlmZdgZ e!edZ"ej#dZ$ej%Z%ej&e j'ej(e j)ej*e j+ej,e j+ej-e j.iZ/ej0e j1ej2e j3ej4e j5ej6e j7ej8e j9ej:e j;eje j?ej@e jAejBe jCejDe jEejFe jGi ZHeIdddddddddZJed d!d"gZKeKZLed#d$d%d&d'gZMed(d)d*d+d,d-gZNed.d/d!d0d1gZOed2d3d4jPeOjQZRd5d6ZSd7d8ZTd9d:ZUd;d<ZVd=d>ZWd?d@ZXdAdBZYdCdDZZej[Z[e j\Z\dXdFdGZ]ej^Z^ej_Z_dZdHdIZ`dJdKZadLdMZbdNdOZcdPdQZddRdSZedTdUZfGdVdWdWegZhdS)[zAIX platform implementation.N) namedtuple)AF_INET)_common)_psposix) _psutil_aix) _psutil_posix)AF_INET6)memoize_when_activated)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN)sockfam_to_enum)socktype_to_enum) usage_percent)PY3) AccessDenied) NoSuchProcess) ZombieProcess PROCFS_PATH proc_threads SC_PAGE_SIZE)ppidrssvms create_timenice num_threadsstatusttynrpmemrr scputimesusersystemZidleZiowaitsvmemtotalZ availablepercentusedfree pmmap_groupedpathZanonlocked pmmap_extz addr perms  cCs tjdjS)z+Return updated psutil.PROCFS_PATH constant.Zpsutil)sysmodulesrr6r6/usr/lib64/python3.6/_psaix.pyget_procfs_pathlsr8cCs4tj\}}}}}t|||dd}t|||||S)Nr)_round)cextZ virtual_memrr*)r+Zavailr.ZpinnedZinuser,r6r6r7virtual_memoryvsr;cCs:tj\}}}}||}t||dd}tj||||||S)z=Swap system memory as a (total, used, free, sin, sout) tuple.r)r9)r:Zswap_memrrZsswap)r+r.ZsinZsoutr-r,r6r6r7 swap_memory|sr<cCstj}tddt|DS)z-Return system-wide CPU times as a named tuplecSsg|] }t|qSr6)sum).0xr6r6r7 szcpu_times..)r: per_cpu_timesr'zip)retr6r6r7 cpu_timessrDcCstj}dd|DS)z5Return system per-CPU times as a list of named tuplescSsg|] }t|qSr6)r')r>r?r6r6r7r@sz!per_cpu_times..)r:rA)rCr6r6r7rAsrAc Cs$y tjdStk rdSXdS)z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNN)ossysconf ValueErrorr6r6r6r7cpu_count_logicals rIcCsrd}tj|dtjtjd}|j\}}tr@dd||fD\}}|jdkrZtd||f|jj}t |ppdS)Nzlsdev -Cc processorT)shellstdoutstderrcSsg|]}|jtjjqSr6)decoder4rKencoding)r>r?r6r6r7r@sz&cpu_count_physical..rz%r command error %s) subprocessPopenPIPE communicater returncode RuntimeErrorstrip splitlineslen)cmdprKrLZ processorsr6r6r7cpu_count_physicals     rZcCs tj\}}}}tj||||S)z*Return various CPU stats as a named tuple.)r: cpu_statsrZ scpustats)Z ctx_switchesZ interruptsZsoft_interruptsZsyscallsr6r6r7r[sr[Fc Cs`g}tj}xN|D]F}|\}}}}|dkr.d}|s>t|js>qtj||||}|j|qW|S)zReturn system disk partitions.Znone)r:disk_partitions disk_usager+rZ sdiskpartappend) allretlistZ partitions partitionZdeviceZ mountpointZfstypeZoptsntupler6r6r7r]s   r]c Cstj}||kr.td|djdd|Dftj|\}}tj|}t}x|D]}|\}} } } } } }| |krrqR| |kr|qRt| } | tt fkr| rtj | } | rtj | } t | } t | } |dkrtj || | | | | |}ntj|| | | | | }|j|qRWt|S)zReturn socket connections. If pid == -1 return system-wide connections (as opposed to connections opened by one process only). z+invalid %r kind argument; choose between %sz, cSsg|] }t|qSr6)repr)r>r?r6r6r7r@sz#net_connections..r)rZ conn_tmaprHjoinr:net_connectionsset TCP_STATUSESrr ZaddrrrZsconnZpconnaddlist)kind_pidZcmapZfamiliestypesrawlistrCitemfdZfamZtype_ZladdrZraddrr$pidntr6r6r7rgs4     rgc Csttd}tddtD}i}x|D]}tj|\}}d}d}tjdd|gtjtjd}|j \} } t rd d| | fD\} } |j dkrt j d | } | d k rt| jd }| jd }|j|t}tj||||||<q(W|S)z)Get NIC stats (isup, duplex, speed, mtu).)ZFullZHalfcSsg|] }|dqS)rr6)r>r?r6r6r7r@sz net_if_stats..r\rz/usr/bin/entstatz-d)rKrLcSsg|]}|jtjjqSr6)rMr4rKrN)r>r?r6r6r7r@ sz"Running: (\d+) Mbps.*?(\w+) DuplexNrr)r r rh net_if_addrsr: net_if_statsrOrPrQrRrrSresearchintgroupgetr rZ snicstats) Z duplex_mapnamesrCnameZisupZmtuZduplexZspeedrYrKrLZ re_resultr6r6r7rus,       rucCstjS)z:The system boot time expressed in seconds since the epoch.)r: boot_timer6r6r6r7r}sr}c Cs`g}tj}d}xJ|D]B}|\}}}}}} |s0q||krr?r6r6r7r@>szpids..)rFlistdirr8r6r6r6r7pids<srcCstjjtjjtt|dS)z&Check for the existence of a unix pid.Zpsinfo)rFr0existsrfr8str)rrr6r6r7 pid_existsAsrcsfdd}|S)zCall callable into a try/except clause and translate ENOENT, EACCES and EPERM in NoSuchProcess or AccessDenied exceptions. csy|f||Stk r}ztdks:tdks:tdkr<|jtjtjfkrzt|jsht|j|j nt|j|j |j |jtj tj fkrt|j|j WYdd}~XnXdS)N) EnvironmentErrorrrrerrnoENOENTZESRCHrrr_name_ppidZEPERMZEACCES)selfargskwargserr)funr6r7wrapperKs z wrap_exceptions..wrapperr6)rrr6)rr7wrap_exceptionsFs rc@sheZdZdZddddgZddZdd Zd d Zed d Z eddZ eddZ e ddZ e ddZe ddZe ddZe ddZere ddZe d@dd Ze d!d"Ze d#d$Ze d%d&Ze d'd(Ze d)d*Ze d+d,Ze d-d.Ze d/d0Ze d1d2ZeZe d3d4Zd5d6Z e d7d8Z!e d9d:Z"e dAdd?Z$d;S)BProcessz1Wrapper class around underlying C implementation.rrrr _procfs_pathcCs||_d|_d|_t|_dS)N)rrrrr8r)rrrr6r6r7__init__fszProcess.__init__cCs"|jj|jj|jjdS)N)_proc_name_and_argsZcache_activate_proc_basic_info _proc_cred)rr6r6r7 oneshot_enterls  zProcess.oneshot_entercCs"|jj|jj|jjdS)N)rZcache_deactivaterr)rr6r6r7 oneshot_exitqs  zProcess.oneshot_exitcCstj|j|jS)N)r:Zproc_name_and_argsrrr)rr6r6r7rvszProcess._proc_name_and_argscCstj|j|jS)N)r:Zproc_basic_inforrr)rr6r6r7rzszProcess._proc_basic_infocCstj|j|jS)N)r:Z proc_credrrr)rr6r6r7r~szProcess._proc_credcCs |jdkrdS|jdjdS)NrZswapper)rrrrstrip)rr6r6r7r|s z Process.namecCs|jd}tjj|krttjj|s>tjjtjj|j|}tjj|rhtjj|rhtj |tj rh|Stjj |}xLtj dj dD]8}tjjtjj||}tjj|rtj |tj r|SqWdS)NrPATH:r\)cmdlinerFr0sepisabsabspathrfcwdisfileaccessX_OKbasenameenvironsplit)rexer0Z possible_exer6r6r7rs       z Process.execCs|jdjdS)Nrr3)rr)rr6r6r7rszProcess.cmdlinecCs|jtdS)Nr!)r proc_info_map)rr6r6r7r!szProcess.create_timecCs|jtdS)Nr#)rr)rr6r6r7r#szProcess.num_threadscCsZtj|j}g}x*|D]"\}}}tj|||}|j|qW|sVtjd|j|jf|S)Nz%s/%s) r:rrrrZpthreadr_rFstatr)rroraZ thread_idutimeZstimercr6r6r7threadss zProcess.threadsinetcCs,t||jd}|s(tjd|j|jf|S)N)rmz%s/%s)rgrrrFrr)rrlrCr6r6r7 connectionsszProcess.connectionscCs tj|jS)N) cext_posix getpriorityrr)rr6r6r7nice_getszProcess.nice_getcCstj|j|S)N)r setpriorityrr)rvaluer6r6r7nice_setszProcess.nice_setcCs|jtd|_|jS)Nr)rrr)rr6r6r7rsz Process.ppidcCs"|j\}}}}}}tj|||S)N)rrpuids)rreal effectivesaved_r6r6r7uidssz Process.uidscCs"|j\}}}}}}tj|||S)N)rrr)rrrrrr6r6r7gidssz Process.gidscCstj|j|j}tj|S)N)r:Zproc_cpu_timesrrrrZ pcputimes)rrDr6r6r7rDszProcess.cpu_timescCsP|jtd}|d@d?|d@B}x&tjdD]}tj|j|kr0|Sq0WdS)Nr%liz /dev/**/*)rrglobrFrst_rdev)rZttydevZdevr6r6r7terminals zProcess.terminalcCsr|j}ytjd||jf}|jdStk rl}z,|jtjkrZtjd||jfdSWYdd}~XnXdS)Nz %s/%s/cwd/z%s/%s) rrFreadlinkrrrOSErrorrrr)rZ procfs_pathresultrr6r6r7rs  z Process.cwdcCs2|j}|tdd}|tdd}t||S)Nrir )rrr&)rrCrr r6r6r7 memory_infoszProcess.memory_infocCs|jtd}tj|dS)Nr$?)rr PROC_STATUSESrz)rcoder6r6r7r$szProcess.statuscCstjddt|jgtjtjd}|j\}}trFdd||fD\}}d|jkr`t|j|j t j d|}g}xR|D]J\}}|j }|j dr|d d}|jd krqv|jtj|t|qvW|S) Nz/usr/bin/procfilesz-n)rKrLcSsg|]}|jtjjqSr6)rMr4rKrN)r>r?r6r6r7r@sz&Process.open_files..zno such processz(\d+): S_IFREG.*\s*.*name:(.*) z//rzcannot be retrieved)rOrPrrrrQrRrlowerrrrvfindallrU startswithr_rZ popenfilerx)rrYrKrLZ procfilesrarqr0r6r6r7 open_filess$      zProcess.open_filescCs(|jdkrdSttjd|j|jfS)Nrz%s/%s/fd)rrrWrFrr)rr6r6r7num_fds$s zProcess.num_fdscCstjtj|jS)N)rZpctxswr:Zproc_num_ctx_switchesrr)rr6r6r7num_ctx_switches*szProcess.num_ctx_switchesNcCstj|j||jS)N)rZwait_pidrrr)rZtimeoutr6r6r7wait/sz Process.waitc CsXytj|j\}}}}Wn.tk rFt|js@t|j|jYnXtj||||S)N) r:Zproc_io_countersrrrrrrrZpio)rZrcZwcrbwbr6r6r7 io_counters3s zProcess.io_counters)r)N)%__name__ __module__ __qualname____doc__ __slots__rrrr rrrrr|rrr!r# HAS_THREADSrrrrrrrrDrrrZmemory_full_infor$rrrrrr6r6r6r7rasD                     r)Fre)re)irrrrFrvrOr4 collectionsrZsocketrr\rrrr:rrr r r r r rrrZ_compatr _exceptionsrrrZ__extra__all__hasattrrrGZ PAGE_SIZEZAF_LINKZSIDLZ STATUS_IDLEZSZOMBZ STATUS_ZOMBIEZSACTIVEZSTATUS_RUNNINGZSSWAPZSSTOPZSTATUS_STOPPEDrZTCPS_ESTABLISHEDZCONN_ESTABLISHEDZ TCPS_SYN_SENTZ CONN_SYN_SENTZ TCPS_SYN_RCVDZ CONN_SYN_RECVZTCPS_FIN_WAIT_1ZCONN_FIN_WAIT1ZTCPS_FIN_WAIT_2ZCONN_FIN_WAIT2ZTCPS_TIME_WAITZCONN_TIME_WAITZ TCPS_CLOSEDZ CONN_CLOSEZTCPS_CLOSE_WAITZCONN_CLOSE_WAITZ TCPS_LAST_ACKZ CONN_LAST_ACKZ TCPS_LISTENZ CONN_LISTENZ TCPS_CLOSINGZ CONN_CLOSINGZPSUTIL_CONN_NONEZ CONN_NONEridictrr&Zpfullmemr'r*r/rf_fieldsr2r8r;r<rDrArIrZr[Zdisk_io_countersr^r]rtZnet_io_countersrgrur}rrrrobjectrr6r6r6r7s                             !$