diff --git a/lib/data/model/container/version.dart b/lib/data/model/container/version.dart index 5407e343..98328a66 100644 --- a/lib/data/model/container/version.dart +++ b/lib/data/model/container/version.dart @@ -49,7 +49,7 @@ class ContainerdClient { factory ContainerdClient.fromJson(Map json) => ContainerdClient( - apiVersion: json["APIVersion"], + apiVersion: json["ApiVersion"], // should be ApiVersion? version: json["Version"], goVersion: json["GoVersion"], gitCommit: json["GitCommit"], diff --git a/lib/data/provider/container.dart b/lib/data/provider/container.dart index 8cceae0f..f6b1a251 100644 --- a/lib/data/provider/container.dart +++ b/lib/data/provider/container.dart @@ -12,7 +12,8 @@ import 'package:toolbox/data/model/container/version.dart'; import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/store.dart'; -final _dockerNotFound = RegExp(r'command not found|Unknown command'); +final _dockerNotFound = + RegExp(r"command not found|Unknown command|Command '\w+' not found"); class ContainerProvider extends ChangeNotifier { SSHClient? client; @@ -43,15 +44,44 @@ class ContainerProvider extends ChangeNotifier { await refresh(); } + Future _checkDockerInstalled(SSHClient client) async { + final session = await client.execute("docker"); + await session.done; + // print('docker code: ${session.exitCode}'); + return session.exitCode == 0; + } + + String _removeSudoPrompts(String value) { + final regex = RegExp(r"\[sudo\] password for \w+:"); + if (value.startsWith(regex)){ + return value.replaceFirstMapped(regex, (match) => ""); + } + return value; + } + Future refresh() async { var raw = ''; + var rawErr = ''; + print('exec: ${_wrap(ContainerCmdType.execAll(type))}'); + await client?.execWithPwd( _wrap(ContainerCmdType.execAll(type)), context: context, onStdout: (data, _) => raw = '$raw$data', + onStderr: (data, _) => raw = '$rawErr$data', ); - if (raw.contains(_dockerNotFound)) { + raw = _removeSudoPrompts(raw); + rawErr = _removeSudoPrompts(rawErr); + + print('result raw [$raw, $rawErr]'); + + final dockerInstalled = await _checkDockerInstalled(client!); + // print("docker installed = $dockerInstalled"); + + if (!dockerInstalled || + raw.contains(_dockerNotFound) || + rawErr.contains(_dockerNotFound)) { error = ContainerErr(type: ContainerErrType.notInstalled); notifyListeners(); return; @@ -71,6 +101,7 @@ class ContainerProvider extends ChangeNotifier { // Parse docker version final verRaw = ContainerCmdType.version.find(segments); + print('version raw = $verRaw\n'); try { final containerVersion = Containerd.fromRawJson(verRaw); version = containerVersion.client.version;