#30 fix: parse mem

This commit is contained in:
lollipopkit
2023-05-10 13:25:46 +08:00
parent c1d1af8c01
commit 4f82eb09d8
11 changed files with 111 additions and 60 deletions

View File

@@ -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)) {

View File

@@ -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,
); );

View File

@@ -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();
} }

View File

@@ -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;
} }

View File

@@ -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,
); );

View File

@@ -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);
} }

View File

@@ -191,7 +191,7 @@ class BackupPage extends StatelessWidget {
); );
} catch (e) { } catch (e) {
showSnackBar(context, Text(e.toString())); showSnackBar(context, Text(e.toString()));
return; rethrow;
} }
} }
} }

View File

@@ -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

View File

@@ -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 {

View File

@@ -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(

View File

@@ -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}%')