-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.nim
97 lines (79 loc) · 3.68 KB
/
main.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import strutils, strformat, tables, os, times
type netItem = object
name: string
recv_bytes: int
trans_bytes: int
proc readInfo(filename = "/proc/net/dev"): Table[string, netItem] =
var netItems: Table[string, netItem];
for line in filename.lines:
let arr = line.split(":")
if len(arr) != 2:
continue;
let parts = arr[1].splitWhitespace()
if len(parts) != 16:
continue;
let name = arr[0].strip()
netItems[name] = netItem(name: name, recv_bytes: parts[0].parseInt, trans_bytes: parts[8].parseInt)
return netItems;
proc main() =
var netItemsLast: Table[string, netItem];
var netItemsInit: Table[string, netItem];
var init_clock: DateTime = now();
var last_clock: DateTime = init_clock;
var maxLen: int = 0;
var empty = netItem();
while true:
let clock_now = now()
let t = float((clock_now - last_clock).inMilliseconds)/1e3;
let tt = float((clock_now - init_clock).inMilliseconds)/1e3;
let netItemsCurrent = readInfo()
if maxLen < 1:
for ifname in netItemsCurrent.keys:
if maxLen < ifname.len:
maxLen = ifname.len
write(stdout, "\ec")
for name, item in netItemsCurrent:
let lastItem = netItemsLast.getOrDefault(name, empty)
let initItem = netItemsInit.getOrDefault(name, empty)
var total_recv: float
var total_trans: float
var recv: float
var trans: float
var recv_speed: float
var trans_speed: float
var recv_avg_speed: float
var trans_avg_speed: float
let first = lastItem.name.isEmptyOrWhitespace or initItem.name.isEmptyOrWhitespace
if not first:
total_recv = float(item.recv_bytes-initItem.recv_bytes)/1024
total_trans = float(item.trans_bytes-initItem.trans_bytes)/1024
recv = float(item.recv_bytes - lastItem.recv_bytes)/1024
trans = float(item.trans_bytes - lastItem.trans_bytes)/1024
recv_speed = recv/t
trans_speed = trans/t
recv_avg_speed = total_recv/tt
trans_avg_speed = total_trans/tt
let total_recv_s = if total_recv > 1048576: fmt"{total_recv/1024/1024:.2f}GB" else: fmt"{total_recv/1024:.2f}MB"
let recv_avg_speed_s = if recv_avg_speed > 1024: fmt"{recv_avg_speed/1024:.1f}MB/S" else: fmt"{recv_avg_speed:.1f}KB/S"
let recv_speed_s = if recv_speed > 1024: fmt"{recv_speed/1024:.1f}MB/S" else: fmt"{recv_speed:.1f}KB/S"
let total_trans_s = if total_trans > 1048576: fmt"{total_trans/1024/1024:.2f}GB" else: fmt"{total_trans/1024:.2f}MB"
let trans_avg_speed_s = if trans_avg_speed > 1024: fmt"{trans_avg_speed/1024:.1f}MB/S" else: fmt"{trans_avg_speed:.1f}KB/S"
let trans_speed_s = if trans_speed > 1024: fmt"{trans_speed/1024:.1f}MB/S" else: fmt"{trans_speed:.1f}KB/S"
let str_recv = fmt"{total_recv_s:<11} {recv_avg_speed_s:<11} {recv_speed_s:<11}"
let str_trans = fmt"{total_trans_s:<11} {trans_avg_speed_s:<11} {trans_speed_s:<11}"
let name_pad = name.alignLeft(maxLen)
echo &"\e[1;34m{name_pad}\e[00m 接收: \e[1;32m{str_recv}\e[00m 发送: \e[1;31m{str_trans}\e[00m"
last_clock = clock_now
netItemsLast = netItemsCurrent
if netItemsInit.len < 1:
netItemsInit = netItemsCurrent
sleep(200)
else:
sleep(1000)
try:
proc ctrlc() {.noconv.} =
quit(0)
setControlCHook(ctrlc)
main()
except Exception:
echo getCurrentExceptionMsg()