mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
feat: systemd management (#532)
This commit is contained in:
@@ -2,29 +2,47 @@ import 'package:flutter/material.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:icons_plus/icons_plus.dart';
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
|
||||
part 'server_func.g.dart';
|
||||
|
||||
@HiveType(typeId: 6)
|
||||
enum ServerFuncBtn {
|
||||
@HiveField(0)
|
||||
terminal,
|
||||
terminal._(),
|
||||
@HiveField(1)
|
||||
sftp,
|
||||
sftp._(),
|
||||
@HiveField(2)
|
||||
container,
|
||||
container._(),
|
||||
@HiveField(3)
|
||||
process,
|
||||
process._(),
|
||||
//@HiveField(4)
|
||||
//pkg,
|
||||
@HiveField(5)
|
||||
snippet,
|
||||
snippet._(),
|
||||
@HiveField(6)
|
||||
iperf,
|
||||
iperf._(),
|
||||
// @HiveField(7)
|
||||
// pve,
|
||||
@HiveField(8)
|
||||
systemd._(1058),
|
||||
;
|
||||
|
||||
final int? addedVersion;
|
||||
|
||||
const ServerFuncBtn._([this.addedVersion]);
|
||||
|
||||
static void autoAddNewFuncs(int cur) {
|
||||
if (cur >= systemd.addedVersion!) {
|
||||
final prop = Stores.setting.serverFuncBtns;
|
||||
final list = prop.fetch();
|
||||
if (!list.contains(systemd.index)) {
|
||||
list.add(systemd.index);
|
||||
prop.put(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static final defaultIdxs = [
|
||||
terminal,
|
||||
sftp,
|
||||
@@ -32,6 +50,7 @@ enum ServerFuncBtn {
|
||||
process,
|
||||
//pkg,
|
||||
snippet,
|
||||
systemd,
|
||||
].map((e) => e.index).toList();
|
||||
|
||||
IconData get icon => switch (this) {
|
||||
@@ -42,6 +61,7 @@ enum ServerFuncBtn {
|
||||
process => Icons.list_alt_outlined,
|
||||
terminal => Icons.terminal,
|
||||
iperf => Icons.speed,
|
||||
systemd => MingCute.plugin_2_fill,
|
||||
};
|
||||
|
||||
String get toStr => switch (this) {
|
||||
@@ -52,5 +72,6 @@ enum ServerFuncBtn {
|
||||
process => l10n.process,
|
||||
terminal => l10n.terminal,
|
||||
iperf => 'iperf',
|
||||
systemd => 'Systemd',
|
||||
};
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ class ServerFuncBtnAdapter extends TypeAdapter<ServerFuncBtn> {
|
||||
return ServerFuncBtn.snippet;
|
||||
case 6:
|
||||
return ServerFuncBtn.iperf;
|
||||
case 8:
|
||||
return ServerFuncBtn.systemd;
|
||||
default:
|
||||
return ServerFuncBtn.terminal;
|
||||
}
|
||||
@@ -51,6 +53,9 @@ class ServerFuncBtnAdapter extends TypeAdapter<ServerFuncBtn> {
|
||||
case ServerFuncBtn.iperf:
|
||||
writer.writeByte(6);
|
||||
break;
|
||||
case ServerFuncBtn.systemd:
|
||||
writer.writeByte(8);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
118
lib/data/model/server/systemd.dart
Normal file
118
lib/data/model/server/systemd.dart
Normal file
@@ -0,0 +1,118 @@
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum SystemdUnitFunc {
|
||||
start,
|
||||
stop,
|
||||
restart,
|
||||
reload,
|
||||
enable,
|
||||
disable,
|
||||
status,
|
||||
;
|
||||
|
||||
IconData get icon => switch (this) {
|
||||
start => Icons.play_arrow,
|
||||
stop => Icons.stop,
|
||||
restart => Icons.refresh,
|
||||
reload => Icons.refresh,
|
||||
enable => Icons.check,
|
||||
disable => Icons.close,
|
||||
status => Icons.info,
|
||||
};
|
||||
}
|
||||
|
||||
enum SystemdUnitType {
|
||||
service,
|
||||
socket,
|
||||
mount,
|
||||
timer,
|
||||
;
|
||||
|
||||
static SystemdUnitType? fromString(String? value) {
|
||||
return values.firstWhereOrNull((e) => e.name == value?.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
enum SystemdUnitScope {
|
||||
system,
|
||||
user,
|
||||
;
|
||||
|
||||
Color? get color => switch (this) {
|
||||
system => Colors.red,
|
||||
_ => null,
|
||||
};
|
||||
|
||||
String getCmdPrefix(bool isRoot) {
|
||||
if (this == system) {
|
||||
return isRoot ? 'systemctl' : 'sudo systemctl';
|
||||
}
|
||||
return 'systemctl --user';
|
||||
}
|
||||
}
|
||||
|
||||
enum SystemdUnitState {
|
||||
active,
|
||||
inactive,
|
||||
failed,
|
||||
activating,
|
||||
deactivating,
|
||||
;
|
||||
|
||||
static SystemdUnitState? fromString(String? value) {
|
||||
return values.firstWhereOrNull((e) => e.name == value?.toLowerCase());
|
||||
}
|
||||
|
||||
Color? get color => switch (this) {
|
||||
failed => Colors.red,
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
||||
final class SystemdUnit {
|
||||
final String name;
|
||||
final String? description;
|
||||
final SystemdUnitType type;
|
||||
final SystemdUnitScope scope;
|
||||
final SystemdUnitState state;
|
||||
|
||||
SystemdUnit({
|
||||
required this.name,
|
||||
this.description,
|
||||
required this.type,
|
||||
required this.scope,
|
||||
required this.state,
|
||||
});
|
||||
|
||||
String getCmd({
|
||||
required SystemdUnitFunc func,
|
||||
required bool isRoot,
|
||||
}) {
|
||||
final prefix = scope.getCmdPrefix(isRoot);
|
||||
return '$prefix ${func.name} $name';
|
||||
}
|
||||
|
||||
List<SystemdUnitFunc> get availableFuncs {
|
||||
final funcs = <SystemdUnitFunc>{};
|
||||
switch (state) {
|
||||
case SystemdUnitState.active:
|
||||
funcs.addAll([SystemdUnitFunc.stop, SystemdUnitFunc.restart]);
|
||||
break;
|
||||
case SystemdUnitState.inactive:
|
||||
funcs.addAll([SystemdUnitFunc.start]);
|
||||
break;
|
||||
case SystemdUnitState.failed:
|
||||
funcs.addAll([SystemdUnitFunc.restart]);
|
||||
break;
|
||||
case SystemdUnitState.activating:
|
||||
funcs.addAll([SystemdUnitFunc.stop]);
|
||||
break;
|
||||
case SystemdUnitState.deactivating:
|
||||
funcs.addAll([SystemdUnitFunc.start]);
|
||||
break;
|
||||
}
|
||||
funcs.addAll([SystemdUnitFunc.status]);
|
||||
return funcs.toList();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user