fix: sysVer of older CentOS

This commit is contained in:
lollipopkit
2023-05-08 17:30:39 +08:00
parent 7f16c27dcf
commit 6a4d4f9bca
6 changed files with 81 additions and 91 deletions

View File

@@ -4,7 +4,7 @@ import '../../res/misc.dart';
///
/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/
///
class TcpStatus {
class ConnStatus {
/*
{
"maxConn": 0,
@@ -19,37 +19,21 @@ class TcpStatus {
late int passive;
late int fail;
TcpStatus(
ConnStatus(
this.maxConn,
this.active,
this.passive,
this.fail,
);
TcpStatus.fromJson(Map<String, dynamic> json) {
maxConn = json["maxConn"].toInt();
active = json["active"].toInt();
passive = json["passive"].toInt();
fail = json["fail"].toInt();
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["maxConn"] = maxConn;
data["active"] = active;
data["passive"] = passive;
data["fail"] = fail;
return data;
}
}
TcpStatus? parseTcp(String raw) {
ConnStatus? parseConn(String raw) {
final lines = raw.split('\n');
final idx = lines.lastWhere((element) => element.startsWith('Tcp:'),
orElse: () => '');
if (idx != '') {
final vals = idx.split(numReg);
return TcpStatus(vals[5].i, vals[6].i, vals[7].i, vals[8].i);
return ConnStatus(vals[5].i, vals[6].i, vals[7].i, vals[8].i);
}
return null;
}

View File

@@ -2,41 +2,16 @@ import 'package:toolbox/data/model/server/cpu_status.dart';
import 'package:toolbox/data/model/server/disk_info.dart';
import 'package:toolbox/data/model/server/memory.dart';
import 'package:toolbox/data/model/server/net_speed.dart';
import 'package:toolbox/data/model/server/tcp_status.dart';
///
/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/
///
import 'package:toolbox/data/model/server/conn_status.dart';
class ServerStatus {
/*
{
"cpuPercent": 0,
"memList": [
1
],
"sysVer": "",
"uptime": "",
"disk": [
{
"mountPath": "",
"mountLocation": "",
"usedPercent": 0,
"used": "",
"size": "",
"avail": ""
}
]
}
*/
CpuStatus cpu;
Memory mem;
Swap swap;
String sysVer;
String uptime;
List<DiskInfo> disk;
TcpStatus tcp;
ConnStatus tcp;
NetSpeed netSpeed;
String? failedInfo;

View File

@@ -1,9 +1,10 @@
import '../../res/server_cmd.dart';
import 'cpu_status.dart';
import 'disk_info.dart';
import 'memory.dart';
import 'net_speed.dart';
import 'server_status.dart';
import 'tcp_status.dart';
import 'conn_status.dart';
class ServerStatusUpdateReq {
final ServerStatus ss;
@@ -12,27 +13,42 @@ class ServerStatusUpdateReq {
const ServerStatusUpdateReq(this.ss, this.segments);
}
extension _SegmentsExt on List<String> {
String at(CmdType t) {
final index = t.index;
if (index >= length) return '';
return this[index];
}
}
Future<ServerStatus> getStatus(ServerStatusUpdateReq req) async {
final net = parseNetSpeed(req.segments[0]);
final net = parseNetSpeed(req.segments.at(CmdType.net));
req.ss.netSpeed.update(net);
final sys = _parseSysVer(req.segments[1], req.segments[9]);
final sys = _parseSysVer(
req.segments.at(CmdType.sys),
req.segments.at(CmdType.host),
req.segments.at(CmdType.sysRhel),
);
if (sys != null) {
req.ss.sysVer = sys;
}
final cpus = parseCPU(req.segments[2]);
final cpuTemp = parseCPUTemp(req.segments[7], req.segments[8]);
final cpus = parseCPU(req.segments.at(CmdType.cpu));
final cpuTemp = parseCPUTemp(
req.segments.at(CmdType.tempType),
req.segments.at(CmdType.tempVal),
);
req.ss.cpu.update(cpus, cpuTemp);
final tcp = parseTcp(req.segments[4]);
final tcp = parseConn(req.segments.at(CmdType.conn));
if (tcp != null) {
req.ss.tcp = tcp;
}
req.ss.disk = parseDisk(req.segments[5]);
req.ss.mem = parseMem(req.segments[6]);
final uptime = _parseUpTime(req.segments[3]);
req.ss.disk = parseDisk(req.segments.at(CmdType.disk));
req.ss.mem = parseMem(req.segments.at(CmdType.mem));
final uptime = _parseUpTime(req.segments.at(CmdType.uptime));
if (uptime != null) {
req.ss.uptime = uptime;
}
req.ss.swap = parseSwap(req.segments[6]);
req.ss.swap = parseSwap(req.segments.at(CmdType.mem));
return req.ss;
}
@@ -49,7 +65,10 @@ String? _parseUpTime(String raw) {
return null;
}
String? _parseSysVer(String raw, String hostname) {
String? _parseSysVer(String raw, String hostname, String rawRhel) {
if (!rawRhel.contains('No such file')) {
return rawRhel;
}
final s = raw.split('=');
if (s.length == 2) {
return s[1].replaceAll('"', '').replaceFirst('\n', '');

View File

@@ -131,6 +131,7 @@ class ServerProvider extends BusyProvider {
final s = _servers[sid];
if (s == null) return;
var raw = '';
try {
final state = s.state;
if (state.shouldConnect) {
@@ -165,24 +166,23 @@ class ServerProvider extends BusyProvider {
if (s.client == null) return;
// run script to get server status
final raw = await s.client!.run("sh $shellPath").string;
raw = await s.client!.run("sh $shellPath").string;
final segments = raw.split(seperator).map((e) => e.trim()).toList();
if (raw.isEmpty || segments.length == 1) {
if (raw.isEmpty || segments.length != CmdType.values.length) {
s.state = ServerState.failed;
if (s.status.failedInfo == null || s.status.failedInfo!.isEmpty) {
s.status.failedInfo = 'Seperate segments failed, raw:\n$raw';
}
return;
}
// remove first empty segment
// for `export xxx` in shell script
segments.removeAt(0);
final req = ServerStatusUpdateReq(s.status, segments);
s.status = await compute(getStatus, req);
// Comment for debug
// s.status = await getStatus(req);
} catch (e) {
s.state = ServerState.failed;
s.status.failedInfo = e.toString();
s.status.failedInfo = '$e\n$raw';
_logger.warning(e);
} finally {
notifyListeners();

View File

@@ -3,32 +3,44 @@ import 'build_data.dart';
const seperator = 'SrvBox';
const serverBoxDir = r'$HOME/.config/server_box';
const shellPath = '$serverBoxDir/mobile_app.sh';
const installShellCmd =
"mkdir -p $serverBoxDir && echo '$shellCmd' > $shellPath && chmod +x $shellPath";
const shellCmd = """
# Script for app `${BuildData.name}`
enum CmdType {
export,
net,
sys,
cpu,
uptime,
conn,
disk,
mem,
tempType,
tempVal,
host,
sysRhel,
}
const _cmdList = [
'export LANG=en_US.utf-8',
'cat /proc/net/dev && date +%s',
'cat /etc/os-release | grep PRETTY_NAME',
'cat /proc/stat | grep cpu',
'uptime',
'cat /proc/net/snmp',
'df -h',
'cat /proc/meminfo',
'cat /sys/class/thermal/thermal_zone*/type',
'cat /sys/class/thermal/thermal_zone*/temp',
'hostname',
'cat /etc/redhat-release',
];
final shellCmd = """
# Script for app `${BuildData.name} v${BuildData.build}`
# Delete this file while app is running will cause app crash
export LANG=en_US.utf-8
echo $seperator
cat /proc/net/dev && date +%s
echo $seperator
cat /etc/os-release | grep PRETTY_NAME
echo $seperator
cat /proc/stat | grep cpu
echo $seperator
uptime
echo $seperator
cat /proc/net/snmp
echo $seperator
df -h
echo $seperator
cat /proc/meminfo
echo $seperator
cat /sys/class/thermal/thermal_zone*/type
echo $seperator
cat /sys/class/thermal/thermal_zone*/temp
echo $seperator
hostname
${_cmdList.join('\necho $seperator\n')}
""";
final installShellCmd = "mkdir -p $serverBoxDir && "
"echo '$shellCmd' > $shellPath && "
"chmod +x $shellPath";

View File

@@ -3,7 +3,7 @@ import '../model/server/disk_info.dart';
import '../model/server/memory.dart';
import '../model/server/net_speed.dart';
import '../model/server/server_status.dart';
import '../model/server/tcp_status.dart';
import '../model/server/conn_status.dart';
Memory get _initMemory => Memory(
total: 1,
@@ -49,7 +49,7 @@ ServerStatus get initStatus => ServerStatus(
sysVer: 'Loading...',
uptime: '',
disk: [DiskInfo('/', '/', 0, '0', '0', '0')],
tcp: TcpStatus(0, 0, 0, 0),
tcp: ConnStatus(0, 0, 0, 0),
netSpeed: initNetSpeed,
swap: _initSwap,
);