diff --git a/lib/core/extension/ssh_client.dart b/lib/core/extension/ssh_client.dart index 7b721020..43e16ef8 100644 --- a/lib/core/extension/ssh_client.dart +++ b/lib/core/extension/ssh_client.dart @@ -112,7 +112,7 @@ extension SSHClientX on SSHClient { return (session, result.takeBytes().string); } - Future execWithPwd( + Future<(int?, String)> execWithPwd( String script, { String? entry, BuildContext? context, @@ -121,7 +121,7 @@ extension SSHClientX on SSHClient { required String id, }) async { var isRequestingPwd = false; - final (session, _) = await exec( + final (session, output) = await exec( (sess) { sess.stdin.add('$script\n'.uint8List); sess.stdin.close(); @@ -147,7 +147,7 @@ extension SSHClientX on SSHClient { onStdout: onStdout, entry: entry, ); - return session.exitCode; + return (session.exitCode, output); } Future execForOutput( diff --git a/lib/data/model/app/error.dart b/lib/data/model/app/error.dart index 8ff3f41f..d3d64ca8 100644 --- a/lib/data/model/app/error.dart +++ b/lib/data/model/app/error.dart @@ -26,6 +26,7 @@ enum ContainerErrType { parsePs, parseImages, parseStats, + podmanDetected, } class ContainerErr extends Err { diff --git a/lib/data/provider/container.dart b/lib/data/provider/container.dart index 69a7bc67..afaaaeda 100644 --- a/lib/data/provider/container.dart +++ b/lib/data/provider/container.dart @@ -6,6 +6,7 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:server_box/core/extension/context/locale.dart'; import 'package:server_box/core/extension/ssh_client.dart'; import 'package:server_box/data/model/app/error.dart'; import 'package:server_box/data/model/app/scripts/script_consts.dart'; @@ -18,6 +19,7 @@ part 'container.freezed.dart'; part 'container.g.dart'; final _dockerNotFound = RegExp(r"command not found|Unknown command|Command '\w+' not found"); +final _podmanEmulationMsg = 'Emulate Docker CLI using podman'; @freezed abstract class ContainerState with _$ContainerState { @@ -84,21 +86,51 @@ class ContainerNotifier extends _$ContainerNotifier { } final includeStats = Stores.setting.containerParseStat.fetch(); - var raw = ''; final cmd = _wrap(ContainerCmdType.execAll(state.type, sudo: sudo, includeStats: includeStats)); - final code = await client?.execWithPwd( - cmd, - context: context, - onStdout: (data, _) => raw = '$raw$data', - id: hostId, - ); + int? code; + String raw = ''; + final errs = []; + if (client != null) { + (code, raw) = await client!.execWithPwd(cmd, context: context, id: hostId); + } else { + state = state.copyWith( + isBusy: false, + error: ContainerErr(type: ContainerErrType.noClient), + ); + return; + } + if (!ref.mounted) return; state = state.copyWith(isBusy: false); if (!context.mounted) return; /// Code 127 means command not found - if (code == 127 || raw.contains(_dockerNotFound)) { + if (code == 127 || raw.contains(_dockerNotFound) || errs.join().contains(_dockerNotFound)) { + state = state.copyWith(error: ContainerErr(type: ContainerErrType.notInstalled)); + return; + } + + /// Pre-parse Podman detection + if (raw.contains(_podmanEmulationMsg)) { + state = state.copyWith( + error: ContainerErr( + type: ContainerErrType.podmanDetected, + message: l10n.podmanDockerEmulationDetected, + ), + ); + return; + } + + /// Filter out sudo password prompt from output + if (errs.any((e) => e.contains('[sudo] password'))) { + raw = raw.split('\n').where((line) => !line.contains('[sudo] password')).join('\n'); + } + + /// Detect Podman not installed when using Podman mode + if (state.type == ContainerType.podman && + (errs.any((e) => e.contains('podman: not found')) || + raw.contains('podman: not found'))) { state = state.copyWith(error: ContainerErr(type: ContainerErrType.notInstalled)); return; } @@ -122,9 +154,11 @@ class ContainerNotifier extends _$ContainerNotifier { final version = json.decode(verRaw)['Client']['Version']; state = state.copyWith(version: version, error: null); } catch (e, trace) { - state = state.copyWith( - error: ContainerErr(type: ContainerErrType.invalidVersion, message: '$e'), - ); + if (state.error == null) { + state = state.copyWith( + error: ContainerErr(type: ContainerErrType.invalidVersion, message: '$e'), + ); + } Loggers.app.warning('Container version failed', e, trace); } @@ -140,9 +174,11 @@ class ContainerNotifier extends _$ContainerNotifier { final items = lines.map((e) => ContainerPs.fromRaw(e, state.type)).toList(); state = state.copyWith(items: items); } catch (e, trace) { - state = state.copyWith( - error: ContainerErr(type: ContainerErrType.parsePs, message: '$e'), - ); + if (state.error == null) { + state = state.copyWith( + error: ContainerErr(type: ContainerErrType.parsePs, message: '$e'), + ); + } Loggers.app.warning('Container ps failed', e, trace); } @@ -162,9 +198,11 @@ class ContainerNotifier extends _$ContainerNotifier { } state = state.copyWith(images: images); } catch (e, trace) { - state = state.copyWith( - error: ContainerErr(type: ContainerErrType.parseImages, message: '$e'), - ); + if (state.error == null) { + state = state.copyWith( + error: ContainerErr(type: ContainerErrType.parseImages, message: '$e'), + ); + } Loggers.app.warning('Container images failed', e, trace); } @@ -189,9 +227,11 @@ class ContainerNotifier extends _$ContainerNotifier { item.parseStats(statsLine, state.version); } } catch (e, trace) { - state = state.copyWith( - error: ContainerErr(type: ContainerErrType.parseStats, message: '$e'), - ); + if (state.error == null) { + state = state.copyWith( + error: ContainerErr(type: ContainerErrType.parseStats, message: '$e'), + ); + } Loggers.app.warning('Parse docker stats: $statsRaw', e, trace); } } @@ -227,6 +267,10 @@ class ContainerNotifier extends _$ContainerNotifier { } Future run(String cmd, {bool autoRefresh = true}) async { + if (client == null) { + return ContainerErr(type: ContainerErrType.noClient); + } + cmd = switch (state.type) { ContainerType.docker => 'docker $cmd', ContainerType.podman => 'podman $cmd', @@ -234,7 +278,7 @@ class ContainerNotifier extends _$ContainerNotifier { state = state.copyWith(runLog: ''); final errs = []; - final code = await client?.execWithPwd( + final (code, _) = await client?.execWithPwd( _wrap((await sudoCompleter.future) ? 'sudo -S $cmd' : cmd), context: context, onStdout: (data, _) { @@ -242,7 +286,7 @@ class ContainerNotifier extends _$ContainerNotifier { }, onStderr: (data, _) => errs.add(data), id: hostId, - ); + ) ?? (null, null); state = state.copyWith(runLog: null); if (code != 0) { diff --git a/lib/generated/l10n/l10n.dart b/lib/generated/l10n/l10n.dart index 072cce4e..e796c7be 100644 --- a/lib/generated/l10n/l10n.dart +++ b/lib/generated/l10n/l10n.dart @@ -1933,6 +1933,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Logs'** String get logs; + + /// No description provided for @podmanDockerEmulationDetected. + /// + /// In en, this message translates to: + /// **'Podman Docker emulation detected. Please switch to Podman in settings.'** + String get podmanDockerEmulationDetected; } class _AppLocalizationsDelegate diff --git a/lib/generated/l10n/l10n_de.dart b/lib/generated/l10n/l10n_de.dart index d794efde..5a378600 100644 --- a/lib/generated/l10n/l10n_de.dart +++ b/lib/generated/l10n/l10n_de.dart @@ -1031,4 +1031,8 @@ class AppLocalizationsDe extends AppLocalizations { @override String get logs => 'Protokolle'; + + @override + String get podmanDockerEmulationDetected => + 'Podman Docker-Emulation erkannt. Bitte wechseln Sie in den Einstellungen zu Podman.'; } diff --git a/lib/generated/l10n/l10n_en.dart b/lib/generated/l10n/l10n_en.dart index 94f6a2e8..977c1a05 100644 --- a/lib/generated/l10n/l10n_en.dart +++ b/lib/generated/l10n/l10n_en.dart @@ -1022,4 +1022,8 @@ class AppLocalizationsEn extends AppLocalizations { @override String get logs => 'Logs'; + + @override + String get podmanDockerEmulationDetected => + 'Podman Docker emulation detected. Please switch to Podman in settings.'; } diff --git a/lib/generated/l10n/l10n_es.dart b/lib/generated/l10n/l10n_es.dart index 376cd739..ccc30449 100644 --- a/lib/generated/l10n/l10n_es.dart +++ b/lib/generated/l10n/l10n_es.dart @@ -1033,4 +1033,8 @@ class AppLocalizationsEs extends AppLocalizations { @override String get logs => 'Registros'; + + @override + String get podmanDockerEmulationDetected => + 'Detectada emulación de Podman Docker. Por favor, cambie a Podman en la configuración.'; } diff --git a/lib/generated/l10n/l10n_fr.dart b/lib/generated/l10n/l10n_fr.dart index 3e4f9a87..e647ad80 100644 --- a/lib/generated/l10n/l10n_fr.dart +++ b/lib/generated/l10n/l10n_fr.dart @@ -1036,4 +1036,8 @@ class AppLocalizationsFr extends AppLocalizations { @override String get logs => 'Journaux'; + + @override + String get podmanDockerEmulationDetected => + 'Émulation Podman Docker détectée. Veuillez passer à Podman dans les paramètres.'; } diff --git a/lib/generated/l10n/l10n_id.dart b/lib/generated/l10n/l10n_id.dart index e6406b5a..d1aa0409 100644 --- a/lib/generated/l10n/l10n_id.dart +++ b/lib/generated/l10n/l10n_id.dart @@ -1022,4 +1022,8 @@ class AppLocalizationsId extends AppLocalizations { @override String get logs => 'Log'; + + @override + String get podmanDockerEmulationDetected => + 'Emulasi Podman Docker terdeteksi. Silakan beralih ke Podman di pengaturan.'; } diff --git a/lib/generated/l10n/l10n_ja.dart b/lib/generated/l10n/l10n_ja.dart index a70553e4..cceb5609 100644 --- a/lib/generated/l10n/l10n_ja.dart +++ b/lib/generated/l10n/l10n_ja.dart @@ -992,4 +992,8 @@ class AppLocalizationsJa extends AppLocalizations { @override String get logs => 'ログ'; + + @override + String get podmanDockerEmulationDetected => + 'Podman Docker エミュレーションが検出されました。設定で Podman に切り替えてください。'; } diff --git a/lib/generated/l10n/l10n_nl.dart b/lib/generated/l10n/l10n_nl.dart index 805df546..911a8dfc 100644 --- a/lib/generated/l10n/l10n_nl.dart +++ b/lib/generated/l10n/l10n_nl.dart @@ -1029,4 +1029,8 @@ class AppLocalizationsNl extends AppLocalizations { @override String get logs => 'Logboeken'; + + @override + String get podmanDockerEmulationDetected => + 'Podman Docker-emulatie gedetecteerd. Schakel over naar Podman in de instellingen.'; } diff --git a/lib/generated/l10n/l10n_pt.dart b/lib/generated/l10n/l10n_pt.dart index 6079f1aa..66fdd64d 100644 --- a/lib/generated/l10n/l10n_pt.dart +++ b/lib/generated/l10n/l10n_pt.dart @@ -1024,4 +1024,8 @@ class AppLocalizationsPt extends AppLocalizations { @override String get logs => 'Logs'; + + @override + String get podmanDockerEmulationDetected => + 'Emulação Podman Docker detectada. Por favor, alterne para Podman nas configurações.'; } diff --git a/lib/generated/l10n/l10n_ru.dart b/lib/generated/l10n/l10n_ru.dart index 88aa8a32..42c79304 100644 --- a/lib/generated/l10n/l10n_ru.dart +++ b/lib/generated/l10n/l10n_ru.dart @@ -1028,4 +1028,8 @@ class AppLocalizationsRu extends AppLocalizations { @override String get logs => 'Журналы'; + + @override + String get podmanDockerEmulationDetected => + 'Обнаружена эмуляция Podman Docker. Пожалуйста, переключитесь на Podman в настройках.'; } diff --git a/lib/generated/l10n/l10n_tr.dart b/lib/generated/l10n/l10n_tr.dart index 71f554cb..26cb5233 100644 --- a/lib/generated/l10n/l10n_tr.dart +++ b/lib/generated/l10n/l10n_tr.dart @@ -1023,4 +1023,8 @@ class AppLocalizationsTr extends AppLocalizations { @override String get logs => 'Günlükler'; + + @override + String get podmanDockerEmulationDetected => + 'Podman Docker emülasyonu tespit edildi. Lütfen ayarlarda Podman\'a geçin.'; } diff --git a/lib/generated/l10n/l10n_uk.dart b/lib/generated/l10n/l10n_uk.dart index 935d33d0..39fe3c94 100644 --- a/lib/generated/l10n/l10n_uk.dart +++ b/lib/generated/l10n/l10n_uk.dart @@ -1028,4 +1028,8 @@ class AppLocalizationsUk extends AppLocalizations { @override String get logs => 'Журнали'; + + @override + String get podmanDockerEmulationDetected => + 'Виявлено емуляцію Podman Docker. Будь ласка, переключіться на Podman у налаштуваннях.'; } diff --git a/lib/generated/l10n/l10n_zh.dart b/lib/generated/l10n/l10n_zh.dart index 1de01419..3d38205b 100644 --- a/lib/generated/l10n/l10n_zh.dart +++ b/lib/generated/l10n/l10n_zh.dart @@ -977,6 +977,10 @@ class AppLocalizationsZh extends AppLocalizations { @override String get logs => '日志'; + + @override + String get podmanDockerEmulationDetected => + '检测到 Podman Docker 仿真。请在设置中切换到 Podman。'; } /// The translations for Chinese, as used in Taiwan (`zh_TW`). @@ -1931,4 +1935,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get logs => '日誌'; + + @override + String get podmanDockerEmulationDetected => + '檢測到 Podman Docker 仿真。請在設定中切換到 Podman。'; } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index f1f87701..81ec0826 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -294,5 +294,6 @@ "write": "Schreiben", "writeScriptFailTip": "Das Schreiben des Skripts ist fehlgeschlagen, möglicherweise aufgrund fehlender Berechtigungen oder das Verzeichnis existiert nicht.", "writeScriptTip": "Nach der Verbindung mit dem Server wird ein Skript in `~/.config/server_box` \n | `/tmp/server_box` geschrieben, um den Systemstatus zu überwachen. Sie können den Skriptinhalt überprüfen.", - "logs": "Protokolle" + "logs": "Protokolle", + "podmanDockerEmulationDetected": "Podman Docker-Emulation erkannt. Bitte wechseln Sie in den Einstellungen zu Podman." } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 53468f37..20d5d227 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -304,5 +304,6 @@ "menuGitHubRepository": "GitHub Repository", "menuWiki": "Wiki", "menuHelp": "Help", - "logs": "Logs" + "logs": "Logs", + "podmanDockerEmulationDetected": "Podman Docker emulation detected. Please switch to Podman in settings." } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 0d2eb6d7..9a02db12 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -294,5 +294,6 @@ "write": "Escribir", "writeScriptFailTip": "La escritura en el script falló, posiblemente por falta de permisos o porque el directorio no existe.", "writeScriptTip": "Después de conectarse al servidor, se escribirá un script en `~/.config/server_box` \n | `/tmp/server_box` para monitorear el estado del sistema. Puedes revisar el contenido del script.", - "logs": "Registros" + "logs": "Registros", + "podmanDockerEmulationDetected": "Detectada emulación de Podman Docker. Por favor, cambie a Podman en la configuración." } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 8c6efe42..0792d705 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -294,5 +294,6 @@ "write": "Écrire", "writeScriptFailTip": "Échec de l'écriture dans le script, probablement en raison d'un manque de permissions ou que le répertoire n'existe pas.", "writeScriptTip": "Après la connexion au serveur, un script sera écrit dans `~/.config/server_box` \n | `/tmp/server_box` pour surveiller l'état du système. Vous pouvez examiner le contenu du script.", - "logs": "Journaux" + "logs": "Journaux", + "podmanDockerEmulationDetected": "Émulation Podman Docker détectée. Veuillez passer à Podman dans les paramètres." } diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 026deffe..532faad9 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -294,5 +294,6 @@ "write": "Tulis", "writeScriptFailTip": "Penulisan ke skrip gagal, mungkin karena tidak ada izin atau direktori tidak ada.", "writeScriptTip": "Setelah terhubung ke server, sebuah skrip akan ditulis ke `~/.config/server_box` \n | `/tmp/server_box` untuk memantau status sistem. Anda dapat meninjau konten skrip tersebut.", - "logs": "Log" + "logs": "Log", + "podmanDockerEmulationDetected": "Emulasi Podman Docker terdeteksi. Silakan beralih ke Podman di pengaturan." } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index ac141432..822071ed 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -294,5 +294,6 @@ "write": "書き込み", "writeScriptFailTip": "スクリプトの書き込みに失敗しました。権限がないかディレクトリが存在しない可能性があります。", "writeScriptTip": "サーバーへの接続後、システムステータスを監視するスクリプトが `~/.config/server_box` \n | `/tmp/server_box` に書き込まれます。スクリプトの内容を確認できます。", - "logs": "ログ" + "logs": "ログ", + "podmanDockerEmulationDetected": "Podman Docker エミュレーションが検出されました。設定で Podman に切り替えてください。" } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 65357272..695b790a 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -294,5 +294,6 @@ "write": "Schrijven", "writeScriptFailTip": "Het schrijven naar het script is mislukt, mogelijk door gebrek aan rechten of omdat de map niet bestaat.", "writeScriptTip": "Na het verbinden met de server wordt een script geschreven naar `~/.config/server_box` \n | `/tmp/server_box` om de systeemstatus te monitoren. U kunt de inhoud van het script controleren.", - "logs": "Logboeken" + "logs": "Logboeken", + "podmanDockerEmulationDetected": "Podman Docker-emulatie gedetecteerd. Schakel over naar Podman in de instellingen." } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 22ff962b..6d2a2f04 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -294,5 +294,6 @@ "write": "Escrita", "writeScriptFailTip": "Falha ao escrever no script, possivelmente devido à falta de permissões ou o diretório não existe.", "writeScriptTip": "Após conectar ao servidor, um script será escrito em `~/.config/server_box` \n | `/tmp/server_box` para monitorar o status do sistema. Você pode revisar o conteúdo do script.", - "logs": "Logs" + "logs": "Logs", + "podmanDockerEmulationDetected": "Emulação Podman Docker detectada. Por favor, alterne para Podman nas configurações." } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index acb3b6e8..907f70bb 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -294,5 +294,6 @@ "write": "Запись", "writeScriptFailTip": "Запись скрипта не удалась, возможно, из-за отсутствия прав или потому что, директории не существует.", "writeScriptTip": "После подключения к серверу скрипт будет записан в `~/.config/server_box` \n | `/tmp/server_box` для мониторинга состояния системы. Вы можете проверить содержимое скрипта.", - "logs": "Журналы" + "logs": "Журналы", + "podmanDockerEmulationDetected": "Обнаружена эмуляция Podman Docker. Пожалуйста, переключитесь на Podman в настройках." } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 8bb4d6d0..8f4d884a 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -294,5 +294,6 @@ "write": "Yaz", "writeScriptFailTip": "Betik yazma başarısız oldu, muhtemelen izin eksikliği veya dizin mevcut değil.", "writeScriptTip": "Sunucuya bağlandıktan sonra, sistem durumunu izlemek için `~/.config/server_box` \n | `/tmp/server_box` dizinine bir betik yazılacak. Betik içeriğini inceleyebilirsiniz.", - "logs": "Günlükler" + "logs": "Günlükler", + "podmanDockerEmulationDetected": "Podman Docker emülasyonu tespit edildi. Lütfen ayarlarda Podman'a geçin." } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 2a1807c2..8416ac71 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -294,5 +294,6 @@ "write": "Записати", "writeScriptFailTip": "Запис у скрипт не вдався, можливо, через брак дозволів або каталог не існує.", "writeScriptTip": "Після підключення до сервера скрипт буде записано у `~/.config/server_box` \n | `/tmp/server_box` для моніторингу стану системи. Ви можете переглянути вміст скрипта.", - "logs": "Журнали" + "logs": "Журнали", + "podmanDockerEmulationDetected": "Виявлено емуляцію Podman Docker. Будь ласка, переключіться на Podman у налаштуваннях." } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index bb6d4243..c6e44459 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -301,5 +301,6 @@ "menuGitHubRepository": "GitHub 仓库", "menuWiki": "Wiki", "menuHelp": "帮助", - "logs": "日志" + "logs": "日志", + "podmanDockerEmulationDetected": "检测到 Podman Docker 仿真。请在设置中切换到 Podman。" } diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index c1ea6c36..0c81f922 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -294,5 +294,6 @@ "write": "寫入", "writeScriptFailTip": "寫入腳本失敗,可能是沒有權限/目錄不存在等。", "writeScriptTip": "連線到伺服器後,將會在 `~/.config/server_box` \n | `/tmp/server_box` 中寫入一個腳本來監測系統狀態。你可以審查腳本內容。", - "logs": "日誌" + "logs": "日誌", + "podmanDockerEmulationDetected": "檢測到 Podman Docker 仿真。請在設定中切換到 Podman。" } diff --git a/lib/view/page/container/container.dart b/lib/view/page/container/container.dart index dab4b0a6..f0006a3b 100644 --- a/lib/view/page/container/container.dart +++ b/lib/view/page/container/container.dart @@ -234,7 +234,7 @@ class _ContainerPageState extends ConsumerState { if (item.cpu == null || item.mem == null) return UIs.placeholder; return LayoutBuilder( builder: (_, cons) { - final width = cons.maxWidth / 2 - 41; + final width = cons.maxWidth / 2 - 6.5; return Column( children: [ UIs.height13, @@ -264,10 +264,17 @@ class _ContainerPageState extends ConsumerState { child: Column( children: [ Row( + mainAxisSize: MainAxisSize.min, children: [ Icon(icon, size: 12, color: Colors.grey), UIs.width7, - Text(value ?? l10n.unknown, style: UIs.text11Grey), + Expanded( + child: Text( + value ?? l10n.unknown, + style: UIs.text11Grey, + overflow: TextOverflow.ellipsis, + ), + ), ], ), ], diff --git a/lib/view/page/server/tab/utils.dart b/lib/view/page/server/tab/utils.dart index cd4d94ee..13056644 100644 --- a/lib/view/page/server/tab/utils.dart +++ b/lib/view/page/server/tab/utils.dart @@ -49,11 +49,12 @@ extension _Operation on _ServerPageState { await context.showRoundDialog(title: libL10n.attention, child: Text(l10n.suspendTip)); Stores.setting.showSuspendTip.put(false); } - srv.client?.execWithPwd( + await srv.client?.execWithPwd( ShellFunc.suspend.exec(srv.spi.id, systemType: srv.status.system, customDir: null), context: context, id: srv.id, - ); + ) ?? + (null, ''); }, typ: l10n.suspend, name: srv.spi.name, @@ -62,11 +63,13 @@ extension _Operation on _ServerPageState { void _onTapShutdown(ServerState srv) { _askFor( - func: () => srv.client?.execWithPwd( - ShellFunc.shutdown.exec(srv.spi.id, systemType: srv.status.system, customDir: null), - context: context, - id: srv.id, - ), + func: () async { + await srv.client?.execWithPwd( + ShellFunc.shutdown.exec(srv.spi.id, systemType: srv.status.system, customDir: null), + context: context, + id: srv.id, + ); + }, typ: l10n.shutdown, name: srv.spi.name, ); @@ -74,11 +77,14 @@ extension _Operation on _ServerPageState { void _onTapReboot(ServerState srv) { _askFor( - func: () => srv.client?.execWithPwd( - ShellFunc.reboot.exec(srv.spi.id, systemType: srv.status.system, customDir: null), - context: context, - id: srv.id, - ), + func: () async { + await srv.client?.execWithPwd( + ShellFunc.reboot.exec(srv.spi.id, systemType: srv.status.system, customDir: null), + context: context, + id: srv.id, + ) ?? + (null, ''); + }, typ: l10n.reboot, name: srv.spi.name, ); diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 788ab2b9..1058d345 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -12,7 +12,6 @@ import flutter_secure_storage_macos import icloud_storage import local_auth_darwin import package_info_plus -import path_provider_foundation import screen_retriever_macos import share_plus import shared_preferences_foundation @@ -28,7 +27,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { IcloudStoragePlugin.register(with: registry.registrar(forPlugin: "IcloudStoragePlugin")) LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))