Current File : /home/mmdealscpanel/yummmdeals.com/iotop.tar
__init__.py000064400000000000150351355630006651 0ustar00data.py000064400000036132150351355630006042 0ustar00# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
#
# See the COPYING file for license information.
#
# Copyright (c) 2007 Guillaume Chazarain <guichaz@gmail.com>

# Allow printing with same syntax in Python 2/3
from __future__ import print_function

import errno
import os
import pprint
import pwd
import stat
import struct
import sys
import time
from procfs import cmdline

#
# Check for requirements:
#   o Linux >= 2.6.20 with I/O accounting and VM event counters
#
ioaccounting = os.path.exists('/proc/self/io')

try:
    from iotop.vmstat import VmStat
    vmstat_f = VmStat()
except:
    vm_event_counters = False
else:
    vm_event_counters = True

if not ioaccounting or not vm_event_counters:
    print('Could not run iotop as some of the requirements are not met:')
    print('- Linux >= 2.6.20 with')
    if not ioaccounting:
        print('  - I/O accounting support ' \
          '(CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, ' \
          'CONFIG_TASK_IO_ACCOUNTING, kernel.task_delayacct sysctl)')
    if not vm_event_counters:
        print('  - VM event counters (CONFIG_VM_EVENT_COUNTERS)')
    sys.exit(1)

from iotop import ioprio, vmstat
from iotop.netlink import Connection, NETLINK_GENERIC, U32Attr, NLM_F_REQUEST
from iotop.genetlink import Controller, GeNlMessage

class DumpableObject(object):
    """Base class for all objects that allows easy introspection when printed"""
    def __repr__(self):
        return '%s: %s>' % (str(type(self))[:-1], pprint.pformat(self.__dict__))


#
# Interesting fields in a taskstats output
#

class Stats(DumpableObject):
    members_offsets = [
        ('blkio_delay_total', 40),
        ('swapin_delay_total', 56),
        ('read_bytes', 248),
        ('write_bytes', 256),
        ('cancelled_write_bytes', 264)
    ]

    has_blkio_delay_total = None

    def __init__(self, task_stats_buffer):
        sd = self.__dict__
        for name, offset in Stats.members_offsets:
            data = task_stats_buffer[offset:offset + 8]
            sd[name] = struct.unpack('Q', data)[0]

        # This is a heuristic to detect if CONFIG_TASK_DELAY_ACCT is enabled in
        # the kernel.
        if not Stats.has_blkio_delay_total:
            Stats.has_blkio_delay_total = sysctl_task_delayacct()

    def accumulate(self, other_stats, destination, coeff=1):
        """Update destination from operator(self, other_stats)"""
        dd = destination.__dict__
        sd = self.__dict__
        od = other_stats.__dict__
        for member, offset in Stats.members_offsets:
            dd[member] = sd[member] + coeff * od[member]

    def delta(self, other_stats, destination):
        """Update destination with self - other_stats"""
        return self.accumulate(other_stats, destination, coeff=-1)

    def is_all_zero(self):
        sd = self.__dict__
        for name, offset in Stats.members_offsets:
            if sd[name] != 0:
                return False
        return True

    @staticmethod
    def build_all_zero():
        stats = Stats.__new__(Stats)
        std = stats.__dict__
        for name, offset in Stats.members_offsets:
            std[name] = 0
        return stats

#
# Netlink usage for taskstats
#

TASKSTATS_CMD_GET = 1
TASKSTATS_CMD_ATTR_PID = 1
TASKSTATS_TYPE_AGGR_PID = 4
TASKSTATS_TYPE_PID = 1
TASKSTATS_TYPE_STATS = 3

class TaskStatsNetlink(object):
    # Keep in sync with format_stats() and pinfo.did_some_io()

    def __init__(self, options):
        self.options = options
        self.connection = Connection(NETLINK_GENERIC)
        controller = Controller(self.connection)
        self.family_id = controller.get_family_id('TASKSTATS')

    def build_request(self, tid):
        return GeNlMessage(self.family_id, cmd=TASKSTATS_CMD_GET,
                           attrs=[U32Attr(TASKSTATS_CMD_ATTR_PID, tid)],
                           flags=NLM_F_REQUEST)

    def get_single_task_stats(self, thread):
        thread.task_stats_request.send(self.connection)
        try:
            reply = GeNlMessage.recv(self.connection)
        except OSError as e:
            if e.errno == errno.ESRCH:
                # OSError: Netlink error: No such process (3)
                return
            raise
        for attr_type, attr_value in reply.attrs.items():
            if attr_type == TASKSTATS_TYPE_AGGR_PID:
                reply = attr_value.nested()
                break
        else:
            return
        taskstats_data = reply[TASKSTATS_TYPE_STATS].data
        if len(taskstats_data) < 272:
            # Short reply
            return
        taskstats_version = struct.unpack('H', taskstats_data[:2])[0]
        assert taskstats_version >= 4
        return Stats(taskstats_data)

#
# PIDs manipulations
#

def find_uids(options):
    """Build options.uids from options.users by resolving usernames to UIDs"""
    options.uids = []
    error = False
    for u in options.users or []:
        try:
            uid = int(u)
        except ValueError:
            try:
                passwd = pwd.getpwnam(u)
            except KeyError:
                print('Unknown user:', u, file=sys.stderr)
                error = True
            else:
                uid = passwd.pw_uid
        if not error:
            options.uids.append(uid)
    if error:
        sys.exit(1)


def parse_proc_pid_status(pid):
    result_dict = {}
    try:
        for line in open('/proc/%d/status' % pid):
            key, value = line.split(':\t', 1)
            result_dict[key] = value.strip()
    except IOError:
        pass  # No such process
    return result_dict


def safe_utf8_decode(s):
    try:
        return s.decode('utf-8')
    except UnicodeDecodeError:
        return s.encode('string_escape')
    except AttributeError:
        return s

class ThreadInfo(DumpableObject):
    """Stats for a single thread"""
    def __init__(self, tid, taskstats_connection):
        self.tid = tid
        self.mark = True
        self.stats_total = None
        self.stats_delta = Stats.__new__(Stats)
        self.task_stats_request = taskstats_connection.build_request(tid)

    def get_ioprio(self):
        return ioprio.get(self.tid)

    def set_ioprio(self, ioprio_class, ioprio_data):
        return ioprio.set_ioprio(ioprio.IOPRIO_WHO_PROCESS, self.tid,
                                 ioprio_class, ioprio_data)

    def update_stats(self, stats):
        if not self.stats_total:
            self.stats_total = stats
        stats.delta(self.stats_total, self.stats_delta)
        self.stats_total = stats


class ProcessInfo(DumpableObject):
    """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."""
    def __init__(self, pid):
        self.pid = pid
        self.uid = None
        self.user = None
        self.threads = {} # {tid: ThreadInfo}
        self.stats_delta = Stats.build_all_zero()
        self.stats_accum = Stats.build_all_zero()
        self.stats_accum_timestamp = time.time()

    def is_monitored(self, options):
        if (options.pids and not options.processes and
            self.pid not in options.pids):
            # We only monitor some threads, not this one
            return False

        if options.uids and self.get_uid() not in options.uids:
            # We only monitor some users, not this one
            return False

        return True

    def get_uid(self):
        if self.uid:
            return self.uid
        # uid in (None, 0) means either we don't know the UID yet or the process
        # runs as root so it can change its UID. In both cases it means we have
        # to find out its current UID.
        try:
            uid = os.stat('/proc/%d' % self.pid)[stat.ST_UID]
        except OSError:
            # The process disappeared
            uid = None
        if uid != self.uid:
            # Maybe the process called setuid()
            self.user = None
            self.uid = uid
        return uid

    def get_user(self):
        uid = self.get_uid()
        if uid is not None and not self.user:
            try:
                self.user = safe_utf8_decode(pwd.getpwuid(uid).pw_name)
            except (KeyError, AttributeError):
                self.user = str(uid)
        return self.user or '{none}'

    def get_cmdline(self):
        # A process may exec, so we must always reread its cmdline
        try:
            proc_cmdline = open('/proc/%d/cmdline' % self.pid)
            cmdline = proc_cmdline.read(4096)
        except IOError:
            return '{no such process}'
        proc_status = parse_proc_pid_status(self.pid)
        if not cmdline:
            # Probably a kernel thread, get its name from /proc/PID/status
            proc_status_name = proc_status.get('Name', '')
            if proc_status_name:
                proc_status_name = '[%s]' % proc_status_name
            else:
                proc_status_name = '{no name}'
            return proc_status_name
        suffix = ''
        tgid = int(proc_status.get('Tgid', self.pid))
        if tgid != self.pid:
            # Not the main thread, maybe it has a custom name
            tgid_name = parse_proc_pid_status(tgid).get('Name', '')
            thread_name = proc_status.get('Name', '')
            if thread_name != tgid_name:
                suffix += ' [%s]' % thread_name
        parts = cmdline.split('\0')
        if parts[0].startswith('/'):
            first_command_char = parts[0].rfind('/') + 1
            parts[0] = parts[0][first_command_char:]
        cmdline = ' '.join(parts).strip()
        return safe_utf8_decode(cmdline + suffix)

    def did_some_io(self, accumulated):
        if accumulated:
            return not self.stats_accum.is_all_zero()
        for t in self.threads.values():
            if not t.stats_delta.is_all_zero():
                return True
        return False

    def get_ioprio(self):
        priorities = set(t.get_ioprio() for t in self.threads.values())
        if len(priorities) == 1:
            return priorities.pop()
        return '?dif'

    def set_ioprio(self, ioprio_class, ioprio_data):
        for thread in self.threads.values():
            thread.set_ioprio(ioprio_class, ioprio_data)

    def ioprio_sort_key(self):
        return ioprio.sort_key(self.get_ioprio())

    def get_thread(self, tid, taskstats_connection):
        thread = self.threads.get(tid, None)
        if not thread:
            thread = ThreadInfo(tid, taskstats_connection)
            self.threads[tid] = thread
        return thread

    def update_stats(self):
        stats_delta = Stats.build_all_zero()
        for tid, thread in self.threads.items():
            if not thread.mark:
                stats_delta.accumulate(thread.stats_delta, stats_delta)
        self.threads = dict([(tid, thread) for tid, thread in
                             self.threads.items() if not thread.mark])

        nr_threads = len(self.threads)
        if not nr_threads:
            return False

        stats_delta.blkio_delay_total /= nr_threads
        stats_delta.swapin_delay_total /= nr_threads

        self.stats_delta = stats_delta
        self.stats_accum.accumulate(self.stats_delta, self.stats_accum)

        return True

class ProcessList(DumpableObject):
    def __init__(self, taskstats_connection, options):
        # {pid: ProcessInfo}
        self.processes = {}
        self.taskstats_connection = taskstats_connection
        self.options = options
        self.timestamp = time.time()
        self.vmstat = vmstat.VmStat()

        # A first time as we are interested in the delta
        self.update_process_counts()

    def get_process(self, pid):
        """Either get the specified PID from self.processes or build a new
        ProcessInfo if we see this PID for the first time"""
        process = self.processes.get(pid, None)
        if not process:
            process = ProcessInfo(pid)
            self.processes[pid] = process

        if process.is_monitored(self.options):
            return process

    def list_tgids(self):
        if self.options.pids:
            return self.options.pids

        tgids = os.listdir('/proc')
        if self.options.processes:
            return [int(tgid) for tgid in tgids if '0' <= tgid[0] <= '9']

        tids = []
        for tgid in tgids:
            if '0' <= tgid[0] <= '9':
                try:
                    tids.extend(map(int, os.listdir('/proc/' + tgid + '/task')))
                except OSError:
                    # The PID went away
                    pass
        return tids

    def list_tids(self, tgid):
        if not self.options.processes:
            return [tgid]

        try:
            tids = list(map(int, os.listdir('/proc/%d/task' % tgid)))
        except OSError:
            return []

        if self.options.pids:
            tids = list(set(self.options.pids).intersection(set(tids)))

        return tids

    def update_process_counts(self):
        new_timestamp = time.time()
        self.duration = new_timestamp - self.timestamp
        self.timestamp = new_timestamp

        total_read = total_write = 0

        for tgid in self.list_tgids():
            process = self.get_process(tgid)
            if not process:
                continue
            for tid in self.list_tids(tgid):
                thread = process.get_thread(tid, self.taskstats_connection)
                stats = self.taskstats_connection.get_single_task_stats(thread)
                if stats:
                    thread.update_stats(stats)
                    delta = thread.stats_delta
                    total_read += delta.read_bytes
                    total_write += delta.write_bytes
                    thread.mark = False
        return (total_read, total_write), self.vmstat.delta()

    def refresh_processes(self):
        for process in self.processes.values():
            for thread in process.threads.values():
                thread.mark = True

        total_read_and_write = self.update_process_counts()

        self.processes = dict([(pid, process) for pid, process in
                               self.processes.items() if
                               process.update_stats()])

        return total_read_and_write

    def clear(self):
        self.processes = {}


def sysctl_task_delayacct():
    """ WAS:
    try:
        with open('/proc/sys/kernel/task_delayacct') as f:
            return bool(int(f.read().strip()))
    except FileNotFoundError:
        return None


    Because /proc/sys/kernel/task_delayacct doesn't exist on RHEL8,
    it always returns None, which is equivalent to False in the end.

    On RHEL8, delayacct_on kernel variable is enabled by default
    """
    return 'nodelayacct' not in cmdline().keys()
genetlink.py000064400000003774150351355630007117 0ustar00'''
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
'''

import struct
from iotop.netlink import NLM_F_REQUEST, NLMSG_MIN_TYPE, Message, parse_attributes
from iotop.netlink import NulStrAttr, Connection, NETLINK_GENERIC

CTRL_CMD_UNSPEC       = 0
CTRL_CMD_NEWFAMILY    = 1
CTRL_CMD_DELFAMILY    = 2
CTRL_CMD_GETFAMILY    = 3
CTRL_CMD_NEWOPS       = 4
CTRL_CMD_DELOPS       = 5
CTRL_CMD_GETOPS       = 6

CTRL_ATTR_UNSPEC      = 0
CTRL_ATTR_FAMILY_ID   = 1
CTRL_ATTR_FAMILY_NAME = 2
CTRL_ATTR_VERSION     = 3
CTRL_ATTR_HDRSIZE     = 4
CTRL_ATTR_MAXATTR     = 5
CTRL_ATTR_OPS         = 6

class GenlHdr:
    def __init__(self, cmd, version = 0):
        self.cmd = cmd
        self.version = version
    def _dump(self):
        return struct.pack("BBxx", self.cmd, self.version)

def _genl_hdr_parse(data):
    return GenlHdr(*struct.unpack("BBxx", data))

GENL_ID_CTRL        = NLMSG_MIN_TYPE

class GeNlMessage(Message):
    def __init__(self, family, cmd, attrs=[], flags=0):
        self.cmd = cmd
        self.attrs = attrs
        self.family = family
        Message.__init__(self, family, flags=flags,
                         payload=[GenlHdr(self.cmd)]+attrs)

    @staticmethod
    def recv(conn):
        msg = conn.recv()
        packet = msg.payload
        hdr = _genl_hdr_parse(packet[:4])

        genlmsg = GeNlMessage(msg.type, hdr.cmd, [], msg.flags)
        genlmsg.attrs = parse_attributes(packet[4:])
        genlmsg.version = hdr.version

        return genlmsg

class Controller:
    def __init__(self, conn):
        self.conn = conn
    def get_family_id(self, family):
        a = NulStrAttr(CTRL_ATTR_FAMILY_NAME, family)
        m = GeNlMessage(GENL_ID_CTRL, CTRL_CMD_GETFAMILY,
                        flags=NLM_F_REQUEST, attrs=[a])
        m.send(self.conn)
        m = GeNlMessage.recv(self.conn)
        return m.attrs[CTRL_ATTR_FAMILY_ID].u16()

connection = Connection(NETLINK_GENERIC)
controller = Controller(connection)
__pycache__/genetlink.cpython-36.opt-1.pyc000064400000005263150351355630014335 0ustar003

B��Q��@s�dZddlZddlmZmZmZmZddlmZmZm	Z	dZ
dZdZdZ
dZd	Zd
ZdZdZdZdZdZd	Zd
ZGdd�d�Zd
d�ZeZGdd�de�ZGdd�d�Zee	�Zee�ZdS)z�
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
�N)�
NLM_F_REQUEST�NLMSG_MIN_TYPE�Message�parse_attributes)�
NulStrAttr�
Connection�NETLINK_GENERIC������c@seZdZddd�Zdd�ZdS)�GenlHdrrcCs||_||_dS)N)�cmd�version)�selfrr�r�/usr/lib/python3.6/genetlink.py�__init__szGenlHdr.__init__cCstjd|j|j�S)N�BBxx)�struct�packrr)rrrr�_dump!sz
GenlHdr._dumpN)r)�__name__�
__module__�__qualname__rrrrrrrs
rcCsttjd|��S)Nr)rr�unpack)�datarrr�_genl_hdr_parse$src@s&eZdZgdfdd�Zedd��ZdS)�GeNlMessagercCs4||_||_||_tj|||t|j�g|d�dS)N)�flags�payload)r�attrs�familyrrr)rr$rr#r!rrrr*s

zGeNlMessage.__init__cCsP|j�}|j}t|dd��}t|j|jg|j�}t|dd��|_|j	|_	|S)Nr)
�recvr"rr �typerr!rr#r)�conn�msgZpacketZhdrZgenlmsgrrrr%1szGeNlMessage.recvN)rrrr�staticmethodr%rrrrr )sr c@seZdZdd�Zdd�ZdS)�
ControllercCs
||_dS)N)r')rr'rrrr>szController.__init__cCsBtt|�}tttt|gd�}|j|j�tj|j�}|j	t
j�S)N)r!r#)r�CTRL_ATTR_FAMILY_NAMEr �GENL_ID_CTRL�CTRL_CMD_GETFAMILYr�sendr'r%r#�CTRL_ATTR_FAMILY_ID�u16)rr$�a�mrrr�
get_family_id@s
zController.get_family_idN)rrrrr3rrrrr*=sr*)�__doc__rZ
iotop.netlinkrrrrrrrZCTRL_CMD_UNSPECZCTRL_CMD_NEWFAMILYZCTRL_CMD_DELFAMILYr-ZCTRL_CMD_NEWOPSZCTRL_CMD_DELOPSZCTRL_CMD_GETOPSZCTRL_ATTR_UNSPECr/r+ZCTRL_ATTR_VERSIONZCTRL_ATTR_HDRSIZEZCTRL_ATTR_MAXATTRZ
CTRL_ATTR_OPSrrr,r r*Z
connectionZ
controllerrrrr�<module>s0__pycache__/data.cpython-36.pyc000064400000032206150351355630012324 0ustar003

