mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 23:34:24 +01:00
new: battery (#235)
This commit is contained in:
12
lib/core/extension/status_cmd_type.dart
Normal file
12
lib/core/extension/status_cmd_type.dart
Normal file
@@ -0,0 +1,12 @@
|
||||
import 'package:toolbox/core/extension/context/locale.dart';
|
||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
||||
|
||||
extension StatusCmdTypeX on StatusCmdType {
|
||||
String get i18n => switch (this) {
|
||||
StatusCmdType.sys => l10n.system,
|
||||
StatusCmdType.host => l10n.host,
|
||||
StatusCmdType.uptime => l10n.uptime,
|
||||
StatusCmdType.battery => l10n.battery,
|
||||
final val => val.name,
|
||||
};
|
||||
}
|
||||
@@ -200,7 +200,8 @@ enum StatusCmdType {
|
||||
tempVal,
|
||||
host,
|
||||
diskio,
|
||||
nvdia,
|
||||
battery,
|
||||
nvidia,
|
||||
;
|
||||
}
|
||||
|
||||
@@ -219,6 +220,7 @@ const _statusCmds = [
|
||||
'cat /sys/class/thermal/thermal_zone*/temp',
|
||||
'hostname',
|
||||
'cat /proc/diskstats',
|
||||
'cat /sys/class/power_supply/*/capacity',
|
||||
'nvidia-smi -q -x',
|
||||
];
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:dartssh2/dartssh2.dart';
|
||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
||||
import 'package:toolbox/data/model/server/conn.dart';
|
||||
import 'package:toolbox/data/model/server/cpu.dart';
|
||||
import 'package:toolbox/data/model/server/disk.dart';
|
||||
@@ -47,8 +48,6 @@ class ServerStatus {
|
||||
Cpus cpu;
|
||||
Memory mem;
|
||||
Swap swap;
|
||||
String sysVer;
|
||||
String uptime;
|
||||
List<Disk> disk;
|
||||
Conn tcp;
|
||||
NetSpeed netSpeed;
|
||||
@@ -57,6 +56,7 @@ class ServerStatus {
|
||||
String? err;
|
||||
DiskIO diskIO;
|
||||
List<NvidiaSmiItem>? nvidia;
|
||||
final Map<StatusCmdType, String> more = {};
|
||||
|
||||
/// Whether is connectting, parsing and etc.
|
||||
bool _isBusy = false;
|
||||
@@ -64,8 +64,6 @@ class ServerStatus {
|
||||
ServerStatus({
|
||||
required this.cpu,
|
||||
required this.mem,
|
||||
required this.sysVer,
|
||||
required this.uptime,
|
||||
required this.disk,
|
||||
required this.tcp,
|
||||
required this.netSpeed,
|
||||
|
||||
@@ -49,10 +49,18 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
||||
try {
|
||||
final sys = _parseSysVer(
|
||||
StatusCmdType.sys.find(segments),
|
||||
StatusCmdType.host.find(segments),
|
||||
);
|
||||
if (sys != null) {
|
||||
req.ss.sysVer = sys;
|
||||
req.ss.more[StatusCmdType.sys] = sys;
|
||||
}
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
}
|
||||
|
||||
try {
|
||||
final host = StatusCmdType.host.find(segments);
|
||||
if (host.isNotEmpty) {
|
||||
req.ss.more[StatusCmdType.host] = host;
|
||||
}
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
@@ -93,7 +101,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
||||
try {
|
||||
final uptime = _parseUpTime(StatusCmdType.uptime.find(segments));
|
||||
if (uptime != null) {
|
||||
req.ss.uptime = uptime;
|
||||
req.ss.more[StatusCmdType.uptime] = uptime;
|
||||
}
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
@@ -118,6 +126,16 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
}
|
||||
|
||||
try {
|
||||
final battery = StatusCmdType.battery.find(segments);
|
||||
if (battery.isNotEmpty && !battery.contains('No such')) {
|
||||
req.ss.more[StatusCmdType.battery] = battery;
|
||||
}
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
}
|
||||
|
||||
return req.ss;
|
||||
}
|
||||
|
||||
@@ -134,7 +152,7 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
|
||||
}
|
||||
|
||||
try {
|
||||
req.ss.sysVer = BSDStatusCmdType.sys.find(segments);
|
||||
req.ss.more[StatusCmdType.sys] = BSDStatusCmdType.sys.find(segments);
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
}
|
||||
@@ -154,7 +172,7 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
|
||||
try {
|
||||
final uptime = _parseUpTime(BSDStatusCmdType.uptime.find(segments));
|
||||
if (uptime != null) {
|
||||
req.ss.uptime = uptime;
|
||||
req.ss.more[StatusCmdType.uptime] = uptime;
|
||||
}
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
@@ -181,10 +199,10 @@ String? _parseUpTime(String raw) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String? _parseSysVer(String raw, String hostname) {
|
||||
String? _parseSysVer(String raw) {
|
||||
final s = raw.split('=');
|
||||
if (s.length == 2) {
|
||||
return s[1].replaceAll('"', '').replaceFirst('\n', '');
|
||||
}
|
||||
return hostname.isEmpty ? null : hostname;
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
class BuildData {
|
||||
static const String name = "ServerBox";
|
||||
static const int build = 674;
|
||||
static const int build = 678;
|
||||
static const String engine = "3.16.3";
|
||||
static const String buildAt = "2023-12-12 18:14:36";
|
||||
static const int modifications = 29;
|
||||
static const String buildAt = "2023-12-17 18:43:29";
|
||||
static const int modifications = 8;
|
||||
static const int script = 31;
|
||||
}
|
||||
|
||||
@@ -40,8 +40,6 @@ abstract final class InitStatus {
|
||||
free: 1,
|
||||
avail: 1,
|
||||
),
|
||||
sysVer: 'Loading...',
|
||||
uptime: '',
|
||||
disk: [
|
||||
const Disk(
|
||||
dev: '/',
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"backupAndRestore": "Backup und Wiederherstellung",
|
||||
"backupTip": "Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.",
|
||||
"backupVersionNotMatch": "Die Backup-Version stimmt nicht überein.",
|
||||
"battery": "Batterie",
|
||||
"bgRun": "Hintergrundaktualisierung",
|
||||
"bioAuth": "Biozertifizierung",
|
||||
"canPullRefresh": "Danach: herunterziehen zum Aktualisieren",
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"backupAndRestore": "Backup and Restore",
|
||||
"backupTip": "The exported data is simply encrypted. \nPlease keep it safe.",
|
||||
"backupVersionNotMatch": "Backup version is not match.",
|
||||
"battery": "Battery",
|
||||
"bgRun": "Run in backgroud",
|
||||
"bioAuth": "Biometric auth",
|
||||
"canPullRefresh": "You can pull to refresh.",
|
||||
@@ -236,6 +237,7 @@
|
||||
"updateTipTooLow": "Current version is too low, please update to v1.0.{newest}",
|
||||
"upload": "Upload",
|
||||
"upsideDown": "Upside Down",
|
||||
"uptime": "Uptime",
|
||||
"urlOrJson": "URL or JSON",
|
||||
"useNoPwd": "No password will be used.",
|
||||
"user": "User",
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"backupAndRestore": "Cadangan dan Pulihkan",
|
||||
"backupTip": "Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.",
|
||||
"backupVersionNotMatch": "Versi cadangan tidak cocok.",
|
||||
"battery": "Baterai",
|
||||
"bgRun": "Jalankan di Backgroud",
|
||||
"bioAuth": "Biosertifikasi",
|
||||
"canPullRefresh": "Anda dapat menarik untuk menyegarkan.",
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"backupAndRestore": "备份和恢复",
|
||||
"backupTip": "导出的数据仅进行了简单加密,请妥善保管。",
|
||||
"backupVersionNotMatch": "备份版本不匹配,无法恢复",
|
||||
"battery": "电池",
|
||||
"bgRun": "后台运行",
|
||||
"bioAuth": "生物认证",
|
||||
"canPullRefresh": "可以下拉刷新",
|
||||
@@ -236,6 +237,7 @@
|
||||
"updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}",
|
||||
"upload": "上传",
|
||||
"upsideDown": "上下交换",
|
||||
"uptime": "启动时长",
|
||||
"urlOrJson": "链接或JSON",
|
||||
"useNoPwd": "将会使用无密码。",
|
||||
"user": "用户",
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"backupAndRestore": "備份和還原",
|
||||
"backupTip": "導出的數據僅進行了簡單加密,請妥善保管。",
|
||||
"backupVersionNotMatch": "備份版本不匹配,無法還原",
|
||||
"battery": "電池",
|
||||
"bgRun": "背景運行",
|
||||
"bioAuth": "生物認證",
|
||||
"canPullRefresh": "可以下拉更新",
|
||||
@@ -236,6 +237,7 @@
|
||||
"updateTipTooLow": "當前版本過低,請升級至 v1.0.{newest}",
|
||||
"upload": "上傳",
|
||||
"upsideDown": "上下交換",
|
||||
"uptime": "啟動時長",
|
||||
"urlOrJson": "鏈接或JSON",
|
||||
"useNoPwd": "将使用無密碼。",
|
||||
"user": "用戶",
|
||||
|
||||
@@ -8,6 +8,7 @@ import 'package:get_it/get_it.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:toolbox/core/extension/context/locale.dart';
|
||||
import 'package:toolbox/core/route.dart';
|
||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
||||
import 'package:toolbox/data/model/server/disk.dart';
|
||||
import 'package:toolbox/data/provider/server.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
@@ -239,7 +240,7 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
|
||||
final topRightStr = _getTopRightStr(
|
||||
cs,
|
||||
ss.temps.first,
|
||||
ss.uptime,
|
||||
ss.more[StatusCmdType.uptime] ?? '',
|
||||
ss.err,
|
||||
);
|
||||
return Text(
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/context/locale.dart';
|
||||
import 'package:toolbox/core/extension/order.dart';
|
||||
import 'package:toolbox/core/extension/status_cmd_type.dart';
|
||||
import 'package:toolbox/core/extension/widget.dart';
|
||||
import 'package:toolbox/data/model/server/cpu.dart';
|
||||
import 'package:toolbox/data/model/server/disk.dart';
|
||||
@@ -203,23 +204,25 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
|
||||
Widget _buildUpTimeAndSys(ServerStatus ss) {
|
||||
return CardX(
|
||||
child: Padding(
|
||||
padding: UIs.roundRectCardPadding,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
ss.sysVer,
|
||||
style: UIs.textSize11,
|
||||
textScaler: _textFactor,
|
||||
),
|
||||
Text(
|
||||
ss.uptime,
|
||||
style: UIs.textSize11,
|
||||
textScaler: _textFactor,
|
||||
),
|
||||
],
|
||||
child: ExpandTile(
|
||||
leading: const Icon(Icons.computer),
|
||||
initiallyExpanded: ss.more.entries.length < 7,
|
||||
title: Text(l10n.about),
|
||||
childrenPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 17,
|
||||
vertical: 7,
|
||||
),
|
||||
children: ss.more.entries
|
||||
.map(
|
||||
(e) => Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(e.key.i18n, style: UIs.textSize13),
|
||||
Text(e.value, style: UIs.textSize11Grey)
|
||||
],
|
||||
).padding(const EdgeInsets.symmetric(vertical: 1)),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -370,7 +370,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
final topRightStr = _getTopRightStr(
|
||||
cs,
|
||||
ss.temps.first,
|
||||
ss.uptime,
|
||||
ss.more[StatusCmdType.uptime] ?? '',
|
||||
ss.err,
|
||||
);
|
||||
if (cs == ServerState.failed && ss.err != null) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import 'package:toolbox/core/extension/ssh_client.dart';
|
||||
import 'package:toolbox/core/extension/uint8list.dart';
|
||||
import 'package:toolbox/core/utils/platform/base.dart';
|
||||
import 'package:toolbox/core/utils/platform/path.dart';
|
||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
||||
import 'package:toolbox/data/model/pkg/manager.dart';
|
||||
import 'package:toolbox/data/model/server/dist.dart';
|
||||
import 'package:toolbox/data/res/path.dart';
|
||||
@@ -238,7 +239,11 @@ Future<void> _onPkg(BuildContext context, ServerPrivateInfo spi) async {
|
||||
context.showSnackBar(l10n.noClient);
|
||||
return;
|
||||
}
|
||||
final sys = server.status.sysVer;
|
||||
final sys = server.status.more[StatusCmdType.sys];
|
||||
if (sys == null) {
|
||||
context.showSnackBar(l10n.noResult);
|
||||
return;
|
||||
}
|
||||
final pkg = PkgManager.fromDist(sys.dist);
|
||||
|
||||
// Update pkg list
|
||||
|
||||
Reference in New Issue
Block a user