From a2d622613d748671b9f22bc6c24e8ebfb106944d Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Tue, 12 Aug 2025 02:25:44 -0700 Subject: [PATCH] improve ensureZfsMounted script --- overlays.nix | 32 ++++++++++++++++---------------- tests/zfs.nix | 9 +++++++++ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/overlays.nix b/overlays.nix index e64025b..dc58d37 100644 --- a/overlays.nix +++ b/overlays.nix @@ -3,31 +3,31 @@ final: prev: { name = "zfsEnsureMounted"; runtimeInputs = with prev; [ zfs - gnugrep gawk coreutils ]; text = '' - #!/bin/sh -x + #!/bin/sh - if [[ "$#" -eq "0" ]]; then - echo "no arguments passed" - exit 1 - fi + if [[ "$#" -eq "0" ]]; then + echo "no arguments passed" + exit 1 + fi - TARGETS=$(echo "$@" | sort | uniq) - MOUNTED=$(zfs list -o mountpoint,mounted -H | awk '$2 == "yes" {print $1}' | sort | uniq) - NUM_MATCHED=$(echo "$MOUNTED" | grep -Ec "$(echo "$@" | tr ' ' '\|')") # does not properly handle paths with strings - if [[ "$NUM_MATCHED" -eq "$#" ]]; then - exit 0 - fi + MOUNTED=$(zfs list -o mountpoint,mounted -H | awk '$NF == "yes" {$NF=""; print $0}' | sed 's/[[:space:]]*$//') - FOUND=$(printf "%s\n%s" "$TARGETS" "$MOUNTED" | sort | uniq -c | awk '$1 == "2" {print $2}' | sort) - MISSING=$(printf "%s\n%s" "$FOUND" "$TARGETS" | sort | uniq -u | sort) + MISSING="" + for target in "$@"; do + if ! echo "$MOUNTED" | grep -Fxq "$target"; then + MISSING="$MISSING $target" + fi + done - echo "FAILURE, missing: $MISSING" 1>&2 - exit 1 + if [[ -n "$MISSING" ]]; then + echo "FAILURE, missing:$MISSING" 1>&2 + exit 1 + fi ''; }; } diff --git a/tests/zfs.nix b/tests/zfs.nix index ca9d92e..79f910c 100644 --- a/tests/zfs.nix +++ b/tests/zfs.nix @@ -86,6 +86,15 @@ testPkgs.testers.runNixOSTest { machine.succeed("zfsEnsureMounted /mnt/test_mountpoint /mnt/test_mountpoint_dos") + machine.succeed("zfs create -o mountpoint='/mnt/test path with spaces' rpool/test3") + + machine.succeed("zfsEnsureMounted '/mnt/test path with spaces'") + + machine.succeed("echo 'ZFS output for escaped spaces:'; zfs list -o mountpoint,mounted -H | grep escaped") + + machine.succeed("zfsEnsureMounted /mnt/test\\ escaped\\ spaces") + + machine.succeed("zfsEnsureMounted /mnt/test_mountpoint '/mnt/test path with spaces' /mnt/test_mountpoint_dos") machine.succeed("zfs create -o mountpoint=/mnt/foobar_data rpool/foobar") machine.succeed("systemctl start foobar")