mirror of
https://github.com/fsquillace/junest.git
synced 2026-01-23 10:35:36 +00:00
This change separate different parts of the code into several categories: `chroot`, `proot`, `build`, `common`, `setup`. This should simplify the maintenance of the code and will help introducing the user namespace module in a easier way.
224 lines
7.3 KiB
Bash
Executable file
224 lines
7.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# This file is part of JuNest (https://github.com/fsquillace/junest).
|
|
#
|
|
|
|
JUNEST_BASE="$(readlink -f $(dirname $(readlink -f "$0"))/..)"
|
|
|
|
source "${JUNEST_BASE}/lib/utils/utils.sh"
|
|
source "${JUNEST_BASE}/lib/core/common.sh"
|
|
source "${JUNEST_BASE}/lib/core/build.sh"
|
|
source "${JUNEST_BASE}/lib/core/setup.sh"
|
|
source "${JUNEST_BASE}/lib/core/proot.sh"
|
|
source "${JUNEST_BASE}/lib/core/chroot.sh"
|
|
|
|
###################################
|
|
### General functions ###
|
|
###################################
|
|
|
|
usage() {
|
|
echo -e "$NAME (v$(cat $JUNEST_BASE/VERSION)): $DESCRIPTION"
|
|
echo
|
|
echo -e "Usage: $CMD [options] [--] [command]"
|
|
echo
|
|
echo -e "Setup options:"
|
|
echo -e "-i, --setup-from-file <image> Setup the $NAME image in ${JUNEST_HOME}"
|
|
echo -e "-a, --arch <arch> $NAME architecture to download (x86_64, x86, arm)"
|
|
echo -e " Defaults to the host architecture ($ARCH)"
|
|
echo -e "-d, --delete Delete $NAME from ${JUNEST_HOME}"
|
|
echo
|
|
echo -e "Access options:"
|
|
echo -e "-f, --fakeroot Run $NAME with fakeroot privileges"
|
|
echo -e "-r, --root Run $NAME with root privileges"
|
|
echo -e "-p, --proot-args <args> Proot arguments (use $CMD -p \"--help\" to check out the proot options)"
|
|
echo
|
|
echo -e "Building options:"
|
|
echo -e "-b, --build-image Build a $NAME image (must run in ArchLinux)"
|
|
echo -e "-n, --disable-validation Disable the $NAME image validation"
|
|
echo -e "-c, --check <${CMD}_script> Validate the env located in ${JUNEST_HOME}"
|
|
echo -e " using ${CMD}_script. This will alterate the environment"
|
|
echo -e "-s, --skip-root-tests Skip the root tests during the validation process"
|
|
echo
|
|
echo -e "General options:"
|
|
echo -e "-h, --help Show this help message"
|
|
echo -e "-v, --version Show the $NAME version"
|
|
}
|
|
|
|
version() {
|
|
echo -e "$NAME $(cat $JUNEST_BASE/VERSION)"
|
|
}
|
|
|
|
check_cli(){
|
|
if $OPT_BUILD_IMAGE
|
|
then
|
|
if $OPT_DELETE || $OPT_HELP || $OPT_VERSION || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT || $OPT_CHECK
|
|
then
|
|
die "The build image option must be used exclusively"
|
|
fi
|
|
fi
|
|
if $OPT_SKIP_ROOT_TEST
|
|
then
|
|
if $OPT_DELETE || $OPT_HELP || $OPT_VERSION || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT
|
|
then
|
|
die "The skip root tests option must be used with either build image or check options"
|
|
fi
|
|
fi
|
|
if $OPT_CHECK
|
|
then
|
|
if $OPT_DELETE || $OPT_HELP || $OPT_VERSION || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT || $OPT_BUILD_IMAGE
|
|
then
|
|
die "The validation image option must be used exclusively"
|
|
fi
|
|
fi
|
|
if $OPT_DISABLE_VALIDATION
|
|
then
|
|
if $OPT_DELETE || $OPT_HELP || $OPT_VERSION || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT || $OPT_CHECK
|
|
then
|
|
die "The disable validation option must be used with the build image option only"
|
|
fi
|
|
fi
|
|
if $OPT_DELETE
|
|
then
|
|
if $OPT_BUILD_IMAGE || $OPT_HELP || $OPT_VERSION || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT || $OPT_DISABLE_VALIDATION || $OPT_CHECK
|
|
then
|
|
die "The $NAME delete option must be used exclusively"
|
|
fi
|
|
fi
|
|
if $OPT_HELP
|
|
then
|
|
if $OPT_BUILD_IMAGE || $OPT_DELETE || $OPT_VERSION || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT || $OPT_DISABLE_VALIDATION || $OPT_CHECK
|
|
then
|
|
die "The $NAME help option must be used exclusively"
|
|
fi
|
|
fi
|
|
if $OPT_VERSION
|
|
then
|
|
if $OPT_BUILD_IMAGE || $OPT_DELETE || $OPT_HELP || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_FAKEROOT || $OPT_ROOT || $OPT_DISABLE_VALIDATION || $OPT_CHECK
|
|
then
|
|
die "The $NAME version option must be used exclusively"
|
|
fi
|
|
fi
|
|
if $OPT_FAKEROOT && $OPT_ROOT
|
|
then
|
|
die "You must access to $NAME with either fakeroot or root permissions"
|
|
fi
|
|
if $OPT_PROOT_ARGS || $OPT_ARCH
|
|
then
|
|
if $OPT_BUILD_IMAGE || $OPT_DELETE || $OPT_HELP || \
|
|
$OPT_ROOT || $OPT_VERSION || $OPT_DISABLE_VALIDATION || $OPT_CHECK
|
|
then
|
|
die "Invalid syntax: Proot and arch args are not allowed with the other options"
|
|
fi
|
|
fi
|
|
if [ "$ARGS" != "" ]
|
|
then
|
|
if $OPT_BUILD_IMAGE || $OPT_DELETE || $OPT_HELP || $OPT_SETUP_FROM_FILE || \
|
|
$OPT_VERSION || $OPT_DISABLE_VALIDATION || $OPT_CHECK
|
|
then
|
|
die "No arguments are needed. For the CLI syntax run: $CMD --help"
|
|
fi
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
|
|
function parse_arguments(){
|
|
OPT_SETUP_FROM_FILE=false
|
|
IMAGE_FILE=""
|
|
OPT_FAKEROOT=false
|
|
OPT_ROOT=false
|
|
OPT_PROOT_ARGS=false
|
|
PROOT_ARGS=""
|
|
OPT_ARCH=false
|
|
ARCH_ARG=""
|
|
OPT_BUILD_IMAGE=false
|
|
OPT_DISABLE_VALIDATION=false
|
|
OPT_CHECK=false
|
|
CHECK_ARG=""
|
|
OPT_SKIP_ROOT_TEST=false
|
|
OPT_DELETE=false
|
|
OPT_HELP=false
|
|
OPT_VERSION=false
|
|
for opt in "$@"
|
|
do
|
|
case "$1" in
|
|
-i|--setup-from-file) OPT_SETUP_FROM_FILE=true ; shift ; IMAGE_FILE=$1 ; shift ;;
|
|
-f|--fakeroot) OPT_FAKEROOT=true ; shift ;;
|
|
-r|--root) OPT_ROOT=true ; shift ;;
|
|
-p|--proot-args) OPT_PROOT_ARGS=true ; shift ; PROOT_ARGS=$1; shift ;;
|
|
-a|--arch) OPT_ARCH=true ; shift ; ARCH_ARG=$1; shift ;;
|
|
-b|--build-image) OPT_BUILD_IMAGE=true ; shift ;;
|
|
-n|--disable-validation) OPT_DISABLE_VALIDATION=true ; shift ;;
|
|
-c|--check) OPT_CHECK=true ; shift ; CHECK_ARG=$1; shift ;;
|
|
-s|--skip-root-tests) OPT_SKIP_ROOT_TEST=true ; shift ;;
|
|
-d|--delete) OPT_DELETE=true ; shift ;;
|
|
-h|--help) OPT_HELP=true ; shift ;;
|
|
-v|--version) OPT_VERSION=true ; shift ;;
|
|
--) shift ; break ;;
|
|
-*) die "Invalid option $1" ;;
|
|
*) break ;;
|
|
esac
|
|
done
|
|
|
|
ARGS=()
|
|
for arg in "$@"
|
|
do
|
|
ARGS+=("$arg")
|
|
done
|
|
}
|
|
|
|
function execute_operation(){
|
|
$OPT_HELP && usage && return
|
|
$OPT_VERSION && version && return
|
|
|
|
if $OPT_BUILD_IMAGE; then
|
|
build_image_env $OPT_DISABLE_VALIDATION $OPT_SKIP_ROOT_TEST
|
|
return
|
|
elif $OPT_DELETE; then
|
|
delete_env
|
|
return
|
|
elif $OPT_CHECK; then
|
|
check_env "${JUNEST_HOME}" "${CHECK_ARG}" $OPT_SKIP_ROOT_TEST
|
|
return
|
|
fi
|
|
|
|
if ! is_env_installed
|
|
then
|
|
if $OPT_SETUP_FROM_FILE; then
|
|
setup_env_from_file $IMAGE_FILE
|
|
else
|
|
setup_env $ARCH_ARG
|
|
unset ARCH_ARG
|
|
fi
|
|
elif $OPT_SETUP_FROM_FILE; then
|
|
die "Error: The image cannot be installed since $JUNEST_HOME is not empty."
|
|
fi
|
|
|
|
[ -z "${ARCH_ARG}" ] || \
|
|
die "The option --arch cannot be specified since JuNest has already been downloaded in $JUNEST_HOME"
|
|
|
|
if $OPT_FAKEROOT; then
|
|
run_env_as_fakeroot "${PROOT_ARGS}" "${ARGS[@]}"
|
|
elif $OPT_ROOT; then
|
|
run_env_as_root "${ARGS[@]}"
|
|
else
|
|
run_env_as_user "${PROOT_ARGS}" "${ARGS[@]}"
|
|
fi
|
|
}
|
|
|
|
function cli() {
|
|
parse_arguments "$@"
|
|
check_cli
|
|
execute_operation
|
|
}
|
|
|
|
cli "$@"
|
|
# vim: set ts=4 sw=4 noet:
|