mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
opt. & rm: server detail cards seq
This commit is contained in:
@@ -12,20 +12,20 @@ class Conn {
|
|||||||
required this.passive,
|
required this.passive,
|
||||||
required this.fail,
|
required this.fail,
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
Conn? parseConn(String raw) {
|
static Conn? parse(String raw) {
|
||||||
final lines = raw.split('\n');
|
final lines = raw.split('\n');
|
||||||
final idx = lines.lastWhere((element) => element.startsWith('Tcp:'),
|
final idx = lines.lastWhere((element) => element.startsWith('Tcp:'),
|
||||||
orElse: () => '');
|
orElse: () => '');
|
||||||
if (idx != '') {
|
if (idx != '') {
|
||||||
final vals = idx.split(Miscs.numReg);
|
final vals = idx.split(Miscs.numReg);
|
||||||
return Conn(
|
return Conn(
|
||||||
maxConn: int.tryParse(vals[5]) ?? 0,
|
maxConn: int.tryParse(vals[5]) ?? 0,
|
||||||
active: int.tryParse(vals[6]) ?? 0,
|
active: int.tryParse(vals[6]) ?? 0,
|
||||||
passive: int.tryParse(vals[7]) ?? 0,
|
passive: int.tryParse(vals[7]) ?? 0,
|
||||||
fail: int.tryParse(vals[8]) ?? 0,
|
fail: int.tryParse(vals[8]) ?? 0,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,9 +73,8 @@ class OneTimeCpuStatus extends TimeSeqIface<OneTimeCpuStatus> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool same(OneTimeCpuStatus other) => id == other.id;
|
bool same(OneTimeCpuStatus other) => id == other.id;
|
||||||
}
|
|
||||||
|
|
||||||
List<OneTimeCpuStatus> parseCPU(String raw) {
|
static List<OneTimeCpuStatus> parse(String raw) {
|
||||||
final List<OneTimeCpuStatus> cpus = [];
|
final List<OneTimeCpuStatus> cpus = [];
|
||||||
|
|
||||||
for (var item in raw.split('\n')) {
|
for (var item in raw.split('\n')) {
|
||||||
@@ -97,6 +96,8 @@ List<OneTimeCpuStatus> parseCPU(String raw) {
|
|||||||
}
|
}
|
||||||
return cpus;
|
return cpus;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
final _bsdCpuPercentReg = RegExp(r'(\d+\.\d+)%');
|
final _bsdCpuPercentReg = RegExp(r'(\d+\.\d+)%');
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,40 @@ class Disk {
|
|||||||
required this.size,
|
required this.size,
|
||||||
required this.avail,
|
required this.avail,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
static List<Disk> parse(String raw) {
|
||||||
|
final list = <Disk>[];
|
||||||
|
final items = raw.split('\n');
|
||||||
|
items.removeAt(0);
|
||||||
|
var pathCache = '';
|
||||||
|
for (var item in items) {
|
||||||
|
if (item.isEmpty) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final vals = item.split(Miscs.numReg);
|
||||||
|
if (vals.length == 1) {
|
||||||
|
pathCache = vals[0];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pathCache != '') {
|
||||||
|
vals[0] = pathCache;
|
||||||
|
pathCache = '';
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
list.add(Disk(
|
||||||
|
dev: vals[0],
|
||||||
|
mount: vals[5],
|
||||||
|
usedPercent: int.parse(vals[4].replaceFirst('%', '')),
|
||||||
|
used: vals[2],
|
||||||
|
size: vals[1],
|
||||||
|
avail: vals[3],
|
||||||
|
));
|
||||||
|
} catch (e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DiskIO extends TimeSeq<DiskIOPiece> {
|
class DiskIO extends TimeSeq<DiskIOPiece> {
|
||||||
@@ -118,40 +152,6 @@ class DiskIOPiece extends TimeSeqIface<DiskIOPiece> {
|
|||||||
bool same(DiskIOPiece other) => dev == other.dev;
|
bool same(DiskIOPiece other) => dev == other.dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Disk> parseDisk(String raw) {
|
|
||||||
final list = <Disk>[];
|
|
||||||
final items = raw.split('\n');
|
|
||||||
items.removeAt(0);
|
|
||||||
var pathCache = '';
|
|
||||||
for (var item in items) {
|
|
||||||
if (item.isEmpty) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final vals = item.split(Miscs.numReg);
|
|
||||||
if (vals.length == 1) {
|
|
||||||
pathCache = vals[0];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (pathCache != '') {
|
|
||||||
vals[0] = pathCache;
|
|
||||||
pathCache = '';
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
list.add(Disk(
|
|
||||||
dev: vals[0],
|
|
||||||
mount: vals[5],
|
|
||||||
usedPercent: int.parse(vals[4].replaceFirst('%', '')),
|
|
||||||
used: vals[2],
|
|
||||||
size: vals[1],
|
|
||||||
avail: vals[3],
|
|
||||||
));
|
|
||||||
} catch (e) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Issue 88
|
/// Issue 88
|
||||||
///
|
///
|
||||||
/// Due to performance issues,
|
/// Due to performance issues,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:toolbox/core/extension/listx.dart';
|
||||||
|
|
||||||
class Memory {
|
class Memory {
|
||||||
final int total;
|
final int total;
|
||||||
final int free;
|
final int free;
|
||||||
@@ -17,51 +19,36 @@ class Memory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
double get usedPercent => 1 - availPercent;
|
double get usedPercent => 1 - availPercent;
|
||||||
|
|
||||||
|
static Memory parse(String raw) {
|
||||||
|
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
||||||
|
|
||||||
|
final total = int.tryParse(items
|
||||||
|
.firstWhereOrNull((e) => e?.group(1) == 'MemTotal:')
|
||||||
|
?.group(2) ??
|
||||||
|
'1') ??
|
||||||
|
1;
|
||||||
|
final free = int.tryParse(items
|
||||||
|
.firstWhereOrNull((e) => e?.group(1) == 'MemFree:')
|
||||||
|
?.group(2) ??
|
||||||
|
'0') ??
|
||||||
|
0;
|
||||||
|
final available = int.tryParse(items
|
||||||
|
.firstWhereOrNull((e) => e?.group(1) == 'MemAvailable:')
|
||||||
|
?.group(2) ??
|
||||||
|
'0') ??
|
||||||
|
0;
|
||||||
|
|
||||||
|
return Memory(
|
||||||
|
total: total,
|
||||||
|
free: free,
|
||||||
|
avail: available,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final memItemReg = RegExp(r'([A-Z].+:)\s+([0-9]+) kB');
|
final memItemReg = RegExp(r'([A-Z].+:)\s+([0-9]+) kB');
|
||||||
|
|
||||||
Memory parseMem(String raw) {
|
|
||||||
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
|
||||||
|
|
||||||
final total = int.tryParse(
|
|
||||||
items
|
|
||||||
.firstWhere(
|
|
||||||
(e) => e?.group(1) == 'MemTotal:',
|
|
||||||
orElse: () => null,
|
|
||||||
)
|
|
||||||
?.group(2) ??
|
|
||||||
'1',
|
|
||||||
) ??
|
|
||||||
1;
|
|
||||||
final free = int.tryParse(
|
|
||||||
items
|
|
||||||
.firstWhere(
|
|
||||||
(e) => e?.group(1) == 'MemFree:',
|
|
||||||
orElse: () => null,
|
|
||||||
)
|
|
||||||
?.group(2) ??
|
|
||||||
'0',
|
|
||||||
) ??
|
|
||||||
0;
|
|
||||||
final available = int.tryParse(
|
|
||||||
items
|
|
||||||
.firstWhere(
|
|
||||||
(e) => e?.group(1) == 'MemAvailable:',
|
|
||||||
orElse: () => null,
|
|
||||||
)
|
|
||||||
?.group(2) ??
|
|
||||||
'0',
|
|
||||||
) ??
|
|
||||||
0;
|
|
||||||
|
|
||||||
return Memory(
|
|
||||||
total: total,
|
|
||||||
free: free,
|
|
||||||
avail: available,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Swap {
|
class Swap {
|
||||||
final int total;
|
final int total;
|
||||||
final int free;
|
final int free;
|
||||||
@@ -81,45 +68,30 @@ class Swap {
|
|||||||
String toString() {
|
String toString() {
|
||||||
return 'Swap{total: $total, free: $free, cached: $cached}';
|
return 'Swap{total: $total, free: $free, cached: $cached}';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
static Swap parse(String raw) {
|
||||||
Swap parseSwap(String raw) {
|
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
||||||
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
|
||||||
|
final total = int.tryParse(items
|
||||||
final total = int.tryParse(
|
.firstWhereOrNull((e) => e?.group(1) == 'SwapTotal:')
|
||||||
items
|
?.group(2) ??
|
||||||
.firstWhere(
|
'1') ??
|
||||||
(e) => e?.group(1) == 'SwapTotal:',
|
0;
|
||||||
orElse: () => null,
|
final free = int.tryParse(items
|
||||||
)
|
.firstWhereOrNull((e) => e?.group(1) == 'SwapFree:')
|
||||||
?.group(2) ??
|
?.group(2) ??
|
||||||
'1',
|
'1') ??
|
||||||
) ??
|
0;
|
||||||
0;
|
final cached = int.tryParse(items
|
||||||
final free = int.tryParse(
|
.firstWhereOrNull((e) => e?.group(1) == 'SwapCached:')
|
||||||
items
|
?.group(2) ??
|
||||||
.firstWhere(
|
'0') ??
|
||||||
(e) => e?.group(1) == 'SwapFree:',
|
0;
|
||||||
orElse: () => null,
|
|
||||||
)
|
return Swap(
|
||||||
?.group(2) ??
|
total: total,
|
||||||
'1',
|
free: free,
|
||||||
) ??
|
cached: cached,
|
||||||
0;
|
);
|
||||||
final cached = int.tryParse(
|
}
|
||||||
items
|
|
||||||
.firstWhere(
|
|
||||||
(e) => e?.group(1) == 'SwapCached:',
|
|
||||||
orElse: () => null,
|
|
||||||
)
|
|
||||||
?.group(2) ??
|
|
||||||
'0',
|
|
||||||
) ??
|
|
||||||
0;
|
|
||||||
|
|
||||||
return Swap(
|
|
||||||
total: total,
|
|
||||||
free: free,
|
|
||||||
cached: cached,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,80 +91,80 @@ class NetSpeed extends TimeSeq<NetSpeedPart> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String buildStandardOutput(double speed) => '${speed.convertBytes}/s';
|
String buildStandardOutput(double speed) => '${speed.convertBytes}/s';
|
||||||
}
|
|
||||||
|
|
||||||
/// [raw] example:
|
/// [raw] example:
|
||||||
/// Inter-| Receive | Transmit
|
/// Inter-| Receive | Transmit
|
||||||
/// face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
|
/// face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
|
||||||
/// lo: 45929941 269112 0 0 0 0 0 0 45929941 269112 0 0 0 0 0 0
|
/// lo: 45929941 269112 0 0 0 0 0 0 45929941 269112 0 0 0 0 0 0
|
||||||
/// eth0: 48481023 505772 0 0 0 0 0 0 36002262 202307 0 0 0 0 0 0
|
/// eth0: 48481023 505772 0 0 0 0 0 0 36002262 202307 0 0 0 0 0 0
|
||||||
List<NetSpeedPart> parseNetSpeed(String raw, int time) {
|
static List<NetSpeedPart> parse(String raw, int time) {
|
||||||
final split = raw.split('\n');
|
final split = raw.split('\n');
|
||||||
if (split.length < 4) {
|
if (split.length < 4) {
|
||||||
return [];
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
final results = <NetSpeedPart>[];
|
||||||
|
for (final item in split.sublist(2)) {
|
||||||
|
try {
|
||||||
|
final data = item.trim().split(':');
|
||||||
|
final device = data.first;
|
||||||
|
final bytes = data.last.trim().split(' ');
|
||||||
|
bytes.removeWhere((element) => element == '');
|
||||||
|
final bytesIn = BigInt.parse(bytes.first);
|
||||||
|
final bytesOut = BigInt.parse(bytes[8]);
|
||||||
|
results.add(NetSpeedPart(device, bytesIn, bytesOut, time));
|
||||||
|
} catch (_) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
final results = <NetSpeedPart>[];
|
/// [raw] example:
|
||||||
for (final item in split.sublist(2)) {
|
/// Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll
|
||||||
try {
|
/// lo0 16384 <Link#1> 17296531 0 2524959720 17296531 0 2524959720 0
|
||||||
final data = item.trim().split(':');
|
/// lo0 16384 127 127.0.0.1 17296531 - 2524959720 17296531 - 2524959720 -
|
||||||
final device = data.first;
|
/// lo0 16384 ::1/128 ::1 17296531 - 2524959720 17296531 - 2524959720 -
|
||||||
final bytes = data.last.trim().split(' ');
|
/// lo0 16384 fe80::1%lo0 fe80:1::1 17296531 - 2524959720 17296531 - 2524959720 -
|
||||||
bytes.removeWhere((element) => element == '');
|
/// gif0* 1280 <Link#2> 0 0 0 0 0 0 0
|
||||||
final bytesIn = BigInt.parse(bytes.first);
|
/// stf0* 1280 <Link#3> 0 0 0 0 0 0 0
|
||||||
final bytesOut = BigInt.parse(bytes[8]);
|
/// en0 1500 <Link#4> 22:20:xx:xx:xx:e6 739447 0 693997876 535600 0 79008877 0
|
||||||
|
/// en0 1500 fe80::f1:xx fe80:4::f1:xxxx:9 739447 - 693997876 535600 - 79008877 -
|
||||||
|
/// en0 1500 192.168.2 192.168.2.111 739447 - 693997876 535600 - 79008877 -
|
||||||
|
/// en0 1500 fd6b:xxxx:3 fd6b:xxxx:xxxx:0: 739447 - 693997876 535600 - 79008877 -
|
||||||
|
/// en1 1500 <Link#5> 88:d8:xx:xx:xx:1d 0 0 0 0 0 0 0
|
||||||
|
/// utun0 1380 <Link#6> 0 0 0 3 0 280 0
|
||||||
|
/// utun0 1380 fe80::xxxx: fe80:6::xxxx:xxxx 0 - 0 3 - 280 -
|
||||||
|
/// utun1 2000 <Link#7> 0 0 0 3 0 280 0
|
||||||
|
/// utun1 2000 fe80::xxxx: fe80:7::xxxx:xxxx 0 - 0 3 - 280 -
|
||||||
|
/// utun2 1000 <Link#8> 0 0 0 3 0 280 0
|
||||||
|
/// utun2 1000 fe80::xxxx: fe80:8::xxxx:xxx: 0 - 0 3 - 280 -
|
||||||
|
/// utun4 9000 <Link#10> 746744 0 845373390 386111 0 424400998 0
|
||||||
|
/// utun4 9000 198.18.0/16 198.18.0.1 746744 - 845373390 386111 - 424400998 -
|
||||||
|
/// en2* 1500 <Link#11> 36:7c:xx:xx:xx:xx 0 0 0 0 0 0 0
|
||||||
|
static List<NetSpeedPart> parseBsd(String raw, int time) {
|
||||||
|
final split = raw.split('\n');
|
||||||
|
if (split.length < 2) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
final results = <NetSpeedPart>[];
|
||||||
|
for (final item in split.sublist(1)) {
|
||||||
|
final data = item.trim().split(RegExp(r'\s+'));
|
||||||
|
final device = data[0];
|
||||||
|
if (device.endsWith('*')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (results.any((element) => element.device == device)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (data.length != 11) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final bytesIn = BigInt.parse(data[6]);
|
||||||
|
final bytesOut = BigInt.parse(data[9]);
|
||||||
results.add(NetSpeedPart(device, bytesIn, bytesOut, time));
|
results.add(NetSpeedPart(device, bytesIn, bytesOut, time));
|
||||||
} catch (_) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// [raw] example:
|
|
||||||
/// Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll
|
|
||||||
/// lo0 16384 <Link#1> 17296531 0 2524959720 17296531 0 2524959720 0
|
|
||||||
/// lo0 16384 127 127.0.0.1 17296531 - 2524959720 17296531 - 2524959720 -
|
|
||||||
/// lo0 16384 ::1/128 ::1 17296531 - 2524959720 17296531 - 2524959720 -
|
|
||||||
/// lo0 16384 fe80::1%lo0 fe80:1::1 17296531 - 2524959720 17296531 - 2524959720 -
|
|
||||||
/// gif0* 1280 <Link#2> 0 0 0 0 0 0 0
|
|
||||||
/// stf0* 1280 <Link#3> 0 0 0 0 0 0 0
|
|
||||||
/// en0 1500 <Link#4> 22:20:xx:xx:xx:e6 739447 0 693997876 535600 0 79008877 0
|
|
||||||
/// en0 1500 fe80::f1:xx fe80:4::f1:xxxx:9 739447 - 693997876 535600 - 79008877 -
|
|
||||||
/// en0 1500 192.168.2 192.168.2.111 739447 - 693997876 535600 - 79008877 -
|
|
||||||
/// en0 1500 fd6b:xxxx:3 fd6b:xxxx:xxxx:0: 739447 - 693997876 535600 - 79008877 -
|
|
||||||
/// en1 1500 <Link#5> 88:d8:xx:xx:xx:1d 0 0 0 0 0 0 0
|
|
||||||
/// utun0 1380 <Link#6> 0 0 0 3 0 280 0
|
|
||||||
/// utun0 1380 fe80::xxxx: fe80:6::xxxx:xxxx 0 - 0 3 - 280 -
|
|
||||||
/// utun1 2000 <Link#7> 0 0 0 3 0 280 0
|
|
||||||
/// utun1 2000 fe80::xxxx: fe80:7::xxxx:xxxx 0 - 0 3 - 280 -
|
|
||||||
/// utun2 1000 <Link#8> 0 0 0 3 0 280 0
|
|
||||||
/// utun2 1000 fe80::xxxx: fe80:8::xxxx:xxx: 0 - 0 3 - 280 -
|
|
||||||
/// utun4 9000 <Link#10> 746744 0 845373390 386111 0 424400998 0
|
|
||||||
/// utun4 9000 198.18.0/16 198.18.0.1 746744 - 845373390 386111 - 424400998 -
|
|
||||||
/// en2* 1500 <Link#11> 36:7c:xx:xx:xx:xx 0 0 0 0 0 0 0
|
|
||||||
List<NetSpeedPart> parseBsdNetSpeed(String raw, int time) {
|
|
||||||
final split = raw.split('\n');
|
|
||||||
if (split.length < 2) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
final results = <NetSpeedPart>[];
|
|
||||||
for (final item in split.sublist(1)) {
|
|
||||||
final data = item.trim().split(RegExp(r'\s+'));
|
|
||||||
final device = data[0];
|
|
||||||
if (device.endsWith('*')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (results.any((element) => element.device == device)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (data.length != 11) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final bytesIn = BigInt.parse(data[6]);
|
|
||||||
final bytesOut = BigInt.parse(data[9]);
|
|
||||||
results.add(NetSpeedPart(device, bytesIn, bytesOut, time));
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
|||||||
DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final net = parseNetSpeed(StatusCmdType.net.find(segments), time);
|
final net = NetSpeed.parse(StatusCmdType.net.find(segments), time);
|
||||||
req.ss.netSpeed.update(net);
|
req.ss.netSpeed.update(net);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
@@ -66,7 +66,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final cpus = parseCPU(StatusCmdType.cpu.find(segments));
|
final cpus = OneTimeCpuStatus.parse(StatusCmdType.cpu.find(segments));
|
||||||
req.ss.cpu.update(cpus);
|
req.ss.cpu.update(cpus);
|
||||||
req.ss.temps.parse(
|
req.ss.temps.parse(
|
||||||
StatusCmdType.tempType.find(segments),
|
StatusCmdType.tempType.find(segments),
|
||||||
@@ -77,7 +77,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final tcp = parseConn(StatusCmdType.conn.find(segments));
|
final tcp = Conn.parse(StatusCmdType.conn.find(segments));
|
||||||
if (tcp != null) {
|
if (tcp != null) {
|
||||||
req.ss.tcp = tcp;
|
req.ss.tcp = tcp;
|
||||||
}
|
}
|
||||||
@@ -86,13 +86,13 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
req.ss.disk = parseDisk(StatusCmdType.disk.find(segments));
|
req.ss.disk = Disk.parse(StatusCmdType.disk.find(segments));
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
req.ss.mem = parseMem(StatusCmdType.mem.find(segments));
|
req.ss.mem = Memory.parse(StatusCmdType.mem.find(segments));
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
req.ss.swap = parseSwap(StatusCmdType.mem.find(segments));
|
req.ss.swap = Swap.parse(StatusCmdType.mem.find(segments));
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
}
|
}
|
||||||
@@ -120,8 +120,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final nvidia = NvidiaSmi.fromXml(StatusCmdType.nvidia.find(segments));
|
req.ss.nvidia = NvidiaSmi.fromXml(StatusCmdType.nvidia.find(segments));
|
||||||
req.ss.nvidia = nvidia;
|
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
}
|
}
|
||||||
@@ -148,7 +147,7 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
final time = int.parse(BSDStatusCmdType.time.find(segments));
|
final time = int.parse(BSDStatusCmdType.time.find(segments));
|
||||||
final net = parseBsdNetSpeed(BSDStatusCmdType.net.find(segments), time);
|
final net = NetSpeed.parseBsd(BSDStatusCmdType.net.find(segments), time);
|
||||||
req.ss.netSpeed.update(net);
|
req.ss.netSpeed.update(net);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
@@ -182,7 +181,7 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
req.ss.disk = parseDisk(BSDStatusCmdType.disk.find(segments));
|
req.ss.disk = Disk.parse(BSDStatusCmdType.disk.find(segments));
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Loggers.parse.warning(e, s);
|
Loggers.parse.warning(e, s);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/utils/platform/path.dart';
|
import 'package:toolbox/core/utils/platform/path.dart';
|
||||||
@@ -294,13 +295,18 @@ class ServerProvider extends ChangeNotifier {
|
|||||||
if (writeResult == null || writeResult.isNotEmpty) {
|
if (writeResult == null || writeResult.isNotEmpty) {
|
||||||
throw Exception('$writeResult');
|
throw Exception('$writeResult');
|
||||||
}
|
}
|
||||||
|
} on SSHAuthAbortError catch (e) {
|
||||||
|
TryLimiter.inc(sid);
|
||||||
|
s.status.err = e.toString();
|
||||||
|
_setServerState(s, ServerState.failed);
|
||||||
|
return;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Loggers.app.warning('Write script to ${spi.name} by shell', e);
|
Loggers.app.warning('Write script to ${spi.name} by shell', e);
|
||||||
// by sftp
|
|
||||||
|
/// by sftp
|
||||||
final localPath = joinPath(await Paths.doc, 'install.sh');
|
final localPath = joinPath(await Paths.doc, 'install.sh');
|
||||||
final file = File(localPath);
|
final file = File(localPath);
|
||||||
try {
|
try {
|
||||||
Loggers.app.info('Using SFTP to write script to ${spi.name}');
|
|
||||||
file.writeAsString(ShellFunc.allScript);
|
file.writeAsString(ShellFunc.allScript);
|
||||||
final completer = Completer();
|
final completer = Completer();
|
||||||
final homePath = (await s.client?.run('echo \$HOME').string)?.trim();
|
final homePath = (await s.client?.run('echo \$HOME').string)?.trim();
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_cardsOrder.addAll(Stores.setting.detailCardOrder.fetch());
|
//_cardsOrder.addAll(Stores.setting.detailCardOrder.fetch());
|
||||||
|
_cardsOrder.addAll(_cardBuildMap.keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -313,7 +314,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
|
|
||||||
Widget _buildGpuView(ServerStatus ss) {
|
Widget _buildGpuView(ServerStatus ss) {
|
||||||
if (ss.nvidia == null) return UIs.placeholder;
|
if (ss.nvidia == null) return UIs.placeholder;
|
||||||
final children = ss.nvidia!.map((e) => _buildGpuItem(e)).toList();
|
final children = ss.nvidia?.map((e) => _buildGpuItem(e)).toList() ?? [];
|
||||||
return CardX(
|
return CardX(
|
||||||
child: ExpandTile(
|
child: ExpandTile(
|
||||||
title: const Text('GPU'),
|
title: const Text('GPU'),
|
||||||
@@ -333,8 +334,25 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
}
|
}
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text(item.name, style: UIs.text13),
|
title: Text(item.name, style: UIs.text13),
|
||||||
|
leading: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'${item.percent}%',
|
||||||
|
style: UIs.text12Grey,
|
||||||
|
textScaler: _textFactor,
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
Text(
|
||||||
|
'${item.temp} °C',
|
||||||
|
style: UIs.text12Grey,
|
||||||
|
textScaler: _textFactor,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
'${item.power} - ${item.temp} °C\n${mem.used} / ${mem.total} ${mem.unit} - ${item.fanSpeed} RPM',
|
'${item.power} - ${item.fanSpeed} RPM\n${mem.used} / ${mem.total} ${mem.unit}',
|
||||||
style: UIs.text12Grey,
|
style: UIs.text12Grey,
|
||||||
textScaler: _textFactor,
|
textScaler: _textFactor,
|
||||||
),
|
),
|
||||||
@@ -343,11 +361,6 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
|
||||||
'${item.percent}%',
|
|
||||||
style: UIs.text12Grey,
|
|
||||||
textScaler: _textFactor,
|
|
||||||
),
|
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
final height = () {
|
final height = () {
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import 'package:toolbox/core/utils/platform/base.dart';
|
|||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:toolbox/data/res/provider.dart';
|
||||||
import 'package:toolbox/data/res/rebuild.dart';
|
import 'package:toolbox/data/res/rebuild.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:toolbox/data/res/store.dart';
|
||||||
import 'package:toolbox/view/widget/expand_tile.dart';
|
|
||||||
|
|
||||||
import '../../../core/persistant_store.dart';
|
import '../../../core/persistant_store.dart';
|
||||||
import '../../../core/route.dart';
|
import '../../../core/route.dart';
|
||||||
@@ -991,25 +990,26 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildSequence() {
|
Widget _buildSequence() {
|
||||||
return ExpandTile(
|
return ListTile(
|
||||||
title: Text(l10n.sequence),
|
title: Text(l10n.serverOrder),
|
||||||
subtitle: Text(
|
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||||
'${l10n.serverOrder} / ${l10n.serverDetailOrder} ...',
|
onTap: () => AppRoute.serverOrder().go(context),
|
||||||
style: UIs.textGrey,
|
|
||||||
),
|
|
||||||
children: [
|
|
||||||
ListTile(
|
|
||||||
title: Text(l10n.serverOrder),
|
|
||||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
|
||||||
onTap: () => AppRoute.serverOrder().go(context),
|
|
||||||
),
|
|
||||||
ListTile(
|
|
||||||
title: Text(l10n.serverDetailOrder),
|
|
||||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
|
||||||
onTap: () => AppRoute.serverDetailOrder().go(context),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
);
|
||||||
|
// return ExpandTile(
|
||||||
|
// title: Text(l10n.sequence),
|
||||||
|
// subtitle: Text(
|
||||||
|
// '${l10n.serverOrder} / ${l10n.serverDetailOrder} ...',
|
||||||
|
// style: UIs.textGrey,
|
||||||
|
// ),
|
||||||
|
// children: [
|
||||||
|
// ,
|
||||||
|
// ListTile(
|
||||||
|
// title: Text(l10n.serverDetailOrder),
|
||||||
|
// trailing: const Icon(Icons.keyboard_arrow_right),
|
||||||
|
// onTap: () => AppRoute.serverDetailOrder().go(context),
|
||||||
|
// ),
|
||||||
|
// ],
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildEditorFontSize() {
|
Widget _buildEditorFontSize() {
|
||||||
|
|||||||
Reference in New Issue
Block a user