blob: e708f41d264b87f9858aa05a1468fc33aa426c77 [file] [log] [blame]
#!/bin/sh
set -eu
fstab_fs_mntopt() {
awk "\"overlay\" == \$1 && \"$1\" == \$2 { printf(\"%s\n\", \$4) }"
}
fstab_option_iter() {
tr ',' '\n'
}
fstab_option_value() {
cut -d= -f2
}
overlay_add() {
o_lowerdir="$1"
o_upperdir=$(mktemp -d)
o_workdir=$(mktemp -d)
chmod $(stat -c '%a' $o_lowerdir) $o_upperdir $o_workdir
mount -t overlay -o lowerdir="${o_lowerdir}",upperdir=${o_upperdir},workdir=${o_workdir} overlay "${o_lowerdir}"
}
overlay_remove() {
o_lowerdir="$1"
o_options="$(fstab_fs_mntopt $o_lowerdir < /proc/mounts)"
umount $o_lowerdir
if [ -z "$o_options" ]
then
echo >&2 $o_lowerdir is not an overlay
exit 1
else
echo "${o_options}" |
fstab_option_iter |
while read FS_MNTOPT
do
case $FS_MNTOPT in
upperdir=*|workdir=*)
rm -rf "$(echo $FS_MNTOPT | fstab_option_value)"
;;
esac
done
fi
}
if [ $# -lt 2 ]
then
cat $0
exit 1
fi
subcmd=$1
shift
case $subcmd in
add)
for target in "$@"
do
overlay_add "$target"
done
;;
remove)
for target in "$@"
do
overlay_remove "$target"
done
;;
-h|--help|*)
cat $0
;;
esac