mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
Support to get net speed
This commit is contained in:
71
lib/data/model/server/net_speed.dart
Normal file
71
lib/data/model/server/net_speed.dart
Normal 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'];
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user