diff --git a/modules.d/99img-lib/.shchkdir b/modules.d/99img-lib/.shchkdir new file mode 100644 index 00000000..e69de29b diff --git a/modules.d/99img-lib/img-lib.sh b/modules.d/99img-lib/img-lib.sh index 79f42d77..fa117adf 100755 --- a/modules.d/99img-lib/img-lib.sh +++ b/modules.d/99img-lib/img-lib.sh @@ -6,9 +6,14 @@ # super-simple "file" that only identifies archives. # works with stdin if $1 is not set. det_archive() { - # NOTE: echo -e works in ash and bash, but not dash - local bz="BZh" xz="$(echo -e '\xfd7zXZ')" gz="$(echo -e '\x1f\x8b')" zs="$(echo -e '\x28\xB5\x2F\xFD')" - local headerblock="$(dd ${1:+if=$1} bs=262 count=1 2> /dev/null)" + # NOTE: internal echo -e works in ash and bash, but not dash + local bz xz gz zs + local headerblock + bz="BZh" + xz="$(/bin/echo -e '\xfd7zXZ')" + gz="$(/bin/echo -e '\x1f\x8b')" + zs="$(/bin/echo -e '\x28\xB5\x2F\xFD')" + headerblock="$(dd ${1:+if=$1} bs=262 count=1 2> /dev/null)" case "$headerblock" in $xz*) echo "xz" ;; $gz*) echo "gzip" ;; @@ -21,10 +26,11 @@ det_archive() { # determine filesystem type for a filesystem image det_fs_img() { - local dev=$(losetup --find --show "$1") rv="" - det_fs $dev + local dev + dev=$(losetup --find --show "$1") rv="" + det_fs "$dev" rv=$? - losetup -d $dev + losetup -d "$dev" return $rv } @@ -32,41 +38,44 @@ det_fs_img() { # unpack a (possibly compressed) cpio/tar archive unpack_archive() { local img="$1" outdir="$2" archiver="" decompr="" - local ft="$(det_archive $img)" + local ft + ft="$(det_archive "$img")" case "$ft" in xz | gzip | bzip2 | zstd) decompr="$ft -dc" ;; cpio | tar) decompr="cat" ;; *) return 1 ;; esac - ft="$($decompr $img | det_archive)" + ft="$($decompr "$img" | det_archive)" case "$ft" in cpio) archiver="cpio -iumd" ;; tar) archiver="tar -xf -" ;; *) return 2 ;; esac - mkdir -p $outdir + mkdir -p "$outdir" ( - cd $outdir + cd "$outdir" || exit $decompr | $archiver 2> /dev/null - ) < $img + ) < "$img" } # unpack_fs FSIMAGE OUTDIR # unpack a filesystem image unpack_fs() { - local img="$1" outdir="$2" mnt="$(mkuniqdir /tmp unpack_fs.)" - mount -o loop $img $mnt || { - rmdir $mnt + local img="$1" outdir="$2" + local mnt + mnt="$(mkuniqdir /tmp unpack_fs.)" + mount -o loop "$img" "$mnt" || { + rmdir "$mnt" return 1 } - mkdir -p $outdir + mkdir -p "$outdir" outdir="$( - cd $outdir + cd "$outdir" || exit pwd )" - copytree $mnt $outdir - umount $mnt - rmdir $mnt + copytree "$mnt" "$outdir" + umount "$mnt" + rmdir "$mnt" } # unpack an image file - compressed/uncompressed cpio/tar, filesystem, whatever @@ -82,7 +91,7 @@ unpack_img() { return 1 } - if [ "$(det_archive $img)" ]; then + if [ "$(det_archive "$img")" ]; then unpack_archive "$@" || { warn "can't unpack archive file!" return 1 diff --git a/modules.d/99img-lib/module-setup.sh b/modules.d/99img-lib/module-setup.sh index e11c7ba9..61c11038 100755 --- a/modules.d/99img-lib/module-setup.sh +++ b/modules.d/99img-lib/module-setup.sh @@ -3,7 +3,7 @@ # called by dracut check() { - require_binaries tar gzip dd bash || return 1 + require_binaries tar gzip dd echo || return 1 return 255 } @@ -14,7 +14,7 @@ depends() { # called by dracut install() { - inst_multiple tar gzip dd bash + inst_multiple tar gzip dd echo # TODO: make this conditional on a cmdline flag / config option inst_multiple -o cpio xz bzip2 zstd inst_simple "$moddir/img-lib.sh" "/lib/img-lib.sh"