�bfZ<�
@s�ddlmZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZejj
d�ZyddlmZe�ZWndZYnXdZes�er�ed�ed	�es�ed
�es�ed�ejd�dd
lmZmZddlmZmZmZmZddlmZmZGdd�de �Z!Gdd�de!�Z"dZ#dZ$dZ%dZ&dZ'Gdd�de �Z(dd�Z)dd�Z*dd�Z+Gdd�de!�Z,Gd d!�d!e!�Z-Gd"d#�d#e!�Z.d$d%�Z/dS)&�)�print_functionN)�cmdlinez
/proc/self/io)�VmStatFTz<Could not run iotop as some of the requirements are not met:z- Linux >= 2.6.20 withz~  - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING, kernel.task_delayacct sysctl)z0  - VM event counters (CONFIG_VM_EVENT_COUNTERS)�)�ioprio�vmstat)�
Connection�NETLINK_GENERIC�U32Attr�
NLM_F_REQUEST)�
Controller�GeNlMessagec@seZdZdZdd�ZdS)�DumpableObjectzFBase class for all objects that allows easy introspection when printedcCs$dtt|��dd�tj|j�fS)Nz%s: %s>r���)�str�type�pprintZpformat�__dict__)�self�r�/usr/lib/python3.6/data.py�__repr__?szDumpableObject.__repr__N)�__name__�
__module__�__qualname__�__doc__rrrrrr=src@sLeZdZdddddgZdZdd
�Zddd�Zdd�Zdd�Ze	dd��Z
dS)�Stats�blkio_delay_total�(�swapin_delay_total�8�
read_bytes��write_bytes��cancelled_write_bytes�NcCsP|j}x6tjD],\}}|||d�}tjd|�d||<qWtjsLt�t_dS)N��Qr)rr�members_offsets�struct�unpack�has_blkio_delay_total�sysctl_task_delayacct)rZtask_stats_buffer�sd�name�offset�datarrr�__init__RszStats.__init__rc	CsB|j}|j}|j}x*tjD] \}}|||||||<qWdS)z3Update destination from operator(self, other_stats)N)rrr))	r�other_stats�destination�coeffZddr.Zod�memberr0rrr�
accumulate]s
zStats.accumulatecCs|j||dd�S)z*Update destination with self - other_statsr)r5r)r7)rr3r4rrr�deltaeszStats.deltacCs.|j}x"tjD]\}}||dkrdSqWdS)NrFT)rrr))rr.r/r0rrr�is_all_zerois
zStats.is_all_zerocCs0tjt�}|j}xtjD]\}}d||<qW|S)Nr)r�__new__rr))�statsZstdr/r0rrr�build_all_zerops

zStats.build_all_zero)rr)rr )r!r")r#r$)r%r&)r)rrrr)r,r2r7r8r9�staticmethodr<rrrrrGs
r��c@s$eZdZdd�Zdd�Zdd�ZdS)�TaskStatsNetlinkcCs*||_tt�|_t|j�}|jd�|_dS)NZ	TASKSTATS)�optionsrr	�
connectionrZ
get_family_id�	family_id)rrAZ
controllerrrrr2�s

zTaskStatsNetlink.__init__cCst|jttt|�gtd�S)N)�cmd�attrs�flags)r
rC�TASKSTATS_CMD_GETr
�TASKSTATS_CMD_ATTR_PIDr)r�tidrrr�
build_request�s
zTaskStatsNetlink.build_requestcCs�|jj|j�ytj|j�}Wn4tk
rR}z|jtjkr@dS�WYdd}~XnXx,|jj	�D]\}}|t
kr`|j�}Pq`WdS|tj
}t|�dkr�dStjd|dd��d}|dks�t�t|�S)Ni�H�rr>)�task_stats_request�sendrBr
Zrecv�OSError�errnoZESRCHrE�items�TASKSTATS_TYPE_AGGR_PID�nested�TASKSTATS_TYPE_STATSr1�lenr*r+�AssertionErrorr)r�threadZreply�eZ	attr_typeZ
attr_valueZtaskstats_dataZtaskstats_versionrrr�get_single_task_stats�s$
z&TaskStatsNetlink.get_single_task_statsN)rrrr2rJrYrrrrr@�sr@cCs�g|_d}x�|jpgD]t}yt|�}WnRtk
rxytj|�}Wn(tk
rltd|tj	d�d}YnX|j
}YnX|s|jj|�qW|r�tj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)rA�error�u�uidZpasswdrrr�	find_uids�s 
ricCsTi}y6x0td|�D] }|jdd�\}}|j�||<qWWntk
rNYnX|S)Nz/proc/%d/statusz:	r)�open�split�strip�IOError)�pidZresult_dict�line�key�valuerrr�parse_proc_pid_status�srrcCs<y
|jd�Stk
r$|jd�Stk
r6|SXdS)Nzutf-8Z
string_escape)�decode�UnicodeDecodeError�encode�AttributeError)�srrr�safe_utf8_decode�s

rxc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
ThreadInfozStats for a single threadcCs.||_d|_d|_tjt�|_|j|�|_dS)NT)rI�mark�stats_totalrr:�stats_deltarJrM)rrI�taskstats_connectionrrrr2�s
zThreadInfo.__init__cCstj|j�S)N)r�getrI)rrrr�
get_ioprio�szThreadInfo.get_iopriocCstjtj|j||�S)N)r�
set_ioprioZIOPRIO_WHO_PROCESSrI)r�ioprio_class�ioprio_datarrrr��szThreadInfo.set_iopriocCs&|js||_|j|j|j�||_dS)N)r{r8r|)rr;rrr�update_stats�szThreadInfo.update_statsN)rrrrr2rr�r�rrrrry�s
ryc@sheZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�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|_tj�|_tj�|_tj�|_	dS)N)
rnrh�user�threadsrr<r|�stats_accum�timeZstats_accum_timestamp)rrnrrrr2�s

zProcessInfo.__init__cCs:|jr|jr|j|jkrdS|jr6|j�|jkr6dSdS)NFT)�pids�	processesrnr[�get_uid)rrArrr�is_monitored�szProcessInfo.is_monitoredcCsZ|jr|jSytjd|j�tj}Wntk
r>d}YnX||jkrVd|_||_|S)Nz/proc/%d)rh�os�statrn�ST_UIDrOr�)rrhrrrr�s

zProcessInfo.get_uidcCs\|j�}|dk	rR|jrRyttj|�j�|_Wn"ttfk
rPt|�|_YnX|jpZdS)Nz{none})	r�r�rxr^�getpwuidZpw_namer`rvr)rrhrrr�get_userszProcessInfo.get_usercCs
ytd|j�}|jd�}Wntk
r0dSXt|j�}|sb|jdd�}|rZd|}nd}|Sd}t|jd|j��}||jkr�t|�jdd�}|jdd�}||kr�|d	|7}|jd
�}	|	djd�r�|	dj	d�d
}
|	d|
d�|	d<dj
|	�j�}t||�S)Nz/proc/%d/cmdlineiz{no such process}�Name�z[%s]z	{no name}ZTgidz [%s]�r�/r� )
rjrn�readrmrrr~r\rk�
startswith�rfind�joinrlrx)rZproc_cmdlinerZproc_statusZproc_status_name�suffix�tgidZ	tgid_nameZthread_name�partsZfirst_command_charrrr�get_cmdlines2



zProcessInfo.get_cmdlinecCs6|r|jj�Sx |jj�D]}|jj�sdSqWdS)NTF)r�r9r��valuesr|)rZaccumulated�trrr�did_some_io<s
zProcessInfo.did_some_iocCs0tdd�|jj�D��}t|�dkr,|j�SdS)Ncss|]}|j�VqdS)N)r)�.0r�rrr�	<genexpr>Esz)ProcessInfo.get_ioprio.<locals>.<genexpr>rz?dif)�setr�r�rU�pop)rZ
prioritiesrrrrDszProcessInfo.get_iopriocCs$x|jj�D]}|j||�qWdS)N)r�r�r�)rr�r�rWrrrr�JszProcessInfo.set_iopriocCstj|j��S)N)rZsort_keyr)rrrr�ioprio_sort_keyNszProcessInfo.ioprio_sort_keycCs*|jj|d�}|s&t||�}||j|<|S)N)r�r~ry)rrIr}rWrrr�
get_threadQs


zProcessInfo.get_threadcCs�tj�}x*|jj�D]\}}|js|j|j|�qWtdd�|jj�D��|_t|j�}|s`dS|j	|_	|j
|_
||_|jj|j|j�dS)NcSsg|]\}}|js||f�qSr)rz)r�rIrWrrr�
<listcomp>]sz,ProcessInfo.update_stats.<locals>.<listcomp>FT)rr<r�rQrzr7r|�dictrUrrr�)rr|rIrWZ
nr_threadsrrrr�Xs
zProcessInfo.update_statsN)rrrrr2r�r�r�r�r�rr�r�r�r�rrrrr��s		r�c@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�ProcessListcCs2i|_||_||_tj�|_tj�|_|j�dS)N)r�r}rAr��	timestamprr�update_process_counts)rr}rArrrr2ms

zProcessList.__init__cCs8|jj|d�}|s$t|�}||j|<|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)r�r~r�r�rA)rrn�processrrr�get_processxs
zProcessList.get_processc
Cs�|jjr|jjStjd�}|jjr0dd�|D�Sg}x`|D]X}d|dkoTdknr:y"|jtttjd|d���Wq:tk
r�Yq:Xq:W|S)	Nz/proccSs0g|](}d|dkodknrt|��qS)�0r�9)r\)r�r�rrrr��sz*ProcessList.list_tgids.<locals>.<listcomp>r�rr�z/proc/z/task)	rAr�r��listdirr��extend�mapr\rO)rZtgids�tidsr�rrr�
list_tgids�s

"
zProcessList.list_tgidscCsf|jjs|gSyttttjd|���}Wntk
r>gSX|jjrbtt	|jj�j
t	|���}|S)Nz
/proc/%d/task)rAr��listr�r\r�r�rOr�r��intersection)rr�r�rrr�	list_tids�szProcessList.list_tidsc
Cs�tj�}||j|_||_d}}x||j�D]p}|j|�}|s@q,xZ|j|�D]L}|j||j�}|jj|�}|rL|j	|�|j
}	||	j7}||	j7}d|_
qLWq,W||f|jj�fS)NrF)r�r�Zdurationr�r�r�r�r}rYr�r|r!r#rzrr8)
rZ
new_timestampZ
total_readZtotal_writer�r�rIrWr;r8rrrr��s$



z!ProcessList.update_process_countscCsTx,|jj�D]}x|jj�D]
}d|_qWqW|j�}tdd�|jj�D��|_|S)NTcSs g|]\}}|j�r||f�qSr)r�)r�rnr�rrrr��sz1ProcessList.refresh_processes.<locals>.<listcomp>)r�r�r�rzr�r�rQ)rr�rWZtotal_read_and_writerrr�refresh_processes�szProcessList.refresh_processescCs
i|_dS)N)r�)rrrr�clear�szProcessList.clearN)
rrrr2r�r�r�r�r�r�rrrrr�ls
r�cCsdt�j�kS)a| WAS:
    try:
        with open('/proc/sys/kernel/task_delayacct') as f:
            return bool(int(f.read().strip()))
    except FileNotFoundError:
        return None


    Because /proc/sys/kernel/task_delayacct doesn't exist on RHEL8,
    it always returns None, which is equivalent to False in the end.

    On RHEL8, delayacct_on kernel variable is enabled by default
    Znodelayacct)r�keysrrrrr-�sr-)0Z
__future__rrPr�rr^r�r*rbr�Zprocfsr�path�existsZioaccountingZiotop.vmstatrZvmstat_fZvm_event_countersrareZiotoprrZ
iotop.netlinkrr	r
rZiotop.genetlinkrr
�objectrrrGrHrRZTASKSTATS_TYPE_PIDrTr@rirrrxryr�r�r-rrrr�<module>sV



5)^__pycache__/data.cpython-36.opt-1.pyc000064400000032143150351355630013263 0ustar003

�bfZ<�
@s�ddlmZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZejj
d�ZyddlmZe�ZWndZYnXdZes�er�ed�ed	�es�ed
�es�ed�ejd�dd
lmZmZddlmZmZmZmZddlmZmZGdd�de �Z!Gdd�de!�Z"dZ#dZ$dZ%dZ&dZ'Gdd�de �Z(dd�Z)dd�Z*dd�Z+Gdd�de!�Z,Gd d!�d!e!�Z-Gd"d#�d#e!�Z.d$d%�Z/dS)&�)�print_functionN)�cmdlinez
/proc/self/io)�VmStatFTz<Could not run iotop as some of the requirements are not met:z- Linux >= 2.6.20 withz~  - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING, kernel.task_delayacct sysctl)z0  - VM event counters (CONFIG_VM_EVENT_COUNTERS)�)�ioprio�vmstat)�
Connection�NETLINK_GENERIC�U32Attr�
NLM_F_REQUEST)�
Controller�GeNlMessagec@seZdZdZdd�ZdS)�DumpableObjectzFBase class for all objects that allows easy introspection when printedcCs$dtt|��dd�tj|j�fS)Nz%s: %s>r���)�str�type�pprintZpformat�__dict__)�self�r�/usr/lib/python3.6/data.py�__repr__?szDumpableObject.__repr__N)�__name__�
__module__�__qualname__�__doc__rrrrrr=src@sLeZdZdddddgZdZdd
�Zddd�Zdd�Zdd�Ze	dd��Z
dS)�Stats�blkio_delay_total�(�swapin_delay_total�8�
read_bytes��write_bytes��cancelled_write_bytes�NcCsP|j}x6tjD],\}}|||d�}tjd|�d||<qWtjsLt�t_dS)N��Qr)rr�members_offsets�struct�unpack�has_blkio_delay_total�sysctl_task_delayacct)rZtask_stats_buffer�sd�name�offset�datarrr�__init__RszStats.__init__rc	CsB|j}|j}|j}x*tjD] \}}|||||||<qWdS)z3Update destination from operator(self, other_stats)N)rrr))	r�other_stats�destination�coeffZddr.Zod�memberr0rrr�
accumulate]s
zStats.accumulatecCs|j||dd�S)z*Update destination with self - other_statsr)r5r)r7)rr3r4rrr�deltaeszStats.deltacCs.|j}x"tjD]\}}||dkrdSqWdS)NrFT)rrr))rr.r/r0rrr�is_all_zerois
zStats.is_all_zerocCs0tjt�}|j}xtjD]\}}d||<qW|S)Nr)r�__new__rr))�statsZstdr/r0rrr�build_all_zerops

zStats.build_all_zero)rr)rr )r!r")r#r$)r%r&)r)rrrr)r,r2r7r8r9�staticmethodr<rrrrrGs
r��c@s$eZdZdd�Zdd�Zdd�ZdS)�TaskStatsNetlinkcCs*||_tt�|_t|j�}|jd�|_dS)NZ	TASKSTATS)�optionsrr	�
connectionrZ
get_family_id�	family_id)rrAZ
controllerrrrr2�s

zTaskStatsNetlink.__init__cCst|jttt|�gtd�S)N)�cmd�attrs�flags)r
rC�TASKSTATS_CMD_GETr
�TASKSTATS_CMD_ATTR_PIDr)r�tidrrr�
build_request�s
zTaskStatsNetlink.build_requestcCs�|jj|j�ytj|j�}Wn4tk
rR}z|jtjkr@dS�WYdd}~XnXx,|jj	�D]\}}|t
kr`|j�}Pq`WdS|tj
}t|�dkr�dStjd|dd��d}t|�S)Ni�H�r)�task_stats_request�sendrBr
Zrecv�OSError�errnoZESRCHrE�items�TASKSTATS_TYPE_AGGR_PID�nested�TASKSTATS_TYPE_STATSr1�lenr*r+r)r�threadZreply�eZ	attr_typeZ
attr_valueZtaskstats_dataZtaskstats_versionrrr�get_single_task_stats�s"
z&TaskStatsNetlink.get_single_task_statsN)rrrr2rJrXrrrrr@�sr@cCs�g|_d}x�|jpgD]t}yt|�}WnRtk
rxytj|�}Wn(tk
rltd|tj	d�d}YnX|j
}YnX|s|jj|�qW|r�tj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)rA�error�u�uidZpasswdrrr�	find_uids�s 
rhcCsTi}y6x0td|�D] }|jdd�\}}|j�||<qWWntk
rNYnX|S)Nz/proc/%d/statusz:	r)�open�split�strip�IOError)�pidZresult_dict�line�key�valuerrr�parse_proc_pid_status�srqcCs<y
|jd�Stk
r$|jd�Stk
r6|SXdS)Nzutf-8Z
string_escape)�decode�UnicodeDecodeError�encode�AttributeError)�srrr�safe_utf8_decode�s

rwc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
ThreadInfozStats for a single threadcCs.||_d|_d|_tjt�|_|j|�|_dS)NT)rI�mark�stats_totalrr:�stats_deltarJrM)rrI�taskstats_connectionrrrr2�s
zThreadInfo.__init__cCstj|j�S)N)r�getrI)rrrr�
get_ioprio�szThreadInfo.get_iopriocCstjtj|j||�S)N)r�
set_ioprioZIOPRIO_WHO_PROCESSrI)r�ioprio_class�ioprio_datarrrr�szThreadInfo.set_iopriocCs&|js||_|j|j|j�||_dS)N)rzr8r{)rr;rrr�update_stats�szThreadInfo.update_statsN)rrrrr2r~rr�rrrrrx�s
rxc@sheZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�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|_tj�|_tj�|_tj�|_	dS)N)
rmrg�user�threadsrr<r{�stats_accum�timeZstats_accum_timestamp)rrmrrrr2�s

zProcessInfo.__init__cCs:|jr|jr|j|jkrdS|jr6|j�|jkr6dSdS)NFT)�pids�	processesrmrZ�get_uid)rrArrr�is_monitored�szProcessInfo.is_monitoredcCsZ|jr|jSytjd|j�tj}Wntk
r>d}YnX||jkrVd|_||_|S)Nz/proc/%d)rg�os�statrm�ST_UIDrOr�)rrgrrrr�s

zProcessInfo.get_uidcCs\|j�}|dk	rR|jrRyttj|�j�|_Wn"ttfk
rPt|�|_YnX|jpZdS)Nz{none})	r�r�rwr]�getpwuidZpw_namer_rur)rrgrrr�get_userszProcessInfo.get_usercCs
ytd|j�}|jd�}Wntk
r0dSXt|j�}|sb|jdd�}|rZd|}nd}|Sd}t|jd|j��}||jkr�t|�jdd�}|jdd�}||kr�|d	|7}|jd
�}	|	djd�r�|	dj	d�d
}
|	d|
d�|	d<dj
|	�j�}t||�S)Nz/proc/%d/cmdlineiz{no such process}�Name�z[%s]z	{no name}ZTgidz [%s]�r�/r� )
rirm�readrlrqr}r[rj�
startswith�rfind�joinrkrw)rZproc_cmdlinerZproc_statusZproc_status_name�suffix�tgidZ	tgid_nameZthread_name�partsZfirst_command_charrrr�get_cmdlines2



zProcessInfo.get_cmdlinecCs6|r|jj�Sx |jj�D]}|jj�sdSqWdS)NTF)r�r9r��valuesr{)rZaccumulated�trrr�did_some_io<s
zProcessInfo.did_some_iocCs0tdd�|jj�D��}t|�dkr,|j�SdS)Ncss|]}|j�VqdS)N)r~)�.0r�rrr�	<genexpr>Esz)ProcessInfo.get_ioprio.<locals>.<genexpr>rz?dif)�setr�r�rU�pop)rZ
prioritiesrrrr~DszProcessInfo.get_iopriocCs$x|jj�D]}|j||�qWdS)N)r�r�r)rr�r�rVrrrrJszProcessInfo.set_iopriocCstj|j��S)N)rZsort_keyr~)rrrr�ioprio_sort_keyNszProcessInfo.ioprio_sort_keycCs*|jj|d�}|s&t||�}||j|<|S)N)r�r}rx)rrIr|rVrrr�
get_threadQs


zProcessInfo.get_threadcCs�tj�}x*|jj�D]\}}|js|j|j|�qWtdd�|jj�D��|_t|j�}|s`dS|j	|_	|j
|_
||_|jj|j|j�dS)NcSsg|]\}}|js||f�qSr)ry)r�rIrVrrr�
<listcomp>]sz,ProcessInfo.update_stats.<locals>.<listcomp>FT)rr<r�rQryr7r{�dictrUrrr�)rr{rIrVZ
nr_threadsrrrr�Xs
zProcessInfo.update_statsN)rrrrr2r�r�r�r�r�r~rr�r�r�rrrrr��s		r�c@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�ProcessListcCs2i|_||_||_tj�|_tj�|_|j�dS)N)r�r|rAr��	timestamprr�update_process_counts)rr|rArrrr2ms

