mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2026-01-31 21:34:45 +01:00
* fix(systemd): Fix the issue of special characters in unit names In systemd unit processing, filtering of special characters in unit names has been added to prevent command injection and security issues. Additionally, the rendering performance of the unit list has been optimized by merging unnecessary watch calls and removing confirmation dialogs to simplify the operation process. * feat(Systemd): Add a confirmation dialog for systemd unit operations Display a confirmation dialog when stopping or restarting systemd units to prevent accidental operations. For other operations, directly navigate to the SSH page to execute commands. * fix(systemd): Fix the range of characters allowed in unit names Extend the regular expression to allow more valid characters, including dots, @, and colons, in system unit names, to support a broader range of unit naming conventions * fix(systemd): Fix the issue of parsing service names with dots When dealing with service IDs containing multiple dots (such as org.cups.cupsd.service), correctly extract the service name and type. When there are no dots in the service ID, set the type to an empty string.
125 lines
2.6 KiB
Dart
125 lines
2.6 KiB
Dart
import 'package:fl_lib/fl_lib.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:server_box/core/extension/context/locale.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 SystemdScopeFilter {
|
|
all,
|
|
system,
|
|
user;
|
|
|
|
String get displayName => switch (this) {
|
|
all => libL10n.all,
|
|
system => l10n.system,
|
|
user => libL10n.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.replaceAll(RegExp(r'[^a-zA-Z0-9\-_.@:]'), '')}';
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|