mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 23:34:24 +01:00
opt.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import 'package:toolbox/core/provider_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppProvider extends BusyProvider {
|
||||
class AppProvider extends ChangeNotifier {
|
||||
int? _newestBuild;
|
||||
int? get newestBuild => _newestBuild;
|
||||
|
||||
|
||||
@@ -2,16 +2,16 @@ import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:dartssh2/dartssh2.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:toolbox/core/extension/ssh_client.dart';
|
||||
import 'package:toolbox/core/extension/stringx.dart';
|
||||
import 'package:toolbox/core/extension/uint8list.dart';
|
||||
import 'package:toolbox/core/provider_base.dart';
|
||||
import 'package:toolbox/data/model/pkg/manager.dart';
|
||||
import 'package:toolbox/data/model/pkg/upgrade_info.dart';
|
||||
import 'package:toolbox/data/model/server/dist.dart';
|
||||
|
||||
class PkgProvider extends BusyProvider {
|
||||
class PkgProvider extends ChangeNotifier {
|
||||
final logger = Logger('PKG');
|
||||
|
||||
SSHClient? client;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:toolbox/core/provider_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:toolbox/data/model/server/private_key_info.dart';
|
||||
import 'package:toolbox/data/store/private_key.dart';
|
||||
import 'package:toolbox/locator.dart';
|
||||
|
||||
class PrivateKeyProvider extends BusyProvider {
|
||||
class PrivateKeyProvider extends ChangeNotifier {
|
||||
List<PrivateKeyInfo> get pkis => _pkis;
|
||||
final _store = locator<PrivateKeyStore>();
|
||||
late List<PrivateKeyInfo> _pkis;
|
||||
|
||||
@@ -6,7 +6,6 @@ import 'package:toolbox/data/model/app/shell_func.dart';
|
||||
|
||||
import '../../core/extension/order.dart';
|
||||
import '../../core/extension/uint8list.dart';
|
||||
import '../../core/provider_base.dart';
|
||||
import '../../core/utils/server.dart';
|
||||
import '../../locator.dart';
|
||||
import '../model/server/server.dart';
|
||||
@@ -21,7 +20,7 @@ import '../store/setting.dart';
|
||||
|
||||
typedef ServersMap = Map<String, Server>;
|
||||
|
||||
class ServerProvider extends BusyProvider {
|
||||
class ServerProvider extends ChangeNotifier {
|
||||
final ServersMap _servers = {};
|
||||
ServersMap get servers => _servers;
|
||||
final Order<String> _serverOrder = [];
|
||||
@@ -39,7 +38,6 @@ class ServerProvider extends BusyProvider {
|
||||
final _settingStore = locator<SettingStore>();
|
||||
|
||||
Future<void> loadLocalData() async {
|
||||
setBusyState(true);
|
||||
final spis = _serverStore.fetch();
|
||||
for (final spi in spis) {
|
||||
_servers[spi.id] = genServer(spi);
|
||||
@@ -56,7 +54,6 @@ class ServerProvider extends BusyProvider {
|
||||
}
|
||||
_settingStore.serverOrder.put(_serverOrder);
|
||||
_updateTags();
|
||||
setBusyState(false);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@@ -204,77 +201,96 @@ class ServerProvider extends BusyProvider {
|
||||
}
|
||||
}
|
||||
|
||||
void _setServerState(Server s, ServerState ss) {
|
||||
s.state = ss;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> _getData(ServerPrivateInfo spi) async {
|
||||
final sid = spi.id;
|
||||
final s = _servers[sid];
|
||||
|
||||
if (s == null) return;
|
||||
|
||||
var raw = '';
|
||||
var segments = <String>[];
|
||||
|
||||
try {
|
||||
final state = s.state;
|
||||
if (state.shouldConnect) {
|
||||
if (!_limiter.shouldTry(sid)) {
|
||||
s.state = ServerState.failed;
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
s.state = ServerState.connecting;
|
||||
notifyListeners();
|
||||
|
||||
// try to connect
|
||||
final time1 = DateTime.now();
|
||||
s.client = await genClient(spi);
|
||||
final time2 = DateTime.now();
|
||||
final spentTime = time2.difference(time1).inMilliseconds;
|
||||
_logger.info('Connected to $sid in $spentTime ms.');
|
||||
|
||||
// after connected
|
||||
s.state = ServerState.connected;
|
||||
notifyListeners();
|
||||
// write script to server
|
||||
final writeResult = await s.client!.run(installShellCmd).string;
|
||||
|
||||
// if write failed
|
||||
if (writeResult.isNotEmpty) {
|
||||
throw Exception(writeResult);
|
||||
}
|
||||
// reset try times if connected successfully
|
||||
_limiter.reset(sid);
|
||||
if (!_limiter.canTry(sid)) {
|
||||
if (s.state != ServerState.failed) {
|
||||
_setServerState(s, ServerState.failed);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (s.client == null) return;
|
||||
// run script to get server status
|
||||
raw = await s.client!.run(AppShellFuncType.status.exec).string;
|
||||
segments = raw.split(seperator).map((e) => e.trim()).toList();
|
||||
if (raw.isEmpty || segments.length != StatusCmdType.values.length) {
|
||||
s.state = ServerState.failed;
|
||||
if (s.status.failedInfo?.isEmpty ?? true) {
|
||||
s.status.failedInfo = 'Seperate segments failed, raw:\n$raw';
|
||||
}
|
||||
if (s.state.shouldConnect) {
|
||||
_setServerState(s, ServerState.connecting);
|
||||
|
||||
final time1 = DateTime.now();
|
||||
|
||||
try {
|
||||
s.client = await genClient(spi);
|
||||
} catch (e) {
|
||||
_limiter.inc(sid);
|
||||
s.status.failedInfo = e.toString();
|
||||
_setServerState(s, ServerState.failed);
|
||||
_logger.warning('Connect to $sid failed', e);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
s.state = ServerState.failed;
|
||||
s.status.failedInfo = e.toString();
|
||||
rethrow;
|
||||
} finally {
|
||||
notifyListeners();
|
||||
|
||||
final time2 = DateTime.now();
|
||||
final spentTime = time2.difference(time1).inMilliseconds;
|
||||
_logger.info('Connected to $sid in $spentTime ms.');
|
||||
|
||||
_setServerState(s, ServerState.connected);
|
||||
|
||||
try {
|
||||
final writeResult = await s.client?.run(installShellCmd).string;
|
||||
if (writeResult == null || writeResult.isNotEmpty) {
|
||||
_limiter.inc(sid);
|
||||
s.status.failedInfo = writeResult;
|
||||
_setServerState(s, ServerState.failed);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
_limiter.inc(sid);
|
||||
s.status.failedInfo = e.toString();
|
||||
_setServerState(s, ServerState.failed);
|
||||
_logger.warning('Write script to $sid failed', e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (s.client == null) return;
|
||||
|
||||
if (s.state != ServerState.finished) {
|
||||
_setServerState(s, ServerState.loading);
|
||||
}
|
||||
|
||||
final raw = await s.client?.run(AppShellFuncType.status.exec).string;
|
||||
final segments = raw?.split(seperator).map((e) => e.trim()).toList();
|
||||
if (raw == null ||
|
||||
raw.isEmpty ||
|
||||
segments == null ||
|
||||
segments.length != StatusCmdType.values.length) {
|
||||
_limiter.inc(sid);
|
||||
s.status.failedInfo = 'Seperate segments failed, raw:\n$raw';
|
||||
_setServerState(s, ServerState.failed);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
final req = ServerStatusUpdateReq(s.status, segments);
|
||||
s.status = await compute(getStatus, req);
|
||||
// Comment for debug
|
||||
// s.status = await getStatus(req);
|
||||
} catch (e) {
|
||||
s.state = ServerState.failed;
|
||||
} catch (e, trace) {
|
||||
_limiter.inc(sid);
|
||||
s.status.failedInfo = 'Parse failed: $e\n\n$raw';
|
||||
rethrow;
|
||||
} finally {
|
||||
notifyListeners();
|
||||
_setServerState(s, ServerState.failed);
|
||||
_logger.warning('Parse failed', e, trace);
|
||||
return;
|
||||
}
|
||||
|
||||
if (s.state != ServerState.finished) {
|
||||
_setServerState(s, ServerState.finished);
|
||||
}
|
||||
// reset try times only after prepared successfully
|
||||
_limiter.reset(sid);
|
||||
}
|
||||
|
||||
Future<String?> runSnippets(String id, List<Snippet> snippets) async {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:toolbox/core/provider_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../model/sftp/req.dart';
|
||||
|
||||
class SftpProvider extends ProviderBase {
|
||||
class SftpProvider extends ChangeNotifier {
|
||||
final List<SftpReqStatus> _status = [];
|
||||
List<SftpReqStatus> get status => _status;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:toolbox/core/provider_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:toolbox/data/model/server/snippet.dart';
|
||||
import 'package:toolbox/data/store/snippet.dart';
|
||||
import 'package:toolbox/locator.dart';
|
||||
@@ -8,7 +8,7 @@ import 'package:toolbox/locator.dart';
|
||||
import '../../core/extension/order.dart';
|
||||
import '../store/setting.dart';
|
||||
|
||||
class SnippetProvider extends BusyProvider {
|
||||
class SnippetProvider extends ChangeNotifier {
|
||||
late Order<Snippet> _snippets;
|
||||
Order<Snippet> get snippets => _snippets;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user