Andrew Jeffery | ba2e744 | 2021-09-07 09:11:21 +0930 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | set -eu |
| 4 | |
| 5 | fstab_fs_mntopt() { |
| 6 | awk "\"overlay\" == \$1 && \"$1\" == \$2 { printf(\"%s\n\", \$4) }" |
| 7 | } |
| 8 | |
| 9 | fstab_option_iter() { |
| 10 | tr ',' '\n' |
| 11 | } |
| 12 | |
| 13 | fstab_option_value() { |
| 14 | cut -d= -f2 |
| 15 | } |
| 16 | |
Andrew Jeffery | dc68110 | 2021-12-08 11:16:27 +1030 | [diff] [blame] | 17 | overlay_add() { |
| 18 | o_lowerdir="$1" |
| 19 | o_upperdir=$(mktemp -d) |
| 20 | o_workdir=$(mktemp -d) |
Andrew Jeffery | c49e2c5 | 2022-04-04 14:07:38 +0930 | [diff] [blame] | 21 | chmod $(stat -c '%a' $o_lowerdir) $o_upperdir $o_workdir |
Andrew Jeffery | dc68110 | 2021-12-08 11:16:27 +1030 | [diff] [blame] | 22 | mount -t overlay -o lowerdir="${o_lowerdir}",upperdir=${o_upperdir},workdir=${o_workdir} overlay "${o_lowerdir}" |
| 23 | } |
| 24 | |
Andrew Jeffery | f6823ab | 2021-12-08 11:18:32 +1030 | [diff] [blame] | 25 | overlay_remove() { |
| 26 | o_lowerdir="$1" |
| 27 | o_options="$(fstab_fs_mntopt $o_lowerdir < /proc/mounts)" |
| 28 | umount $o_lowerdir |
| 29 | if [ -z "$o_options" ] |
| 30 | then |
Andrew Jeffery | 2f6ab50 | 2021-12-08 15:43:35 +1030 | [diff] [blame] | 31 | echo >&2 $o_lowerdir is not an overlay |
Andrew Jeffery | f6823ab | 2021-12-08 11:18:32 +1030 | [diff] [blame] | 32 | exit 1 |
| 33 | else |
| 34 | echo "${o_options}" | |
Patrick Williams | e310dd9 | 2022-12-07 06:55:38 -0600 | [diff] [blame] | 35 | fstab_option_iter | |
| 36 | while read FS_MNTOPT |
| 37 | do |
| 38 | case $FS_MNTOPT in |
| 39 | upperdir=*|workdir=*) |
| 40 | rm -rf "$(echo $FS_MNTOPT | fstab_option_value)" |
| 41 | ;; |
| 42 | esac |
| 43 | done |
Andrew Jeffery | f6823ab | 2021-12-08 11:18:32 +1030 | [diff] [blame] | 44 | fi |
| 45 | } |
| 46 | |
Andrew Jeffery | ba2e744 | 2021-09-07 09:11:21 +0930 | [diff] [blame] | 47 | if [ $# -lt 2 ] |
| 48 | then |
| 49 | cat $0 |
| 50 | exit 1 |
| 51 | fi |
| 52 | |
Andrew Jeffery | 727d135 | 2021-12-08 11:25:09 +1030 | [diff] [blame] | 53 | subcmd=$1 |
| 54 | shift |
| 55 | |
| 56 | case $subcmd in |
Andrew Jeffery | ba2e744 | 2021-09-07 09:11:21 +0930 | [diff] [blame] | 57 | add) |
Andrew Jeffery | 811a575 | 2021-12-08 12:10:20 +1030 | [diff] [blame] | 58 | for target in "$@" |
| 59 | do |
| 60 | overlay_add "$target" |
| 61 | done |
Andrew Jeffery | ba2e744 | 2021-09-07 09:11:21 +0930 | [diff] [blame] | 62 | ;; |
| 63 | remove) |
Andrew Jeffery | 811a575 | 2021-12-08 12:10:20 +1030 | [diff] [blame] | 64 | for target in "$@" |
| 65 | do |
| 66 | overlay_remove "$target" |
| 67 | done |
Andrew Jeffery | ba2e744 | 2021-09-07 09:11:21 +0930 | [diff] [blame] | 68 | ;; |
| 69 | -h|--help|*) |
| 70 | cat $0 |
| 71 | ;; |
| 72 | esac |