zProcessList.__init__cCs8|jj|d�}|s$t|�}||j|<|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)r�r}r�r�rA)rrm�processrrr�get_processxs
zProcessList.get_processc
Cs�|jjr|jjStjd�}|jjr0dd�|D�Sg}x`|D]X}d|dkoTdknr:y"|jtttjd|d���Wq:tk
r�Yq:Xq:W|S)	Nz/proccSs0g|](}d|dkodknrt|��qS)�0r�9)r[)r�r�rrrr��sz*ProcessList.list_tgids.<locals>.<listcomp>r�rr�z/proc/z/task)	rAr�r��listdirr��extend�mapr[rO)rZtgids�tidsr�rrr�
list_tgids�s

"
zProcessList.list_tgidscCsf|jjs|gSyttttjd|���}Wntk
r>gSX|jjrbtt	|jj�j
t	|���}|S)Nz
/proc/%d/task)rAr��listr�r[r�r�rOr�r��intersection)rr�r�rrr�	list_tids�szProcessList.list_tidsc
Cs�tj�}||j|_||_d}}x||j�D]p}|j|�}|s@q,xZ|j|�D]L}|j||j�}|jj|�}|rL|j	|�|j
}	||	j7}||	j7}d|_
qLWq,W||f|jj�fS)NrF)r�r�Zdurationr�r�r�r�r|rXr�r{r!r#ryrr8)
rZ
new_timestampZ
total_readZtotal_writer�r�rIrVr;r8rrrr��s$



z!ProcessList.update_process_countscCsTx,|jj�D]}x|jj�D]
}d|_qWqW|j�}tdd�|jj�D��|_|S)NTcSs g|]\}}|j�r||f�qSr)r�)r�rmr�rrrr��sz1ProcessList.refresh_processes.<locals>.<listcomp>)r�r�r�ryr�r�rQ)rr�rVZtotal_read_and_writerrr�refresh_processes�szProcessList.refresh_processescCs
i|_dS)N)r�)rrrr�clear�szProcessList.clearN)
rrrr2r�r�r�r�r�r�rrrrr�ls
r�cCsdt�j�kS)a| WAS:
    try:
        with open('/proc/sys/kernel/task_delayacct') as f:
            return bool(int(f.read().strip()))
    except FileNotFoundError:
        return None


    Because /proc/sys/kernel/task_delayacct doesn't exist on RHEL8,
    it always returns None, which is equivalent to False in the end.

    On RHEL8, delayacct_on kernel variable is enabled by default
    Znodelayacct)r�keysrrrrr-�sr-)0Z
__future__rrPr�rr]r�r*rar�Zprocfsr�path�existsZioaccountingZiotop.vmstatrZvmstat_fZvm_event_countersr`rdZiotoprrZ
iotop.netlinkrr	r
rZiotop.genetlinkrr
�objectrrrGrHrRZTASKSTATS_TYPE_PIDrTr@rhrqrwrxr�r�r-rrrr�<module>sV



5)^__pycache__/version.cpython-36.opt-1.pyc000064400000000177150351355630014041 0ustar003

B��Q�@sdZdS)z0.6N)�VERSION�rr�/usr/lib/python3.6/version.py�<module>s__pycache__/version.cpython-36.pyc000064400000000177150351355630013102 0ustar003

B��Q�@sdZdS)z0.6N)�VERSION�rr�/usr/lib/python3.6/version.py�<module>s__pycache__/netlink.cpython-36.pyc000064400000022075150351355630013062 0ustar003

B��Q��@s�dZddlZddlZddlZyDejejejd�Zejd8�[dd�Zdd�Z	dd�Z
d9d
d�ZWn�ejk
�ry.ddl
Z
dd�Zd
d�Z	dd�Z
d:dd�ZWn\ek
�r�ddlZejd�ZGdd�dej�Zdd�Zdd�Z	dd�Z
d;dd�ZYnXYnXdZdZdZdZdZdZdZdZdZGdd�d�ZGdd�de�ZGd d!�d!e�ZGd"d#�d#e�Z Gd$d%�d%e�Z!Gd&d'�d'e�Z"dZ#dZ$dZ%dZ&dZ'd(Z(d)Z)d*Z*dZ+d+Z,d,Z-d-Z.d.Z/d/Z0d0Z1d1Z2dZ3Gd2d3�d3�Z4Gd4d5�d5�Z5d6d7�Z6dS)<z�
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
�NcCs|j|�dS)N)�bind)�
descriptor�addr�r�/usr/lib/python3.6/netlink.py�_nl_bindsrcCs|j�S)N)�getsockname)rrrr�_nl_getsocknamesr	cCs|j|�dS)N)�send)r�msgrrr�_nl_sendsr�@cCs
|j|�S)N)�recvfrom)r�bufsrrr�_nl_recvsrcCstj|j�|d�dS)N�)�_netlinkr�fileno)rrrrrrscCstj|j��S)N)rrr)rrrrr	 scCstj|j�|�dS)N)rr
r)rrrrrr"scCstj|j�|�S)N)rrr)rrrrrr$sc@s0eZdZdejfdejfdejfdejfgZdS)�SOCKADDR_NLZ	nl_familyZnl_pad�nl_pid�	nl_groupsN)�__name__�
__module__�__qualname__�ctypesZc_ushort�c_intZ_fields_rrrrr,srcCs2ttjdtj�d�}tj|j�tj	|�tj
|��S)Nr)r�socket�
AF_NETLINK�os�getpid�libcrrr�pointer�sizeof)rrrrrr2s
cCsHtdddd�}tjtj|��}tj|j�tj|�tj|��|j|j	fS)Nr)
rrrr"r rrr!rr)rr�lenrrrr	8s
cCstj|j�|t|�d�S)Nr)r r
rr#)rrrrrr@scCsntdddd�}tjtj|��}tj|�}tj|j�||dtj|�tj|��}tj	tj|�|�}||j
|jffS)Nr)rrrr"Zcreate_string_bufferr rrr!Z	string_atrr)rrrr#Zbuf�r�retrrrrCs

r�����c@s\eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�AttrcGs,||_t|�r"tj|f|��|_n||_dS)N)�typer#�struct�pack�data)�self�	attr_typer/�valuesrrr�__init__^sz
Attr.__init__cCsJtjdt|j�d|j�}t|j�}|ddd@|}||jd|S)N�HHr'rr)����)r-r.r#r/r,)r0�hdr�lengthZpadrrr�_dumpes
z
Attr._dumpcCsd|jt|j�fS)Nz<Attr type %d, data "%s">)r,�reprr/)r0rrr�__repr__ksz
Attr.__repr__cCstjd|j�dS)N�Hr)r-�unpackr/)r0rrr�u16nszAttr.u16cCstjd|j�dS)N�hr)r-r=r/)r0rrr�s16pszAttr.s16cCstjd|j�dS)N�Ir)r-r=r/)r0rrr�u32rszAttr.u32cCstjd|j�dS)N�ir)r-r=r/)r0rrr�s32tszAttr.s32cCs|jS)N)r/)r0rrr�strvszAttr.strcCs|jjd�dS)N�r)r/�split)r0rrr�nulstrxszAttr.nulstrcCs
t|j�S)N)�parse_attributesr/)r0rrr�nestedzszAttr.nestedN)
rrrr3r9r;r>r@rBrDrErHrJrrrrr+]sr+c@seZdZdd�ZdS)�StrAttrcCs"tj||dt|�|jd��dS)Nz%dszutf-8)r+r3r#�encode)r0r1r/rrrr3~szStrAttr.__init__N)rrrr3rrrrrK}srKc@seZdZdd�ZdS)�
NulStrAttrcCs$tj||dt|�|jd�d�dS)Nz%dsBzutf-8r)r+r3r#rL)r0r1r/rrrr3�szNulStrAttr.__init__N)rrrr3rrrrrM�srMc@seZdZdd�ZdS)�U32AttrcCstj||d|�dS)NrA)r+r3)r0r1�valrrrr3�szU32Attr.__init__N)rrrr3rrrrrN�srNc@seZdZdd�ZdS)�U8AttrcCstj||d|�dS)N�B)r+r3)r0r1rOrrrr3�szU8Attr.__init__N)rrrr3rrrrrP�srPc@seZdZdd�Zdd�ZdS)�NestedcCs||_||_dS)N)�attrsr,)r0r1rSrrrr3�szNested.__init__cCsPg}x|jD]}|j|j��qWdj|�}t|�}tjd|d|j�}||S)N�r4r')rS�appendr9�joinr#r-r.r,)r0�contents�attrr8r7rrrr9�s
zNested._dumpN)rrrr3r9rrrrrR�srR����	�
���
��c@s&eZdZddd�Zdd�Zdd	�ZdS)�MessagerrNcCsb||_||_||_d|_|pg}t|t�rXg}x|D]}|j|j��q4Wdj|�|_	n||_	dS)Nr����)
r,�flags�seq�pid�
isinstance�listrUr9rV�payload)r0�msg_typerfrgrkrWrXrrrr3�s

zMessage.__init__cCsZ|jdkr|j�|_|j|_t|j�}tjd|d|j|j|j|j�}|j||j�dS)Nr�IHHIIr'rer*)	rgrhr#rkr-r.r,rfr
)r0Zconnr8r7rrrr
�s


zMessage.sendcCs d|j|j|j|jt|j�fS)Nz:<netlink.Message type=%d, pid=%d, seq=%d, flags=0x%x "%s">)r,rhrgrfr:rk)r0rrrr;�szMessage.__repr__re)rreN)rrrr3r
r;rrrrrc�s
rcc@s.eZdZddd�Zdd�Zdd�Zd	d
�ZdS)�
ConnectionrNcCsntjtjtj|�|_|jjtjtjd�|jjtjtjd�t|jd|f�t	|j�\|_
|_d|_||_
dS)Nir)rr�SOCK_RAWrZ
setsockoptZ
SOL_SOCKETZ	SO_SNDBUFZ	SO_RCVBUFrr	rh�groups�_seqZ
unexpected)r0ZnltyperpZunexpected_msg_handlerrrrr3�szConnection.__init__cCst|j|�dS)N)rr)r0rrrrr
�szConnection.sendcCs�t|j�\}\}}tjd|dd��\}}}}}t||||dd��}	||	_|	jtkr�tjd|	jdd��d}
|
dkr�t	dt
j|
�|
f�}|
|_|�|	S)Nrmr*rCr'rzNetlink error: %s (%d))
rrr-r=rcrhr,�NLMSG_ERRORrk�OSErrorr�strerror�errno)r0rWZnlpidZnlgrpsZmsglenrlrfrgrhrru�errrrr�recv�s
zConnection.recvcCs|jd7_|jS)Nr)rq)r0rrrrg�szConnection.seq)rN)rrrr3r
rwrgrrrrrn�s
	rncCs`i}xVt|�rZtjd|dd��\}}t||d|��||<|ddd@}||d�}qW|S)Nr4r'rr)r6)r#r-r=r+)r/rSZattr_lenr1rrrrI�s
rI)rr)r
)r
)r
)7�__doc__rrr-rroZ
_dummysockrrr	rr�errorr�ImportErrorrZCDLLr Z	StructurerZ
NLM_F_REQUESTZNLM_F_MULTIZ	NLM_F_ACKZ
NLM_F_ECHOZ
NLMSG_NOOPrrZ
NLMSG_DONEZ
NLMSG_OVERRUNZNLMSG_MIN_TYPEr+rKrMrNrPrRZ
NETLINK_ROUTEZNETLINK_UNUSEDZNETLINK_USERSOCKZNETLINK_FIREWALLZNETLINK_INET_DIAGZ
NETLINK_NFLOGZNETLINK_XFRMZNETLINK_SELINUXZ
NETLINK_ISCSIZ
NETLINK_AUDITZNETLINK_FIB_LOOKUPZNETLINK_CONNECTORZNETLINK_NETFILTERZNETLINK_IP6_FWZNETLINK_DNRTMSGZNETLINK_KOBJECT_UEVENTZNETLINK_GENERICrcrnrIrrrr�<module>sz

  __pycache__/netlink.cpython-36.opt-1.pyc000064400000022075150351355630014021 0ustar003

B��Q��@s�dZddlZddlZddlZyDejejejd�Zejd8�[dd�Zdd�Z	dd�Z
d9d
d�ZWn�ejk
�ry.ddl
Z
dd�Zd
d�Z	dd�Z
d:dd�ZWn\ek
�r�ddlZejd�ZGdd�dej�Zdd�Zdd�Z	dd�Z
d;dd�ZYnXYnXdZdZdZdZdZdZdZdZdZGdd�d�ZGdd�de�ZGd d!�d!e�ZGd"d#�d#e�Z Gd$d%�d%e�Z!Gd&d'�d'e�Z"dZ#dZ$dZ%dZ&dZ'd(Z(d)Z)d*Z*dZ+d+Z,d,Z-d-Z.d.Z/d/Z0d0Z1d1Z2dZ3Gd2d3�d3�Z4Gd4d5�d5�Z5d6d7�Z6dS)<z�
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
�NcCs|j|�dS)N)�bind)�
descriptor�addr�r�/usr/lib/python3.6/netlink.py�_nl_bindsrcCs|j�S)N)�getsockname)rrrr�_nl_getsocknamesr	cCs|j|�dS)N)�send)r�msgrrr�_nl_sendsr�@cCs
|j|�S)N)�recvfrom)r�bufsrrr�_nl_recvsrcCstj|j�|d�dS)N�)�_netlinkr�fileno)rrrrrrscCstj|j��S)N)rrr)rrrrr	 scCstj|j�|�dS)N)rr
r)rrrrrr"scCstj|j�|�S)N)rrr)rrrrrr$sc@s0eZdZdejfdejfdejfdejfgZdS)�SOCKADDR_NLZ	nl_familyZnl_pad�nl_pid�	nl_groupsN)�__name__�
__module__�__qualname__�ctypesZc_ushort�c_intZ_fields_rrrrr,srcCs2ttjdtj�d�}tj|j�tj	|�tj
|��S)Nr)r�socket�
AF_NETLINK�os�getpid�libcrrr�pointer�sizeof)rrrrrr2s
cCsHtdddd�}tjtj|��}tj|j�tj|�tj|��|j|j	fS)Nr)
rrrr"r rrr!rr)rr�lenrrrr	8s
cCstj|j�|t|�d�S)Nr)r r
rr#)rrrrrr@scCsntdddd�}tjtj|��}tj|�}tj|j�||dtj|�tj|��}tj	tj|�|�}||j
|jffS)Nr)rrrr"Zcreate_string_bufferr rrr!Z	string_atrr)rrrr#Zbuf�r�retrrrrCs

r�����c@s\eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�AttrcGs,||_t|�r"tj|f|��|_n||_dS)N)�typer#�struct�pack�data)�self�	attr_typer/�valuesrrr�__init__^sz
Attr.__init__cCsJtjdt|j�d|j�}t|j�}|ddd@|}||jd|S)N�HHr'rr)����)r-r.r#r/r,)r0�hdr�lengthZpadrrr�_dumpes
z
Attr._dumpcCsd|jt|j�fS)Nz<Attr type %d, data "%s">)r,�reprr/)r0rrr�__repr__ksz
Attr.__repr__cCstjd|j�dS)N�Hr)r-�unpackr/)r0rrr�u16nszAttr.u16cCstjd|j�dS)N�hr)r-r=r/)r0rrr�s16pszAttr.s16cCstjd|j�dS)N�Ir)r-r=r/)r0rrr�u32rszAttr.u32cCstjd|j�dS)N�ir)r-r=r/)r0rrr�s32tszAttr.s32cCs|jS)N)r/)r0rrr�strvszAttr.strcCs|jjd�dS)N�r)r/�split)r0rrr�nulstrxszAttr.nulstrcCs
t|j�S)N)�parse_attributesr/)r0rrr�nestedzszAttr.nestedN)
rrrr3r9r;r>r@rBrDrErHrJrrrrr+]sr+c@seZdZdd�ZdS)�StrAttrcCs"tj||dt|�|jd��dS)Nz%dszutf-8)r+r3r#�encode)r0r1r/rrrr3~szStrAttr.__init__N)rrrr3rrrrrK}srKc@seZdZdd�ZdS)�
NulStrAttrcCs$tj||dt|�|jd�d�dS)Nz%dsBzutf-8r)r+r3r#rL)r0r1r/rrrr3�szNulStrAttr.__init__N)rrrr3rrrrrM�srMc@seZdZdd�ZdS)�U32AttrcCstj||d|�dS)NrA)r+r3)r0r1�valrrrr3�szU32Attr.__init__N)rrrr3rrrrrN�srNc@seZdZdd�ZdS)�U8AttrcCstj||d|�dS)N�B)r+r3)r0r1rOrrrr3�szU8Attr.__init__N)rrrr3rrrrrP�srPc@seZdZdd�Zdd�ZdS)�NestedcCs||_||_dS)N)�attrsr,)r0r1rSrrrr3�szNested.__init__cCsPg}x|jD]}|j|j��qWdj|�}t|�}tjd|d|j�}||S)N�r4r')rS�appendr9�joinr#r-r.r,)r0�contents�attrr8r7rrrr9�s
zNested._dumpN)rrrr3r9rrrrrR�srR����	�
���
��c@s&eZdZddd�Zdd�Zdd	�ZdS)�MessagerrNcCsb||_||_||_d|_|pg}t|t�rXg}x|D]}|j|j��q4Wdj|�|_	n||_	dS)Nr����)
r,�flags�seq�pid�
isinstance�listrUr9rV�payload)r0�msg_typerfrgrkrWrXrrrr3�s

zMessage.__init__cCsZ|jdkr|j�|_|j|_t|j�}tjd|d|j|j|j|j�}|j||j�dS)Nr�IHHIIr'rer*)	rgrhr#rkr-r.r,rfr
)r0Zconnr8r7rrrr
�s


zMessage.sendcCs d|j|j|j|jt|j�fS)Nz:<netlink.Message type=%d, pid=%d, seq=%d, flags=0x%x "%s">)r,rhrgrfr:rk)r0rrrr;�szMessage.__repr__re)rreN)rrrr3r
r;rrrrrc�s
rcc@s.eZdZddd�Zdd�Zdd�Zd	d
�ZdS)�
ConnectionrNcCsntjtjtj|�|_|jjtjtjd�|jjtjtjd�t|jd|f�t	|j�\|_
|_d|_||_
dS)Nir)rr�SOCK_RAWrZ
setsockoptZ
SOL_SOCKETZ	SO_SNDBUFZ	SO_RCVBUFrr	rh�groups�_seqZ
unexpected)r0ZnltyperpZunexpected_msg_handlerrrrr3�szConnection.__init__cCst|j|�dS)N)rr)r0rrrrr
�szConnection.sendcCs�t|j�\}\}}tjd|dd��\}}}}}t||||dd��}	||	_|	jtkr�tjd|	jdd��d}
|
dkr�t	dt
j|
�|
f�}|
|_|�|	S)Nrmr*rCr'rzNetlink error: %s (%d))
rrr-r=rcrhr,�NLMSG_ERRORrk�OSErrorr�strerror�errno)r0rWZnlpidZnlgrpsZmsglenrlrfrgrhrru�errrrr�recv�s
zConnection.recvcCs|jd7_|jS)Nr)rq)r0rrrrg�szConnection.seq)rN)rrrr3r
rwrgrrrrrn�s
	rncCs`i}xVt|�rZtjd|dd��\}}t||d|��||<|ddd@}||d�}qW|S)Nr4r'rr)r6)r#r-r=r+)r/rSZattr_lenr1rrrrI�s
