Support to get net speed

This commit is contained in:
LollipopKit
2021-11-01 21:29:12 +08:00
parent e7d87b40b8
commit fbc8f9598d
4 changed files with 123 additions and 10 deletions

View File

@@ -0,0 +1,71 @@
import 'dart:math';
class NetSpeedPart {
String device;
int bytesIn;
int bytesOut;
int time;
NetSpeedPart(this.device, this.bytesIn, this.bytesOut, this.time);
}
class NetSpeed {
List<NetSpeedPart> old;
List<NetSpeedPart> now;
NetSpeed(this.old, this.now);
List<String> get devices {
final devices = <String>[];
for (var item in now) {
devices.add(item.device);
}
return devices;
}
NetSpeed update(List<NetSpeedPart> newOne) => NetSpeed(now, newOne);
int get timeDiff => now[0].time - old[0].time;
String speedIn({String? device}) {
if (old[0].device == '' || now[0].device == '') return '0kb/s';
int idx = 0;
if (device != null) {
for (var item in now) {
if (item.device == device) {
idx = now.indexOf(item);
break;
}
}
}
final speedInBytesPerSecond =
(now[idx].bytesIn - old[idx].bytesIn) / timeDiff;
int squareTimes = 0;
for (; speedInBytesPerSecond / pow(1024, squareTimes) > 1024;) {
if (squareTimes >= suffixs.length - 1) break;
squareTimes++;
}
return '${(speedInBytesPerSecond / pow(1024, squareTimes)).toStringAsFixed(1)} ${suffixs[squareTimes]}';
}
String speedOut({String? device}) {
if (old[0].device == '' || now[0].device == '') return '0kb/s';
int idx = 0;
if (device != null) {
for (var item in now) {
if (item.device == device) {
idx = now.indexOf(item);
break;
}
}
}
final speedInBytesPerSecond =
(now[idx].bytesOut - old[idx].bytesOut) / timeDiff;
int squareTimes = 0;
for (; speedInBytesPerSecond / pow(1024, squareTimes) > 1024;) {
if (squareTimes >= suffixs.length - 1) break;
squareTimes++;
}
return '${(speedInBytesPerSecond / pow(1024, squareTimes)).toStringAsFixed(1)} ${suffixs[squareTimes]}';
}
}
const suffixs = ['b/s', 'kb/s', 'mb/s', 'gb/s'];

View File

@@ -1,5 +1,6 @@
import 'package:toolbox/data/model/server/cpu_2_status.dart'; import 'package:toolbox/data/model/server/cpu_2_status.dart';
import 'package:toolbox/data/model/server/disk_info.dart'; import 'package:toolbox/data/model/server/disk_info.dart';
import 'package:toolbox/data/model/server/net_speed.dart';
import 'package:toolbox/data/model/server/tcp_status.dart'; import 'package:toolbox/data/model/server/tcp_status.dart';
/// ///
@@ -28,13 +29,14 @@ class ServerStatus {
} }
*/ */
late Cpu2Status cpu2Status; Cpu2Status cpu2Status;
late List<int> memList; List<int> memList;
late String sysVer; String sysVer;
late String uptime; String uptime;
late List<DiskInfo> disk; List<DiskInfo> disk;
late TcpStatus tcp; TcpStatus tcp;
NetSpeed netSpeed;
ServerStatus(this.cpu2Status, this.memList, this.sysVer, this.uptime, ServerStatus(this.cpu2Status, this.memList, this.sysVer, this.uptime,
this.disk, this.tcp); this.disk, this.tcp, this.netSpeed);
} }

View File

