podman/example/generate_assets_example.dart

115 lines
3.3 KiB
Dart

import 'dart:io';
import 'package:podman/podman.dart';
Future<void> main(List<String> args) async {
if (args.isEmpty || args.contains('--help') || args.contains('-h')) {
_printUsage();
return;
}
final flags = args
.where((arg) => arg.startsWith('--'))
.toList(growable: false);
final positional = args
.where((arg) => !arg.startsWith('--'))
.toList(growable: false);
if (positional.isEmpty) {
stderr.writeln('Provide at least one container or pod name.');
_printUsage();
exitCode = 64;
return;
}
final kubeOutPath = _readOption(flags, 'kube-out');
final systemdDirPath = _readOption(flags, 'systemd-dir');
final systemdTarget =
_readOption(flags, 'systemd-target') ?? positional.first;
final includeService = !flags.contains('--no-service');
final podmanOnly = !flags.contains('--no-podman-only');
final noTrunc = flags.contains('--no-trunc');
final client = PodmanClient();
try {
final kubeYaml = await client.generateKube(
GenerateKubeOptions(
names: positional,
service: includeService,
podmanOnly: podmanOnly,
noTrunc: noTrunc,
),
);
if (kubeOutPath != null && kubeOutPath.isNotEmpty) {
await File(kubeOutPath).writeAsString(kubeYaml);
print('Wrote generated Kubernetes YAML to $kubeOutPath');
} else {
print('--- begin generated kube yaml ---');
print(kubeYaml.trim());
print('--- end generated kube yaml ---');
}
final systemd = await client.generateSystemd(
systemdTarget,
options: const GenerateSystemdOptions(
useName: true,
noHeader: true,
restartPolicy: 'always',
),
);
if (systemd.units.isEmpty) {
print('No systemd units were generated for "$systemdTarget".');
return;
}
if (systemdDirPath != null && systemdDirPath.isNotEmpty) {
final outputDir = Directory(systemdDirPath);
await outputDir.create(recursive: true);
for (final entry in systemd.units.entries) {
final file = File('${outputDir.path}/${entry.key}');
await file.writeAsString(entry.value);
print('Wrote ${entry.key}');
}
} else {
print('Generated systemd units: ${systemd.units.keys.toList()..sort()}');
}
} finally {
await client.close();
}
}
String? _readOption(List<String> args, String name) {
final prefix = '--$name=';
for (final arg in args) {
if (arg.startsWith(prefix)) {
return arg.substring(prefix.length);
}
}
return null;
}
void _printUsage() {
print('''
Generate assets example
Usage:
dart run example/generate_assets_example.dart <name> [name ...] [options]
Examples:
dart run example/generate_assets_example.dart groupware-orchestrator
dart run example/generate_assets_example.dart groupware-pod --kube-out=./stack.yaml --systemd-dir=./units
Options:
--kube-out=<path> Write generated kube YAML to file (default: stdout)
--systemd-dir=<path> Write generated systemd units to directory
--systemd-target=<name> Specific name for systemd generation (defaults to first positional)
--no-service Do not include generated Service objects in kube YAML
--no-podman-only Do not include Podman-only annotations in kube YAML
--no-trunc Use non-truncated annotations
--help, -h Show this help
''');
}