rI)rr)r
)r
)r
)7�__doc__rrr-rroZ
_dummysockrrr	rr�errorr�ImportErrorrZCDLLr Z	StructurerZ
NLM_F_REQUESTZNLM_F_MULTIZ	NLM_F_ACKZ
NLM_F_ECHOZ
NLMSG_NOOPrrZ
NLMSG_DONEZ
NLMSG_OVERRUNZNLMSG_MIN_TYPEr+rKrMrNrPrRZ
NETLINK_ROUTEZNETLINK_UNUSEDZNETLINK_USERSOCKZNETLINK_FIREWALLZNETLINK_INET_DIAGZ
NETLINK_NFLOGZNETLINK_XFRMZNETLINK_SELINUXZ
NETLINK_ISCSIZ
NETLINK_AUDITZNETLINK_FIB_LOOKUPZNETLINK_CONNECTORZNETLINK_NETFILTERZNETLINK_IP6_FWZNETLINK_DNRTMSGZNETLINK_KOBJECT_UEVENTZNETLINK_GENERICrcrnrIrrrr�<module>sz

  __pycache__/genetlink.cpython-36.pyc000064400000005263150351355630013376 0ustar003

B��Q��@s�dZddlZddlmZmZmZmZddlmZmZm	Z	dZ
dZdZdZ
dZd	Zd
ZdZdZdZdZdZd	Zd
ZGdd�d�Zd
d�ZeZGdd�de�ZGdd�d�Zee	�Zee�ZdS)z�
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
�N)�
NLM_F_REQUEST�NLMSG_MIN_TYPE�Message�parse_attributes)�
NulStrAttr�
Connection�NETLINK_GENERIC������c@seZdZddd�Zdd�ZdS)�GenlHdrrcCs||_||_dS)N)�cmd�version)�selfrr�r�/usr/lib/python3.6/genetlink.py�__init__szGenlHdr.__init__cCstjd|j|j�S)N�BBxx)�struct�packrr)rrrr�_dump!sz
GenlHdr._dumpN)r)�__name__�
__module__�__qualname__rrrrrrrs
rcCsttjd|��S)Nr)rr�unpack)�datarrr�_genl_hdr_parse$src@s&eZdZgdfdd�Zedd��ZdS)�GeNlMessagercCs4||_||_||_tj|||t|j�g|d�dS)N)�flags�payload)r�attrs�familyrrr)rr$rr#r!rrrr*s

zGeNlMessage.__init__cCsP|j�}|j}t|dd��}t|j|jg|j�}t|dd��|_|j	|_	|S)Nr)
�recvr"rr �typerr!rr#r)�conn�msgZpacketZhdrZgenlmsgrrrr%1szGeNlMessage.recvN)rrrr�staticmethodr%rrrrr )sr c@seZdZdd�Zdd�ZdS)�
ControllercCs
||_dS)N)r')rr'rrrr>szController.__init__cCsBtt|�}tttt|gd�}|j|j�tj|j�}|j	t
j�S)N)r!r#)r�CTRL_ATTR_FAMILY_NAMEr �GENL_ID_CTRL�CTRL_CMD_GETFAMILYr�sendr'r%r#�CTRL_ATTR_FAMILY_ID�u16)rr$�a�mrrr�
get_family_id@s
zController.get_family_idN)rrrrr3rrrrr*=sr*)�__doc__rZ
iotop.netlinkrrrrrrrZCTRL_CMD_UNSPECZCTRL_CMD_NEWFAMILYZCTRL_CMD_DELFAMILYr-ZCTRL_CMD_NEWOPSZCTRL_CMD_DELOPSZCTRL_CMD_GETOPSZCTRL_ATTR_UNSPECr/r+ZCTRL_ATTR_VERSIONZCTRL_ATTR_HDRSIZEZCTRL_ATTR_MAXATTRZ
CTRL_ATTR_OPSrrr,r r*Z
connectionZ
controllerrrrr�<module>s0__pycache__/vmstat.cpython-36.pyc000064400000002056150351355630012731 0ustar003

B��Q�@sGdd�de�ZdS)c@s$eZdZdd�Zdd�Zdd�ZdS)�VmStatcCstd�|_|j�|_dS)Nz/proc/vmstat)�open�vmstat_file�read�vmstat)�self�r�/usr/lib/python3.6/vmstat.py�__init__s
zVmStat.__init__cCsddd�}x"|jD]}|jd�r||�}PqWx"|jD]}|jd�r4||�}Pq4W|jjd�||fS)NcSst|j�d�dS)N�i)�int�split)�linerrr�extractszVmStat.read.<locals>.extractzpgpgin zpgpgout �)r�
startswith�seek)rrr
ZpgpginZpgpgoutrrrrs

zVmStat.readcCs6|j�}|d|jd|d|jdf}||_|S)Nrr
)rr)rZnow�deltarrrr)s$zVmStat.deltaN)�__name__�
__module__�__qualname__r	rrrrrrrsrN)�objectrrrrr�<module>s__pycache__/ui.cpython-36.pyc000064400000050456150351355630012037 0ustar003

�bf�b�@szddlmZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
mZmZmZmZddlmZddlmZddlmZddlmZdd	d
ddd
dgZdd�Zdd�Zdd�Zdd�Zdd�Ze�ZGdd�de �Z!Gdd�de �Z"Gdd�de �Z#Gdd �d e �Z$Gd!d"�d"e �Z%Gd#d$�d$e&�Z'd%d&�Z(d'd(�Z)d)d*�Z*d+e
j+dZ,d,d-�Z-dS).�)�print_functionN)�	find_uids�TaskStatsNetlink�ProcessList�Stats�sysctl_task_delayacct)�
ThreadInfo)�VERSION)�ioprio)�IoprioSetError�B�K�M�G�T�P�EcCs`|dkrd}n|dkr"d}|}ndSttj|dd�d�}d|t|�dd|>t|fS)	Nr��-z0.00 B��
z	%s%.2f %s�)�int�math�log�float�UNITS)�sizeZsignZexpo�r�/usr/lib/python3.6/ui.py�
human_size-sr cCs|jrd|dSt|�S)Nz%.2f Kg�@)�	kilobytesr )�options�bytesrrr�format_size9sr$cCst||ot|�|�dS)Nz/s)r$r)r"r�durationrrr�format_bandwidth>sr&cs��fdd�}�jr4|j}�fdd�}tj�|j�n|j}�fdd�}||j�}||j�}||j��}|j|j	}	t
d|	�}	||	��}
||||
fS)Ncsdtd|�d�S)Nz%.2f %%g��(\�X@g�cA)�min)Zdelay)r%rr�
delay2percentDsz#format_stats.<locals>.delay2percentcs
t�|�S)N)r$)rr%)r"rr�<lambda>Hszformat_stats.<locals>.<lambda>cst�||�S)N)r&)rr%)r"rrr)Lsr)�accumulated�stats_accum�timeZstats_accum_timestamp�stats_delta�blkio_delay_total�swapin_delay_total�
read_bytes�write_bytes�cancelled_write_bytes�max)r"Zprocessr%r(�statsZdisplay_format�io_delay�swapin_delayr0Z
written_bytesr1r)r%r"r�format_statsAs



r7cCsByttd�j�j��Stk
r<}zt|�dSd}~XnXdS)Nz/proc/sys/kernel/pid_max�)�len�open�read�strip�	Exception�print)�errr�get_max_pid_widthVs
r@c@seZdZdS)�CancelInputN)�__name__�
__module__�__qualname__rrrrrAdsrAc@seZdZdS)�
InvalidIntN)rBrCrDrrrrrEesrEc@seZdZdS)�
InvalidPidN)rBrCrDrrrrrFfsrFc@seZdZdS)�
InvalidTidN)rBrCrDrrrrrGgsrGc@seZdZdS)�InvalidIoprioDataN)rBrCrDrrrrrHhsrHc	@s�eZdZdd�dfdd�dfdd�dfdd�dfdd�dfd	d�dfd
d�dfdd�dfgZdd
�Zdd�Zdd�Zdd�Zdd�Zd0dd�Z	d1dd�Z
dd�Zdd�Zdd �Z
d!d"�Zd2d#d$�Zd3d&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�ZdS)4�IOTopUIcCs|jS)N)�pid)�p�srrrr)qszIOTopUI.<lambda>FcCs|j�S)N)Zioprio_sort_key)rKrLrrrr)rscCs|j�S)N)�get_user)rKrLrrrr)sscCs|jS)N)r0)rKrLrrrr)tsTcCs|j|jS)N)r1r2)rKrLrrrr)uscCs|jS)N)r/)rKrLrrrr)vscCs|jpt|jp|j�S)N)r.rr0r1)rKrLrrrr)yscCs|j�S)N)�get_cmdline)rKrLrrrr){scCst||_||_d|_tj|jd|_|jjsp||_|j�yt	j
�t	j�t	jd�Wnt	j
k
rnYnXdS)N�rr)�process_listr"�sorting_keyrI�sorting_keys�sorting_reverse�batch�win�resize�cursesZuse_default_colorsZstart_color�curs_set�error)�selfrUrPr"rrr�__init__~szIOTopUI.__init__cCs|jj�\|_|_dS)N)rUZgetmaxyx�height�width)rZrrrrV�szIOTopUI.resizec
Cs^d}tj�}|jjs.|jtjj�tjtj	B��x(|jj
dksL||jj
k�rX|jj�\}}|j
|dk|||jj�|jj
dk	r�|d7}||jj
kr�Pn|dkr�d}y|j|jjd�}WnBtjk
r�}z$|jr�|jdtjkr�g}n�WYdd}~XnXx.|D]&\}}|tjtjB@�rtjd��qW|jj�s>|j�|r2|jj�}	|j|	�q2WdS)Nrrg@�@)�select�pollr"rT�register�sys�stdin�filenoZPOLLINZPOLLPRI�
iterationsrP�refresh_processes�refresh_displayr%�
delay_secondsrY�args�errnoZEINTRZPOLLERRZPOLLHUP�exitrVrU�getch�
handle_key)
rZrdr_�total�actualZeventsr?�fdZevent�keyrrr�run�s:


zIOTopUI.runcCs|j|_dS)N)rS)rZrrr�reverse_sorting�szIOTopUI.reverse_sortingcCs�|j}|j|7_td|j�|_tttj�d|j�|_|jsh|jdkrh|dkrZd|_n|dkrhd|_||jkr�tj|jd|_dS)Nrrr8rO��)r8rO)rQr3r'r9rIrR�
has_swapin_iorS)rZZdeltaZorig_sorting_keyrrr�adjust_sorting_key�s

zIOTopUI.adjust_sorting_keyNcCs�|jjddtd�tjB|j�|jjdd|tj�|jj�tj	�tj
d�|jjdt|��}tj
d�tj
�|dkr~|S|r�t��|S)Nrr� r)Nr)rU�hline�ordrW�A_NORMALr]�addstr�A_BOLD�refreshZechorXZgetstrr9ZnoechorA)rZ�prompt�default�empty_is_cancel�inprrr�
prompt_str�s


zIOTopUI.prompt_strcCs6|j|||�}yt|�Stk
r0t��YnXdS)N)r�r�
ValueErrorrE)rZr~rr�r�rrr�
prompt_int�s
zIOTopUI.prompt_intcCs>y
|jd�Stk
r$t��Yntk
r8�YnXdS)NzPID to ionice: )r�rErFrA)rZrrr�
prompt_pid�s

zIOTopUI.prompt_pidcCs>y
|jd�Stk
r$t��Yntk
r8�YnXdS)NzTID to ionice: )r�rErGrA)rZrrr�
prompt_tid�s

zIOTopUI.prompt_tidcCsdy.|dk	r|jd||d�}n|jddd�}Wntk
rHt��YnX|dksZ|dkr`t��|S)Nz'I/O priority data (0-7, currently %s): FzI/O priority data (0-7): rrt)r�rErH)rZ�ioprio_datar�rrr�prompt_data�szIOTopUI.prompt_datacCsvy|j|�}Wntk
r&d}YnXt|�d}�x:|jjddtd�tjB|j�|jj	dd|tj
�t|�}xPt|�D]D\}}d|}	||kr�tj}
ntj}
|jj	d||	|
�|t|	�7}q|Wx�|jj
�}|tjtd�fkr�|dkr�|d8}Pq�|tjtd�fk�r ||k�r |d7}Pq�|tjtd�td�fk�rB||S|d	tjtjtjtd
�td�fkr�t��q�Wq8WdS)
Nrrrwz %s �l�r�
�
��q�Q���)�indexr�r9rUrxryrWrzr]�insstrr|�	enumerate�	A_REVERSErk�KEY_LEFT�	KEY_RIGHTZ	KEY_ENTERZ
KEY_CANCELZ	KEY_CLOSEZKEY_EXITrA)rZr~Zdisplay_listZret_listZselectedZset_len�offset�i�itemZdisplay�attrrprrr�
prompt_set�s:

zIOTopUI.prompt_setcCs8d}dddg}dddg}|dkr$d}|j||||�}|S)	NzI/O priority class: z	Real-timezBest-effortZIdleZrtZbe�idler)r�)rZ�ioprio_classr~Zclasses_promptZclasses_retr�rrr�prompt_classs

zIOTopUI.prompt_class�Error!cCsN|jjddtd�tjB|j�|jjddd|tj�|jj�t	j
d�dS)Nrrrwz  %s  )rUrxryrWrzr]r�r�r}r,Zsleep)rZrYrrr�prompt_error"s
zIOTopUI.prompt_errorcCs,|jjddtd�tjB|j�|jj�dS)Nrrrw)rUrxryrWrzr]r})rZrrr�prompt_clear(szIOTopUI.prompt_clearc"s��fdd�}�fdd�}�fdd�}�fdd�}td	�d
d�td�d
d�td��fdd�td��fdd�td�|td�|td�|td�|td�|td�|td�|td�|tj�fdd�tj�fdd�tj�fdd�tj�fdd�i}|j|dd��}|�dS)Ncs�jjdN_dS)NT)r"r*r)rZrr�toggle_accumulated-sz.IOTopUI.handle_key.<locals>.toggle_accumulatedcs�jjdN_dS)NT)r"�onlyr)rZrr�toggle_only_io/sz*IOTopUI.handle_key.<locals>.toggle_only_iocs(�jjdN_�jj��jj�dS)NT)r"�	processesrP�clearrer)rZrr�toggle_processes1s
z,IOTopUI.handle_key.<locals>.toggle_processescs`y��jjr �j�}�jj|�}n�j�}t|�jj�}|j�}t	j
|�\}}�j|�}|dkrdd}n
�j|�}|j
||��jj��jj�Wn�tk
r�}z�jd|j�WYdd}~Xn�tk
r��jd�Yn~tk
r��jd�Ynbtk
�r�jd�YnDtk
�r6�jd�Yn&tk
�rR�j�Yn
X�j�dS)Nr�rzError setting I/O priority: %szInvalid process id!zInvalid thread id!zInvalid I/O priority data!zInvalid integer!)r"r�r�rPZget_processr�r�taskstats_connection�
get_ioprior
Zto_class_and_datar�r�Z
set_ioprior�rerr��errrFrGrHrErAr�)rJZ	exec_unit�tidZioprio_valuer�r�r?)rZrr�ionice5s:



 z"IOTopUI.handle_key.<locals>.ionicer�cSs
tjd�S)Nr)rarjrrrrr)Zsz$IOTopUI.handle_key.<locals>.<lambda>r�cSs
tjd�S)Nr)rarjrrrrr)\sr�cs�j�S)N)rrr)rZrrr)^s�Rcs�j�S)N)rrr)rZrrr)`s�a�A�o�OrKrr��Ics
�jd�S)Nrr�)rvr)rZrrr)rscs
�jd�S)Nr)rvr)rZrrr)tscs�jttj��S)N)rvr9rIrRr)rZrrr)vscs�jttj��S)N)rvr9rIrRr)rZrrr)xscSsdS)Nrrrrrr){s)ryrWr�r�ZKEY_HOMEZKEY_END�get)rZrpr�r�r�r�Zkey_bindings�actionr)rZrrl,sL$