@@ -6,6 +6,7 @@ import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/core/provider_base.dart'; import 'package:toolbox/core/provider_base.dart';
import 'package:toolbox/data/model/server/cpu_2_status.dart'; import 'package:toolbox/data/model/server/cpu_2_status.dart';
import 'package:toolbox/data/model/server/cpu_status.dart'; import 'package:toolbox/data/model/server/cpu_status.dart';
import 'package:toolbox/data/model/server/net_speed.dart';
import 'package:toolbox/data/model/server/server_connection_state.dart'; import 'package:toolbox/data/model/server/server_connection_state.dart';
import 'package:toolbox/data/model/server/disk_info.dart'; import 'package:toolbox/data/model/server/disk_info.dart';
import 'package:toolbox/data/model/server/server.dart'; import 'package:toolbox/data/model/server/server.dart';
@@ -22,6 +23,11 @@ class ServerProvider extends BusyProvider {
final logger = Logger('ServerProvider'); final logger = Logger('ServerProvider');
NetSpeedPart get emptyNetSpeedPart => NetSpeedPart('', 0, 0, 0);
NetSpeed get emptyNetSpeed =>
NetSpeed([emptyNetSpeedPart], [emptyNetSpeedPart]);
CpuStatus get emptyCpuStatus => CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0); CpuStatus get emptyCpuStatus => CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0);
Cpu2Status get emptyCpu2Status => Cpu2Status get emptyCpu2Status =>
@@ -33,7 +39,8 @@ class ServerProvider extends BusyProvider {
'Loading...', 'Loading...',
'', '',
[DiskInfo('/', '/', 0, '0', '0', '0')], [DiskInfo('/', '/', 0, '0', '0', '0')],
TcpStatus(0, 0, 0, 0)); TcpStatus(0, 0, 0, 0),
emptyNetSpeed);
Future<void> loadLocalData() async { Future<void> loadLocalData() async {
setBusyState(true); setBusyState(true);
@@ -144,6 +151,8 @@ class ServerProvider extends BusyProvider {
final upTime = await client.execute('uptime') ?? ''; final upTime = await client.execute('uptime') ?? '';
final disk = await client.execute('df -h') ?? ''; final disk = await client.execute('df -h') ?? '';
final tcp = await client.execute('cat /proc/net/snmp') ?? ''; final tcp = await client.execute('cat /proc/net/snmp') ?? '';
final netSpeed =
await client.execute('cat /proc/net/dev && date +%s') ?? '';
return ServerStatus( return ServerStatus(
_getCPU(cpu, _servers[idx].status.cpu2Status, cpuTemp), _getCPU(cpu, _servers[idx].status.cpu2Status, cpuTemp),
@@ -151,7 +160,8 @@ class ServerProvider extends BusyProvider {
_getSysVer(sysVer), _getSysVer(sysVer),
_getUpTime(upTime), _getUpTime(upTime),
_getDisk(disk), _getDisk(disk),
_getTcp(tcp)); _getTcp(tcp),
_getNetSpeed(netSpeed, _servers[idx].status.netSpeed));
} catch (e) { } catch (e) {
_servers[idx].connectionState = ServerConnectionState.failed; _servers[idx].connectionState = ServerConnectionState.failed;
notifyListeners(); notifyListeners();
@@ -160,6 +170,30 @@ class ServerProvider extends BusyProvider {
} }
} }
/// [raw] example:
/// Inter-| Receive | Transmit
/// face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
/// lo: 45929941 269112 0 0 0 0 0 0 45929941 269112 0 0 0 0 0 0
/// eth0: 48481023 505772 0 0 0 0 0 0 36002262 202307 0 0 0 0 0 0
/// 1635752901
NetSpeed _getNetSpeed(String raw, NetSpeed old) {
final split = raw.split('\n');
final deviceCount = split.length - 3;
if (deviceCount < 1) return emptyNetSpeed;
final time = int.parse(split[split.length - 2]);
final results = <NetSpeedPart>[];
for (int idx = 2; idx < deviceCount; idx++) {
final data = split[idx].trim().split(':');
final device = data.first;
final bytes = data.last.trim().split(' ');
bytes.removeWhere((element) => element == '');
final bytesIn = int.parse(bytes.first);
final bytesOut = int.parse(bytes[8]);
results.add(NetSpeedPart(device, bytesIn, bytesOut, time));
}
return old.update(results);
}
String _getSysVer(String raw) { String _getSysVer(String raw) {
final s = raw.split('='); final s = raw.split('=');
if (s.length == 2) { if (s.length == 2) {

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:toolbox/data/model/server/net_speed.dart';
import 'package:toolbox/data/model/server/server.dart'; import 'package:toolbox/data/model/server/server.dart';
import 'package:toolbox/data/model/server/server_status.dart'; import 'package:toolbox/data/model/server/server_status.dart';
import 'package:toolbox/data/provider/server.dart'; import 'package:toolbox/data/provider/server.dart';
@@ -47,7 +48,8 @@ class _ServerDetailPageState extends State<ServerDetailPage>
_buildUpTimeAndSys(si.status), _buildUpTimeAndSys(si.status),
_buildCPUView(si.status), _buildCPUView(si.status),
_buildDiskView(si.status), _buildDiskView(si.status),
_buildMemView(si.status) _buildMemView(si.status),
_buildNetView(si.status.netSpeed)
], ],
), ),
); );
@@ -264,6 +266,10 @@ class _ServerDetailPageState extends State<ServerDetailPage>
)); ));
} }
Widget _buildNetView(NetSpeed ns) {
return Text(ns.speedIn() + '' + ns.speedOut());
}
static const ignorePath = [ static const ignorePath = [
'/run', '/run',
'/sys', '/sys',