opt.: more friendly err tip

This commit is contained in:
lollipopkit
2024-05-09 21:50:30 +08:00
parent 131ece725a
commit 7767cc4b51
17 changed files with 128 additions and 31 deletions

View File

@@ -1,3 +1,5 @@
import 'package:toolbox/core/extension/context/locale.dart';
enum ErrFrom {
unknown,
apt,
@@ -15,18 +17,35 @@ abstract class Err<T> {
final T type;
final String? message;
String? get solution;
Err({required this.from, required this.type, this.message});
}
enum SSHErrType {
unknown,
connect,
noPrivateKey;
auth,
noPrivateKey,
chdir,
segements,
writeScript,
getStatus,
;
}
class SSHErr extends Err<SSHErrType> {
SSHErr({required super.type, super.message}) : super(from: ErrFrom.ssh);
@override
String? get solution => switch (type) {
SSHErrType.chdir => l10n.needHomeDir,
SSHErrType.auth => l10n.authFailTip,
SSHErrType.writeScript => l10n.writeScriptFailTip,
SSHErrType.noPrivateKey => l10n.noPrivateKeyTip,
_ => null,
};
@override
String toString() {
return 'SSHErr<$type>: $message';
@@ -49,6 +68,9 @@ class ContainerErr extends Err<ContainerErrType> {
ContainerErr({required super.type, super.message})
: super(from: ErrFrom.docker);
@override
String? get solution => null;
@override
String toString() {
return 'ContainerErr<$type>: $message';
@@ -64,6 +86,9 @@ enum ICloudErrType {
class ICloudErr extends Err<ICloudErrType> {
ICloudErr({required super.type, super.message}) : super(from: ErrFrom.icloud);
@override
String? get solution => null;
@override
String toString() {
return 'ICloudErr<$type>: $message';
@@ -79,6 +104,9 @@ enum WebdavErrType {
class WebdavErr extends Err<WebdavErrType> {
WebdavErr({required super.type, super.message}) : super(from: ErrFrom.webdav);
@override
String? get solution => null;
@override
String toString() {
return 'WebdavErr<$type>: $message';
@@ -95,6 +123,9 @@ enum PveErrType {
class PveErr extends Err<PveErrType> {
PveErr({required super.type, super.message}) : super(from: ErrFrom.status);
@override
String? get solution => null;
@override
String toString() {
return 'PveErr<$type>: $message';

View File

@@ -1,6 +1,7 @@
import 'package:dartssh2/dartssh2.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/listx.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/battery.dart';
import 'package:toolbox/data/model/server/conn.dart';
@@ -55,7 +56,7 @@ class ServerStatus {
NetSpeed netSpeed;
Temperatures temps;
SystemType system;
String? err;
Err? err;
DiskIO diskIO;
List<NvidiaSmiItem>? nvidia;
final List<Battery> batteries = [];

View File

@@ -53,7 +53,7 @@ extension ServerX on Server {
case ServerConn.connecting:
return l10n.serverTabConnecting;
case ServerConn.failed:
return status.err ?? l10n.serverTabFailed;
return status.err != null ? l10n.viewErr : l10n.serverTabFailed;
}
}
}

View File

@@ -8,6 +8,7 @@ import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/core/utils/ssh_auth.dart';
import 'package:toolbox/core/utils/platform/path.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/system.dart';
import 'package:toolbox/data/model/sftp/req.dart';
@@ -290,7 +291,7 @@ class ServerProvider extends ChangeNotifier {
}
} catch (e) {
TryLimiter.inc(sid);
s.status.err = e.toString();
s.status.err = SSHErr(type: SSHErrType.connect, message: e.toString());
_setServerState(s, ServerConn.failed);
/// In order to keep privacy, print [spi.name] instead of [spi.id]
@@ -313,12 +314,12 @@ class ServerProvider extends ChangeNotifier {
);
} on SSHAuthAbortError catch (e) {
TryLimiter.inc(sid);
s.status.err = e.toString();
s.status.err = SSHErr(type: SSHErrType.auth, message: e.toString());
_setServerState(s, ServerConn.failed);
return;
} on SSHAuthFailError catch (e) {
TryLimiter.inc(sid);
s.status.err = e.toString();
s.status.err = SSHErr(type: SSHErrType.auth, message: e.toString());
_setServerState(s, ServerConn.failed);
return;
} catch (e) {
@@ -344,11 +345,14 @@ class ServerProvider extends ChangeNotifier {
if (err != null) {
throw err;
}
} catch (e) {
} catch (ee) {
TryLimiter.inc(sid);
s.status.err = e.toString();
s.status.err = SSHErr(
type: SSHErrType.writeScript,
message: '$e\n\n$ee',
);
_setServerState(s, ServerConn.failed);
Loggers.app.warning('Write script to ${spi.name} by sftp', e);
Loggers.app.warning('Write script to ${spi.name} by sftp', ee);
return;
} finally {
if (await file.exists()) await file.delete();
@@ -379,13 +383,16 @@ class ServerProvider extends ChangeNotifier {
}
}
TryLimiter.inc(sid);
s.status.err = 'Seperate segments failed, raw:\n$raw';
s.status.err = SSHErr(
type: SSHErrType.segements,
message: 'Seperate segments failed, raw:\n$raw',
);
_setServerState(s, ServerConn.failed);
return;
}
} catch (e) {
TryLimiter.inc(sid);
s.status.err = e.toString();
s.status.err = SSHErr(type: SSHErrType.getStatus, message: e.toString());
_setServerState(s, ServerConn.failed);
Loggers.app.warning('Get status from ${spi.name} failed', e);
return;
@@ -395,10 +402,17 @@ class ServerProvider extends ChangeNotifier {
final customCmdLen = spi.custom?.cmds?.length ?? 0;
if (!systemType.isSegmentsLenMatch(segments.length - customCmdLen)) {
TryLimiter.inc(sid);
if (raw.contains('Could not chdir to home directory /var/services/')) {
s.status.err = SSHErr(type: SSHErrType.chdir, message: raw);
_setServerState(s, ServerConn.failed);
return;
}
final expected = systemType.segmentsLen;
final actual = segments.length;
final err = 'Segments: expect $expected, got $actual, raw:\n\n$raw';
s.status.err = err;
s.status.err = SSHErr(
type: SSHErrType.segements,
message: 'Segments: expect $expected, got $actual, raw:\n\n$raw',
);
_setServerState(s, ServerConn.failed);
return;
}
@@ -418,7 +432,10 @@ class ServerProvider extends ChangeNotifier {
);
} catch (e, trace) {
TryLimiter.inc(sid);
s.status.err = 'Parse failed: $e\n\n$raw';
s.status.err = SSHErr(
type: SSHErrType.getStatus,
message: 'Parse failed: $e\n\n$raw',
);
_setServerState(s, ServerConn.failed);
Loggers.parse.warning('Server status', e, trace);
return;