mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-16 23:04:22 +01:00
chore: README
This commit is contained in:
@@ -74,7 +74,7 @@ Platform | Support | Sign
|
||||
- Due to Chinese government policy and the [BEIAN](https://github.com/lollipopkit/flutter_server_box/discussions/180) issue. iOS app is now free. Please download it from other regions of AppStore.
|
||||
- Security:
|
||||
- To prevent injection attacks and etc., please don't download from untrusted sources.
|
||||
- Since `Linux / Windows` is signed with flutter default certificate, it is recommended to **build it yourself**.
|
||||
- Since `Linux / Windows` is signed with flutter default certificate, it is recommended to [build it yourself](https://github.com/lollipopkit/flutter_server_box/wiki#compile-yourself).
|
||||
|
||||
|
||||
## 🆘 Help
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
- 由于中国政策原因,且**目前**无法完成[备案](https://github.com/lollipopkit/flutter_server_box/discussions/180)。iOS 端现已转为免费,请移步 AppStore 其他区下载。
|
||||
- 关于安全:
|
||||
- 为了防止注入攻击等因素,请勿从不可信来源下载。
|
||||
- 由于 `Linux / Windows` 使用了默认签名,因此建议**自行构建**。
|
||||
- 由于 `Linux / Windows` 使用了默认签名,因此建议[自行构建](https://github.com/lollipopkit/flutter_server_box/wiki/%E4%B8%BB%E9%A1%B5#%E8%87%AA%E7%BC%96%E8%AF%91)。
|
||||
|
||||
|
||||
## 🆘 帮助
|
||||
|
||||
@@ -586,7 +586,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -596,7 +596,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -720,7 +720,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -730,7 +730,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -748,7 +748,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -758,7 +758,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -779,7 +779,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -792,7 +792,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
@@ -818,7 +818,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -831,7 +831,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -854,7 +854,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -867,7 +867,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -890,7 +890,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -902,7 +902,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
@@ -931,7 +931,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -943,7 +943,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
@@ -969,7 +969,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 667;
|
||||
CURRENT_PROJECT_VERSION = 672;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -981,7 +981,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.667;
|
||||
MARKETING_VERSION = 1.0.672;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
|
||||
@@ -21,11 +21,11 @@ import 'package:xml/xml.dart';
|
||||
/// ]
|
||||
///
|
||||
|
||||
class NvdiaSmi {
|
||||
static List<NvdiaSmiItem> fromXml(String raw) {
|
||||
class NvidiaSmi {
|
||||
static List<NvidiaSmiItem> fromXml(String raw) {
|
||||
final xmlData = XmlDocument.parse(raw);
|
||||
final gpus = xmlData.findAllElements('gpu');
|
||||
final result = List<NvdiaSmiItem?>.generate(gpus.length, (index) {
|
||||
final result = List<NvidiaSmiItem?>.generate(gpus.length, (index) {
|
||||
final gpu = gpus.elementAt(index);
|
||||
final name = gpu.findElements('product_name').firstOrNull?.innerText;
|
||||
final temp = gpu
|
||||
@@ -47,7 +47,7 @@ class NvdiaSmi {
|
||||
.firstOrNull
|
||||
?.findElements('process_info');
|
||||
final memoryProcesses =
|
||||
List<NvdiaSmiMemProcess?>.generate(processes?.length ?? 0, (index) {
|
||||
List<NvidiaSmiMemProcess?>.generate(processes?.length ?? 0, (index) {
|
||||
final process = processes?.elementAt(index);
|
||||
final pid = process?.findElements('pid').firstOrNull?.innerText;
|
||||
final name =
|
||||
@@ -55,7 +55,7 @@ class NvdiaSmi {
|
||||
final memory =
|
||||
process?.findElements('used_memory').firstOrNull?.innerText;
|
||||
if (pid != null && name != null && memory != null) {
|
||||
return NvdiaSmiMemProcess(
|
||||
return NvidiaSmiMemProcess(
|
||||
int.parse(pid),
|
||||
name,
|
||||
int.parse(
|
||||
@@ -78,13 +78,13 @@ class NvdiaSmi {
|
||||
powerDraw != null &&
|
||||
powerLimit != null &&
|
||||
memory != null) {
|
||||
return NvdiaSmiItem(
|
||||
return NvidiaSmiItem(
|
||||
name: name,
|
||||
uuid: gpu.findElements('uuid').firstOrNull?.innerText ?? '',
|
||||
temp: int.parse(temp.split(' ').firstOrNull ?? '0'),
|
||||
percent: int.parse(percent?.split(' ').firstOrNull ?? '0'),
|
||||
power: '$powerDraw / $powerLimit',
|
||||
memory: NvdiaSmiMem(
|
||||
memory: NvidiaSmiMem(
|
||||
int.parse(memoryTotal?.split(' ').firstOrNull ?? '0'),
|
||||
int.parse(memoryUsed?.split(' ').firstOrNull ?? '0'),
|
||||
'MiB',
|
||||
@@ -100,16 +100,16 @@ class NvdiaSmi {
|
||||
}
|
||||
}
|
||||
|
||||
class NvdiaSmiItem {
|
||||
class NvidiaSmiItem {
|
||||
final String uuid;
|
||||
final String name;
|
||||
final int temp;
|
||||
final String power;
|
||||
final NvdiaSmiMem memory;
|
||||
final NvidiaSmiMem memory;
|
||||
final int percent;
|
||||
final int fanSpeed;
|
||||
|
||||
const NvdiaSmiItem({
|
||||
const NvidiaSmiItem({
|
||||
required this.uuid,
|
||||
required this.name,
|
||||
required this.temp,
|
||||
@@ -125,13 +125,13 @@ class NvdiaSmiItem {
|
||||
}
|
||||
}
|
||||
|
||||
class NvdiaSmiMem {
|
||||
class NvidiaSmiMem {
|
||||
final int total;
|
||||
final int used;
|
||||
final String unit;
|
||||
final List<NvdiaSmiMemProcess> processes;
|
||||
final List<NvidiaSmiMemProcess> processes;
|
||||
|
||||
const NvdiaSmiMem(this.total, this.used, this.unit, this.processes);
|
||||
const NvidiaSmiMem(this.total, this.used, this.unit, this.processes);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
@@ -139,12 +139,12 @@ class NvdiaSmiMem {
|
||||
}
|
||||
}
|
||||
|
||||
class NvdiaSmiMemProcess {
|
||||
class NvidiaSmiMemProcess {
|
||||
final int pid;
|
||||
final String name;
|
||||
final int memory;
|
||||
|
||||
const NvdiaSmiMemProcess(this.pid, this.name, this.memory);
|
||||
const NvidiaSmiMemProcess(this.pid, this.name, this.memory);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
|
||||
@@ -56,7 +56,7 @@ class ServerStatus {
|
||||
SystemType system;
|
||||
String? err;
|
||||
DiskIO diskIO;
|
||||
List<NvdiaSmiItem>? nvdia;
|
||||
List<NvidiaSmiItem>? nvdia;
|
||||
|
||||
/// Whether is connectting, parsing and etc.
|
||||
bool _isBusy = false;
|
||||
|
||||
@@ -113,7 +113,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
|
||||
}
|
||||
|
||||
try {
|
||||
final nvdia = NvdiaSmi.fromXml(StatusCmdType.nvdia.find(segments));
|
||||
final nvdia = NvidiaSmi.fromXml(StatusCmdType.nvdia.find(segments));
|
||||
req.ss.nvdia = nvdia;
|
||||
} catch (e, s) {
|
||||
Loggers.parse.warning(e, s);
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
class BuildData {
|
||||
static const String name = "ServerBox";
|
||||
static const int build = 667;
|
||||
static const int build = 672;
|
||||
static const String engine = "3.16.2";
|
||||
static const String buildAt = "2023-12-09 14:56:57";
|
||||
static const int modifications = 11;
|
||||
static const String buildAt = "2023-12-11 11:40:12";
|
||||
static const int modifications = 3;
|
||||
static const int script = 31;
|
||||
}
|
||||
|
||||
@@ -318,7 +318,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGpuItem(NvdiaSmiItem item) {
|
||||
Widget _buildGpuItem(NvidiaSmiItem item) {
|
||||
final mem = item.memory;
|
||||
final processes = mem.processes;
|
||||
final children = <Widget>[];
|
||||
@@ -378,7 +378,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGpuProcessItem(NvdiaSmiMemProcess process) {
|
||||
Widget _buildGpuProcessItem(NvidiaSmiMemProcess process) {
|
||||
return ListTile(
|
||||
title: Text(
|
||||
process.name,
|
||||
|
||||
@@ -91,7 +91,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
|
||||
// Desktop doesn't support pull to refresh
|
||||
if (isDesktop) return child;
|
||||
|
||||
|
||||
return RefreshIndicator(
|
||||
key: ServerProvider.refreshKey,
|
||||
onRefresh: () async => await Pros.server.refreshData(onlyFailed: true),
|
||||
|
||||
@@ -41,7 +41,7 @@ class Input extends StatefulWidget {
|
||||
this.autoFocus = false,
|
||||
this.onViewPwdTap,
|
||||
});
|
||||
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => _InputState();
|
||||
}
|
||||
@@ -74,7 +74,9 @@ class _InputState extends State<Input> {
|
||||
prefix: widget.prefix,
|
||||
suffixIcon: widget.obscureText
|
||||
? IconButton(
|
||||
icon: Icon(_obscureText ? Icons.visibility : Icons.visibility_off),
|
||||
icon: Icon(
|
||||
_obscureText ? Icons.visibility : Icons.visibility_off,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_obscureText = !_obscureText;
|
||||
|
||||
@@ -842,7 +842,7 @@ const _raw = '''
|
||||
void main() {
|
||||
test('nvdia-smi', () {
|
||||
if (kDebugMode) {
|
||||
print(NvdiaSmi.fromXml(_raw).firstOrNull?.memory.processes);
|
||||
print(NvidiaSmi.fromXml(_raw).firstOrNull?.memory.processes);
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user