mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
new: detail status page
This commit is contained in:
@@ -1,16 +1,19 @@
|
||||
import 'package:toolbox/core/extension/numx.dart';
|
||||
import 'package:toolbox/data/model/server/time_seq.dart';
|
||||
|
||||
import '../../res/misc.dart';
|
||||
|
||||
class Disk {
|
||||
final String path;
|
||||
final String loc;
|
||||
final String dev;
|
||||
final String mount;
|
||||
final int usedPercent;
|
||||
final String used;
|
||||
final String size;
|
||||
final String avail;
|
||||
|
||||
const Disk({
|
||||
required this.path,
|
||||
required this.loc,
|
||||
required this.dev,
|
||||
required this.mount,
|
||||
required this.usedPercent,
|
||||
required this.used,
|
||||
required this.size,
|
||||
@@ -18,6 +21,80 @@ class Disk {
|
||||
});
|
||||
}
|
||||
|
||||
class DiskIO extends TimeSeq<DiskIOPiece> {
|
||||
DiskIO(super.pre, super.now);
|
||||
|
||||
(String?, String?) getReadSpeed(String dev) {
|
||||
final pres = this.pre.where(
|
||||
(element) => element.dev == dev.replaceFirst('/dev/', ''),
|
||||
);
|
||||
final nows = this.now.where(
|
||||
(element) => element.dev == dev.replaceFirst('/dev/', ''),
|
||||
);
|
||||
if (pres.isEmpty || nows.isEmpty) return (null, null);
|
||||
final pre = pres.first;
|
||||
final now = nows.first;
|
||||
final sectorsRead = now.sectorsRead - pre.sectorsRead;
|
||||
final sectorsWrite = now.sectorsWrite - pre.sectorsWrite;
|
||||
final time = now.time - pre.time;
|
||||
final read = '${(sectorsRead / time * 512).convertBytes}/s';
|
||||
final write = '${(sectorsWrite / time * 512).convertBytes}/s';
|
||||
return (read, write);
|
||||
}
|
||||
|
||||
// Raw:
|
||||
// 254 0 vda 584193 186416 40419294 845790 5024458 2028159 92899586 6997559 0 5728372 8143590 0 0 0 0 2006112 300240
|
||||
// 254 1 vda1 584029 186416 40412734 845668 5024453 2028159 92899586 6997558 0 5728264 7843226 0 0 0 0 0 0
|
||||
// 11 0 sr0 36 0 280 49 0 0 0 0 0 56 49 0 0 0 0 0 0
|
||||
// 7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
// 7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
static List<DiskIOPiece> parse(String raw, int time) {
|
||||
final lines = raw.split('\n');
|
||||
if (lines.isEmpty) return [];
|
||||
final items = <DiskIOPiece>[];
|
||||
for (var item in lines) {
|
||||
item = item.trim();
|
||||
if (item.isEmpty) continue;
|
||||
final vals = item.split(Miscs.blankReg);
|
||||
if (vals.length < 10) continue;
|
||||
try {
|
||||
items.add(DiskIOPiece(
|
||||
dev: vals[2],
|
||||
sectorsRead: int.parse(vals[5]),
|
||||
sectorsWrite: int.parse(vals[9]),
|
||||
time: time,
|
||||
));
|
||||
} catch (e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
class DiskIOPiece extends TimeSeqIface<DiskIOPiece> {
|
||||
final String dev;
|
||||
final int sectorsRead;
|
||||
final int sectorsWrite;
|
||||
final int time;
|
||||
|
||||
DiskIOPiece({
|
||||
required this.dev,
|
||||
required this.sectorsRead,
|
||||
required this.sectorsWrite,
|
||||
required this.time,
|
||||
});
|
||||
|
||||
@override
|
||||
bool same(DiskIOPiece other) => dev == other.dev;
|
||||
}
|
||||
|
||||
List<Disk> parseDisk(String raw) {
|
||||
final list = <Disk>[];
|
||||
final items = raw.split('\n');
|
||||
@@ -38,8 +115,8 @@ List<Disk> parseDisk(String raw) {
|
||||
}
|
||||
try {
|
||||
list.add(Disk(
|
||||
path: vals[0],
|
||||
loc: vals[5],
|
||||
dev: vals[0],
|
||||
mount: vals[5],
|
||||
usedPercent: int.parse(vals[4].replaceFirst('%', '')),
|
||||
used: vals[2],
|
||||
size: vals[1],
|
||||
@@ -62,9 +139,9 @@ List<Disk> parseDisk(String raw) {
|
||||
/// the fps may lower than 60.
|
||||
Disk? findRootDisk(List<Disk> disks) {
|
||||
if (disks.isEmpty) return null;
|
||||
final roots = disks.where((element) => element.loc == '/');
|
||||
final roots = disks.where((element) => element.mount == '/');
|
||||
if (roots.isEmpty) {
|
||||
final sysRoots = disks.where((element) => element.loc == '/sysroot');
|
||||
final sysRoots = disks.where((element) => element.mount == '/sysroot');
|
||||
if (sysRoots.isEmpty) {
|
||||
return disks.first;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user