Add app source and tests
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
68
lib/Peach/see/systemd/ViewSystemd.dart
Normal file
68
lib/Peach/see/systemd/ViewSystemd.dart
Normal file
@@ -0,0 +1,68 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user