opt.: refactor AppShellFunc

This commit is contained in:
lollipopkit
2023-08-05 15:19:37 +08:00
parent 432e3b1824
commit c406d92b82
6 changed files with 98 additions and 80 deletions

View File

@@ -1,22 +1,46 @@
import '../../res/server_cmd.dart';
class AppShellFunc {
final String name;
final String cmd;
final String flag;
const _cmdDivider = '\necho $seperator\n';
const AppShellFunc(this.name, this.cmd, this.flag);
enum AppShellFuncType {
status,
docker;
String get flag {
switch (this) {
case AppShellFuncType.status:
return 's';
case AppShellFuncType.docker:
return 'd';
}
}
String get exec => 'sh $shellPath -$flag';
}
typedef AppShellFuncs = List<AppShellFunc>;
String get name {
switch (this) {
case AppShellFuncType.status:
return 'status';
case AppShellFuncType.docker:
/// `dockeR` -> avoid conflict with `docker` command
/// 以防止循环递归
return 'dockeR';
}
}
extension AppShellFuncsExt on AppShellFuncs {
String get generate {
String get cmd {
switch (this) {
case AppShellFuncType.status:
return statusCmds.join(_cmdDivider);
case AppShellFuncType.docker:
return dockerCmds.join(_cmdDivider);
}
}
static String get shellScript {
final sb = StringBuffer();
// Write each func
for (final func in this) {
for (final func in values) {
sb.write('''
${func.name}() {
${func.cmd}
@@ -27,7 +51,7 @@ ${func.cmd}
// Write switch case
sb.write('case \$1 in\n');
for (final func in this) {
for (final func in values) {
sb.write('''
'-${func.flag}')
${func.name}
@@ -38,13 +62,43 @@ ${func.cmd}
*)
echo "Invalid argument \$1"
;;
esac
''');
esac''');
return sb.toString();
}
}
// enum AppShellFuncType {
// status,
// docker;
// }
abstract class _CmdType {
/// Find out the required segment from [segments]
String find(List<String> segments);
}
enum StatusCmdType implements _CmdType {
net,
sys,
cpu,
uptime,
conn,
disk,
mem,
tempType,
tempVal,
host,
sysRhel;
@override
String find(List<String> segments) {
return segments[index];
}
}
enum DockerCmdType implements _CmdType {
version,
ps,
stats,
images;
@override
String find(List<String> segments) {
return segments[index];
}
}

View File

@@ -1,4 +1,4 @@
import '../../res/server_cmd.dart';
import '../app/shell_func.dart';
import 'cpu.dart';
import 'disk.dart';
import 'memory.dart';
@@ -13,50 +13,43 @@ 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.at(CmdType.net));
final segments = req.segments;
final net = parseNetSpeed(StatusCmdType.net.find(segments));
req.ss.netSpeed.update(net);
final sys = _parseSysVer(
req.segments.at(CmdType.sys),
req.segments.at(CmdType.host),
req.segments.at(CmdType.sysRhel),
StatusCmdType.sys.find(segments),
StatusCmdType.host.find(segments),
StatusCmdType.sysRhel.find(segments),
);
if (sys != null) {
req.ss.sysVer = sys;
}
final cpus = parseCPU(req.segments.at(CmdType.cpu));
final cpus = parseCPU(StatusCmdType.cpu.find(segments));
req.ss.cpu.update(cpus);
req.ss.temps.parse(
req.segments.at(CmdType.tempType),
req.segments.at(CmdType.tempVal),
StatusCmdType.tempType.find(segments),
StatusCmdType.tempVal.find(segments),
);
final tcp = parseConn(req.segments.at(CmdType.conn));
final tcp = parseConn(StatusCmdType.conn.find(segments));
if (tcp != null) {
req.ss.tcp = tcp;
}
req.ss.disk = parseDisk(req.segments.at(CmdType.disk));
req.ss.disk = parseDisk(StatusCmdType.disk.find(segments));
req.ss.mem = parseMem(req.segments.at(CmdType.mem));
req.ss.mem = parseMem(StatusCmdType.mem.find(segments));
final uptime = _parseUpTime(req.segments.at(CmdType.uptime));
final uptime = _parseUpTime(StatusCmdType.uptime.find(segments));
if (uptime != null) {
req.ss.uptime = uptime;
}
req.ss.swap = parseSwap(req.segments.at(CmdType.mem));
req.ss.swap = parseSwap(StatusCmdType.mem.find(segments));
return req.ss;
}