mirror of
https://github.com/nix-community/home-manager
synced 2024-12-25 19:29:47 +01:00
1743615b61
Adds a new Podman module for creating user containers and networks as systemd services. These are installed to the user's `$XDG_CONFIG/systemd/user` directory.
99 lines
3.4 KiB
Nix
99 lines
3.4 KiB
Nix
{ config, podman-lib, ... }:
|
|
|
|
{
|
|
cleanup = ''
|
|
PATH=$PATH:${podman-lib.newuidmapPaths}
|
|
export VERBOSE=true
|
|
|
|
DRYRUN_ENABLED() {
|
|
return $([ -n "''${DRY_RUN:-}" ] && echo 0 || echo 1)
|
|
}
|
|
|
|
VERBOSE_ENABLED() {
|
|
return $([ -n "''${VERBOSE:-}" ] && echo 0 || echo 1)
|
|
}
|
|
|
|
cleanup() {
|
|
local resourceType=$1
|
|
local manifestFile="${config.xdg.configHome}/podman/$2"
|
|
local extraListCommands="''${3:-}"
|
|
[[ $resourceType = "container" ]] && extraListCommands+=" -a"
|
|
|
|
[ ! -f "$manifestFile" ] && VERBOSE_ENABLED && echo "Manifest does not exist: $manifestFile" && return 0
|
|
|
|
VERBOSE_ENABLED && echo "Cleaning up ''${resourceType}s not in manifest..." || true
|
|
|
|
loadManifest "$manifestFile"
|
|
|
|
formatString="{{.Name}}"
|
|
[[ $resourceType = "container" ]] && formatString="{{.Names}}"
|
|
|
|
local listOutput=$(${config.services.podman.package}/bin/podman $resourceType ls $extraListCommands --filter 'label=nix.home-manager.managed=true' --format "$formatString")
|
|
|
|
IFS=$'\n' read -r -d "" -a podmanResources <<< "$listOutput" || true
|
|
|
|
if [ ''${#podmanResources[@]} -eq 0 ]; then
|
|
VERBOSE_ENABLED && echo "No ''${resourceType}s available to process." || true
|
|
else
|
|
for resource in "''${podmanResources[@]}"; do
|
|
if ! isResourceInManifest "$resource"; then
|
|
removeResource "$resourceType" "$resource"
|
|
else
|
|
VERBOSE_ENABLED && echo "Keeping managed $resourceType: $resource" || true
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
isResourceInManifest() {
|
|
local resource="$1"
|
|
for manifestEntry in "''${resourceManifest[@]}"; do
|
|
if [ "$resource" = "$manifestEntry" ]; then
|
|
return 0 # Resource found in manifest
|
|
fi
|
|
done
|
|
return 1 # Resource not found in manifest
|
|
}
|
|
|
|
# Function to fill resourceManifest from the manifest file
|
|
loadManifest() {
|
|
local manifestFile="$1"
|
|
VERBOSE_ENABLED && echo "Loading manifest from $manifestFile..." || true
|
|
IFS=$'\n' read -r -d "" -a resourceManifest <<< "$(cat "$manifestFile")" || true
|
|
}
|
|
|
|
removeResource() {
|
|
local resourceType="$1"
|
|
local resource="$2"
|
|
echo "Removing orphaned $resourceType: $resource"
|
|
commands=()
|
|
case "$resourceType" in
|
|
"container")
|
|
commands+="${config.services.podman.package}/bin/podman $resourceType stop $resource"
|
|
commands+="${config.services.podman.package}/bin/podman $resourceType rm -f $resource"
|
|
;;
|
|
"network")
|
|
commands+="${config.services.podman.package}/bin/podman $resourceType rm $resource"
|
|
;;
|
|
esac
|
|
for command in "''${commands[@]}"; do
|
|
command=$(echo $command | tr -d ';&|`')
|
|
DRYRUN_ENABLED && echo "Would run: $command" && continue || true
|
|
VERBOSE_ENABLED && echo "Running: $command" || true
|
|
if [[ "$(eval "$command")" != "$resource" ]]; then
|
|
echo -e "\tCommand failed: ''${command}"
|
|
usedByContainers=$(${config.services.podman.package}/bin/podman container ls -a --filter "$resourceType=$resource" --format "{{.Names}}")
|
|
echo -e "\t$resource in use by containers: $usedByContainers"
|
|
fi
|
|
done
|
|
}
|
|
|
|
resourceManifest=()
|
|
[[ "$@" == *"--verbose"* ]] && VERBOSE="true"
|
|
[[ "$@" == *"--dry-run"* ]] && DRY_RUN="true"
|
|
|
|
for type in "container" "network"; do
|
|
cleanup "$type" "''${type}s.manifest"
|
|
done
|
|
'';
|
|
}
|