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/
|
/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/
|
||||||
///
|
///
|
||||||
class TcpStatus {
|
class ConnStatus {
|
||||||
/*
|
/*
|
||||||
{
|
{
|
||||||
"maxConn": 0,
|
"maxConn": 0,
|
||||||
@@ -19,37 +19,21 @@ class TcpStatus {
|
|||||||
late int passive;
|
late int passive;
|
||||||
late int fail;
|
late int fail;
|
||||||
|
|
||||||
TcpStatus(
|
ConnStatus(
|
||||||
this.maxConn,
|
this.maxConn,
|
||||||
this.active,
|
this.active,
|
||||||
this.passive,
|
this.passive,
|
||||||
this.fail,
|
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 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(numReg);
|
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;
|
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/disk_info.dart';
|
||||||
import 'package:toolbox/data/model/server/memory.dart';
|
import 'package:toolbox/data/model/server/memory.dart';
|
||||||
import 'package:toolbox/data/model/server/net_speed.dart';
|
import 'package:toolbox/data/model/server/net_speed.dart';
|
||||||
import 'package:toolbox/data/model/server/tcp_status.dart';
|
import 'package:toolbox/data/model/server/conn_status.dart';
|
||||||
|
|
||||||
///
|
|
||||||
/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/
|
|
||||||
///
|
|
||||||
|
|
||||||
class ServerStatus {
|
class ServerStatus {
|
||||||
/*
|
|
||||||
{
|
|
||||||
"cpuPercent": 0,
|
|
||||||
"memList": [
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"sysVer": "",
|
|
||||||
"uptime": "",
|
|
||||||
"disk": [
|
|
||||||
{
|
|
||||||
"mountPath": "",
|
|
||||||
"mountLocation": "",
|
|
||||||
"usedPercent": 0,
|
|
||||||
"used": "",
|
|
||||||
"size": "",
|
|
||||||
"avail": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
CpuStatus cpu;
|
CpuStatus cpu;
|
||||||
Memory mem;
|
Memory mem;
|
||||||
Swap swap;
|
Swap swap;
|
||||||
String sysVer;
|
String sysVer;
|
||||||
String uptime;
|
String uptime;
|
||||||
List<DiskInfo> disk;
|
List<DiskInfo> disk;
|
||||||
TcpStatus tcp;
|
ConnStatus tcp;
|
||||||
NetSpeed netSpeed;
|
NetSpeed netSpeed;
|
||||||
String? failedInfo;
|
String? failedInfo;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
|
import '../../res/server_cmd.dart';
|
||||||
import 'cpu_status.dart';
|
import 'cpu_status.dart';
|
||||||
import 'disk_info.dart';
|
import 'disk_info.dart';
|
||||||
import 'memory.dart';
|
import 'memory.dart';
|
||||||
import 'net_speed.dart';
|
import 'net_speed.dart';
|
||||||
import 'server_status.dart';
|
import 'server_status.dart';
|
||||||
import 'tcp_status.dart';
|
import 'conn_status.dart';
|
||||||
|
|
||||||
class ServerStatusUpdateReq {
|
class ServerStatusUpdateReq {
|
||||||
final ServerStatus ss;
|
final ServerStatus ss;
|
||||||
@@ -12,27 +13,42 @@ class ServerStatusUpdateReq {
|
|||||||
const ServerStatusUpdateReq(this.ss, this.segments);
|
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 {
|
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);
|
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) {
|
if (sys != null) {
|
||||||
req.ss.sysVer = sys;
|
req.ss.sysVer = sys;
|
||||||
}
|
}
|
||||||
final cpus = parseCPU(req.segments[2]);
|
final cpus = parseCPU(req.segments.at(CmdType.cpu));
|
||||||
final cpuTemp = parseCPUTemp(req.segments[7], req.segments[8]);
|
final cpuTemp = parseCPUTemp(
|
||||||
|
req.segments.at(CmdType.tempType),
|
||||||
|
req.segments.at(CmdType.tempVal),
|
||||||
|
);
|
||||||
req.ss.cpu.update(cpus, cpuTemp);
|
req.ss.cpu.update(cpus, cpuTemp);
|
||||||
final tcp = parseTcp(req.segments[4]);
|
final tcp = parseConn(req.segments.at(CmdType.conn));
|
||||||
if (tcp != null) {
|
if (tcp != null) {
|
||||||
req.ss.tcp = tcp;
|
req.ss.tcp = tcp;
|
||||||
}
|
}
|
||||||
req.ss.disk = parseDisk(req.segments[5]);
|
req.ss.disk = parseDisk(req.segments.at(CmdType.disk));
|
||||||
req.ss.mem = parseMem(req.segments[6]);
|
req.ss.mem = parseMem(req.segments.at(CmdType.mem));
|
||||||
final uptime = _parseUpTime(req.segments[3]);
|
final uptime = _parseUpTime(req.segments.at(CmdType.uptime));
|
||||||
if (uptime != null) {
|
if (uptime != null) {
|
||||||
req.ss.uptime = uptime;
|
req.ss.uptime = uptime;
|
||||||
}
|
}
|
||||||
req.ss.swap = parseSwap(req.segments[6]);
|
req.ss.swap = parseSwap(req.segments.at(CmdType.mem));
|
||||||
return req.ss;
|
return req.ss;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +65,10 @@ String? _parseUpTime(String raw) {
|
|||||||
return null;
|
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('=');
|
final s = raw.split('=');
|
||||||
if (s.length == 2) {
|
if (s.length == 2) {
|
||||||
return s[1].replaceAll('"', '').replaceFirst('\n', '');
|
return s[1].replaceAll('"', '').replaceFirst('\n', '');
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ class ServerProvider extends BusyProvider {
|
|||||||
final s = _servers[sid];
|
final s = _servers[sid];
|
||||||
if (s == null) return;
|
if (s == null) return;
|
||||||
|
|
||||||
|
var raw = '';
|
||||||
try {
|
try {
|
||||||
final state = s.state;
|
final state = s.state;
|
||||||
if (state.shouldConnect) {
|
if (state.shouldConnect) {
|
||||||
@@ -165,24 +166,23 @@ class ServerProvider extends BusyProvider {
|
|||||||
|
|
||||||
if (s.client == null) return;
|
if (s.client == null) return;
|
||||||
// run script to get server status
|
// 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();
|
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;
|
s.state = ServerState.failed;
|
||||||
if (s.status.failedInfo == null || s.status.failedInfo!.isEmpty) {
|
if (s.status.failedInfo == null || s.status.failedInfo!.isEmpty) {
|
||||||
s.status.failedInfo = 'Seperate segments failed, raw:\n$raw';
|
s.status.failedInfo = 'Seperate segments failed, raw:\n$raw';
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// remove first empty segment
|
|
||||||
// for `export xxx` in shell script
|
|
||||||
segments.removeAt(0);
|
|
||||||
|
|
||||||
final req = ServerStatusUpdateReq(s.status, segments);
|
final req = ServerStatusUpdateReq(s.status, segments);
|
||||||
s.status = await compute(getStatus, req);
|
s.status = await compute(getStatus, req);
|
||||||
|
// Comment for debug
|
||||||
|
// s.status = await getStatus(req);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
s.state = ServerState.failed;
|
s.state = ServerState.failed;
|
||||||
s.status.failedInfo = e.toString();
|
s.status.failedInfo = '$e\n$raw';
|
||||||
_logger.warning(e);
|
_logger.warning(e);
|
||||||
} finally {
|
} finally {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|||||||
@@ -3,32 +3,44 @@ import 'build_data.dart';
|
|||||||
const seperator = 'SrvBox';
|
const seperator = 'SrvBox';
|
||||||
const serverBoxDir = r'$HOME/.config/server_box';
|
const serverBoxDir = r'$HOME/.config/server_box';
|
||||||
const shellPath = '$serverBoxDir/mobile_app.sh';
|
const shellPath = '$serverBoxDir/mobile_app.sh';
|
||||||
const installShellCmd =
|
|
||||||
"mkdir -p $serverBoxDir && echo '$shellCmd' > $shellPath && chmod +x $shellPath";
|
|
||||||
|
|
||||||
const shellCmd = """
|
enum CmdType {
|
||||||
# Script for app `${BuildData.name}`
|
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
|
# Delete this file while app is running will cause app crash
|
||||||
|
|
||||||
export LANG=en_US.utf-8
|
${_cmdList.join('\necho $seperator\n')}
|
||||||
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
|
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
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/memory.dart';
|
||||||
import '../model/server/net_speed.dart';
|
import '../model/server/net_speed.dart';
|
||||||
import '../model/server/server_status.dart';
|
import '../model/server/server_status.dart';
|
||||||
import '../model/server/tcp_status.dart';
|
import '../model/server/conn_status.dart';
|
||||||
|
|
||||||
Memory get _initMemory => Memory(
|
Memory get _initMemory => Memory(
|
||||||
total: 1,
|
total: 1,
|
||||||
@@ -49,7 +49,7 @@ ServerStatus get initStatus => ServerStatus(
|
|||||||
sysVer: 'Loading...',
|
sysVer: 'Loading...',
|
||||||
uptime: '',
|
uptime: '',
|
||||||
disk: [DiskInfo('/', '/', 0, '0', '0', '0')],
|
disk: [DiskInfo('/', '/', 0, '0', '0', '0')],
|
||||||
tcp: TcpStatus(0, 0, 0, 0),
|
tcp: ConnStatus(0, 0, 0, 0),
|
||||||
netSpeed: initNetSpeed,
|
netSpeed: initNetSpeed,
|
||||||
swap: _initSwap,
|
swap: _initSwap,
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user