diff --git a/README.md b/README.md index 6899397f..48991418 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ A new Flutter project which provide a chart view to display server status data. - [x] Private Key Store - [x] Server Status Detail Page - [x] Theme Switch -- [ ] Custom Home Page +- [ ] Execute Snippet ## License `Apache License. LollipopKit 2021` diff --git a/assets/linux/centos.png b/assets/linux/centos.png index e6c89cfd..4eba575c 100644 Binary files a/assets/linux/centos.png and b/assets/linux/centos.png differ diff --git a/lib/data/model/update.dart b/lib/data/model/app/update.dart similarity index 100% rename from lib/data/model/update.dart rename to lib/data/model/app/update.dart diff --git a/lib/data/model/cpu_2_status.dart b/lib/data/model/server/cpu_2_status.dart similarity index 82% rename from lib/data/model/cpu_2_status.dart rename to lib/data/model/server/cpu_2_status.dart index c908a51d..fc453621 100644 --- a/lib/data/model/cpu_2_status.dart +++ b/lib/data/model/server/cpu_2_status.dart @@ -1,9 +1,10 @@ -import 'package:toolbox/data/model/cpu_status.dart'; +import 'package:toolbox/data/model/server/cpu_status.dart'; class Cpu2Status { List pre; List now; - Cpu2Status(this.pre, this.now); + String temp; + Cpu2Status(this.pre, this.now, this.temp); double usedPercent({int coreIdx = 0}) { if (now.length != pre.length) return 0; @@ -13,8 +14,8 @@ class Cpu2Status { return used.isNaN ? 0 : 100 - used * 100; } - Cpu2Status update(List newStatus) { - return Cpu2Status(now, newStatus); + Cpu2Status update(List newStatus, String newTemp) { + return Cpu2Status(now, newStatus, newTemp); } int get coresCount => now.length; diff --git a/lib/data/model/cpu_status.dart b/lib/data/model/server/cpu_status.dart similarity index 100% rename from lib/data/model/cpu_status.dart rename to lib/data/model/server/cpu_status.dart diff --git a/lib/data/model/disk_info.dart b/lib/data/model/server/disk_info.dart similarity index 100% rename from lib/data/model/disk_info.dart rename to lib/data/model/server/disk_info.dart diff --git a/lib/data/model/linux_icon.dart b/lib/data/model/server/linux_icon.dart similarity index 80% rename from lib/data/model/linux_icon.dart rename to lib/data/model/server/linux_icon.dart index 675544c6..522cffcb 100644 --- a/lib/data/model/linux_icon.dart +++ b/lib/data/model/server/linux_icon.dart @@ -5,7 +5,7 @@ class LinuxIcons { String? search(String sysVer) { for (var item in db) { - if (sysVer.contains(item)) { + if (sysVer.toLowerCase().contains(item)) { return 'assets/linux/$item.png'; } } diff --git a/lib/data/model/private_key_info.dart b/lib/data/model/server/private_key_info.dart similarity index 100% rename from lib/data/model/private_key_info.dart rename to lib/data/model/server/private_key_info.dart diff --git a/lib/data/model/server.dart b/lib/data/model/server/server.dart similarity index 53% rename from lib/data/model/server.dart rename to lib/data/model/server/server.dart index dd9852f9..b2687041 100644 --- a/lib/data/model/server.dart +++ b/lib/data/model/server/server.dart @@ -1,7 +1,7 @@ import 'package:ssh2/ssh2.dart'; -import 'package:toolbox/data/model/server_connection_state.dart'; -import 'package:toolbox/data/model/server_private_info.dart'; -import 'package:toolbox/data/model/server_status.dart'; +import 'package:toolbox/data/model/server/server_connection_state.dart'; +import 'package:toolbox/data/model/server/server_private_info.dart'; +import 'package:toolbox/data/model/server/server_status.dart'; class ServerInfo { ServerPrivateInfo info; diff --git a/lib/data/model/server_connection_state.dart b/lib/data/model/server/server_connection_state.dart similarity index 100% rename from lib/data/model/server_connection_state.dart rename to lib/data/model/server/server_connection_state.dart diff --git a/lib/data/model/server_private_info.dart b/lib/data/model/server/server_private_info.dart similarity index 100% rename from lib/data/model/server_private_info.dart rename to lib/data/model/server/server_private_info.dart diff --git a/lib/data/model/server_status.dart b/lib/data/model/server/server_status.dart similarity index 77% rename from lib/data/model/server_status.dart rename to lib/data/model/server/server_status.dart index c9a4d106..43c42562 100644 --- a/lib/data/model/server_status.dart +++ b/lib/data/model/server/server_status.dart @@ -1,6 +1,6 @@ -import 'package:toolbox/data/model/cpu_2_status.dart'; -import 'package:toolbox/data/model/disk_info.dart'; -import 'package:toolbox/data/model/tcp_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/tcp_status.dart'; /// /// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/ diff --git a/lib/data/model/tcp_status.dart b/lib/data/model/server/tcp_status.dart similarity index 100% rename from lib/data/model/tcp_status.dart rename to lib/data/model/server/tcp_status.dart diff --git a/lib/data/provider/private_key.dart b/lib/data/provider/private_key.dart index 9b6ea3f6..4fd8f902 100644 --- a/lib/data/provider/private_key.dart +++ b/lib/data/provider/private_key.dart @@ -1,5 +1,5 @@ import 'package:toolbox/core/provider_base.dart'; -import 'package:toolbox/data/model/private_key_info.dart'; +import 'package:toolbox/data/model/server/private_key_info.dart'; import 'package:toolbox/data/store/private_key.dart'; import 'package:toolbox/locator.dart'; diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index ea032c11..1aa64848 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -4,14 +4,14 @@ import 'package:logging/logging.dart'; import 'package:ssh2/ssh2.dart'; import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/provider_base.dart'; -import 'package:toolbox/data/model/cpu_2_status.dart'; -import 'package:toolbox/data/model/cpu_status.dart'; -import 'package:toolbox/data/model/server_connection_state.dart'; -import 'package:toolbox/data/model/disk_info.dart'; -import 'package:toolbox/data/model/server.dart'; -import 'package:toolbox/data/model/server_private_info.dart'; -import 'package:toolbox/data/model/server_status.dart'; -import 'package:toolbox/data/model/tcp_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/server_connection_state.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_private_info.dart'; +import 'package:toolbox/data/model/server/server_status.dart'; +import 'package:toolbox/data/model/server/tcp_status.dart'; import 'package:toolbox/data/store/server.dart'; import 'package:toolbox/data/store/setting.dart'; import 'package:toolbox/locator.dart'; @@ -25,7 +25,7 @@ class ServerProvider extends BusyProvider { CpuStatus get emptyCpuStatus => CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0); Cpu2Status get emptyCpu2Status => - Cpu2Status([emptyCpuStatus], [emptyCpuStatus]); + Cpu2Status([emptyCpuStatus], [emptyCpuStatus], ''); ServerStatus get emptyStatus => ServerStatus( emptyCpu2Status, @@ -133,16 +133,20 @@ class ServerProvider extends BusyProvider { } try { final cpu = await client.execute("cat /proc/stat | grep cpu") ?? ''; + final cpuTemp = await client.execute( + r"paste <(cat /sys/class/thermal/thermal_zone*/type) <(cat /sys/class/thermal/thermal_zone*/temp) | column -s $'\t' -t | sed 's/\(.\)..$/.\1°C/'") ?? + ''; final mem = await client.execute('free -m') ?? ''; - final sysVer = await client.execute('cat /etc/issue.net') ?? ''; + final sysVer = + await client.execute('cat /etc/os-release | grep PRETTY_NAME') ?? ''; final upTime = await client.execute('uptime') ?? ''; final disk = await client.execute('df -h') ?? ''; final tcp = await client.execute('cat /proc/net/snmp') ?? ''; return ServerStatus( - _getCPU(cpu, _servers[idx].status.cpu2Status), + _getCPU(cpu, _servers[idx].status.cpu2Status, cpuTemp), _getMem(mem), - sysVer.trim(), + _getSysVer(sysVer), _getUpTime(upTime), _getDisk(disk), _getTcp(tcp)); @@ -154,8 +158,27 @@ class ServerProvider extends BusyProvider { } } - Cpu2Status _getCPU(String raw, Cpu2Status old) { + String _getSysVer(String raw) { + final s = raw.split('='); + if (s.length == 2) { + return s[1].replaceAll('"', '').replaceFirst('\n', ''); + } + return ''; + } + + String _getCPUTemp(String raw) { + final split = raw.split('\n'); + for (var item in split) { + if (item.contains('x86_pkg_temp') || item.contains('cpu_thermal')) { + return item.split(' ').last; + } + } + return ''; + } + + Cpu2Status _getCPU(String raw, Cpu2Status old, String temp) { final List cpus = []; + for (var item in raw.split('\n')) { if (item == '') break; final id = item.split(' ').first; @@ -174,7 +197,7 @@ class ServerProvider extends BusyProvider { return emptyCpu2Status; } - return old.update(cpus); + return old.update(cpus, _getCPUTemp(temp)); } String _getUpTime(String raw) { @@ -190,11 +213,7 @@ class ServerProvider extends BusyProvider { } if (idx == 2) { final vals = item.split(RegExp(r'\s{1,}')); - return TcpStatus( - vals[5].i, - vals[6].i, - vals[7].i, - vals[8].i); + return TcpStatus(vals[5].i, vals[6].i, vals[7].i, vals[8].i); } } return TcpStatus(0, 0, 0, 0); diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index fc514dd5..8d208a9b 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,8 +2,8 @@ class BuildData { static const String name = "ToolBox"; - static const int build = 40; + static const int build = 42; static const String engine = "Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 18116933e7 (13 days ago) • 2021-10-15 10:46:35 -0700\nEngine • revision d3ea636dc5\nTools • Dart 2.14.4\n"; - static const String buildAt = "2021-10-28 19:02:21.118303"; - static const int modifications = 17; + static const String buildAt = "2021-10-28 19:40:46.947619"; + static const int modifications = 32; } diff --git a/lib/data/res/linux_icons.dart b/lib/data/res/linux_icons.dart index 76b6b99d..ee50149b 100644 --- a/lib/data/res/linux_icons.dart +++ b/lib/data/res/linux_icons.dart @@ -1,4 +1,4 @@ -import 'package:toolbox/data/model/linux_icon.dart'; +import 'package:toolbox/data/model/server/linux_icon.dart'; final linuxIcons = LinuxIcons(['ubuntu', 'arch', 'centos', 'debian', 'fedora', 'opensuse', 'kali']); \ No newline at end of file diff --git a/lib/data/service/app.dart b/lib/data/service/app.dart index 4744b9fc..9f240949 100644 --- a/lib/data/service/app.dart +++ b/lib/data/service/app.dart @@ -1,5 +1,5 @@ import 'package:dio/dio.dart'; -import 'package:toolbox/data/model/update.dart'; +import 'package:toolbox/data/model/app/update.dart'; import 'package:toolbox/data/res/url.dart'; class AppService { diff --git a/lib/data/store/private_key.dart b/lib/data/store/private_key.dart index 8fbe882c..2e1d7a1c 100644 --- a/lib/data/store/private_key.dart +++ b/lib/data/store/private_key.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:toolbox/core/persistant_store.dart'; -import 'package:toolbox/data/model/private_key_info.dart'; +import 'package:toolbox/data/model/server/private_key_info.dart'; class PrivateKeyStore extends PersistentStore { void put(PrivateKeyInfo info) { diff --git a/lib/data/store/server.dart b/lib/data/store/server.dart index 40b1e6ec..743b1775 100644 --- a/lib/data/store/server.dart +++ b/lib/data/store/server.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:toolbox/core/persistant_store.dart'; -import 'package:toolbox/data/model/server_private_info.dart'; +import 'package:toolbox/data/model/server/server_private_info.dart'; class ServerStore extends PersistentStore { void put(ServerPrivateInfo info) { diff --git a/lib/view/page/private_key/edit.dart b/lib/view/page/private_key/edit.dart index 0ab98ec3..fe6f78ed 100644 --- a/lib/view/page/private_key/edit.dart +++ b/lib/view/page/private_key/edit.dart @@ -1,6 +1,6 @@ import 'package:after_layout/after_layout.dart'; import 'package:flutter/material.dart'; -import 'package:toolbox/data/model/private_key_info.dart'; +import 'package:toolbox/data/model/server/private_key_info.dart'; import 'package:toolbox/data/provider/private_key.dart'; import 'package:toolbox/locator.dart'; import 'package:toolbox/view/widget/input_decoration.dart'; diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 7259e202..42e39524 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:toolbox/data/model/server.dart'; -import 'package:toolbox/data/model/server_status.dart'; +import 'package:toolbox/data/model/server/server.dart'; +import 'package:toolbox/data/model/server/server_status.dart'; import 'package:toolbox/data/provider/server.dart'; import 'package:toolbox/data/res/color.dart'; import 'package:toolbox/data/res/linux_icons.dart'; @@ -54,7 +54,7 @@ class _ServerDetailPageState extends State } Widget _buildLinuxIcon(String sysVer) { - final iconPath = linuxIcons.search(sysVer.toLowerCase()); + final iconPath = linuxIcons.search(sysVer); if (iconPath == null) return const SizedBox(); return SizedBox(height: _media.size.height * 0.15, child: Image.asset(iconPath)); } @@ -260,5 +260,5 @@ class _ServerDetailPageState extends State )); } - static const ignorePath = ['/run', '/sys', '/dev/shm', '/snap']; + static const ignorePath = ['/run', '/sys', '/dev/shm', '/snap', '/var/lib/docker']; } diff --git a/lib/view/page/server/edit.dart b/lib/view/page/server/edit.dart index 7c8ba06f..46b27b0c 100644 --- a/lib/view/page/server/edit.dart +++ b/lib/view/page/server/edit.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/route.dart'; import 'package:toolbox/core/utils.dart'; -import 'package:toolbox/data/model/server_private_info.dart'; +import 'package:toolbox/data/model/server/server_private_info.dart'; import 'package:toolbox/data/provider/private_key.dart'; import 'package:toolbox/data/provider/server.dart'; import 'package:toolbox/data/res/color.dart'; diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 4ceba42c..7a81d524 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -6,9 +6,9 @@ import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:get_it/get_it.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/route.dart'; -import 'package:toolbox/data/model/server.dart'; -import 'package:toolbox/data/model/server_connection_state.dart'; -import 'package:toolbox/data/model/server_status.dart'; +import 'package:toolbox/data/model/server/server.dart'; +import 'package:toolbox/data/model/server/server_connection_state.dart'; +import 'package:toolbox/data/model/server/server_status.dart'; import 'package:toolbox/data/provider/server.dart'; import 'package:toolbox/data/store/setting.dart'; import 'package:toolbox/locator.dart'; @@ -123,7 +123,7 @@ class _ServerPageState extends State style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 12), textScaleFactor: 1.0, ), - Text(getTopRightStr(cs, ss.uptime), + Text(getTopRightStr(cs, ss.cpu2Status.temp, ss.uptime), textScaleFactor: 1.0, style: TextStyle( color: _theme.textTheme.bodyText1!.color!.withAlpha(100), @@ -148,12 +148,12 @@ class _ServerPageState extends State ); } - String getTopRightStr(ServerConnectionState cs, String upTime) { + String getTopRightStr(ServerConnectionState cs, String temp, String upTime) { switch (cs) { case ServerConnectionState.disconnected: return 'Disconnected'; case ServerConnectionState.connected: - return upTime == '' ? 'Loading...' : upTime; + return temp == '' ? (upTime == '' ? 'Loading...' : upTime) : temp; case ServerConnectionState.connecting: return 'Connecting...'; case ServerConnectionState.failed: