class Taskstats(object): ''' The Taskstats class makes requests to assemble netlink messages that communicate taskstats. ''' def __init__(self, pid): super(Taskstats, self).__init__() self.pid = pid self.genlctrl = Controller(TASKSTATS_GENL_NAME) self.attrs = dict() self.taskstats_fields = [task[0] for task in taskstat_struct] self.fmt = ''.join([task[1] for task in taskstat_struct]) def get_task(self, task, pid): task_msg_payload = Genlmsg(TASKSTATS_CMD_GET, Nlattr( TASKSTATS_CMD_ATTR_PID, pid)) self.genlctrl.send(Nlmsg(self.genlctrl.fam_id, self.pid, task_msg_payload).pack()) task_response = self.genlctrl.recv() parse_response(self, task_response[NLA_HDRLEN:]) taskstats_raw = self.attrs[TASKSTATS_TYPE_STATS] taskstats = dict(zip(self.taskstats_fields, struct.unpack(self.fmt, taskstats_raw))) return taskstats.get(task) def process_name(self, pid): raw_taskstats_name = self.get_task('ac_comm', pid) taskstats_name = raw_taskstats_name.strip('\x00') return taskstats_name def read(self, pid): taskstats_read = self.get_task('read_bytes', pid) return taskstats_read def write(self, pid): taskstats_write = self.get_task('write_bytes', pid) return taskstats_write def swap(self, pid): process_swap = self.get_task('swapin_count', pid) return process_swap
class Taskstats(object): ''' The Taskstats class makes requests to assemble netlink messages that communicate taskstats. ''' def __init__(self, pid): super(Taskstats, self).__init__() self.pid = pid self.genlctrl = Controller(TASKSTATS_GENL_NAME) self.attrs = dict() self.taskstat_fields = [task[0] for task in taskstat_struct] self.fmt = ''.join([task[1] for task in taskstat_struct]) def get_task(self, task): task_msg_payload = Genlmsg(TASKSTATS_CMD_GET, Nlattr( TASKSTATS_CMD_ATTR_PID, self.pid)) self.genlctrl.send(Nlmsg(self.genlctrl.fam_id, task_msg_payload).pack()) task_response = self.genlctrl.recv() parse_response(self, task_response[NLA_HDRLEN:]) if not self.attrs.get(TASKSTATS_TYPE_STATS): return -1 taskstats_raw = self.attrs[TASKSTATS_TYPE_STATS] taskstats = dict(zip(self.taskstat_fields, struct.unpack(self.fmt, taskstats_raw))) return taskstats.get(task) def read(self): taskstats_read = self.get_task('read_bytes') if taskstats_read == -1: raise InsufficientRights(self.read.func_name, self.pid) return taskstats_read def write(self): taskstats_write = self.get_task('write_bytes') if taskstats_write == -1: raise InsufficientRights(self.write.func_name, self.pid) return taskstats_write