zIOTopUI.handle_keycs��fdd�}�fdd�}tt|�jjj���}tj�jd��jj	rPdd��ndd��|j
��fd	d��jd
��jjs�|�j
dd�=tt||��S)Nc
sRt�j|�jj�}|\}}}}dt}|jf}|d7}||j�f7}|d7}||j�dd�f7}|d7}|||f7}�jr�|d7}|||f7}n�jj	r�|d7}|d
7}|d	7}||}|j
�}	�jj	�s.�jt|�}
d
|
ko�t|	�kn�r.|
dd
}|
|d}|	d|�d|	|d�}	||	7}�jj	�sN|d�j�}|S)Nz%%%ddz %4sz %-8s�z
 %11s %11sz %7s %7sz %s �
?unavailable?rwrr�~)r�)
r7r"rPr%�
MAX_PID_WIDTHrJr�rMrurTrNr]r9)
rKr4r5r6r0r1�formatZparams�lineZcmdlineZremaining_lengthZlen1Zoffset2)rZrrr�s:

z IOTopUI.get_data.<locals>.formatcs�jjp|j�jj�S)N)r"r�Zdid_some_ior*)rK)rZrr�
should_format�s
z'IOTopUI.get_data.<locals>.should_formatrcSs|jS)N)r+)rKrrrr)�sz"IOTopUI.get_data.<locals>.<lambda>cSs|jS)N)r-)rKrrrr)�scs�|�|��S)Nr)rK)rp�stats_lambdarrr)�s)rp�reverser)�list�filterrPr��valuesrIrRrQr"r*�sortrSrTr\�map)rZr�r�r�r)rprZr�r�get_data~s

zIOTopUI.get_datacs�dt�j|d|�jd�t�j|d|�jd�fdt�j|d|�jd�t�j|d|�jd�fg�tdtd�d}�jjr�|d7}n|d	7}|d
ddd
dddg}tj�_�jr�t	�dkr�d�_�j
d��j�}�jj�rdg|}tj
d���fdd�|D�}�fdd��D���jj�r��jjdk�rjx�D]}t|��q8W�jjt|�k�rjtdj|��x|D]}	t|	jd���qpWtjj��n�jj�x0t��D]$\�}�jj�d|d�j���q�W�jjt��dtd�tj B�j��j}
x�t!t|��D]���j�r$�d!k�r$�qtj }|�}��j"k�rJ|dd�}��j"k�rv|tj#O}|�j$�rpd�prd7}|d|
�}|
t|�8}
�jj||��qW�jdk	�r�d}
nd}
t%t|��j&dtt'|
���}xzt!|�D]n�yN���fdd �}y||��Wn(t(k
�r0||�jd��YnXWntj)k
�rLYnX�q�W|
�rx�jj*�j&t��d|
tj#��jj+�dS)"Nz,Total DISK READ : %s | Total DISK WRITE : %sr�rz,Actual DISK READ: %s | Actual DISK WRITE: %s�rw�PIDZTIDz  PRIOz  USERz     DISK READz  DISK WRITEz  SWAPINz      IOz    COMMANDFz    TIMEz	%H:%M:%S csg|]}�|�qSrr)�.0r�)�current_timerr�
<listcomp>�sz+IOTopUI.refresh_display.<locals>.<listcomp>csg|]}�|�qSrr)r�rL)r�rrr��srrzutf-8r8rO�>�<zoCONFIG_TASK_DELAY_ACCT and kernel.task_delayacct sysctl not enabled in kernel, cannot determine SWAPIN and IO %cs �jj�t��dd|�dS)Nrr)rUr{r9)r�)r�rZ�summaryrr�
print_line�sz+IOTopUI.refresh_display.<locals>.print_line)r8rO),r&r"�rjustr3r�r�rZhas_blkio_delay_totalrurrvr�r,ZstrftimerT�quietr>r�join�encodera�stdout�flushrUZeraser�r{r]rxr9ryrWr��rangerQr|rSr'r\�bool�UnicodeEncodeErrorrYr�r})rZZ
first_timermrnr%rJZtitles�linesrLr�Zremaining_colsr��titleZ
status_msgZ	num_linesr�r)r�r�rZr�rrf�s�











 
 zIOTopUI.refresh_display)NT)NT)N)r�)rBrCrDrRr[rVrqrrrvr�r�r�r�r�r�r�r�r�rlr�rfrrrrrIns4





!


 
	
R1rIcCsf|jrtjtjtj�n$dd�}tjtj|�tjtj|�t|�}t||�}t|||�}|j	�dS)Nc_stjd�dS)Nr)rarj)rh�kwargsrrr�
clean_exit	sz$run_iotop_window.<locals>.clean_exit)
rT�signal�SIGPIPE�SIG_DFL�SIGINT�SIGTERMrrrIrq)rUr"r�r�rPZuirrr�run_iotop_windows
r�cCs�y |jrtd|�Stjt|�SWn�tk
rx}z<|jtjkrft|tj	d�tdtj	d�tj
d�n�WYdd}~XnZtjk
r�}z<t|�}|j
d�dkr�|j
d�dks�|j
d�dkr�n�WYdd}~XnXdS)N)�filea�
The Linux kernel interfaces that iotop relies on now require root priviliges
or the NET_ADMIN capability. This change occured because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.

Please do not file bugs on iotop about this.rZERRrz
nocbreak()zendwin())rTr�rW�wrapper�OSErrorriZEPERMr>ra�stderrrjrY�str�find)r"r?Zstrerrr�	run_iotops"
r�cCs�d}y:ddl}ddl}td�|jdt�t�|�|j|�}WnXtk
r�ddl}ddl	}|j
|dd�}td�|j|�|j�|j
j|�}YnX|j�|jdd	�|jd
�|jd
�tj|�dS)Nz
iotop.profrzProfiling using cProfilezcontinuation()r)Z
lineeventszProfiling using hotshotr,Zcalls�2)�cProfile�pstatsr>Zrunctx�globals�localsr�ImportError�hotshotZ
hotshot.statsZProfileZruncall�closer4�loadZ
strip_dirsZ
sort_statsZprint_statsZ
print_callees�os�remove)ZcontinuationZ	prof_filer�r�r4r�Zprofrrr�_profile6s(


r�aF%s [OPTIONS]

DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
period. SWAPIN and IO are the percentages of time the thread spent respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
which the thread is running (set using the ionice command).

Controls: left and right arrows to change the sorting column, r to invert the
sorting order, o to toggle the --only option, p to toggle the --processes
option, a to toggle the --accumulated option, i to change I/O priority, q to
quit, any other key to force a refresh.cs�ytjtjd�Wntjk
r0td�YnXtjtdtd�}|j	ddddd	d
d�|j	dd
dddd�|j	ddddddd�|j	dddddddd�|j	d d!dd"d#d$d%d&�|j	d'd(d)d*d#d+d,d&�|j	d-d.dd/d	d0d�|j	d1d2dd3d	d4d�|j	d5d6dd7d	d8d�|j	d9d:dd;d<d�|j	d=d>d?d@dAdBd�|j	dCddDd	tj
d�|j�\�}|�rt|jdEdFj
|��t���j�p�g�_�j�p��j�p��j�_�fdGdH���j�ṙfdIdJ�}t|�n��dS)KNrz8unable to set locale, falling back to the default localeziotop )Zusage�versionz-oz--only�
store_truer�Fz1only show processes or threads actually doing I/O)r��destr�helpz-bz--batchrTznon-interactive mode)r�r�r�z-nz--iterrrdZNUMz-number of iterations before ending [infinite])�typer��metavarr�z-dz--delayrrgz#delay between iterations [1 second]ZSECr)r�r�r�r�rz-pz--pid�pids�appendz"processes/threads to monitor [all]r�)r�r�r�r�r�z-uz--userr�Zuserszusers to monitor [all]ZUSERz-Pz--processesr�z$only show processes, not all threadsz-az
--accumulatedr*z)show accumulated I/O instead of bandwidthz-kz--kilobytesr!z.use kilobytes instead of a human friendly unitz-tz--timer,z.add a timestamp on each line (implies --batch)z-qz--quiet�countr�rz/suppress some lines of header (implies --batch)z	--profile�profilezUnexpected arguments: rwcst��S)N)r�r)r"rrr)�szmain.<locals>.<lambda>c	sy
��WnYnXdS)Nrr)�	main_looprr�safe_main_loop�s
zmain.<locals>.safe_main_loop)�locale�	setlocale�LC_ALL�Errorr>�optparseZOptionParser�USAGEr	Z
add_optionZ
SUPPRESS_HELP�
parse_argsrYr�rr�rTr,r�r�r�)�parserrhr�r)r�r"r�main\s\








r).Z
__future__rrWrirrrr�r^r�rar,Z
iotop.datarrrrrrZ
iotop.versionr	Ziotopr
Ziotop.iopriorrr r$r&r7r@r�r=rArErFrGrH�objectrIr�r�r��argvrrrrrr�<module>sH
$$__pycache__/ioprio.cpython-36.pyc000064400000010102150351355630012703 0ustar003

B��Qw�@s�ddlZddlZddlZddlZdBdCdDdEdFdGdHdIdJdKdLgZdMdNdOdPdQdRdSdTdUdVdWgZd"d#�ZGd$d%�d%e�Zee�Z	ee�Z
yejdd&d'�ZWn e
k
�r�ejd�ZYnXejZdd(d)d*gZd+Zd,Zd+e>d+Zd-d.�Zd/d0�Zd1d2�ZejZed3�\ZZZZZZejZdZd4d5�Z d6d7�Z!d8d9�Z"d:d;�Z#d<d=�Z$e%d>k�r�ddl&Z&e'e&j(�d?k�rle)e&j(d+�Z*nej+�Z*e,d@e*�e,dAe!e*��dS)X�N�alpha�*��arm*�;�i*86�"�ia64*��parisc*��powerpc*��s390*��sparc*���sh*�!�x86_64*�32bit�64bit���:������� �cCsLtj�d}tj�d}x.|D]&\}}}tj||�rtj||�r|SqWdS)N�r)�os�uname�platformZarchitecture�fnmatch)Zsyscall_listZarch�bitsZcandidate_archZcandidate_bitsZ
syscall_nr�r(�/usr/lib/python3.6/ioprio.py�find_ioprio_syscall_number9sr*c@seZdZdd�ZdS)�IoprioSetErrorcCs0ytj|�|_Wntk
r*||_YnXdS)N)r#�strerror�err�	TypeError)�selfr-r(r(r)�__init__CszIoprioSetError.__init__N)�__name__�
__module__�__qualname__r0r(r(r(r)r+Bsr+T)�	use_errnoZrtZbe�idle��
cCs:ytj|�}Wntk
r,tjd�}YnX|t>|BS)N)�PRIORITY_CLASSES�index�
ValueError�IOPRIO_CLASS_SHIFT)�ioprio_class�ioprio_datar(r(r)�ioprio_valueYs
r>cCst|t?S)N)r8r;)�ioprior(r(r)r<`sr<cCs|t@S)N)�IOPRIO_PRIO_MASK)r?r(r(r)r=csr=�cCsJt|�}tt|�}|dd}|ttfkr2d|S|tkr>dSd|SdS)N��zrt/%dr5zbe/%d)�sched_getscheduler�getpriority�PRIO_PROCESS�
SCHED_FIFO�SCHED_RR�
SCHED_IDLE)�pidZ	scheduler�niceZioprio_nicer(r(r)�get_ioprio_from_schedls
rLcCsTtdkrdSttt|�}|dkr$dSt|�}|s8t|�S|dkrD|Sd|t|�fS)Nz?sysrz?errr5z%s/%d)�__NR_ioprio_get�syscall�IOPRIO_WHO_PROCESSr<rLr=)rJr?Z
prio_classr(r(r)�getxsrPcCsftdkrtd��t||�}tt|||dd�}|dkrbytj�}Wntk
rXd}YnXt|��dS)NzNo ioprio_set syscall foundT)r4rz<Unknown error (errno support not available before Python2.6))�__NR_ioprio_setr+r>rN�ctypesZ	get_errno�AttributeError)ZwhichZwhor<r=Z
ioprio_val�retr-r(r(r)�
set_ioprio�s

rUcCst|ddkrt|d�Sd|krT|jd�r2d}n|jd�r@d}t|jd�d�}n|dkrdd}d}d|t>|S)	Nr�?r6�/zrt/zbe/r5�)�ord�
startswith�int�splitr;)�keyZshiftZprior(r(r)�sort_key�s

r^cCs6d|kr&|jd�}|dt|d�fS|dkr2dSdS)NrWrr6r5)r5r)NN)r\r[)Z
ioprio_strr\r(r(r)�to_class_and_data�s
r_�__main__rXzpid:zioprio:)rrr)rrr)rrr)r	rr
)rrr)r
rr)rrr)rrr)rrr)rrr)rrr)rrr)rrr)rrr)r	rr)rrr)r
rr)rrr)rrr)rrr )rrr)rrr!)-rRr&r#r%ZIOPRIO_GET_ARCH_SYSCALLZIOPRIO_SET_ARCH_SYSCALLr*�	Exceptionr+rMrQZCDLLZ
ctypes_handler.rNr8rOr;r@r>r<r=rD�range�SCHED_OTHERrGrH�SCHED_BATCHZ	SCHED_ISOrIrErFrLrPrUr^r_r1�sys�len�argvr[rJ�getpid�printr(r(r(r)�<module>sr	


__pycache__/__init__.cpython-36.pyc000064400000000161150351355630013145 0ustar003

B��Q�@sdS)N�rrr�/usr/lib/python3.6/__init__.py�<module>s__pycache__/__init__.cpython-36.opt-1.pyc000064400000000161150351355630014104 0ustar003

B��Q�@sdS)N�rrr�/usr/lib/python3.6/__init__.py�<module>s__pycache__/ui.cpython-36.opt-1.pyc000064400000050456150351355630012776 0ustar003

�bf�b�@szddlmZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
mZmZmZmZddlmZddlmZddlmZddlmZdd	d
ddd
dgZdd�Zdd�Zdd�Zdd�Zdd�Ze�ZGdd�de �Z!Gdd�de �Z"Gdd�de �Z#Gdd �d e �Z$Gd!d"�d"e �Z%Gd#d$�d$e&�Z'd%d&�Z(d'd(�Z)d)d*�Z*d+e
j+dZ,d,d-�Z-dS).�)�print_functionN)�	find_uids�TaskStatsNetlink�ProcessList�Stats�sysctl_task_delayacct)�
ThreadInfo)�VERSION)�ioprio)�IoprioSetError�B�K�M�G�T�P�EcCs`|dkrd}n|dkr"d}|}ndSttj|dd�d�}d|t|�dd|>t|fS)	Nr��-z0.00 B��
z	%s%.2f %s�)�int�math�log�float�UNITS)�sizeZsignZexpo�r�/usr/lib/python3.6/ui.py�
human_size-sr cCs|jrd|dSt|�S)Nz%.2f Kg�@)�	kilobytesr )�options�bytesrrr�format_size9sr$cCst||ot|�|�dS)Nz/s)r$r)r"r�durationrrr�format_bandwidth>sr&cs��fdd�}�jr4|j}�fdd�}tj�|j�n|j}�fdd�}||j�}||j�}||j��}|j|j	}	t
d|	�}	||	��}
||||
fS)Ncsdtd|�d�S)Nz%.2f %%g��(\�X@g�cA)�min)Zdelay)r%rr�
delay2percentDsz#format_stats.<locals>.delay2percentcs
t�|�S)N)r$)rr%)r"rr�<lambda>Hszformat_stats.<locals>.<lambda>cst�||�S)N)r&)rr%)r"rrr)Lsr)�accumulated�stats_accum�timeZstats_accum_timestamp�stats_delta�blkio_delay_total�swapin_delay_total�
read_bytes�write_bytes�cancelled_write_bytes�max)r"Zprocessr%r(�statsZdisplay_format�io_delay�swapin_delayr0Z
written_bytesr1r)r%r"r�format_statsAs



r7cCsByttd�j�j��Stk
r<}zt|�dSd}~XnXdS)Nz/proc/sys/kernel/pid_max�)�len�open�read�strip�	Exception�print)�errr�get_max_pid_widthVs
r@c@seZdZdS)�CancelInputN)�__name__�
__module__�__qualname__rrrrrAdsrAc@seZdZdS)�
InvalidIntN)rBrCrDrrrrrEesrEc@seZdZdS)�
InvalidPidN)rBrCrDrrrrrFfsrFc@seZdZdS)�
InvalidTidN)rBrCrDrrrrrGgsrGc@seZdZdS)�InvalidIoprioDataN)rBrCrDrrrrrHhsrHc	@s�eZdZdd�dfdd�dfdd�dfdd�dfdd�dfd	d�dfd
d�dfdd�dfgZdd
�Zdd�Zdd�Zdd�Zdd�Zd0dd�Z	d1dd�Z
dd�Zdd�Zdd �Z
d!d"�Zd2d#d$�Zd3d&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�ZdS)4�IOTopUIcCs|jS)N)�pid)�p�srrrr)qszIOTopUI.<lambda>FcCs|j�S)N)Zioprio_sort_key)rKrLrrrr)rscCs|j�S)N)�get_user)rKrLrrrr)sscCs|jS)N)r0)rKrLrrrr)tsTcCs|j|jS)N)r1r2)rKrLrrrr)uscCs|jS)N)r/)rKrLrrrr)vscCs|jpt|jp|j�S)N)r.rr0r1)rKrLrrrr)yscCs|j�S)N)�get_cmdline)rKrLrrrr){scCst||_||_d|_tj|jd|_|jjsp||_|j�yt	j
�t	j�t	jd�Wnt	j
k
rnYnXdS)N�rr)�process_listr"�sorting_keyrI�sorting_keys�sorting_reverse�batch�win�resize�cursesZuse_default_colorsZstart_color�curs_set�error)�selfrUrPr"rrr�__init__~szIOTopUI.__init__cCs|jj�\|_|_dS)N)rUZgetmaxyx�height�width)rZrrrrV�szIOTopUI.resizec
Cs^d}tj�}|jjs.|jtjj�tjtj	B��x(|jj
dksL||jj
k�rX|jj�\}}|j
|dk|||jj�|jj
dk	r�|d7}||jj
kr�Pn|dkr�d}y|j|jjd�}WnBtjk
r�}z$|jr�|jdtjkr�g}n�WYdd}~XnXx.|D]&\}}|tjtjB@�rtjd��qW|jj�s>|j�|r2|jj�}	|j|	�q2WdS)Nrrg@�@)�select�pollr"rT�register�sys�stdin�filenoZPOLLINZPOLLPRI�
iterationsrP�refresh_processes�refresh_displayr%�
delay_secondsrY�args�errnoZEINTRZPOLLERRZPOLLHUP�exitrVrU�getch�
handle_key)
rZrdr_�total�actualZeventsr?�fdZevent�keyrrr�run�s:


