migrate to darssh2
This commit is contained in:
@@ -47,7 +47,9 @@ Future<void> doUpdate(BuildContext context, {bool force = false}) async {
|
||||
await RUpgrade.upgrade(update.android,
|
||||
fileName: update.android.split('/').last, isAutoRequestInstall: true);
|
||||
} else if (Platform.isIOS) {
|
||||
showSnackBar(context, const Text('Not support iOS now.'));
|
||||
await RUpgrade.upgradeFromAppStore('1586449703');
|
||||
} else if (Platform.isMacOS) {
|
||||
await RUpgrade.upgradeFromUrl(update.mac);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -13,8 +13,12 @@ class AppUpdate {
|
||||
*/
|
||||
|
||||
late int newest;
|
||||
late int iosbuild;
|
||||
late int androidbuild;
|
||||
late int macbuild;
|
||||
late String android;
|
||||
late String ios;
|
||||
late String mac;
|
||||
late int min;
|
||||
late String changelog;
|
||||
|
||||
@@ -27,6 +31,9 @@ class AppUpdate {
|
||||
});
|
||||
AppUpdate.fromJson(Map<String, dynamic> json) {
|
||||
newest = json["newest"]?.toInt();
|
||||
newest = json["macbuild"]?.toInt();
|
||||
newest = json["iosbuild"]?.toInt();
|
||||
newest = json["androidbuild"]?.toInt();
|
||||
android = json["android"].toString();
|
||||
ios = json["ios"].toString();
|
||||
min = json["min"].toInt();
|
||||
@@ -35,6 +42,9 @@ class AppUpdate {
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data["newest"] = newest;
|
||||
data["macbuild"] = macbuild;
|
||||
data["iosbuild"] = iosbuild;
|
||||
data["androidbuild"] = androidbuild;
|
||||
data["android"] = android;
|
||||
data["ios"] = ios;
|
||||
data["min"] = min;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:ssh2/ssh2.dart';
|
||||
import 'package:dartssh2/dartssh2.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';
|
||||
@@ -6,7 +6,7 @@ import 'package:toolbox/data/model/server/server_status.dart';
|
||||
class ServerInfo {
|
||||
ServerPrivateInfo info;
|
||||
ServerStatus status;
|
||||
SSHClient client;
|
||||
SSHClient? client;
|
||||
ServerConnectionState connectionState;
|
||||
|
||||
ServerInfo(this.info, this.status, this.client, this.connectionState);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:dartssh2/dartssh2.dart';
|
||||
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/server/cpu_2_status.dart';
|
||||
@@ -59,15 +60,21 @@ class ServerProvider extends BusyProvider {
|
||||
|
||||
ServerInfo genInfo(ServerPrivateInfo spi) {
|
||||
return ServerInfo(
|
||||
spi, emptyStatus, genClient(spi), ServerConnectionState.disconnected);
|
||||
spi, emptyStatus, null, ServerConnectionState.disconnected);
|
||||
}
|
||||
|
||||
SSHClient genClient(ServerPrivateInfo spi) {
|
||||
return SSHClient(
|
||||
host: spi.ip,
|
||||
port: spi.port,
|
||||
Future<SSHClient> genClient(ServerPrivateInfo spi) async {
|
||||
final socket = await SSHSocket.connect(spi.ip, spi.port);
|
||||
if (spi.authorization is String) {
|
||||
return SSHClient(socket,
|
||||
username: spi.user,
|
||||
onPasswordRequest: () => spi.authorization as String);
|
||||
}
|
||||
final auth = spi.authorization as Map<String, dynamic>;
|
||||
return SSHClient(socket,
|
||||
username: spi.user,
|
||||
passwordOrKey: spi.authorization);
|
||||
identities: SSHKeyPair.fromPem(auth['privateKey'],
|
||||
auth['passphrase']));
|
||||
}
|
||||
|
||||
Future<void> refreshData({int? idx}) async {
|
||||
@@ -123,10 +130,11 @@ class ServerProvider extends BusyProvider {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void updateServer(ServerPrivateInfo old, ServerPrivateInfo newInfo) {
|
||||
Future<void> updateServer(
|
||||
ServerPrivateInfo old, ServerPrivateInfo newInfo) async {
|
||||
final idx = _servers.indexWhere((e) => e.info == old);
|
||||
_servers[idx].info = newInfo;
|
||||
_servers[idx].client = genClient(newInfo);
|
||||
_servers[idx].client = await genClient(newInfo);
|
||||
locator<ServerStore>().update(old, newInfo);
|
||||
notifyListeners();
|
||||
refreshData(idx: idx);
|
||||
@@ -134,7 +142,7 @@ class ServerProvider extends BusyProvider {
|
||||
|
||||
Future<ServerStatus?> _getData(ServerPrivateInfo info, int idx) async {
|
||||
final client = _servers[idx].client;
|
||||
final connected = await client.isConnected();
|
||||
final connected = client != null;
|
||||
final state = _servers[idx].connectionState;
|
||||
if (!connected ||
|
||||
state == ServerConnectionState.failed ||
|
||||
@@ -143,7 +151,7 @@ class ServerProvider extends BusyProvider {
|
||||
notifyListeners();
|
||||
final time1 = DateTime.now();
|
||||
try {
|
||||
await client.connect();
|
||||
_servers[idx].client = await genClient(info);
|
||||
final time2 = DateTime.now();
|
||||
logger.info(
|
||||
'Connected to [${info.name}] in [${time2.difference(time1).toString()}].');
|
||||
@@ -151,24 +159,24 @@ class ServerProvider extends BusyProvider {
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
_servers[idx].connectionState = ServerConnectionState.failed;
|
||||
_servers[idx].status.failedInfo = e.toString().split(', ')[1];
|
||||
_servers[idx].status.failedInfo = e.toString();
|
||||
notifyListeners();
|
||||
logger.warning(e);
|
||||
}
|
||||
}
|
||||
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/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') ?? '';
|
||||
if (!connected) return null;
|
||||
final cpu = utf8.decode(await client!.run("cat /proc/stat | grep cpu"));
|
||||
final cpuTemp = utf8.decode(await client.run(
|
||||
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 = utf8.decode(await client.run('free -m'));
|
||||
final sysVer = utf8
|
||||
.decode(await client.run('cat /etc/os-release | grep PRETTY_NAME'));
|
||||
final upTime = utf8.decode(await client.run('uptime'));
|
||||
final disk = utf8.decode(await client.run('df -h'));
|
||||
final tcp = utf8.decode(await client.run('cat /proc/net/snmp'));
|
||||
final netSpeed =
|
||||
await client.execute('cat /proc/net/dev && date +%s') ?? '';
|
||||
utf8.decode(await client.run('cat /proc/net/dev && date +%s'));
|
||||
|
||||
return ServerStatus(
|
||||
_getCPU(cpu, _servers[idx].status.cpu2Status, cpuTemp),
|
||||
@@ -303,7 +311,8 @@ class ServerProvider extends BusyProvider {
|
||||
return emptyMemory;
|
||||
}
|
||||
|
||||
Future<String?> runSnippet(int idx, Snippet snippet) {
|
||||
return _servers[idx].client.execute(snippet.script);
|
||||
Future<String?> runSnippet(int idx, Snippet snippet) async {
|
||||
final result = await _servers[idx].client!.run(snippet.script);
|
||||
return utf8.decode(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer<ServerProvider>(builder: (_, provider, __) {
|
||||
return _buildMainPage(
|
||||
provider.servers.firstWhere((e) => e.client.id == widget.id));
|
||||
provider.servers.firstWhere((e) => '${e.info.ip}:${e.info.port}' == widget.id));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
_buildRealServerCard(si.status, si.info.name, si.connectionState),
|
||||
),
|
||||
onTap: () =>
|
||||
AppRoute(ServerDetailPage(si.client.id!), 'server detail page')
|
||||
AppRoute(ServerDetailPage('${si.info.ip}:${si.info.port}'), 'server detail page')
|
||||
.go(context),
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user