mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
new: kill process
This commit is contained in:
@@ -1196,6 +1196,12 @@ abstract class S {
|
|||||||
/// **'Are you sure to use no password?'**
|
/// **'Are you sure to use no password?'**
|
||||||
String get sureNoPwd;
|
String get sureNoPwd;
|
||||||
|
|
||||||
|
/// No description provided for @sureStop.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Sure to stop [{item}] ?'**
|
||||||
|
String sureStop(Object item);
|
||||||
|
|
||||||
/// No description provided for @sureToDeleteServer.
|
/// No description provided for @sureToDeleteServer.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|||||||
@@ -585,6 +585,11 @@ class SDe extends S {
|
|||||||
@override
|
@override
|
||||||
String get sureNoPwd => 'Bist du sicher, dass du kein Passwort verwenden willst?';
|
String get sureNoPwd => 'Bist du sicher, dass du kein Passwort verwenden willst?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sureStop(Object item) {
|
||||||
|
return 'Sind Sie sicher, dass Sie [$item] stoppen möchten?';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sureToDeleteServer(Object server) {
|
String sureToDeleteServer(Object server) {
|
||||||
return 'Bist du sicher, dass du [$server] löschen willst?';
|
return 'Bist du sicher, dass du [$server] löschen willst?';
|
||||||
|
|||||||
@@ -585,6 +585,11 @@ class SEn extends S {
|
|||||||
@override
|
@override
|
||||||
String get sureNoPwd => 'Are you sure to use no password?';
|
String get sureNoPwd => 'Are you sure to use no password?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sureStop(Object item) {
|
||||||
|
return 'Sure to stop [$item] ?';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sureToDeleteServer(Object server) {
|
String sureToDeleteServer(Object server) {
|
||||||
return 'Are you sure to delete server [$server]?';
|
return 'Are you sure to delete server [$server]?';
|
||||||
|
|||||||
@@ -585,6 +585,11 @@ class SId extends S {
|
|||||||
@override
|
@override
|
||||||
String get sureNoPwd => 'Apakah Anda pasti tidak menggunakan kata sandi?';
|
String get sureNoPwd => 'Apakah Anda pasti tidak menggunakan kata sandi?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sureStop(Object item) {
|
||||||
|
return 'Anda yakin ingin menghentikan [$item]?';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sureToDeleteServer(Object server) {
|
String sureToDeleteServer(Object server) {
|
||||||
return 'Apakah Anda pasti akan menghapus server [$server]?';
|
return 'Apakah Anda pasti akan menghapus server [$server]?';
|
||||||
|
|||||||
@@ -585,6 +585,11 @@ class SZh extends S {
|
|||||||
@override
|
@override
|
||||||
String get sureNoPwd => '确认使用无密码?';
|
String get sureNoPwd => '确认使用无密码?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sureStop(Object item) {
|
||||||
|
return '确定要停止 [$item] 吗?';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sureToDeleteServer(Object server) {
|
String sureToDeleteServer(Object server) {
|
||||||
return '你确定要删除服务器 [$server] 吗?';
|
return '你确定要删除服务器 [$server] 吗?';
|
||||||
@@ -1276,6 +1281,11 @@ class SZhTw extends SZh {
|
|||||||
@override
|
@override
|
||||||
String get sureNoPwd => '確認使用無密碼?';
|
String get sureNoPwd => '確認使用無密碼?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sureStop(Object item) {
|
||||||
|
return '確定要停止 [$item] 嗎?';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sureToDeleteServer(Object server) {
|
String sureToDeleteServer(Object server) {
|
||||||
return '你確定要刪除服務器 [$server] 嗎?';
|
return '你確定要刪除服務器 [$server] 嗎?';
|
||||||
|
|||||||
2
.github/workflows/analysis.yml
vendored
2
.github/workflows/analysis.yml
vendored
@@ -12,7 +12,7 @@ on:
|
|||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ enum PlatformType {
|
|||||||
macos,
|
macos,
|
||||||
windows,
|
windows,
|
||||||
web,
|
web,
|
||||||
|
fuchsia,
|
||||||
unknown,
|
unknown,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,6 +32,9 @@ final _p = () {
|
|||||||
if (Platform.isWindows) {
|
if (Platform.isWindows) {
|
||||||
return PlatformType.windows;
|
return PlatformType.windows;
|
||||||
}
|
}
|
||||||
|
if (Platform.isFuchsia) {
|
||||||
|
return PlatformType.fuchsia;
|
||||||
|
}
|
||||||
return PlatformType.unknown;
|
return PlatformType.unknown;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
"sureDelete": "Soll [{name}] wirklich gelöscht werden?",
|
"sureDelete": "Soll [{name}] wirklich gelöscht werden?",
|
||||||
"sureDirEmpty": "Stelle sicher, dass der Ordner leer ist.",
|
"sureDirEmpty": "Stelle sicher, dass der Ordner leer ist.",
|
||||||
"sureNoPwd": "Bist du sicher, dass du kein Passwort verwenden willst?",
|
"sureNoPwd": "Bist du sicher, dass du kein Passwort verwenden willst?",
|
||||||
|
"sureStop": "Sind Sie sicher, dass Sie [{item}] stoppen möchten?",
|
||||||
"sureToDeleteServer": "Bist du sicher, dass du [{server}] löschen willst?",
|
"sureToDeleteServer": "Bist du sicher, dass du [{server}] löschen willst?",
|
||||||
"system": "Systeme",
|
"system": "Systeme",
|
||||||
"tag": "Tags",
|
"tag": "Tags",
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
"sureDelete": "Are you sure to delete [{name}]?",
|
"sureDelete": "Are you sure to delete [{name}]?",
|
||||||
"sureDirEmpty": "Make sure dir is empty.",
|
"sureDirEmpty": "Make sure dir is empty.",
|
||||||
"sureNoPwd": "Are you sure to use no password?",
|
"sureNoPwd": "Are you sure to use no password?",
|
||||||
|
"sureStop": "Sure to stop [{item}] ?",
|
||||||
"sureToDeleteServer": "Are you sure to delete server [{server}]?",
|
"sureToDeleteServer": "Are you sure to delete server [{server}]?",
|
||||||
"system": "System",
|
"system": "System",
|
||||||
"tag": "Tags",
|
"tag": "Tags",
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
"sureDelete": "Apakah Anda pasti akan menghapus [{name}]?",
|
"sureDelete": "Apakah Anda pasti akan menghapus [{name}]?",
|
||||||
"sureDirEmpty": "Pastikan dir kosong.",
|
"sureDirEmpty": "Pastikan dir kosong.",
|
||||||
"sureNoPwd": "Apakah Anda pasti tidak menggunakan kata sandi?",
|
"sureNoPwd": "Apakah Anda pasti tidak menggunakan kata sandi?",
|
||||||
|
"sureStop": "Anda yakin ingin menghentikan [{item}]?",
|
||||||
"sureToDeleteServer": "Apakah Anda pasti akan menghapus server [{server}]?",
|
"sureToDeleteServer": "Apakah Anda pasti akan menghapus server [{server}]?",
|
||||||
"system": "Sistem",
|
"system": "Sistem",
|
||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
"sureDelete": "确定删除 [{name}]?",
|
"sureDelete": "确定删除 [{name}]?",
|
||||||
"sureDirEmpty": "请确保文件夹为空",
|
"sureDirEmpty": "请确保文件夹为空",
|
||||||
"sureNoPwd": "确认使用无密码?",
|
"sureNoPwd": "确认使用无密码?",
|
||||||
|
"sureStop": "确定要停止 [{item}] 吗?",
|
||||||
"sureToDeleteServer": "你确定要删除服务器 [{server}] 吗?",
|
"sureToDeleteServer": "你确定要删除服务器 [{server}] 吗?",
|
||||||
"system": "系统",
|
"system": "系统",
|
||||||
"tag": "标签",
|
"tag": "标签",
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
"sureDelete": "確定刪除 [{name}]?",
|
"sureDelete": "確定刪除 [{name}]?",
|
||||||
"sureDirEmpty": "請確保文件夾為空",
|
"sureDirEmpty": "請確保文件夾為空",
|
||||||
"sureNoPwd": "確認使用無密碼?",
|
"sureNoPwd": "確認使用無密碼?",
|
||||||
|
"sureStop": "確定要停止 [{item}] 嗎?",
|
||||||
"sureToDeleteServer": "你確定要刪除服務器 [{server}] 嗎?",
|
"sureToDeleteServer": "你確定要刪除服務器 [{server}] 嗎?",
|
||||||
"system": "系統",
|
"system": "系統",
|
||||||
"tag": "标签",
|
"tag": "标签",
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
|
import 'package:toolbox/core/extension/navigator.dart';
|
||||||
import 'package:toolbox/core/extension/stringx.dart';
|
import 'package:toolbox/core/extension/stringx.dart';
|
||||||
import 'package:toolbox/core/extension/uint8list.dart';
|
import 'package:toolbox/core/extension/uint8list.dart';
|
||||||
import 'package:toolbox/core/utils/ui.dart';
|
import 'package:toolbox/core/utils/ui.dart';
|
||||||
@@ -25,6 +27,7 @@ class ProcessPage extends StatefulWidget {
|
|||||||
class _ProcessPageState extends State<ProcessPage> {
|
class _ProcessPageState extends State<ProcessPage> {
|
||||||
late S _s;
|
late S _s;
|
||||||
late Timer _timer;
|
late Timer _timer;
|
||||||
|
SSHClient? _client;
|
||||||
|
|
||||||
PsResult _result = PsResult(procs: []);
|
PsResult _result = PsResult(procs: []);
|
||||||
int? _lastFocusId;
|
int? _lastFocusId;
|
||||||
@@ -35,24 +38,27 @@ class _ProcessPageState extends State<ProcessPage> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
final client = _serverProvider.servers[widget.spi.id]?.client;
|
_client = _serverProvider.servers[widget.spi.id]?.client;
|
||||||
if (client == null) {
|
if (_client == null) {
|
||||||
showSnackBar(context, Text(_s.noClient));
|
showSnackBar(context, Text(_s.noClient));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_timer = Timer.periodic(const Duration(seconds: 3), (_) async {
|
_timer =
|
||||||
if (mounted) {
|
Timer.periodic(const Duration(seconds: 3), (_) => _refresh());
|
||||||
final result = await client.run('ps -aux'.withLangExport).string;
|
}
|
||||||
if (result.isEmpty) {
|
|
||||||
showSnackBar(context, Text(_s.noResult));
|
Future<void> _refresh() async {
|
||||||
return;
|
if (mounted) {
|
||||||
}
|
final result = await _client?.run('ps -aux'.withLangExport).string;
|
||||||
_result = PsResult.parse(result, sort: _procSortMode);
|
if (result == null || result.isEmpty) {
|
||||||
setState(() {});
|
showSnackBar(context, Text(_s.noResult));
|
||||||
} else {
|
return;
|
||||||
_timer.cancel();
|
|
||||||
}
|
}
|
||||||
});
|
_result = PsResult.parse(result, sort: _procSortMode);
|
||||||
|
setState(() {});
|
||||||
|
} else {
|
||||||
|
_timer.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -140,6 +146,24 @@ class _ProcessPageState extends State<ProcessPage> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
onTap: () => _lastFocusId = proc.pid,
|
onTap: () => _lastFocusId = proc.pid,
|
||||||
|
onLongPress: () {
|
||||||
|
showRoundDialog(
|
||||||
|
context: context,
|
||||||
|
title: Text(_s.attention),
|
||||||
|
child: Text(_s.sureStop(proc.pid)),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
await _client?.run('kill ${proc.pid}');
|
||||||
|
await _refresh();
|
||||||
|
context.pop();
|
||||||
|
},
|
||||||
|
child: Text(_s.ok),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
selected: _lastFocusId == proc.pid,
|
||||||
autofocus: _lastFocusId == proc.pid,
|
autofocus: _lastFocusId == proc.pid,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
// This is a basic Flutter widget test.
|
|
||||||
//
|
|
||||||
// To perform an interaction with a widget in your test, use the WidgetTester
|
|
||||||
// utility that Flutter provides. For example, you can send tap and scroll
|
|
||||||
// gestures. You can also use WidgetTester to find child widgets in the widget
|
|
||||||
// tree, read text, and verify that the values of widget properties are correct.
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:toolbox/app.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
|
||||||
// Build our app and trigger a frame.
|
|
||||||
await tester.pumpWidget(MyApp());
|
|
||||||
|
|
||||||
// Verify that our counter starts at 0.
|
|
||||||
expect(find.text('0'), findsOneWidget);
|
|
||||||
expect(find.text('1'), findsNothing);
|
|
||||||
|
|
||||||
// Tap the '+' icon and trigger a frame.
|
|
||||||
await tester.tap(find.byIcon(Icons.add));
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
// Verify that our counter has incremented.
|
|
||||||
expect(find.text('0'), findsNothing);
|
|
||||||
expect(find.text('1'), findsOneWidget);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user