mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix: sysVer of older CentOS
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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', '');
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user