mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
#30 fix: parse mem
This commit is contained in:
@@ -102,13 +102,11 @@ final cpuTempReg = RegExp(r'(x86_pkg_temp|cpu_thermal)');
|
|||||||
String parseCPUTemp(String type, String value) {
|
String parseCPUTemp(String type, String value) {
|
||||||
const noMatch = "/sys/class/thermal/thermal_zone*/type";
|
const noMatch = "/sys/class/thermal/thermal_zone*/type";
|
||||||
// Not support to get CPU temperature
|
// Not support to get CPU temperature
|
||||||
if (value.contains(noMatch) ||
|
if (type.contains(noMatch) || value.isEmpty || type.isEmpty) {
|
||||||
type.contains(noMatch) ||
|
|
||||||
value.isEmpty ||
|
|
||||||
type.isEmpty) {
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
final split = type.split('\n');
|
final split = type.split('\n');
|
||||||
|
// if no match, use idx 0
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
for (var item in split) {
|
for (var item in split) {
|
||||||
if (item.contains(cpuTempReg)) {
|
if (item.contains(cpuTempReg)) {
|
||||||
|
|||||||
@@ -1,16 +1,24 @@
|
|||||||
class Memory {
|
class Memory {
|
||||||
int total;
|
int total;
|
||||||
int used;
|
|
||||||
int free;
|
int free;
|
||||||
int cache;
|
int cache;
|
||||||
int avail;
|
int avail;
|
||||||
|
|
||||||
Memory({
|
Memory({
|
||||||
required this.total,
|
required this.total,
|
||||||
required this.used,
|
|
||||||
required this.free,
|
required this.free,
|
||||||
required this.cache,
|
required this.cache,
|
||||||
required this.avail,
|
required this.avail,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
double get availPercent {
|
||||||
|
if (avail == 0) {
|
||||||
|
return free / total;
|
||||||
|
}
|
||||||
|
return avail / total;
|
||||||
|
}
|
||||||
|
|
||||||
|
double get usedPercent => 1 - availPercent;
|
||||||
}
|
}
|
||||||
|
|
||||||
final memItemReg = RegExp(r'([A-Z].+:)\s+([0-9]+) kB');
|
final memItemReg = RegExp(r'([A-Z].+:)\s+([0-9]+) kB');
|
||||||
@@ -18,22 +26,49 @@ final memItemReg = RegExp(r'([A-Z].+:)\s+([0-9]+) kB');
|
|||||||
Memory parseMem(String raw) {
|
Memory parseMem(String raw) {
|
||||||
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
||||||
|
|
||||||
final total = int.parse(
|
final total = int.tryParse(
|
||||||
items.firstWhere((e) => e?.group(1) == 'MemTotal:')?.group(2) ?? '1',
|
items
|
||||||
);
|
.firstWhere(
|
||||||
final free = int.parse(
|
(e) => e?.group(1) == 'MemTotal:',
|
||||||
items.firstWhere((e) => e?.group(1) == 'MemFree:')?.group(2) ?? '0',
|
orElse: () => null,
|
||||||
);
|
)
|
||||||
final cached = int.parse(
|
?.group(2) ??
|
||||||
items.firstWhere((e) => e?.group(1) == 'Cached:')?.group(2) ?? '0',
|
'1',
|
||||||
);
|
) ??
|
||||||
final available = int.parse(
|
1;
|
||||||
items.firstWhere((e) => e?.group(1) == 'MemAvailable:')?.group(2) ?? '0',
|
final free = int.tryParse(
|
||||||
);
|
items
|
||||||
|
.firstWhere(
|
||||||
|
(e) => e?.group(1) == 'MemFree:',
|
||||||
|
orElse: () => null,
|
||||||
|
)
|
||||||
|
?.group(2) ??
|
||||||
|
'0',
|
||||||
|
) ??
|
||||||
|
0;
|
||||||
|
final cached = int.tryParse(
|
||||||
|
items
|
||||||
|
.firstWhere(
|
||||||
|
(e) => e?.group(1) == 'Cached:',
|
||||||
|
orElse: () => null,
|
||||||
|
)
|
||||||
|
?.group(2) ??
|
||||||
|
'0',
|
||||||
|
) ??
|
||||||
|
0;
|
||||||
|
final available = int.tryParse(
|
||||||
|
items
|
||||||
|
.firstWhere(
|
||||||
|
(e) => e?.group(1) == 'MemAvailable:',
|
||||||
|
orElse: () => null,
|
||||||
|
)
|
||||||
|
?.group(2) ??
|
||||||
|
'0',
|
||||||
|
) ??
|
||||||
|
0;
|
||||||
|
|
||||||
return Memory(
|
return Memory(
|
||||||
total: total,
|
total: total,
|
||||||
used: total - available,
|
|
||||||
free: free,
|
free: free,
|
||||||
cache: cached,
|
cache: cached,
|
||||||
avail: available,
|
avail: available,
|
||||||
@@ -42,39 +77,61 @@ Memory parseMem(String raw) {
|
|||||||
|
|
||||||
class Swap {
|
class Swap {
|
||||||
final int total;
|
final int total;
|
||||||
final int used;
|
|
||||||
final int free;
|
final int free;
|
||||||
final int cached;
|
final int cached;
|
||||||
|
|
||||||
Swap({
|
Swap({
|
||||||
required this.total,
|
required this.total,
|
||||||
required this.used,
|
|
||||||
required this.free,
|
required this.free,
|
||||||
required this.cached,
|
required this.cached,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
double get usedPercent => 1 - free / total;
|
||||||
|
|
||||||
|
double get freePercent => free / total;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Swap{total: $total, used: $used, free: $free, cached: $cached}';
|
return 'Swap{total: $total, free: $free, cached: $cached}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Swap parseSwap(String raw) {
|
Swap parseSwap(String raw) {
|
||||||
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
final items = raw.split('\n').map((e) => memItemReg.firstMatch(e)).toList();
|
||||||
|
|
||||||
final total = int.parse(
|
final total = int.tryParse(
|
||||||
items.firstWhere((e) => e?.group(1) == 'SwapTotal:')?.group(2) ?? '1',
|
items
|
||||||
);
|
.firstWhere(
|
||||||
final free = int.parse(
|
(e) => e?.group(1) == 'SwapTotal:',
|
||||||
items.firstWhere((e) => e?.group(1) == 'SwapFree:')?.group(2) ?? '0',
|
orElse: () => null,
|
||||||
);
|
)
|
||||||
final cached = int.parse(
|
?.group(2) ??
|
||||||
items.firstWhere((e) => e?.group(1) == 'SwapCached:')?.group(2) ?? '0',
|
'1',
|
||||||
);
|
) ??
|
||||||
|
1;
|
||||||
|
final free = int.tryParse(
|
||||||
|
items
|
||||||
|
.firstWhere(
|
||||||
|
(e) => e?.group(1) == 'SwapFree:',
|
||||||
|
orElse: () => null,
|
||||||
|
)
|
||||||
|
?.group(2) ??
|
||||||
|
'1',
|
||||||
|
) ??
|
||||||
|
1;
|
||||||
|
final cached = int.tryParse(
|
||||||
|
items
|
||||||
|
.firstWhere(
|
||||||
|
(e) => e?.group(1) == 'SwapCached:',
|
||||||
|
orElse: () => null,
|
||||||
|
)
|
||||||
|
?.group(2) ??
|
||||||
|
'0',
|
||||||
|
) ??
|
||||||
|
0;
|
||||||
|
|
||||||
return Swap(
|
return Swap(
|
||||||
total: total,
|
total: total,
|
||||||
used: total - free,
|
|
||||||
free: free,
|
free: free,
|
||||||
cached: cached,
|
cached: cached,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -59,9 +59,11 @@ class PkgProvider extends BusyProvider {
|
|||||||
|
|
||||||
Future<void> refresh() async {
|
Future<void> refresh() async {
|
||||||
final result = await _update();
|
final result = await _update();
|
||||||
_parse(result);
|
try {
|
||||||
try {} catch (e) {
|
_parse(result);
|
||||||
|
} catch (e) {
|
||||||
error = '[Server Raw]:\n$result\n[App Error]:\n$e';
|
error = '[Server Raw]:\n$result\n[App Error]:\n$e';
|
||||||
|
rethrow;
|
||||||
} finally {
|
} finally {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ class BuildData {
|
|||||||
static const String name = "ServerBox";
|
static const String name = "ServerBox";
|
||||||
static const int build = 293;
|
static const int build = 293;
|
||||||
static const String engine = "3.7.11";
|
static const String engine = "3.7.11";
|
||||||
static const String buildAt = "2023-05-09 19:48:09.523377";
|
static const String buildAt = "2023-05-10 12:26:52.686";
|
||||||
static const int modifications = 4;
|
static const int modifications = 11;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import '../model/server/conn_status.dart';
|
|||||||
|
|
||||||
Memory get _initMemory => Memory(
|
Memory get _initMemory => Memory(
|
||||||
total: 1,
|
total: 1,
|
||||||
used: 0,
|
|
||||||
free: 1,
|
free: 1,
|
||||||
cache: 0,
|
cache: 0,
|
||||||
avail: 1,
|
avail: 1,
|
||||||
@@ -39,7 +38,6 @@ NetSpeed get initNetSpeed => NetSpeed(
|
|||||||
);
|
);
|
||||||
Swap get _initSwap => Swap(
|
Swap get _initSwap => Swap(
|
||||||
total: 1,
|
total: 1,
|
||||||
used: 0,
|
|
||||||
free: 1,
|
free: 1,
|
||||||
cached: 0,
|
cached: 0,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/persistant_store.dart';
|
import 'package:toolbox/core/persistant_store.dart';
|
||||||
|
import 'package:toolbox/core/utils/platform.dart';
|
||||||
|
|
||||||
class SettingStore extends PersistentStore {
|
class SettingStore extends PersistentStore {
|
||||||
StoreProperty<int> get primaryColor =>
|
StoreProperty<int> get primaryColor =>
|
||||||
property('primaryColor', defaultValue: Colors.deepPurpleAccent.value);
|
property('primaryColor', defaultValue: Colors.pink.value);
|
||||||
|
|
||||||
StoreProperty<int> get serverStatusUpdateInterval =>
|
StoreProperty<int> get serverStatusUpdateInterval =>
|
||||||
property('serverStatusUpdateInterval', defaultValue: 3);
|
property('serverStatusUpdateInterval', defaultValue: 3);
|
||||||
@@ -37,5 +38,5 @@ class SettingStore extends PersistentStore {
|
|||||||
StoreProperty<String> get fontPath => property('fontPath');
|
StoreProperty<String> get fontPath => property('fontPath');
|
||||||
|
|
||||||
/// Backgroud running (Android)
|
/// Backgroud running (Android)
|
||||||
StoreProperty<bool> get bgRun => property('bgRun', defaultValue: true);
|
StoreProperty<bool> get bgRun => property('bgRun', defaultValue: isAndroid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ class BackupPage extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
showSnackBar(context, Text(e.toString()));
|
showSnackBar(context, Text(e.toString()));
|
||||||
return;
|
rethrow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ class _PingPageState extends State<PingPage>
|
|||||||
doPing();
|
doPing();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
showSnackBar(context, Text('Error: \n$e'));
|
showSnackBar(context, Text('Error: \n$e'));
|
||||||
|
rethrow;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: const Icon(Icons.play_arrow),
|
child: const Icon(Icons.play_arrow),
|
||||||
@@ -154,18 +155,14 @@ class _PingPageState extends State<PingPage>
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
await Future.wait(_serverProvider.servers.values.map((e) async {
|
||||||
await Future.wait(_serverProvider.servers.values.map((e) async {
|
if (e.client == null) {
|
||||||
if (e.client == null) {
|
return;
|
||||||
return;
|
}
|
||||||
}
|
final result = await e.client!.run('ping -c 3 $target').string;
|
||||||
final result = await e.client!.run('ping -c 3 $target').string;
|
_results.add(PingResult.parse(e.spi.name, result));
|
||||||
_results.add(PingResult.parse(e.spi.name, result));
|
setState(() {});
|
||||||
setState(() {});
|
}));
|
||||||
}));
|
|
||||||
} catch (e) {
|
|
||||||
showSnackBar(context, Text(e.toString()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -105,18 +105,16 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
final info = PrivateKeyInfo(name, key, '');
|
final info = PrivateKeyInfo(name, key, '');
|
||||||
bool haveErr = false;
|
|
||||||
try {
|
try {
|
||||||
info.privateKey = await compute(decyptPem, [key, pwd]);
|
info.privateKey = await compute(decyptPem, [key, pwd]);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
showSnackBar(context, Text(e.toString()));
|
showSnackBar(context, Text(e.toString()));
|
||||||
haveErr = true;
|
rethrow;
|
||||||
} finally {
|
} finally {
|
||||||
setState(() {
|
setState(() {
|
||||||
_loading = const SizedBox();
|
_loading = const SizedBox();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (haveErr) return;
|
|
||||||
if (widget.info != null) {
|
if (widget.info != null) {
|
||||||
_provider.updateInfo(widget.info!, info);
|
_provider.updateInfo(widget.info!, info);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -204,9 +204,9 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildMemView(ServerStatus ss) {
|
Widget _buildMemView(ServerStatus ss) {
|
||||||
final used = ss.mem.used / ss.mem.total * 100;
|
|
||||||
final free = ss.mem.free / ss.mem.total * 100;
|
final free = ss.mem.free / ss.mem.total * 100;
|
||||||
final avail = ss.mem.avail / ss.mem.total * 100;
|
final avail = ss.mem.availPercent * 100;
|
||||||
|
final used = ss.mem.usedPercent * 100;
|
||||||
|
|
||||||
return RoundRectCard(
|
return RoundRectCard(
|
||||||
Padding(
|
Padding(
|
||||||
@@ -245,7 +245,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
|
|
||||||
Widget _buildSwapView(ServerStatus ss) {
|
Widget _buildSwapView(ServerStatus ss) {
|
||||||
if (ss.swap.total == 0) return const SizedBox();
|
if (ss.swap.total == 0) return const SizedBox();
|
||||||
final used = ss.swap.used / ss.swap.total * 100;
|
final used = ss.swap.usedPercent * 100;
|
||||||
final cached = ss.swap.cached / ss.swap.total * 100;
|
final cached = ss.swap.cached / ss.swap.total * 100;
|
||||||
return RoundRectCard(
|
return RoundRectCard(
|
||||||
Padding(
|
Padding(
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ class _ServerPageState extends State<ServerPage>
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
children: [
|
children: [
|
||||||
_buildPercentCircle(ss.cpu.usedPercent()),
|
_buildPercentCircle(ss.cpu.usedPercent()),
|
||||||
_buildPercentCircle(ss.mem.used / ss.mem.total * 100),
|
_buildPercentCircle(ss.mem.usedPercent * 100),
|
||||||
_buildIOData('Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'),
|
_buildIOData('Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'),
|
||||||
_buildIOData(
|
_buildIOData(
|
||||||
'Total:\n${rootDisk.size}', 'Used:\n${rootDisk.usedPercent}%')
|
'Total:\n${rootDisk.size}', 'Used:\n${rootDisk.usedPercent}%')
|
||||||
|
|||||||
Reference in New Issue
Block a user