Files
PeachDeployments/lib/Peach/see/systemd/ViewSystemd.dart
alvocool 38881d1fe1 Add app source and tests
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-11 10:15:30 +03:00

69 lines
2.1 KiB
Dart

import '../../about/external/initial/SystemdSpec.dart';
import '../../about/internal/application/ServerProfile.dart';
import '../../about/internal/application/ServiceConfig.dart';
import '../../about/internal/application/StepTracker.dart';
import '../../comms/Comms.dart' show LogLine;
import '../parent/ParentViewModel.dart';
import 'ConnectSystemd.dart';
class ViewSystemd extends ParentViewModel {
ConnectSystemd connection;
ViewSystemd(super.context, this.connection);
Stream<LogLine> get logs => getDataManager().logs;
Stream<List<DeployStep>> get steps => getDataManager().stepStream;
/// Writes the unit file, reloads systemd and (optionally) enables and starts
/// it. On success the unit name is recorded against [service] so the deploy
/// and log screens target the right unit from now on.
void installUnit(
ServerProfile server,
SystemdSpec spec,
ServiceConfig? service,
) async {
if (!await canReach(server, () => installUnit(server, spec, service))) {
return;
}
try {
final result = await getDataManager().installSystemdUnit(
server: server,
unitName: spec.safeName,
unitContent: spec.render(),
enable: spec.enableOnBoot,
startNow: spec.startNow,
);
if (result.ok && service != null) {
service.serviceName = spec.safeName;
await _persistService(server, service);
}
connection.onUnitInstalled(result);
} catch (error) {
handleError(
error,
() => installUnit(server, spec, service),
() {},
"Retry",
);
}
}
/// Saves the service back onto its server in storage.
Future<void> _persistService(
ServerProfile server,
ServiceConfig service,
) async {
final servers = await getDataManager().getServers();
final serverIndex = servers.indexWhere((s) => s.id == server.id);
if (serverIndex < 0) return;
final services = servers[serverIndex].services;
final serviceIndex = services.indexWhere((s) => s.id == service.id);
if (serviceIndex < 0) return;
services[serviceIndex] = service;
await getDataManager().setServers(servers);
}
}