8
import psutil # maybe not...
11
from dbus.mainloop.glib import DBusGMainLoop
15
Time to make this latest version with netlink sockets and
17
the methods polling /sys/block/dev/... for device i/o
21
class IoMonitor(dbus.service.Object):
24
name = dbus.service.BusName('org.iomonitor', dbus.SystemBus(mainloop=DBusGMainLoop()))
25
dbus.service.Object.__init__(self, name, '/org/iomonitor')
26
self.conn = socket.socket(socket.AF_NETLINK, socket.SOCK_RAW, 16)
27
self.conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536)
28
self.conn.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)
30
self.pid, self.grp = self.conn.getsockname()
34
ps = [int(i) for i in os.listdir('/proc') if i.isdigit()]
36
front = struct.pack('HH', 1, 0)
37
back = struct.pack('I', pid)
38
back_hdr = struct.pack('HH', len(back) + 4, 1)
39
back = back_hdr + back
40
load = b''.join(front+back)
41
hdr = struct.pack('IHHII', len(load) + 16, 23, 1, 1, self.pid)
42
self.conn.send(hdr+load)
43
t, (x, y) = self.conn.recvfrom(16384)
46
while 3 not in a.keys():
48
atl, aty = struct.unpack('HH', t[:4])
53
aps.append(['PID:', pid, 'READ:', struct.unpack('Q', t[248:256])[0],
54
'WRITE:', struct.unpack('Q', t[256:264])[0]])
59
@dbus.service.method('org.iomonitor', out_signature='as')
60
def process_list(self):
62
prclst = [pid for pid in os.listdir('/proc') if pid.isdigit()]
64
if os.path.isfile('/proc/%s/stat' % pid):
65
with open('/proc/%s/stat' % pid, 'r+') as f:
68
name = [j for j in name.split(' ') if '(' in j]
69
pidnamelst.append(name[0][1:-1])
72
@dbus.service.method('org.iomonitor', out_signature='aas')
73
def allprocess_stats(self):
74
aps = self.grab_data()
77
@dbus.service.method('org.iomonitor', in_signature='s', out_signature='as')
78
def process_stats(self, pid):
79
aps = self.grab_data()
85
@dbus.service.method('org.iomonitor', out_signature='as')
86
def process_swap(self, pid):
87
# check if this best place to monitor?
88
with open('/proc/swaps') as f:
95
@dbus.service.method('org.iomonitor', out_signature='s')
98
return str(psutil.avail_phymem())
100
@dbus.service.method('org.iomonitor', in_signature='s', out_signature='as')
101
def diskstats(self, disk):
102
with open('/sys/block/sda/%s/stat' % disk, 'r') as f:
105
data = [i for i in data[0].split(' ') if len(i) > 0]
106
return ['read ' + data[0], 'write ' + data[4]]
108
@dbus.service.method('org.iomonitor', out_signature='as')
110
# /sys/block/dev/...just sda/hda -- or all partitions??
111
dl = os.listdir('/sys/block')
114
@dbus.service.method('org.iomonitor', out_signature='as')
115
def deviceinfo(self):
116
with open('/proc/scsi/scsi', 'r') as f:
117
devinfo = f.readlines()
121
if __name__ == '__main__':
122
with daemon.DaemonContext():
125
gobject.MainLoop().run()
127
# this will need a .conf file in /etc/dbus/system.d/...
128
# and also for startup execution an entry in --> sudo crontab -e @reboot