]> rtime.felk.cvut.cz Git - jailhouse.git/blob - tools/jailhouse-cell-stats
tools: Rewrap jailhouse help output
[jailhouse.git] / tools / jailhouse-cell-stats
1 #!/usr/bin/env python
2
3 # Jailhouse, a Linux-based partitioning hypervisor
4 #
5 # Copyright (c) Siemens AG, 2014
6 #
7 # Authors:
8 #  Jan Kiszka <jan.kiszka@siemens.com>
9 #
10 # This work is licensed under the terms of the GNU GPL, version 2.  See
11 # the COPYING file in the top-level directory.
12
13 from __future__ import print_function
14 import curses
15 import datetime
16 import os
17 import sys
18
19 stats_dir = "/sys/devices/jailhouse/cells/%s/statistics"
20
21
22 def main(stdscr, cell, stats_names):
23     try:
24         curses.use_default_colors()
25         curses.curs_set(0)
26     except curses.error:
27         pass
28     curses.noecho()
29     curses.halfdelay(10)
30     value = dict.fromkeys(stats_names)
31     old_value = dict.fromkeys(stats_names, None)
32     while True:
33         now = datetime.datetime.now()
34
35         for name in stats_names:
36             f = open((stats_dir + "/%s") % (cell, name), "r")
37             value[name] = int(f.read())
38
39         def sortkey(name):
40             if old_value[name] is None:
41                 return (-value[name], name)
42             else:
43                 return (old_value[name] - value[name], -value[name], name)
44
45         stdscr.erase()
46         stdscr.addstr(0, 0, "Statistics for %s cell" % cell)
47         (height, width) = stdscr.getmaxyx()
48         stdscr.hline(2, 0, " ", width, curses.A_REVERSE)
49         stdscr.addstr(2, 0, "COUNTER", curses.A_REVERSE)
50         stdscr.addstr(2, 30, "%10s" % "SUM", curses.A_REVERSE)
51         stdscr.addstr(2, 40, "%10s" % "PER SEC", curses.A_REVERSE)
52         line = 3
53         for name in sorted(stats_names, key=sortkey):
54             stdscr.addstr(line, 0, name)
55             stdscr.addstr(line, 30, "%10u" % value[name])
56             if not old_value[name] is None:
57                 dt = (now - last_refresh).total_seconds()
58                 delta_per_sec = (value[name] - old_value[name]) / dt
59                 stdscr.addstr(line, 40, "%10u" % round(delta_per_sec))
60             old_value[name] = value[name]
61             line += 1
62         stdscr.hline(height - 1, 0, " ", width, curses.A_REVERSE)
63         stdscr.addstr(height - 1, 1, "Q - Quit", curses.A_REVERSE)
64         stdscr.refresh()
65
66         last_refresh = now
67
68         try:
69             if stdscr.getch() == ord('q'):
70                 break
71             curses.halfdelay(40)
72         except KeyboardInterrupt:
73             break
74         except curses.error:
75             continue
76
77
78 def usage(exit_code):
79     prog = os.path.basename(sys.argv[0]).replace('-', ' ')
80     print("usage: %s { ID | [--name] NAME }" % prog)
81     exit(exit_code)
82
83
84 argc = len(sys.argv)
85 use_name = argc >= 2 and sys.argv[1] == "--name"
86
87 if argc < 2 or argc > 3 or (not use_name and argc > 2):
88     usage(1)
89 if sys.argv[1] in ("--help", "-h"):
90     usage(0)
91
92 try:
93     if use_name:
94         cell_name = sys.argv[2]
95     else:
96         cell_name = sys.argv[1]
97         try:
98             cell_id = int(sys.argv[1])
99             for cell in os.listdir("/sys/devices/jailhouse/cells"):
100                 f = open("/sys/devices/jailhouse/cells/%s/id" % cell, "r")
101                 if int(f.read()) == cell_id:
102                     cell_name = cell
103                     break
104         except ValueError:
105             pass
106
107     stats_names = os.listdir(stats_dir % cell_name)
108 except OSError as e:
109     print("reading stats: %s" % e.strerror, file=sys.stderr)
110     exit(1)
111
112 curses.wrapper(main, cell_name, stats_names)