zIOTopUI.runcCs|j|_dS)N)rS)rZrrr�reverse_sorting�szIOTopUI.reverse_sortingcCs�|j}|j|7_td|j�|_tttj�d|j�|_|jsh|jdkrh|dkrZd|_n|dkrhd|_||jkr�tj|jd|_dS)Nrrr8rO��)r8rO)rQr3r'r9rIrR�
has_swapin_iorS)rZZdeltaZorig_sorting_keyrrr�adjust_sorting_key�s

zIOTopUI.adjust_sorting_keyNcCs�|jjddtd�tjB|j�|jjdd|tj�|jj�tj	�tj
d�|jjdt|��}tj
d�tj
�|dkr~|S|r�t��|S)Nrr� r)Nr)rU�hline�ordrW�A_NORMALr]�addstr�A_BOLD�refreshZechorXZgetstrr9ZnoechorA)rZ�prompt�default�empty_is_cancel�inprrr�
prompt_str�s


zIOTopUI.prompt_strcCs6|j|||�}yt|�Stk
r0t��YnXdS)N)r�r�
ValueErrorrE)rZr~rr�r�rrr�
prompt_int�s
zIOTopUI.prompt_intcCs>y
|jd�Stk
r$t��Yntk
r8�YnXdS)NzPID to ionice: )r�rErFrA)rZrrr�
prompt_pid�s

zIOTopUI.prompt_pidcCs>y
|jd�Stk
r$t��Yntk
r8�YnXdS)NzTID to ionice: )r�rErGrA)rZrrr�
prompt_tid�s

zIOTopUI.prompt_tidcCsdy.|dk	r|jd||d�}n|jddd�}Wntk
rHt��YnX|dksZ|dkr`t��|S)Nz'I/O priority data (0-7, currently %s): FzI/O priority data (0-7): rrt)r�rErH)rZ�ioprio_datar�rrr�prompt_data�szIOTopUI.prompt_datacCsvy|j|�}Wntk
r&d}YnXt|�d}�x:|jjddtd�tjB|j�|jj	dd|tj
�t|�}xPt|�D]D\}}d|}	||kr�tj}
ntj}
|jj	d||	|
�|t|	�7}q|Wx�|jj
�}|tjtd�fkr�|dkr�|d8}Pq�|tjtd�fk�r ||k�r |d7}Pq�|tjtd�td�fk�rB||S|d	tjtjtjtd
�td�fkr�t��q�Wq8WdS)
Nrrrwz %s �l�r�
�
��q�Q���)�indexr�r9rUrxryrWrzr]�insstrr|�	enumerate�	A_REVERSErk�KEY_LEFT�	KEY_RIGHTZ	KEY_ENTERZ
KEY_CANCELZ	KEY_CLOSEZKEY_EXITrA)rZr~Zdisplay_listZret_listZselectedZset_len�offset�i�itemZdisplay�attrrprrr�
prompt_set�s:

zIOTopUI.prompt_setcCs8d}dddg}dddg}|dkr$d}|j||||�}|S)	NzI/O priority class: z	Real-timezBest-effortZIdleZrtZbe�idler)r�)rZ�ioprio_classr~Zclasses_promptZclasses_retr�rrr�prompt_classs

zIOTopUI.prompt_class�Error!cCsN|jjddtd�tjB|j�|jjddd|tj�|jj�t	j
d�dS)Nrrrwz  %s  )rUrxryrWrzr]r�r�r}r,Zsleep)rZrYrrr�prompt_error"s
zIOTopUI.prompt_errorcCs,|jjddtd�tjB|j�|jj�dS)Nrrrw)rUrxryrWrzr]r})rZrrr�prompt_clear(szIOTopUI.prompt_clearc"s��fdd�}�fdd�}�fdd�}�fdd�}td	�d
d�td�d
d�td��fdd�td��fdd�td�|td�|td�|td�|td�|td�|td�|td�|tj�fdd�tj�fdd�tj�fdd�tj�fdd�i}|j|dd��}|�dS)Ncs�jjdN_dS)NT)r"r*r)rZrr�toggle_accumulated-sz.IOTopUI.handle_key.<locals>.toggle_accumulatedcs�jjdN_dS)NT)r"�onlyr)rZrr�toggle_only_io/sz*IOTopUI.handle_key.<locals>.toggle_only_iocs(�jjdN_�jj��jj�dS)NT)r"�	processesrP�clearrer)rZrr�toggle_processes1s
z,IOTopUI.handle_key.<locals>.toggle_processescs`y��jjr �j�}�jj|�}n�j�}t|�jj�}|j�}t	j
|�\}}�j|�}|dkrdd}n
�j|�}|j
||��jj��jj�Wn�tk
r�}z�jd|j�WYdd}~Xn�tk
r��jd�Yn~tk
r��jd�Ynbtk
�r�jd�YnDtk
�r6�jd�Yn&tk
�rR�j�Yn
X�j�dS)Nr�rzError setting I/O priority: %szInvalid process id!zInvalid thread id!zInvalid I/O priority data!zInvalid integer!)r"r�r�rPZget_processr�r�taskstats_connection�
get_ioprior
Zto_class_and_datar�r�Z
set_ioprior�rerr��errrFrGrHrErAr�)rJZ	exec_unit�tidZioprio_valuer�r�r?)rZrr�ionice5s:



 z"IOTopUI.handle_key.<locals>.ionicer�cSs
