new: battery (#235)

This commit is contained in:
lollipopkit
2023-12-18 17:43:38 +08:00
parent dd2555fc3f
commit 48bc6da7b5
21 changed files with 141 additions and 54 deletions

View File

@@ -230,6 +230,12 @@ abstract class S {
/// **'Backup version is not match.'** /// **'Backup version is not match.'**
String get backupVersionNotMatch; String get backupVersionNotMatch;
/// No description provided for @battery.
///
/// In en, this message translates to:
/// **'Battery'**
String get battery;
/// No description provided for @bgRun. /// No description provided for @bgRun.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -1514,6 +1520,12 @@ abstract class S {
/// **'Upside Down'** /// **'Upside Down'**
String get upsideDown; String get upsideDown;
/// No description provided for @uptime.
///
/// In en, this message translates to:
/// **'Uptime'**
String get uptime;
/// No description provided for @urlOrJson. /// No description provided for @urlOrJson.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

View File

@@ -72,6 +72,9 @@ class SDe extends S {
@override @override
String get backupVersionNotMatch => 'Die Backup-Version stimmt nicht überein.'; String get backupVersionNotMatch => 'Die Backup-Version stimmt nicht überein.';
@override
String get battery => 'Batterie';
@override @override
String get bgRun => 'Hintergrundaktualisierung'; String get bgRun => 'Hintergrundaktualisierung';
@@ -746,6 +749,9 @@ class SDe extends S {
@override @override
String get upsideDown => 'Upside Down'; String get upsideDown => 'Upside Down';
@override
String get uptime => 'Uptime';
@override @override
String get urlOrJson => 'URL oder JSON'; String get urlOrJson => 'URL oder JSON';

View File

@@ -72,6 +72,9 @@ class SEn extends S {
@override @override
String get backupVersionNotMatch => 'Backup version is not match.'; String get backupVersionNotMatch => 'Backup version is not match.';
@override
String get battery => 'Battery';
@override @override
String get bgRun => 'Run in backgroud'; String get bgRun => 'Run in backgroud';
@@ -746,6 +749,9 @@ class SEn extends S {
@override @override
String get upsideDown => 'Upside Down'; String get upsideDown => 'Upside Down';
@override
String get uptime => 'Uptime';
@override @override
String get urlOrJson => 'URL or JSON'; String get urlOrJson => 'URL or JSON';

View File

@@ -72,6 +72,9 @@ class SId extends S {
@override @override
String get backupVersionNotMatch => 'Versi cadangan tidak cocok.'; String get backupVersionNotMatch => 'Versi cadangan tidak cocok.';
@override
String get battery => 'Baterai';
@override @override
String get bgRun => 'Jalankan di Backgroud'; String get bgRun => 'Jalankan di Backgroud';
@@ -746,6 +749,9 @@ class SId extends S {
@override @override
String get upsideDown => 'Terbalik'; String get upsideDown => 'Terbalik';
@override
String get uptime => 'Uptime';
@override @override
String get urlOrJson => 'URL atau JSON'; String get urlOrJson => 'URL atau JSON';

View File

@@ -72,6 +72,9 @@ class SZh extends S {
@override @override
String get backupVersionNotMatch => '备份版本不匹配,无法恢复'; String get backupVersionNotMatch => '备份版本不匹配,无法恢复';
@override
String get battery => '电池';
@override @override
String get bgRun => '后台运行'; String get bgRun => '后台运行';
@@ -746,6 +749,9 @@ class SZh extends S {
@override @override
String get upsideDown => '上下交换'; String get upsideDown => '上下交换';
@override
String get uptime => '启动时长';
@override @override
String get urlOrJson => '链接或JSON'; String get urlOrJson => '链接或JSON';
@@ -870,6 +876,9 @@ class SZhTw extends SZh {
@override @override
String get backupVersionNotMatch => '備份版本不匹配,無法還原'; String get backupVersionNotMatch => '備份版本不匹配,無法還原';
@override
String get battery => '電池';
@override @override
String get bgRun => '背景運行'; String get bgRun => '背景運行';
@@ -1544,6 +1553,9 @@ class SZhTw extends SZh {
@override @override
String get upsideDown => '上下交換'; String get upsideDown => '上下交換';
@override
String get uptime => '啟動時長';
@override @override
String get urlOrJson => '鏈接或JSON'; String get urlOrJson => '鏈接或JSON';

View File

@@ -586,7 +586,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -596,7 +596,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -720,7 +720,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -730,7 +730,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -748,7 +748,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -758,7 +758,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -779,7 +779,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -792,7 +792,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
@@ -818,7 +818,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -831,7 +831,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -854,7 +854,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -867,7 +867,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -890,7 +890,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -902,7 +902,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
@@ -931,7 +931,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -943,7 +943,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox; PRODUCT_NAME = ServerBox;
@@ -969,7 +969,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 674; CURRENT_PROJECT_VERSION = 678;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -981,7 +981,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.674; MARKETING_VERSION = 1.0.678;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox; PRODUCT_NAME = ServerBox;

View 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,
};
}

View File

@@ -200,7 +200,8 @@ enum StatusCmdType {
tempVal, tempVal,
host, host,
diskio, diskio,
nvdia, battery,
nvidia,
; ;
} }
@@ -219,6 +220,7 @@ const _statusCmds = [
'cat /sys/class/thermal/thermal_zone*/temp', 'cat /sys/class/thermal/thermal_zone*/temp',
'hostname', 'hostname',
'cat /proc/diskstats', 'cat /proc/diskstats',
'cat /sys/class/power_supply/*/capacity',
'nvidia-smi -q -x', 'nvidia-smi -q -x',
]; ];

View File

@@ -1,4 +1,5 @@
import 'package:dartssh2/dartssh2.dart'; 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/conn.dart';
import 'package:toolbox/data/model/server/cpu.dart'; import 'package:toolbox/data/model/server/cpu.dart';
import 'package:toolbox/data/model/server/disk.dart'; import 'package:toolbox/data/model/server/disk.dart';
@@ -47,8 +48,6 @@ class ServerStatus {
Cpus cpu; Cpus cpu;
Memory mem; Memory mem;
Swap swap; Swap swap;
String sysVer;
String uptime;
List<Disk> disk; List<Disk> disk;
Conn tcp; Conn tcp;
NetSpeed netSpeed; NetSpeed netSpeed;
@@ -57,6 +56,7 @@ class ServerStatus {
String? err; String? err;
DiskIO diskIO; DiskIO diskIO;
List<NvidiaSmiItem>? nvidia; List<NvidiaSmiItem>? nvidia;
final Map<StatusCmdType, String> more = {};
/// Whether is connectting, parsing and etc. /// Whether is connectting, parsing and etc.
bool _isBusy = false; bool _isBusy = false;
@@ -64,8 +64,6 @@ class ServerStatus {
ServerStatus({ ServerStatus({
required this.cpu, required this.cpu,
required this.mem, required this.mem,
required this.sysVer,
required this.uptime,
required this.disk, required this.disk,
required this.tcp, required this.tcp,
required this.netSpeed, required this.netSpeed,

View File

@@ -49,10 +49,18 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
try { try {
final sys = _parseSysVer( final sys = _parseSysVer(
StatusCmdType.sys.find(segments), StatusCmdType.sys.find(segments),
StatusCmdType.host.find(segments),
); );
if (sys != null) { 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) { } catch (e, s) {
Loggers.parse.warning(e, s); Loggers.parse.warning(e, s);
@@ -93,7 +101,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
try { try {
final uptime = _parseUpTime(StatusCmdType.uptime.find(segments)); final uptime = _parseUpTime(StatusCmdType.uptime.find(segments));
if (uptime != null) { if (uptime != null) {
req.ss.uptime = uptime; req.ss.more[StatusCmdType.uptime] = uptime;
} }
} catch (e, s) { } catch (e, s) {
Loggers.parse.warning(e, s); Loggers.parse.warning(e, s);
@@ -118,6 +126,16 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
} catch (e, s) { } catch (e, s) {
Loggers.parse.warning(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; return req.ss;
} }
@@ -134,7 +152,7 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
} }
try { try {
req.ss.sysVer = BSDStatusCmdType.sys.find(segments); req.ss.more[StatusCmdType.sys] = BSDStatusCmdType.sys.find(segments);
} catch (e, s) { } catch (e, s) {
Loggers.parse.warning(e, s); Loggers.parse.warning(e, s);
} }
@@ -154,7 +172,7 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
try { try {
final uptime = _parseUpTime(BSDStatusCmdType.uptime.find(segments)); final uptime = _parseUpTime(BSDStatusCmdType.uptime.find(segments));
if (uptime != null) { if (uptime != null) {
req.ss.uptime = uptime; req.ss.more[StatusCmdType.uptime] = uptime;
} }
} catch (e, s) { } catch (e, s) {
Loggers.parse.warning(e, s); Loggers.parse.warning(e, s);
@@ -181,10 +199,10 @@ String? _parseUpTime(String raw) {
return null; return null;
} }
String? _parseSysVer(String raw, String hostname) { String? _parseSysVer(String raw) {
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', '');
} }
return hostname.isEmpty ? null : hostname; return null;
} }

View File

@@ -2,9 +2,9 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; 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 engine = "3.16.3";
static const String buildAt = "2023-12-12 18:14:36"; static const String buildAt = "2023-12-17 18:43:29";
static const int modifications = 29; static const int modifications = 8;
static const int script = 31; static const int script = 31;
} }

View File

@@ -40,8 +40,6 @@ abstract final class InitStatus {
free: 1, free: 1,
avail: 1, avail: 1,
), ),
sysVer: 'Loading...',
uptime: '',
disk: [ disk: [
const Disk( const Disk(
dev: '/', dev: '/',

View File

@@ -22,6 +22,7 @@
"backupAndRestore": "Backup und Wiederherstellung", "backupAndRestore": "Backup und Wiederherstellung",
"backupTip": "Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.", "backupTip": "Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.",
"backupVersionNotMatch": "Die Backup-Version stimmt nicht überein.", "backupVersionNotMatch": "Die Backup-Version stimmt nicht überein.",
"battery": "Batterie",
"bgRun": "Hintergrundaktualisierung", "bgRun": "Hintergrundaktualisierung",
"bioAuth": "Biozertifizierung", "bioAuth": "Biozertifizierung",
"canPullRefresh": "Danach: herunterziehen zum Aktualisieren", "canPullRefresh": "Danach: herunterziehen zum Aktualisieren",

View File

@@ -22,6 +22,7 @@
"backupAndRestore": "Backup and Restore", "backupAndRestore": "Backup and Restore",
"backupTip": "The exported data is simply encrypted. \nPlease keep it safe.", "backupTip": "The exported data is simply encrypted. \nPlease keep it safe.",
"backupVersionNotMatch": "Backup version is not match.", "backupVersionNotMatch": "Backup version is not match.",
"battery": "Battery",
"bgRun": "Run in backgroud", "bgRun": "Run in backgroud",
"bioAuth": "Biometric auth", "bioAuth": "Biometric auth",
"canPullRefresh": "You can pull to refresh.", "canPullRefresh": "You can pull to refresh.",
@@ -236,6 +237,7 @@
"updateTipTooLow": "Current version is too low, please update to v1.0.{newest}", "updateTipTooLow": "Current version is too low, please update to v1.0.{newest}",
"upload": "Upload", "upload": "Upload",
"upsideDown": "Upside Down", "upsideDown": "Upside Down",
"uptime": "Uptime",
"urlOrJson": "URL or JSON", "urlOrJson": "URL or JSON",
"useNoPwd": "No password will be used.", "useNoPwd": "No password will be used.",
"user": "User", "user": "User",

View File

@@ -22,6 +22,7 @@
"backupAndRestore": "Cadangan dan Pulihkan", "backupAndRestore": "Cadangan dan Pulihkan",
"backupTip": "Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.", "backupTip": "Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.",
"backupVersionNotMatch": "Versi cadangan tidak cocok.", "backupVersionNotMatch": "Versi cadangan tidak cocok.",
"battery": "Baterai",
"bgRun": "Jalankan di Backgroud", "bgRun": "Jalankan di Backgroud",
"bioAuth": "Biosertifikasi", "bioAuth": "Biosertifikasi",
"canPullRefresh": "Anda dapat menarik untuk menyegarkan.", "canPullRefresh": "Anda dapat menarik untuk menyegarkan.",

View File

@@ -22,6 +22,7 @@
"backupAndRestore": "备份和恢复", "backupAndRestore": "备份和恢复",
"backupTip": "导出的数据仅进行了简单加密,请妥善保管。", "backupTip": "导出的数据仅进行了简单加密,请妥善保管。",
"backupVersionNotMatch": "备份版本不匹配,无法恢复", "backupVersionNotMatch": "备份版本不匹配,无法恢复",
"battery": "电池",
"bgRun": "后台运行", "bgRun": "后台运行",
"bioAuth": "生物认证", "bioAuth": "生物认证",
"canPullRefresh": "可以下拉刷新", "canPullRefresh": "可以下拉刷新",
@@ -236,6 +237,7 @@
"updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}", "updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}",
"upload": "上传", "upload": "上传",
"upsideDown": "上下交换", "upsideDown": "上下交换",
"uptime": "启动时长",
"urlOrJson": "链接或JSON", "urlOrJson": "链接或JSON",
"useNoPwd": "将会使用无密码。", "useNoPwd": "将会使用无密码。",
"user": "用户", "user": "用户",

View File

@@ -22,6 +22,7 @@
"backupAndRestore": "備份和還原", "backupAndRestore": "備份和還原",
"backupTip": "導出的數據僅進行了簡單加密,請妥善保管。", "backupTip": "導出的數據僅進行了簡單加密,請妥善保管。",
"backupVersionNotMatch": "備份版本不匹配,無法還原", "backupVersionNotMatch": "備份版本不匹配,無法還原",
"battery": "電池",
"bgRun": "背景運行", "bgRun": "背景運行",
"bioAuth": "生物認證", "bioAuth": "生物認證",
"canPullRefresh": "可以下拉更新", "canPullRefresh": "可以下拉更新",
@@ -236,6 +237,7 @@
"updateTipTooLow": "當前版本過低,請升級至 v1.0.{newest}", "updateTipTooLow": "當前版本過低,請升級至 v1.0.{newest}",
"upload": "上傳", "upload": "上傳",
"upsideDown": "上下交換", "upsideDown": "上下交換",
"uptime": "啟動時長",
"urlOrJson": "鏈接或JSON", "urlOrJson": "鏈接或JSON",
"useNoPwd": "将使用無密碼。", "useNoPwd": "将使用無密碼。",
"user": "用戶", "user": "用戶",

View File

@@ -8,6 +8,7 @@ import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:toolbox/core/extension/context/locale.dart'; import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/route.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/model/server/disk.dart';
import 'package:toolbox/data/provider/server.dart'; import 'package:toolbox/data/provider/server.dart';
import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/provider.dart';
@@ -239,7 +240,7 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
final topRightStr = _getTopRightStr( final topRightStr = _getTopRightStr(
cs, cs,
ss.temps.first, ss.temps.first,
ss.uptime, ss.more[StatusCmdType.uptime] ?? '',
ss.err, ss.err,
); );
return Text( return Text(

View File

@@ -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/dialog.dart';
import 'package:toolbox/core/extension/context/locale.dart'; import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/order.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/core/extension/widget.dart';
import 'package:toolbox/data/model/server/cpu.dart'; import 'package:toolbox/data/model/server/cpu.dart';
import 'package:toolbox/data/model/server/disk.dart'; import 'package:toolbox/data/model/server/disk.dart';
@@ -203,23 +204,25 @@ class _ServerDetailPageState extends State<ServerDetailPage>
Widget _buildUpTimeAndSys(ServerStatus ss) { Widget _buildUpTimeAndSys(ServerStatus ss) {
return CardX( return CardX(
child: Padding( child: ExpandTile(
padding: UIs.roundRectCardPadding, leading: const Icon(Icons.computer),
child: Row( initiallyExpanded: ss.more.entries.length < 7,
mainAxisAlignment: MainAxisAlignment.spaceBetween, title: Text(l10n.about),
children: [ childrenPadding: const EdgeInsets.symmetric(
Text( horizontal: 17,
ss.sysVer, vertical: 7,
style: UIs.textSize11,
textScaler: _textFactor,
),
Text(
ss.uptime,
style: UIs.textSize11,
textScaler: _textFactor,
),
],
), ),
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(),
), ),
); );
} }

View File

@@ -370,7 +370,7 @@ class _ServerPageState extends State<ServerPage>
final topRightStr = _getTopRightStr( final topRightStr = _getTopRightStr(
cs, cs,
ss.temps.first, ss.temps.first,
ss.uptime, ss.more[StatusCmdType.uptime] ?? '',
ss.err, ss.err,
); );
if (cs == ServerState.failed && ss.err != null) { if (cs == ServerState.failed && ss.err != null) {

View File

@@ -9,6 +9,7 @@ import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/extension/uint8list.dart';
import 'package:toolbox/core/utils/platform/base.dart'; import 'package:toolbox/core/utils/platform/base.dart';
import 'package:toolbox/core/utils/platform/path.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/pkg/manager.dart';
import 'package:toolbox/data/model/server/dist.dart'; import 'package:toolbox/data/model/server/dist.dart';
import 'package:toolbox/data/res/path.dart'; import 'package:toolbox/data/res/path.dart';
@@ -238,7 +239,11 @@ Future<void> _onPkg(BuildContext context, ServerPrivateInfo spi) async {
context.showSnackBar(l10n.noClient); context.showSnackBar(l10n.noClient);
return; 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); final pkg = PkgManager.fromDist(sys.dist);
// Update pkg list // Update pkg list