#!/hint/bash # 2018 Luke Shumaker print() { # shellcheck disable=SC2059 printf "$(gettext -- "$1")\\n" "${@:2}" } error() { local msg msg="$(print "${@:2}")" printf '%s: %s\n' "${0##*/}" "$msg" >&2 if (( $1 != 0 )); then exit "$1" fi } in_array() { local needle=$1 local straw for straw in "${@:2}"; do if [[ $needle = "$straw" ]]; then return 0 fi done return 1 } is_sudo() { (( UID == 0 && ${SUDO_UID:-0} != 0 )) } is_root() { (( UID = 0 )) } needs_sudo() { if ! is_sudo; then error 4 "Must be invoked through sudo." fi } needs_root() { if ! is_root; then error 4 "Must be invoked as root." fi } become_sudo() { if is_sudo; then return 0 fi if is_root; then needs_sudo fi sudo "${BASH_SOURCE[0]}" "$@" } with_mount() { arg_device=$1 arg_mountpoint=$2 arg_cmd=("${@:3}") needs_root unshare --mount sh -c "mount --make-rslave / && mount -- ${arg_device@Q} ${arg_mountpoint@Q} && exec -- ${arg_cmd[@]@Q}" }