tjd�S)Nr)rarjrrrrr)Zsz$IOTopUI.handle_key.<locals>.<lambda>r�cSs
tjd�S)Nr)rarjrrrrr)\sr�cs�j�S)N)rrr)rZrrr)^s�Rcs�j�S)N)rrr)rZrrr)`s�a�A�o�OrKrr��Ics
�jd�S)Nrr�)rvr)rZrrr)rscs
�jd�S)Nr)rvr)rZrrr)tscs�jttj��S)N)rvr9rIrRr)rZrrr)vscs�jttj��S)N)rvr9rIrRr)rZrrr)xscSsdS)Nrrrrrr){s)ryrWr�r�ZKEY_HOMEZKEY_END�get)rZrpr�r�r�r�Zkey_bindings�actionr)rZrrl,sL$




zIOTopUI.handle_keycs��fdd�}�fdd�}tt|�jjj���}tj�jd��jj	rPdd��ndd��|j
��fd	d��jd
��jjs�|�j
dd�=tt||��S)Nc
sRt�j|�jj�}|\}}}}dt}|jf}|d7}||j�f7}|d7}||j�dd�f7}|d7}|||f7}�jr�|d7}|||f7}n�jj	r�|d7}|d
7}|d	7}||}|j
�}	�jj	�s.�jt|�}
d
|
ko�t|	�kn�r.|
dd
}|
|d}|	d|�d|	|d�}	||	7}�jj	�sN|d�j�}|S)Nz%%%ddz %4sz %-8s�z
 %11s %11sz %7s %7sz %s �
?unavailable?rwrr�~)r�)
r7r"rPr%�
MAX_PID_WIDTHrJr�rMrurTrNr]r9)
rKr4r5r6r0r1�formatZparams�lineZcmdlineZremaining_lengthZlen1Zoffset2)rZrrr�s:

z IOTopUI.get_data.<locals>.formatcs�jjp|j�jj�S)N)r"r�Zdid_some_ior*)rK)rZrr�
should_format�s
z'IOTopUI.get_data.<locals>.should_formatrcSs|jS)N)r+)rKrrrr)�sz"IOTopUI.get_data.<locals>.<lambda>cSs|jS)N)r-)rKrrrr)�scs�|�|��S)Nr)rK)rp�stats_lambdarrr)�s)rp�reverser)�list�filterrPr��valuesrIrRrQr"r*�sortrSrTr\�map)rZr�r�r�r)rprZr�r�get_data~s

zIOTopUI.get_datacs�dt�j|d|�jd�t�j|d|�jd�fdt�j|d|�jd�t�j|d|�jd�fg�tdtd�d}�jjr�|d7}n|d	7}|d
ddd
dddg}tj�_�jr�t	�dkr�d�_�j
d��j�}�jj�rdg|}tj
d���fdd�|D�}�fdd��D���jj�r��jjdk�rjx�D]}t|��q8W�jjt|�k�rjtdj|��x|D]}	t|	jd���qpWtjj��n�jj�x0t��D]$\�}�jj�d|d�j���q�W�jjt��dtd�tj B�j��j}
x�t!t|��D]���j�r$�d!k�r$�qtj }|�}��j"k�rJ|dd�}��j"k�rv|tj#O}|�j$�rpd�prd7}|d|
�}|
t|�8}
�jj||��qW�jdk	�r�d}
nd}
t%t|��j&dtt'|
���}xzt!|�D]n�yN���fdd �}y||��Wn(t(k
�r0||�jd��YnXWntj)k
�rLYnX�q�W|
�rx�jj*�j&t��d|
tj#��jj+�dS)"Nz,Total DISK READ : %s | Total DISK WRITE : %sr�rz,Actual DISK READ: %s | Actual DISK WRITE: %s�rw�PIDZTIDz  PRIOz  USERz     DISK READz  DISK WRITEz  SWAPINz      IOz    COMMANDFz    TIMEz	%H:%M:%S csg|]}�|�qSrr)�.0r�)�current_timerr�
<listcomp>�sz+IOTopUI.refresh_display.<locals>.<listcomp>csg|]}�|�qSrr)r�rL)r�rrr��srrzutf-8r8rO�>�<zoCONFIG_TASK_DELAY_ACCT and kernel.task_delayacct sysctl not enabled in kernel, cannot determine SWAPIN and IO %cs �jj�t��dd|�dS)Nrr)rUr{r9)r�)r�rZ�summaryrr�
print_line�sz+IOTopUI.refresh_display.<locals>.print_line)r8rO),r&r"�rjustr3r�r�rZhas_blkio_delay_totalrurrvr�r,ZstrftimerT�quietr>r�join�encodera�stdout�flushrUZeraser�r{r]rxr9ryrWr��rangerQr|rSr'r\�bool�UnicodeEncodeErrorrYr�r})rZZ
first_timermrnr%rJZtitles�linesrLr�Zremaining_colsr��titleZ
status_msgZ	num_linesr�r)r�r�rZr�rrf�s�











 
 zIOTopUI.refresh_display)NT)NT)N)r�)rBrCrDrRr[rVrqrrrvr�r�r�r�r�r�r�r�r�rlr�rfrrrrrIns4





!


 
	
R1rIcCsf|jrtjtjtj�n$dd�}tjtj|�tjtj|�t|�}t||�}t|||�}|j	�dS)Nc_stjd�dS)Nr)rarj)rh�kwargsrrr�
clean_exit	sz$run_iotop_window.<locals>.clean_exit)
rT�signal�SIGPIPE�SIG_DFL�SIGINT�SIGTERMrrrIrq)rUr"r�r�rPZuirrr�run_iotop_windows
r�cCs�y |jrtd|�Stjt|�SWn�tk
rx}z<|jtjkrft|tj	d�tdtj	d�tj
d�n�WYdd}~XnZtjk
r�}z<t|�}|j
d�dkr�|j
d�dks�|j
d�dkr�n�WYdd}~XnXdS)N)�filea�
The Linux kernel interfaces that iotop relies on now require root priviliges
or the NET_ADMIN capability. This change occured because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.

Please do not file bugs on iotop about this.rZERRrz
nocbreak()zendwin())rTr�rW�wrapper�OSErrorriZEPERMr>ra�stderrrjrY�str�find)r"r?Zstrerrr�	run_iotops"
r�cCs�d}y:ddl}ddl}td�|jdt�t�|�|j|�}WnXtk
r�ddl}ddl	}|j
|dd�}td�|j|�|j�|j
j|�}YnX|j�|jdd	�|jd
�|jd
�tj|�dS)Nz
iotop.profrzProfiling using cProfilezcontinuation()r)Z
lineeventszProfiling using hotshotr,Zcalls�2)�cProfile�pstatsr>Zrunctx�globals�localsr�ImportError�hotshotZ
hotshot.statsZProfileZruncall�closer4�loadZ
strip_dirsZ
sort_statsZprint_statsZ
print_callees�os�remove)ZcontinuationZ	prof_filer�r�r4r�Zprofrrr�_profile6s(


r�aF%s [OPTIONS]

DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
period. SWAPIN and IO are the percentages of time the thread spent respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
which the thread is running (set using the ionice command).

Controls: left and right arrows to change the sorting column, r to invert the
sorting order, o to toggle the --only option, p to toggle the --processes
option, a to toggle the --accumulated option, i to change I/O priority, q to
quit, any other key to force a refresh.cs�ytjtjd�Wntjk
r0td�YnXtjtdtd�}|j	ddddd	d
d�|j	dd
dddd�|j	ddddddd�|j	dddddddd�|j	d d!dd"d#d$d%d&�|j	d'd(d)d*d#d+d,d&�|j	d-d.dd/d	d0d�|j	d1d2dd3d	d4d�|j	d5d6dd7d	d8d�|j	d9d:dd;d<d�|j	d=d>d?d@dAdBd�|j	dCddDd	tj
d�|j�\�}|�rt|jdEdFj
|��t���j�p�g�_�j�p��j�p��j�_�fdGdH���j�ṙfdIdJ�}t|�n��dS)KNrz8unable to set locale, falling back to the default localeziotop )Zusage�versionz-oz--only�
store_truer�Fz1only show processes or threads actually doing I/O)r��destr�helpz-bz--batchrTznon-interactive mode)r�r�r�z-nz--iterrrdZNUMz-number of iterations before ending [infinite])�typer��metavarr�z-dz--delayrrgz#delay between iterations [1 second]ZSECr)r�r�r�r�rz-pz--pid�pids�appendz"processes/threads to monitor [all]r�)r�r�r�r�r�z-uz--userr�Zuserszusers to monitor [all]ZUSERz-Pz--processesr�z$only show processes, not all threadsz-az
--accumulatedr*z)show accumulated I/O instead of bandwidthz-kz--kilobytesr!z.use kilobytes instead of a human friendly unitz-tz--timer,z.add a timestamp on each line (implies --batch)z-qz--quiet�countr�rz/suppress some lines of header (implies --batch)z	--profile�profilezUnexpected arguments: rwcst��S)N)r�r)r"rrr)�szmain.<locals>.<lambda>c	sy
��WnYnXdS)Nrr)�	main_looprr�safe_main_loop�s
zmain.<locals>.safe_main_loop)�locale�	setlocale�LC_ALL�Errorr>�optparseZOptionParser�USAGEr	Z
add_optionZ
SUPPRESS_HELP�
parse_argsrYr�rr�rTr,r�r�r�)�parserrhr�r)r�r"r�main\s\








r).Z
__future__rrWrirrrr�r^r�rar,Z
iotop.datarrrrrrZ
iotop.versionr	Ziotopr
Ziotop.iopriorrr r$r&r7r@r�r=rArErFrGrH�objectrIr�r�r��argvrrrrrr�<module>sH
$$__pycache__/vmstat.cpython-36.opt-1.pyc000064400000002056150351355630013670 0ustar003

B��Q�@sGdd�de�ZdS)c@s$eZdZdd�Zdd�Zdd�ZdS)�VmStatcCstd�|_|j�|_dS)Nz/proc/vmstat)�open�vmstat_file�read�vmstat)�self�r�/usr/lib/python3.6/vmstat.py�__init__s
zVmStat.__init__cCsddd�}x"|jD]}|jd�r||�}PqWx"|jD]}|jd�r4||�}Pq4W|jjd�||fS)NcSst|j�d�dS)N�i)�int�split)�linerrr�extractszVmStat.read.<locals>.extractzpgpgin zpgpgout �)r�
startswith�seek)rrr
ZpgpginZpgpgoutrrrrs

zVmStat.readcCs6|j�}|d|jd|d|jdf}||_|S)Nrr
)rr)rZnow�deltarrrr)s$zVmStat.deltaN)�__name__�
__module__�__qualname__r	rrrrrrrsrN)�objectrrrrr�<module>s__pycache__/ioprio.cpython-36.opt-1.pyc000064400000010102150351355630013642 0ustar003

B��Qw�@s�ddlZddlZddlZddlZdBdCdDdEdFdGdHdIdJdKdLgZdMdNdOdPdQdRdSdTdUdVdWgZd"d#�ZGd$d%�d%e�Zee�Z	ee�Z
yejdd&d'�ZWn e
k
�r�ejd�ZYnXejZdd(d)d*gZd+Zd,Zd+e>d+Zd-d.�Zd/d0�Zd1d2�ZejZed3�\ZZZZZZejZdZd4d5�Z d6d7�Z!d8d9�Z"d:d;�Z#d<d=�Z$e%d>k�r�ddl&Z&e'e&j(�d?k�rle)e&j(d+�Z*nej+�Z*e,d@e*�e,dAe!e*��dS)X�N�alpha�*��arm*�;�i*86�"�ia64*��parisc*��powerpc*��s390*��sparc*���sh*�!�x86_64*�32bit�64bit���:������� �cCsLtj�d}tj�d}x.|D]&\}}}tj||�rtj||�r|SqWdS)N�r)�os�uname�platformZarchitecture�fnmatch)Zsyscall_listZarch�bitsZcandidate_archZcandidate_bitsZ
syscall_nr�r(�/usr/lib/python3.6/ioprio.py�find_ioprio_syscall_number9sr*c@seZdZdd�ZdS)�IoprioSetErrorcCs0ytj|�|_Wntk
r*||_YnXdS)N)r#�strerror�err�	TypeError)�selfr-r(r(r)�__init__CszIoprioSetError.__init__N)�__name__�
__module__�__qualname__r0r(r(r(r)r+Bsr+T)�	use_errnoZrtZbe�idle��
cCs:ytj|�}Wntk
r,tjd�}YnX|t>|BS)N)�PRIORITY_CLASSES�index�
ValueError�IOPRIO_CLASS_SHIFT)�ioprio_class�ioprio_datar(r(r)�ioprio_valueYs
r>cCst|t?S)N)r8r;)�ioprior(r(r)r<`sr<cCs|t@S)N)�IOPRIO_PRIO_MASK)r?r(r(r)r=csr=�cCsJt|�}tt|�}|dd}|ttfkr2d|S|tkr>dSd|SdS)N��zrt/%dr5zbe/%d)�sched_getscheduler�getpriority�PRIO_PROCESS�
SCHED_FIFO�SCHED_RR�
SCHED_IDLE)�pidZ	scheduler�niceZioprio_nicer(r(r)�get_ioprio_from_schedls
rLcCsTtdkrdSttt|�}|dkr$dSt|�}|s8t|�S|dkrD|Sd|t|�fS)Nz?sysrz?errr5z%s/%d)�__NR_ioprio_get�syscall�IOPRIO_WHO_PROCESSr<rLr=)rJr?Z
prio_classr(r(r)�getxsrPcCsftdkrtd��t||�}tt|||dd�}|dkrbytj�}Wntk
rXd}YnXt|��dS)NzNo ioprio_set syscall foundT)r4rz<Unknown error (errno support not available before Python2.6))�__NR_ioprio_setr+r>rN�ctypesZ	get_errno�AttributeError)ZwhichZwhor<r=Z
ioprio_val�retr-r(r(r)�
set_ioprio�s

rUcCst|ddkrt|d�Sd|krT|jd�r2d}n|jd�r@d}t|jd�d�}n|dkrdd}d}d|t>|S)	Nr�?r6�/zrt/zbe/r5�)�ord�
startswith�int�splitr;)�keyZshiftZprior(r(r)�sort_key�s

r^cCs6d|kr&|jd�}|dt|d�fS|dkr2dSdS)NrWrr6r5)r5r)NN)r\r[)Z
ioprio_strr\r(r(r)�to_class_and_data�s
r_�__main__rXzpid:zioprio:)rrr)rrr)rrr)r	rr
)rrr)r
rr)rrr)rrr)rrr)rrr)rrr)rrr)rrr)rrr)r	rr)rrr)r
rr)rrr)rrr)rrr )rrr)rrr!)-rRr&r#r%ZIOPRIO_GET_ARCH_SYSCALLZIOPRIO_SET_ARCH_SYSCALLr*�	Exceptionr+rMrQZCDLLZ
ctypes_handler.rNr8rOr;r@r>r<r=rD�range�SCHED_OTHERrGrH�SCHED_BATCHZ	SCHED_ISOrIrErFrLrPrUr^r_r1�sys�len�argvr[rJ�getpid�printr(r(r(r)�<module>sr	


ui.py000064400000061261150351355630005547 0ustar00# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
#
# See the COPYING file for license information.
#
# Copyright (c) 2007 Guillaume Chazarain <guichaz@gmail.com>

# Allow printing with same syntax in Python 2/3
from __future__ import print_function

import curses
import errno
import locale
import math
import optparse
import os
import select
import signal
import sys
import time

from iotop.data import find_uids, TaskStatsNetlink, ProcessList, Stats, sysctl_task_delayacct
from iotop.data import ThreadInfo
from iotop.version import VERSION
from iotop import ioprio
from iotop.ioprio import IoprioSetError

#
# Utility functions for the UI
#

UNITS = ['B', 'K', 'M', 'G', 'T', 'P', 'E']

def human_size(size):
    if size > 0:
        sign = ''
    elif size < 0:
        sign = '-'
        size = -size
    else:
        return '0.00 B'

    expo = int(math.log(size / 2, 2) / 10)
    return '%s%.2f %s' % (sign, (float(size) / (1 << (10 * expo))), UNITS[expo])

def format_size(options, bytes):
    if options.kilobytes:
        return '%.2f K' % (bytes / 1024.0)
    return human_size(bytes)

def format_bandwidth(options, size, duration):
    return format_size(options, size and float(size) / duration) + '/s'

def format_stats(options, process, duration):
    # Keep in sync with TaskStatsNetlink.members_offsets and
    # IOTopUI.get_data(self)
    def delay2percent(delay): # delay in ns, duration in s
        return '%.2f %%' % min(99.99, delay / (duration * 10000000.0))
    if options.accumulated:
        stats = process.stats_accum
        display_format = lambda size, duration: format_size(options, size)
        duration = time.time() - process.stats_accum_timestamp
    else:
        stats = process.stats_delta
        display_format = lambda size, duration: format_bandwidth(
                                                        options, size, duration)
    io_delay = delay2percent(stats.blkio_delay_total)
    swapin_delay = delay2percent(stats.swapin_delay_total)
    read_bytes = display_format(stats.read_bytes, duration)
    written_bytes = stats.write_bytes - stats.cancelled_write_bytes
    written_bytes = max(0, written_bytes)
    write_bytes = display_format(written_bytes, duration)
    return io_delay, swapin_delay, read_bytes, write_bytes

def get_max_pid_width():
    try:
        return len(open('/proc/sys/kernel/pid_max').read().strip())
    except Exception as e:
        print(e)
        # Reasonable default in case something fails
        return 5

MAX_PID_WIDTH = get_max_pid_width()

#
# UI Exceptions
#

class CancelInput(Exception): pass
class InvalidInt(Exception): pass
class InvalidPid(Exception): pass
class InvalidTid(Exception): pass
class InvalidIoprioData(Exception): pass

#
# The UI
#

class IOTopUI(object):
    # key, reverse
    sorting_keys = [
        (lambda p, s: p.pid, False),
        (lambda p, s: p.ioprio_sort_key(), False),
        (lambda p, s: p.get_user(), False),
        (lambda p, s: s.read_bytes, True),
        (lambda p, s: s.write_bytes - s.cancelled_write_bytes, True),
        (lambda p, s: s.swapin_delay_total, True),
        # The default sorting (by I/O % time) should show processes doing
        # only writes, without waiting on them
        (lambda p, s: s.blkio_delay_total or
                      int(not(not(s.read_bytes or s.write_bytes))), True),
        (lambda p, s: p.get_cmdline(), False),
    ]

    def __init__(self, win, process_list, options):
        self.process_list = process_list
        self.options = options
        self.sorting_key = 6
        self.sorting_reverse = IOTopUI.sorting_keys[self.sorting_key][1]
        if not self.options.batch:
            self.win = win
            self.resize()
            try:
                curses.use_default_colors()
                curses.start_color()
                curses.curs_set(0)
            except curses.error:
                # This call can fail with misconfigured terminals, for example
                # TERM=xterm-color. This is harmless
                pass

    def resize(self):
        self.height, self.width = self.win.getmaxyx()

    def run(self):
        iterations = 0
        poll = select.poll()
        if not self.options.batch:
            poll.register(sys.stdin.fileno(), select.POLLIN|select.POLLPRI)
        while self.options.iterations is None or \
              iterations < self.options.iterations:
            total, actual = self.process_list.refresh_processes()
            self.refresh_display(iterations == 0, total, actual,
                                 self.process_list.duration)
            if self.options.iterations is not None:
                iterations += 1
                if iterations >= self.options.iterations:
                    break
            elif iterations == 0:
                iterations = 1

            try:
                events = poll.poll(self.options.delay_seconds * 1000.0)
            except select.error as e:
                if e.args and e.args[0] == errno.EINTR:
                    events = []
                else:
                    raise
            for (fd, event) in events:
                if event & (select.POLLERR | select.POLLHUP):
                    sys.exit(1)
            if not self.options.batch:
                self.resize()
            if events:
                key = self.win.getch()
                self.handle_key(key)

    def reverse_sorting(self):
        self.sorting_reverse = not self.sorting_reverse

    def adjust_sorting_key(self, delta):
        orig_sorting_key = self.sorting_key
        self.sorting_key += delta
        self.sorting_key = max(0, self.sorting_key)
        self.sorting_key = min(len(IOTopUI.sorting_keys) - 1, self.sorting_key)
        if not self.has_swapin_io:
            if self.sorting_key in (5, 6):
                if delta <= 0:
                    self.sorting_key = 4
                elif delta > 0:
                    self.sorting_key = 7
        if orig_sorting_key != self.sorting_key:
            self.sorting_reverse = IOTopUI.sorting_keys[self.sorting_key][1]

    # I wonder if switching to urwid for the display would be better here

    def prompt_str(self, prompt, default=None, empty_is_cancel=True):
        self.win.hline(1, 0, ord(' ') | curses.A_NORMAL, self.width)
        self.win.addstr(1, 0, prompt, curses.A_BOLD)
        self.win.refresh()
        curses.echo()
        curses.curs_set(1)
        inp = self.win.getstr(1, len(prompt))
        curses.curs_set(0)
        curses.noecho()
        if inp not in (None, ''):
            return inp
        if empty_is_cancel:
            raise CancelInput()
        return default

    def prompt_int(self, prompt, default = None, empty_is_cancel = True):
        inp = self.prompt_str(prompt, default, empty_is_cancel)
        try:
            return int(inp)
        except ValueError:
            raise InvalidInt()

    def prompt_pid(self):
        try:
            return self.prompt_int('PID to ionice: ')
        except InvalidInt:
            raise InvalidPid()
        except CancelInput:
            raise

    def prompt_tid(self):
        try:
            return self.prompt_int('TID to ionice: ')
        except InvalidInt:
            raise InvalidTid()
        except CancelInput:
            raise

    def prompt_data(self, ioprio_data):
        try:
            if ioprio_data is not None:
                inp = self.prompt_int('I/O priority data (0-7, currently %s): '
                                      % ioprio_data, ioprio_data, False)
            else:
                inp = self.prompt_int('I/O priority data (0-7): ', None, False)
        except InvalidInt:
            raise InvalidIoprioData()
        if inp < 0 or inp > 7:
            raise InvalidIoprioData()
        return inp

    def prompt_set(self, prompt, display_list, ret_list, selected):
        try:
            selected = ret_list.index(selected)
        except ValueError:
            selected = -1
        set_len = len(display_list) - 1
        while True:
            self.win.hline(1, 0, ord(' ') | curses.A_NORMAL, self.width)
            self.win.insstr(1, 0, prompt, curses.A_BOLD)
            offset = len(prompt)
            for i, item in enumerate(display_list):
                display = ' %s ' % item
                if i is selected:
                    attr = curses.A_REVERSE
                else:
                    attr = curses.A_NORMAL
                self.win.insstr(1, offset, display, attr)
                offset += len(display)
            while True:
                key = self.win.getch()
                if key in (curses.KEY_LEFT, ord('l')) and selected > 0:
                    selected -= 1
                    break
                elif key in (curses.KEY_RIGHT, ord('r')) and selected < set_len:
                    selected += 1
                    break
                elif key in (curses.KEY_ENTER, ord('\n'), ord('\r')):
                    return ret_list[selected]
                elif key in (27, curses.KEY_CANCEL, curses.KEY_CLOSE,
                             curses.KEY_EXIT, ord('q'), ord('Q')):
                    raise CancelInput()

    def prompt_class(self, ioprio_class=None):
        prompt = 'I/O priority class: '
        classes_prompt = ['Real-time', 'Best-effort', 'Idle']
        classes_ret = ['rt', 'be', 'idle']
        if ioprio_class is None:
            ioprio_class = 2
        inp = self.prompt_set(prompt, classes_prompt, classes_ret, ioprio_class)
        return inp

    def prompt_error(self, error = 'Error!'):
        self.win.hline(1, 0, ord(' ') | curses.A_NORMAL, self.width)
        self.win.insstr(1, 0, '  %s  ' % error, curses.A_REVERSE)
        self.win.refresh()
        time.sleep(1)

    def prompt_clear(self):
        self.win.hline(1, 0, ord(' ') | curses.A_NORMAL, self.width)
        self.win.refresh()

    def handle_key(self, key):
        def toggle_accumulated():
            self.options.accumulated ^= True
        def toggle_only_io():
            self.options.only ^= True
        def toggle_processes():
            self.options.processes ^= True
            self.process_list.clear()
            self.process_list.refresh_processes()
        def ionice():
            try:
                if self.options.processes:
                    pid = self.prompt_pid()
                    exec_unit = self.process_list.get_process(pid)
                else:
                    tid = self.prompt_tid()
                    exec_unit = ThreadInfo(tid,
                                         self.process_list.taskstats_connection)
                ioprio_value = exec_unit.get_ioprio()
                (ioprio_class, ioprio_data) = \
                                          ioprio.to_class_and_data(ioprio_value)
                ioprio_class = self.prompt_class(ioprio_class)
                if ioprio_class == 'idle':
                    ioprio_data = 0
                else:
                    ioprio_data = self.prompt_data(ioprio_data)
                exec_unit.set_ioprio(ioprio_class, ioprio_data)
                self.process_list.clear()
                self.process_list.refresh_processes()
            except IoprioSetError as e:
                self.prompt_error('Error setting I/O priority: %s' % e.err)
            except InvalidPid:
                self.prompt_error('Invalid process id!')
            except InvalidTid:
                self.prompt_error('Invalid thread id!')
            except InvalidIoprioData:
                self.prompt_error('Invalid I/O priority data!')
            except InvalidInt:
                self.prompt_error('Invalid integer!')
            except CancelInput:
                self.prompt_clear()
            else:
                self.prompt_clear()

        key_bindings = {
            ord('q'):
                lambda: sys.exit(0),
            ord('Q'):
                lambda: sys.exit(0),
            ord('r'):
                lambda: self.reverse_sorting(),
            ord('R'):
                lambda: self.reverse_sorting(),
            ord('a'):
                toggle_accumulated,
            ord('A'):
                toggle_accumulated,
            ord('o'):
                toggle_only_io,
            ord('O'):
                toggle_only_io,
            ord('p'):
                toggle_processes,
            ord('P'):
                toggle_processes,
            ord('i'):
                ionice,
            ord('I'):
                ionice,
            curses.KEY_LEFT:
                lambda: self.adjust_sorting_key(-1),
            curses.KEY_RIGHT:
                lambda: self.adjust_sorting_key(1),
            curses.KEY_HOME:
                lambda: self.adjust_sorting_key(-len(IOTopUI.sorting_keys)),
            curses.KEY_END:
                lambda: self.adjust_sorting_key(len(IOTopUI.sorting_keys))
        }

        action = key_bindings.get(key, lambda: None)
        action()

    def get_data(self):
        def format(p):
            stats = format_stats(self.options, p, self.process_list.duration)
            io_delay, swapin_delay, read_bytes, write_bytes = stats
            format = '%%%dd' % MAX_PID_WIDTH
            params = p.pid,
            format += ' %4s'
            params += p.get_ioprio(),
            format += ' %-8s'
            params += p.get_user()[:8],
            format += ' %11s %11s'
            params += read_bytes, write_bytes
            if self.has_swapin_io:
                format += ' %7s %7s'
                params += swapin_delay, io_delay
            elif self.options.batch:
                format += ' %s '
                params += '?unavailable?',
            format += ' '
            line = format % (params)
            cmdline = p.get_cmdline()
            if not self.options.batch:
                remaining_length = self.width - len(line)
                if 2 < remaining_length < len(cmdline):
                    len1 = (remaining_length - 1) // 2
                    offset2 = -(remaining_length - len1 - 1)
                    cmdline = cmdline[:len1] + '~' + cmdline[offset2:]
            line += cmdline
            if not self.options.batch:
                line = line[:self.width]
            return line

        def should_format(p):
            return not self.options.only or \
                   p.did_some_io(self.options.accumulated)

        processes = list(filter(should_format,
                                self.process_list.processes.values()))
        key = IOTopUI.sorting_keys[self.sorting_key][0]
        if self.options.accumulated:
            stats_lambda = lambda p: p.stats_accum
        else:
            stats_lambda = lambda p: p.stats_delta
        processes.sort(key=lambda p: key(p, stats_lambda(p)),
                       reverse=self.sorting_reverse)
        if not self.options.batch:
            del processes[self.height - 2:]
        return list(map(format, processes))

    def refresh_display(self, first_time, total, actual, duration):
        summary = [
                'Total DISK READ : %s | Total DISK WRITE : %s' % (
                format_bandwidth(self.options, total[0], duration).rjust(14),
                format_bandwidth(self.options, total[1], duration).rjust(14)),
                'Actual DISK READ: %s | Actual DISK WRITE: %s' % (
                format_bandwidth(self.options, actual[0], duration).rjust(14),
                format_bandwidth(self.options, actual[1], duration).rjust(14))
        ]

        pid = max(0, (MAX_PID_WIDTH - 3)) * ' '
        if self.options.processes:
            pid += 'PID'
        else:
            pid += 'TID'
        titles = [pid, '  PRIO', '  USER', '     DISK READ', '  DISK WRITE',
                  '  SWAPIN', '      IO', '    COMMAND']
        self.has_swapin_io = Stats.has_blkio_delay_total
        if self.has_swapin_io:
            # Linux kernels without the sysctl return None and
            # iotop just uses the heuristic for those versions.
            # Linux kernels with the sysctl return True or False
            # and iotop then uses the sysctl value instead.
            if sysctl_task_delayacct() == False:
                self.has_swapin_io = False
        self.adjust_sorting_key(0)
        lines = self.get_data()
        if self.options.time:
            titles = ['    TIME'] + titles
            current_time = time.strftime('%H:%M:%S ')
            lines = [current_time + l for l in lines]
            summary = [current_time + s for s in summary]
        if self.options.batch:
            if self.options.quiet <= 2:
                for s in summary:
                    print(s)
                if self.options.quiet <= int(first_time):
                    print(''.join(titles))
            for l in lines:
                print(l.encode('utf-8'))
            sys.stdout.flush()
        else:
            self.win.erase()
            for i, s in enumerate(summary):
                self.win.addstr(i, 0, s[:self.width])
            self.win.hline(len(summary), 0, ord(' ') | curses.A_REVERSE,
                           self.width)
            remaining_cols = self.width
            for i in range(len(titles)):
                if not self.has_swapin_io and i in (5, 6):
                    continue
                attr = curses.A_REVERSE
                title = titles[i]
                if i == self.sorting_key:
                    title = title[1:]
                if i == self.sorting_key:
                    attr |= curses.A_BOLD
                    title += self.sorting_reverse and '>' or '<'
                title = title[:remaining_cols]
                remaining_cols -= len(title)
                self.win.addstr(title, attr)
            if self.has_swapin_io is not False:
                status_msg = None
            else:
                status_msg = ('CONFIG_TASK_DELAY_ACCT '
                              'and kernel.task_delayacct sysctl '
                              'not enabled in kernel, '
                              'cannot determine SWAPIN and IO %')
            num_lines = min(len(lines), self.height - 2 - int(bool(status_msg)))
            for i in range(num_lines):
                try:
                    def print_line(line):
                        self.win.addstr(i + len(summary) + 1, 0, line)
                    try:
                        print_line(lines[i])
                    except UnicodeEncodeError:
                        # Python2: 'ascii' codec can't encode character ...
                        # http://bugs.debian.org/708252
                        print_line(lines[i].encode('utf-8'))
                except curses.error:
                    pass
            if status_msg:
                self.win.insstr(self.height - len(summary), 0, status_msg,
                                curses.A_BOLD)
            self.win.refresh()

def run_iotop_window(win, options):
    if options.batch:
        signal.signal(signal.SIGPIPE, signal.SIG_DFL)
    else:
        def clean_exit(*args, **kwargs):
            sys.exit(0)
        signal.signal(signal.SIGINT, clean_exit)
        signal.signal(signal.SIGTERM, clean_exit)
    taskstats_connection = TaskStatsNetlink(options)
    process_list = ProcessList(taskstats_connection, options)
    ui = IOTopUI(win, process_list, options)
    ui.run()

def run_iotop(options):
    try:
        if options.batch:
            return run_iotop_window(None, options)
        else:
            return curses.wrapper(run_iotop_window, options)
    except OSError as e:
        if e.errno == errno.EPERM:
            print(e, file=sys.stderr)
            print('''
The Linux kernel interfaces that iotop relies on now require root priviliges
or the NET_ADMIN capability. This change occured because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.

Please do not file bugs on iotop about this.''', file=sys.stderr)
            sys.exit(1)
        else:
            raise
    except curses.error as e:
        stre = str(e)
        if stre.find('ERR')>=0 and (
            stre.find('nocbreak()')>=0 or stre.find('endwin()')>=0
            ):
            pass
            # endwin and nocbreak can cause error (and raise hard to catch 
            # exception) if iotop was running in the terminal and that 
            # terminal got closed while iotop was still running
        else:
            raise

#
# Profiling
#

def _profile(continuation):
    prof_file = 'iotop.prof'
    try:
        import cProfile
        import pstats
        print('Profiling using cProfile')
        cProfile.runctx('continuation()', globals(), locals(), prof_file)
        stats = pstats.Stats(prof_file)
    except ImportError:
        import hotshot
        import hotshot.stats
        prof = hotshot.Profile(prof_file, lineevents=1)
        print('Profiling using hotshot')
        prof.runcall(continuation)
        prof.close()
        stats = hotshot.stats.load(prof_file)
    stats.strip_dirs()
    stats.sort_stats('time', 'calls')
    stats.print_stats(50)
    stats.print_callees(50)
    os.remove(prof_file)

#
# Main program
#

USAGE = '''%s [OPTIONS]

DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
period. SWAPIN and IO are the percentages of time the thread spent respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
which the thread is running (set using the ionice command).

Controls: left and right arrows to change the sorting column, r to invert the
sorting order, o to toggle the --only option, p to toggle the --processes
option, a to toggle the --accumulated option, i to change I/O priority, q to
quit, any other key to force a refresh.''' % sys.argv[0]

def main():
    try:
        locale.setlocale(locale.LC_ALL, '')
    except locale.Error:
        print('unable to set locale, falling back to the default locale')
    parser = optparse.OptionParser(usage=USAGE, version='iotop ' + VERSION)
    parser.add_option('-o', '--only', action='store_true',
                      dest='only', default=False,
                      help='only show processes or threads actually doing I/O')
    parser.add_option('-b', '--batch', action='store_true', dest='batch',
                      help='non-interactive mode')
    parser.add_option('-n', '--iter', type='int', dest='iterations',
                      metavar='NUM',
                      help='number of iterations before ending [infinite]')
    parser.add_option('-d', '--delay', type='float', dest='delay_seconds',
                      help='delay between iterations [1 second]',
                      metavar='SEC', default=1)
    parser.add_option('-p', '--pid', type='int', dest='pids', action='append',
                      help='processes/threads to monitor [all]', metavar='PID')
    parser.add_option('-u', '--user', type='str', dest='users', action='append',
                      help='users to monitor [all]', metavar='USER')
    parser.add_option('-P', '--processes', action='store_true',
                      dest='processes', default=False,
                      help='only show processes, not all threads')
    parser.add_option('-a', '--accumulated', action='store_true',
                      dest='accumulated', default=False,
                      help='show accumulated I/O instead of bandwidth')
    parser.add_option('-k', '--kilobytes', action='store_true',
                      dest='kilobytes', default=False,
                      help='use kilobytes instead of a human friendly unit')
    parser.add_option('-t', '--time', action='store_true', dest='time',
                      help='add a timestamp on each line (implies --batch)')
    parser.add_option('-q', '--quiet', action='count', dest='quiet', default=0,
                      help='suppress some lines of header (implies --batch)')
    parser.add_option('--profile', action='store_true', dest='profile',
                      default=False, help=optparse.SUPPRESS_HELP)

    options, args = parser.parse_args()
    if args:
        parser.error('Unexpected arguments: ' + ' '.join(args))
    find_uids(options)
    options.pids = options.pids or []
    options.batch = options.batch or options.time or options.quiet

    main_loop = lambda: run_iotop(options)

    if options.profile:
        def safe_main_loop():
            try:
                main_loop()
            except:
                pass
        _profile(safe_main_loop)
    else:
        main_loop()

netlink.py000064400000017323150351355630006576 0ustar00'''
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
'''

import os
import socket
import struct

try:
    # try to use python 2.5's netlink support
    _dummysock = socket.socket(socket.AF_NETLINK, socket.SOCK_RAW, 0)
    _dummysock.bind((0, 0))
    del _dummysock
    def _nl_bind(descriptor, addr):
        descriptor.bind(addr)
    def _nl_getsockname(descriptor):
        return descriptor.getsockname()
    def _nl_send(descriptor, msg):
        descriptor.send(msg)
    def _nl_recv(descriptor, bufs=16384):
        return descriptor.recvfrom(bufs)
except socket.error:
    # or fall back to the _netlink C module
    try:
        import _netlink
        def _nl_bind(descriptor, addr):
            _netlink.bind(descriptor.fileno(), addr[1])
        def _nl_getsockname(descriptor):
            return _netlink.getsockname(descriptor.fileno())
        def _nl_send(descriptor, msg):
            _netlink.send(descriptor.fileno(), msg)
        def _nl_recv(descriptor, bufs=16384):
            return _netlink.recvfrom(descriptor.fileno(), bufs)
    except ImportError:
        # or fall back to the ctypes module
        import ctypes

        libc = ctypes.CDLL(None)

        class SOCKADDR_NL(ctypes.Structure):
            _fields_ = [("nl_family", ctypes.c_ushort),
                        ("nl_pad",    ctypes.c_ushort),
                        ("nl_pid",    ctypes.c_int),
                        ("nl_groups", ctypes.c_int)]

        def _nl_bind(descriptor, addr):
            addr = SOCKADDR_NL(socket.AF_NETLINK, 0, os.getpid(), 0)
            return libc.bind(descriptor.fileno(),
                             ctypes.pointer(addr),
                             ctypes.sizeof(addr))

        def _nl_getsockname(descriptor):
            addr = SOCKADDR_NL(0, 0, 0, 0)
            len = ctypes.c_int(ctypes.sizeof(addr));
            libc.getsockname(descriptor.fileno(),
                             ctypes.pointer(addr),
                             ctypes.pointer(len))
            return addr.nl_pid, addr.nl_groups;

        def _nl_send(descriptor, msg):
            return libc.send(descriptor.fileno(), msg, len(msg), 0);

        def _nl_recv(descriptor, bufs=16384):
            addr = SOCKADDR_NL(0, 0, 0, 0)
            len = ctypes.c_int(ctypes.sizeof(addr))
            buf = ctypes.create_string_buffer(bufs)

            r = libc.recvfrom(descriptor.fileno(),
                              buf, bufs, 0,
                              ctypes.pointer(addr), ctypes.pointer(len))

            ret = ctypes.string_at(ctypes.pointer(buf), r)
            return ret, (addr.nl_pid, addr.nl_groups)


# flags
NLM_F_REQUEST  = 1
NLM_F_MULTI    = 2
NLM_F_ACK      = 4
NLM_F_ECHO     = 8

# types
NLMSG_NOOP     = 1
NLMSG_ERROR    = 2
NLMSG_DONE     = 3
NLMSG_OVERRUN  = 4
NLMSG_MIN_TYPE = 0x10

class Attr:
    def __init__(self, attr_type, data, *values):
        self.type = attr_type
        if len(values):
            self.data = struct.pack(data, *values)
        else:
            self.data = data

    def _dump(self):
        hdr = struct.pack("HH", len(self.data)+4, self.type)
        length = len(self.data)
        pad = ((length + 4 - 1) & ~3 ) - length
        return hdr + self.data + b'\0' * pad

    def __repr__(self):
        return '<Attr type %d, data "%s">' % (self.type, repr(self.data))

    def u16(self):
        return struct.unpack('H', self.data)[0]
    def s16(self):
        return struct.unpack('h', self.data)[0]
    def u32(self):
        return struct.unpack('I', self.data)[0]
    def s32(self):
        return struct.unpack('i', self.data)[0]
    def str(self):
        return self.data
    def nulstr(self):
        return self.data.split('\0')[0]
    def nested(self):
        return parse_attributes(self.data)

class StrAttr(Attr):
    def __init__(self, attr_type, data):
        Attr.__init__(self, attr_type, "%ds" % len(data), data.encode('utf-8'))

class NulStrAttr(Attr):
    def __init__(self, attr_type, data):
        Attr.__init__(self, attr_type, "%dsB" % len(data), data.encode('utf-8'), 0)

class U32Attr(Attr):
    def __init__(self, attr_type, val):
        Attr.__init__(self, attr_type, "I", val)

class U8Attr(Attr):
    def __init__(self, attr_type, val):
        Attr.__init__(self, attr_type, "B", val)

class Nested(Attr):
    def __init__(self, attr_type, attrs):
        self.attrs = attrs
        self.type = attr_type

    def _dump(self):
        contents = []
        for attr in self.attrs:
            contents.append(attr._dump())
        contents = ''.join(contents)
        length = len(contents)
        hdr = struct.pack("HH", length+4, self.type)
        return hdr + contents

NETLINK_ROUTE          = 0
NETLINK_UNUSED         = 1
NETLINK_USERSOCK       = 2
NETLINK_FIREWALL       = 3
NETLINK_INET_DIAG      = 4
NETLINK_NFLOG          = 5
NETLINK_XFRM           = 6
NETLINK_SELINUX        = 7
NETLINK_ISCSI          = 8
NETLINK_AUDIT          = 9
NETLINK_FIB_LOOKUP     = 10
NETLINK_CONNECTOR      = 11
NETLINK_NETFILTER      = 12
NETLINK_IP6_FW         = 13
NETLINK_DNRTMSG        = 14
NETLINK_KOBJECT_UEVENT = 15
NETLINK_GENERIC        = 16

class Message:
    def __init__(self, msg_type, flags=0, seq=-1, payload=None):
        self.type = msg_type
        self.flags = flags
        self.seq = seq
        self.pid = -1
        payload = payload or []
        if isinstance(payload, list):
            contents = []
            for attr in payload:
                contents.append(attr._dump())
            self.payload = b''.join(contents)
        else:
            self.payload = payload

    def send(self, conn):
        if self.seq == -1:
            self.seq = conn.seq()

        self.pid = conn.pid
        length = len(self.payload)

        hdr = struct.pack("IHHII", length + 4*4, self.type,
                          self.flags, self.seq, self.pid)
        conn.send(hdr + self.payload)

    def __repr__(self):
        return '<netlink.Message type=%d, pid=%d, seq=%d, flags=0x%x "%s">' % (
            self.type, self.pid, self.seq, self.flags, repr(self.payload))

class Connection:
    def __init__(self, nltype, groups=0, unexpected_msg_handler=None):
        self.descriptor = socket.socket(socket.AF_NETLINK,
                                        socket.SOCK_RAW, nltype)
        self.descriptor.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536)
        self.descriptor.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)
        _nl_bind(self.descriptor, (0, groups))
        self.pid, self.groups = _nl_getsockname(self.descriptor)
        self._seq = 0
        self.unexpected = unexpected_msg_handler
    def send(self, msg):
        _nl_send(self.descriptor, msg)
    def recv(self):
        contents, (nlpid, nlgrps) = _nl_recv(self.descriptor)
        # XXX: python doesn't give us message flags, check
        #      len(contents) vs. msglen for TRUNC
        msglen, msg_type, flags, seq, pid = struct.unpack("IHHII",
                                                          contents[:16])
        msg = Message(msg_type, flags, seq, contents[16:])
        msg.pid = pid
        if msg.type == NLMSG_ERROR:
            errno = -struct.unpack("i", msg.payload[:4])[0]
            if errno != 0:
                err = OSError("Netlink error: %s (%d)" % (
                                                     os.strerror(errno), errno))
                err.errno = errno
                raise err
        return msg
    def seq(self):
        self._seq += 1
        return self._seq

def parse_attributes(data):
    attrs = {}
    while len(data):
        attr_len, attr_type = struct.unpack("HH", data[:4])
        attrs[attr_type] = Attr(attr_type, data[4:attr_len])
        attr_len = ((attr_len + 4 - 1) & ~3 )
        data = data[attr_len:]
    return attrs
ioprio.py000064400000012567150351355630006440 0ustar00# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
#
# See the COPYING file for license information.
#
# Copyright (c) 2007 Guillaume Chazarain <guichaz@gmail.com>

import ctypes
import fnmatch
import os
import platform

# From http://git.kernel.org/?p=utils/util-linux-ng/util-linux-ng.git;a=blob;
#      f=configure.ac;h=770eb45ae85d32757fc3cff1d70a7808a627f9f7;hb=HEAD#l354
# i386 bit userspace under an x86_64 kernel will have its uname() appear as
# 'x86_64' but it will use the i386 syscall number, that's why we consider both
# the architecture name and the word size.
IOPRIO_GET_ARCH_SYSCALL = [
    ('alpha',       '*',  443),
    ('arm*',        '*',  315),
    ('i*86',        '*',  290),
    ('ia64*',       '*', 1275),
    ('parisc*',     '*',  268),
    ('powerpc*',    '*',  274),
    ('s390*',       '*',  283),
    ('sparc*',      '*',  218),
    ('sh*',         '*',  289),
    ('x86_64*', '32bit',  290),
    ('x86_64*', '64bit',  252),
]

IOPRIO_SET_ARCH_SYSCALL = [
    ('alpha',       '*',  442),
    ('arm*',        '*',  314),
    ('i*86',        '*',  289),
    ('ia64*',       '*', 1274),
    ('parisc*',     '*',  267),
    ('powerpc*',    '*',  273),
    ('s390*',       '*',  282),
    ('sparc*',      '*',  196),
    ('sh*',         '*',  288),
    ('x86_64*',  '32bit', 289),
    ('x86_64*',  '64bit', 251),
]

def find_ioprio_syscall_number(syscall_list):
    arch = os.uname()[4]
    bits = platform.architecture()[0]

    for candidate_arch, candidate_bits, syscall_nr in syscall_list:
        if fnmatch.fnmatch(arch, candidate_arch) and \
           fnmatch.fnmatch(bits, candidate_bits):
            return syscall_nr

class IoprioSetError(Exception):
    def __init__(self, err):
        try:
            self.err = os.strerror(err)
        except TypeError:
            self.err = err

__NR_ioprio_get = find_ioprio_syscall_number(IOPRIO_GET_ARCH_SYSCALL)
__NR_ioprio_set = find_ioprio_syscall_number(IOPRIO_SET_ARCH_SYSCALL)

try:
    ctypes_handle = ctypes.CDLL(None, use_errno=True)
except TypeError:
    ctypes_handle = ctypes.CDLL(None)

syscall = ctypes_handle.syscall

PRIORITY_CLASSES = [None, 'rt', 'be', 'idle']

IOPRIO_WHO_PROCESS = 1
IOPRIO_CLASS_SHIFT = 13
IOPRIO_PRIO_MASK = (1 << IOPRIO_CLASS_SHIFT) - 1

def ioprio_value(ioprio_class, ioprio_data):
    try:
        ioprio_class = PRIORITY_CLASSES.index(ioprio_class)
    except ValueError:
        ioprio_class = PRIORITY_CLASSES.index(None)
    return (ioprio_class << IOPRIO_CLASS_SHIFT) | ioprio_data

def ioprio_class(ioprio):
    return PRIORITY_CLASSES[ioprio >> IOPRIO_CLASS_SHIFT]

def ioprio_data(ioprio):
    return ioprio & IOPRIO_PRIO_MASK

sched_getscheduler = ctypes_handle.sched_getscheduler
SCHED_OTHER, SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, SCHED_IDLE = range(6)

getpriority = ctypes_handle.getpriority
PRIO_PROCESS = 0

def get_ioprio_from_sched(pid):
    scheduler = sched_getscheduler(pid)
    nice = getpriority(PRIO_PROCESS, pid)
    ioprio_nice = (nice + 20) / 5

    if scheduler in (SCHED_FIFO, SCHED_RR):
        return 'rt/%d' % ioprio_nice
    elif scheduler == SCHED_IDLE:
        return 'idle'
    else:
        return 'be/%d' % ioprio_nice

def get(pid):
    if __NR_ioprio_get is None:
        return '?sys'

    ioprio = syscall(__NR_ioprio_get, IOPRIO_WHO_PROCESS, pid)
    if ioprio < 0:
        return '?err'

    prio_class = ioprio_class(ioprio)
    if not prio_class:
        return get_ioprio_from_sched(pid)
    if prio_class == 'idle':
        return prio_class
    return '%s/%d' % (prio_class, ioprio_data(ioprio))

def set_ioprio(which, who, ioprio_class, ioprio_data):
    if __NR_ioprio_set is None:
        raise IoprioSetError('No ioprio_set syscall found')

    ioprio_val = ioprio_value(ioprio_class, ioprio_data)
    ret = syscall(__NR_ioprio_set, which, who, ioprio_val, use_errno=True)
    if ret < 0:
        try:
            err = ctypes.get_errno()
        except AttributeError:
            err = 'Unknown error (errno support not available before Python2.6)'
        raise IoprioSetError(err)

def sort_key(key):
    if key[0] == '?':
        return -ord(key[1])

    if '/' in key:
        if key.startswith('rt/'):
            shift = 0
        elif key.startswith('be/'):
            shift = 1
        prio = int(key.split('/')[1])
    elif key == 'idle':
        shift = 2
        prio = 0

    return (1 << (shift * IOPRIO_CLASS_SHIFT)) + prio

def to_class_and_data(ioprio_str):
    if '/' in ioprio_str:
        split = ioprio_str.split('/')
        return (split[0], int(split[1]))
    elif ioprio_str == 'idle':
        return ('idle', 0)
    return (None, None)

if __name__ == '__main__':
    import sys
    if len(sys.argv) == 2:
        pid = int(sys.argv[1])
    else:
        pid = os.getpid()
    print('pid:', pid)
    print('ioprio:', get(pid))

version.py000064400000000020150351355630006601 0ustar00VERSION = '0.6'
vmstat.py000064400000003027150351355630006444 0ustar00# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
#
# See the COPYING file for license information.
#
# Copyright (c) 2007 Guillaume Chazarain <guichaz@gmail.com>

class VmStat(object):
    def __init__(self):
        self.vmstat_file = open('/proc/vmstat')
        self.vmstat = self.read()

    def read(self):
        def extract(line):
            return int(line.split()[1]) * 1024

        for line in self.vmstat_file:
            if line.startswith('pgpgin '):
                pgpgin = extract(line)
                break

        for line in self.vmstat_file:
            if line.startswith('pgpgout '):
                pgpgout = extract(line)
                break

        self.vmstat_file.seek(0)
        return pgpgin, pgpgout

    def delta(self):
        now = self.read()
        delta = now[0] - self.vmstat[0], now[1] - self.vmstat[1]
        self.vmstat = now
        return delta