115 lines
3.3 KiB
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
|
|
''');
|
|
}
|