From 6a4d4f9bca040c0919d3415ba6b8af3ebde0110c Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Mon, 8 May 2023 17:30:39 +0800 Subject: [PATCH] fix: `sysVer` of older CentOS --- .../{tcp_status.dart => conn_status.dart} | 24 ++----- lib/data/model/server/server_status.dart | 29 +-------- .../server/server_status_update_req.dart | 41 ++++++++---- lib/data/provider/server.dart | 12 ++-- lib/data/res/server_cmd.dart | 62 +++++++++++-------- lib/data/res/status.dart | 4 +- 6 files changed, 81 insertions(+), 91 deletions(-) rename lib/data/model/server/{tcp_status.dart => conn_status.dart} (51%) diff --git a/lib/data/model/server/tcp_status.dart b/lib/data/model/server/conn_status.dart similarity index 51% rename from lib/data/model/server/tcp_status.dart rename to lib/data/model/server/conn_status.dart index d5305814..4a36847e 100644 --- a/lib/data/model/server/tcp_status.dart +++ b/lib/data/model/server/conn_status.dart @@ -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 json) { - maxConn = json["maxConn"].toInt(); - active = json["active"].toInt(); - passive = json["passive"].toInt(); - fail = json["fail"].toInt(); - } - - Map toJson() { - final Map data = {}; - 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; } diff --git a/lib/data/model/server/server_status.dart b/lib/data/model/server/server_status.dart index f612d886..873b3d21 100644 --- a/lib/data/model/server/server_status.dart +++ b/lib/data/model/server/server_status.dart @@ -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 disk; - TcpStatus tcp; + ConnStatus tcp; NetSpeed netSpeed; String? failedInfo; diff --git a/lib/data/model/server/server_status_update_req.dart b/lib/data/model/server/server_status_update_req.dart index f2eb5fcd..755faa57 100644 --- a/lib/data/model/server/server_status_update_req.dart +++ b/lib/data/model/server/server_status_update_req.dart @@ -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 at(CmdType t) { + final index = t.index; + if (index >= length) return ''; + return this[index]; + } +} + Future 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', ''); diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index d3dd4af8..8ea099b4 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -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(); diff --git a/lib/data/res/server_cmd.dart b/lib/data/res/server_cmd.dart index bb4b24cc..0ca92c17 100644 --- a/lib/data/res/server_cmd.dart +++ b/lib/data/res/server_cmd.dart @@ -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"; diff --git a/lib/data/res/status.dart b/lib/data/res/status.dart index 77617382..8cd934b0 100644 --- a/lib/data/res/status.dart +++ b/lib/data/res/status.dart @@ -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, );