81 lines
1.6 KiB
Bash
Executable file
81 lines
1.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
help () {
|
|
echo 'dchr-run [options] <chroot-dir> [command]'
|
|
echo '-- options:'
|
|
echo ' -u uid[:gid] invoke command in chroot as a different user'
|
|
# TODO:
|
|
#echo ' -x11 apply options for correctly starting GUI apps'
|
|
echo 'https://dchr.dc09.ru'
|
|
}
|
|
|
|
clean () {
|
|
echo '-- Cleaning up'
|
|
umount "$1/proc"
|
|
umount "$1/sys"
|
|
umount "$1/dev"
|
|
umount "$1/run"
|
|
}
|
|
|
|
error () {
|
|
echo -e '-- \e[1;31mError\e[0m -- see output above'
|
|
exit 1 # `trap` in main() calls cleanup function
|
|
}
|
|
|
|
setup () {
|
|
echo '-- Mounting'
|
|
mount -t proc /proc "$1/proc" || error
|
|
mount -t sysfs /sys "$1/sys" || error
|
|
mount -o bind /dev "$1/dev" || error
|
|
mount -o bind /run "$1/run"
|
|
}
|
|
|
|
runcmd () {
|
|
echo -e '-- \e[1;32mOK\e[0m -- running chroot'
|
|
userspec="--userspec=$1"
|
|
chrdir="$2"
|
|
shift 2
|
|
chrcmd=("$@")
|
|
chroot "$userspec" "$chrdir" "${chrcmd[@]}"
|
|
}
|
|
|
|
main () {
|
|
[[ "$1" == "--help" || "$1" == "" ]] && help && exit 0
|
|
|
|
userspec="$(id -u):$(id -g)"
|
|
|
|
while [[ "$1" == -* ]]
|
|
do
|
|
case "$1" in
|
|
-u)
|
|
userspec="$2"
|
|
shift 2
|
|
;;
|
|
#-x11);; TODO
|
|
*)
|
|
echo -ne '-- \e[1mInvalid option:\e[0m '
|
|
echo "$1"
|
|
echo '-- Use ./ or full path if your chroot-dir starts with dash (-)'
|
|
help
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
chrdir=$(readlink -f "$1")
|
|
shift
|
|
|
|
trap "clean \"$chrdir\"" EXIT
|
|
|
|
setup "$chrdir"
|
|
runcmd "$userspec" "$chrdir" "$@"
|
|
exit $?
|
|
}
|
|
|
|
sourced () {
|
|
[ -n "$ZSH_VERSION" ] && [[ "$ZSH_EVAL_CONTEXT" =~ :file ]] && return 0
|
|
[ -n "$BASH_VERSION" ] && [[ "$0" != "$BASH_SOURCE" ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
sourced || main "$@"
|