Add overlay script

`overlay` does the tedious work of setting up and tearing down the
environment required for overlay filesystems. Example use:

```
root@bmc:~# touch /usr/share/vpd/foo
touch: /usr/share/vpd/foo: Read-only file system
root@bmc:~# ./overlay add /usr/share/vpd
[53864.956641] overlayfs: upper fs does not support xattr, falling back to index=off and metacopy=off.
root@bmc:~# touch /usr/share/vpd/foo
root@bmc:~# ls -l /usr/share/vpd/foo
-rw-r--r--    1 root     root             0 Sep  6 23:55 /usr/share/vpd/foo
root@bmc:~# rm /usr/share/vpd/foo
root@bmc:~# ls -l /usr/share/vpd/foo
ls: /usr/share/vpd/foo: No such file or directory
root@bmc:~# ./overlay remove /usr/share/vpd
root@bmc:~# touch /usr/share/vpd/foo
touch: /usr/share/vpd/foo: Read-only file system
```

The `rm -rf` specifically removes the temporary directories specified
in the mount options:

```
root@bmc:~# ./overlay add /usr/share/vpd
root@bmc:~# sh -x ./overlay remove /usr/share/vpd
+ set -eu
+ '[' 2 -lt 2 ']'
+ case $1 in
+ o_lowerdir=/usr/share/vpd
++ fstab_fs_mntopt /usr/share/vpd
++ awk '"overlay" == $1 && "/usr/share/vpd" == $2 { printf("%s\n", $4)
}'
+
o_options=rw,relatime,lowerdir=/usr/share/vpd,upperdir=/tmp/tmp.v8vJ35,workdir=/tmp/tmp.6v1YJY
+ umount /usr/share/vpd
+ '[' -z
rw,relatime,lowerdir=/usr/share/vpd,upperdir=/tmp/tmp.v8vJ35,workdir=/tmp/tmp.6v1YJY
']'
+ fstab_option_iter
+ tr , '\n'
+ echo
rw,relatime,lowerdir=/usr/share/vpd,upperdir=/tmp/tmp.v8vJ35,workdir=/tmp/tmp.6v1YJY
+ read FS_MNTOPT
+ case $FS_MNTOPT in
+ read FS_MNTOPT
+ case $FS_MNTOPT in
+ read FS_MNTOPT
+ case $FS_MNTOPT in
+ read FS_MNTOPT
+ case $FS_MNTOPT in
++ echo upperdir=/tmp/tmp.v8vJ35
++ fstab_option_value
++ cut -d= -f2
+ rm -rf /tmp/tmp.v8vJ35
+ read FS_MNTOPT
+ case $FS_MNTOPT in
++ fstab_option_value
++ cut -d= -f2
++ echo workdir=/tmp/tmp.6v1YJY
+ rm -rf /tmp/tmp.6v1YJY
+ read FS_MNTOPT
root@bmc:~#
```

It also safely handles bad remove invocations:

```
root@bmc:~# sh -x ./overlay remove /asdf
+ set -eu
+ '[' 2 -lt 2 ']'
+ case $1 in
+ o_lowerdir=/asdf
++ fstab_fs_mntopt /asdf
++ awk '"overlay" == $1 && "/asdf" == $2 { printf("%s\n", $4) }'
+ o_options=
+ umount /asdf
umount: /asdf: no mount point specified.
root@bmc:~# sh -x ./overlay remove /
+ set -eu
+ '[' 2 -lt 2 ']'
+ case $1 in
+ o_lowerdir=/
++ fstab_fs_mntopt /
++ awk '"overlay" == $1 && "/" == $2 { printf("%s\n", $4) }'
+ o_options=
+ umount /
+ '[' -z '' ']'
+ echo / is not an overlay
/ is not an overlay
+ exit 1
root@bmc:~#
```

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Change-Id: I0118c645d9edf391d9670aacc889f31d1e1b2f5f
diff --git a/overlay/overlay b/overlay/overlay
new file mode 100755
index 0000000..2400b9f
--- /dev/null
+++ b/overlay/overlay
@@ -0,0 +1,54 @@
+#!/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
+}
+
+if [ $# -lt 2 ]
+then
+    cat $0
+    exit 1
+fi
+
+case $1 in
+    add)
+        o_lowerdir="$2"
+        o_upperdir=$(mktemp -d)
+        o_workdir=$(mktemp -d)
+        mount -t overlay -o lowerdir="${o_lowerdir}",upperdir=${o_upperdir},workdir=${o_workdir} overlay "${o_lowerdir}"
+        ;;
+    remove)
+        o_lowerdir="$2"
+        o_options="$(fstab_fs_mntopt $o_lowerdir < /proc/mounts)"
+        umount $o_lowerdir
+        if [ -z "$o_options" ]
+        then
+            echo $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
+        ;;
+    -h|--help|*)
+        cat $0
+        ;;
+esac