Add app source and tests

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
alvocool
2026-10-11 10:15:30 +03:00
parent 7e246255c2
commit 38881d1fe1
135 changed files with 21057 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
import '../../../about/external/data/Docker.dart';
import '../../../about/external/data/EnvCheck.dart';
import '../../../about/internal/application/ServerProfile.dart';
import '../../parent/ParentViewModel.dart';
import 'ConnectDockerManager.dart';
class ViewDockerManager extends ParentViewModel {
ConnectDockerManager connection;
ViewDockerManager(super.context, this.connection);
/// Reads Docker's state and, when the daemon is up, its containers.
void loadDocker(ServerProfile server) async {
if (!await canReach(server, () => loadDocker(server))) return;
try {
final status = await getDataManager().dockerStatus(server);
var containers = <DockerContainer>[];
if (status.installed && status.running) {
containers = await getDataManager().dockerPs(server, all: true);
}
connection.onDockerLoaded(status, containers);
} catch (error) {
connection.onDockerFailed(error.toString());
}
}
/// start | stop | restart | rm on one container.
void runAction(
ServerProfile server,
String containerId,
String action,
) async {
try {
final output = await getDataManager().dockerAction(
server,
containerId,
action,
);
connection.onActionFinished(output);
} catch (error) {
handleError(
error,
() => runAction(server, containerId, action),
() {},
"Retry",
);
}
}
void loadContainerLogs(
ServerProfile server,
String containerId,
String name,
) async {
try {
final output = await getDataManager().dockerLogs(server, containerId);
connection.onOutputReady(
'$name · logs',
output.isEmpty ? '(no output)' : output,
);
} catch (error) {
handleError(
error,
() => loadContainerLogs(server, containerId, name),
() {},
"Retry",
);
}
}
/// Runs `hello-world` to prove the daemon can pull and execute an image.
void runTest(ServerProfile server) async {
showLoading("Running hello-world …");
try {
final output = await getDataManager().dockerTest(server);
closeLoading();
connection.onOutputReady('docker run --rm hello-world', output);
} catch (error) {
handleError(error, () => runTest(server), () {}, "Retry");
}
}
/// Resolves the right package-manager command for this distro, then hands
/// it back so the screen can confirm before anything is installed.
void prepareInstall(ServerProfile server) async {
if (!await canReach(server, () => prepareInstall(server))) return;
try {
final manager = await getDataManager().detectPackageManager(server);
if (manager == 'unknown') {
connection.onDockerFailed(
'Unknown package manager — install Docker manually.',
);
return;
}
final tool = kEnvTools.firstWhere((t) => t.key == 'docker');
connection.onInstallCommandReady(
installCommandFor(manager, tool.packagesFor(manager)),
);
} catch (error) {
handleError(error, () => prepareInstall(server), () {}, "Retry");
}
}
void installDocker(ServerProfile server, String command) async {
try {
await getDataManager().installPackages(
server: server,
command: command,
enableUnit: 'docker',
);
connection.onInstallFinished();
} catch (error) {
connection.onInstallFinished();
handleError(error, () => installDocker(server, command), () {}, "Retry");
}
}
}