Removal of pacwrap-create, updated pacwrap-utils and pacwrap-common to

interoperate container creation with pacwrap-rust
This commit is contained in:
Xavier Moffett 2023-10-04 09:42:17 -04:00
parent 547c40fe7b
commit ece2fda0c8
3 changed files with 9 additions and 363 deletions

View file

@ -46,7 +46,7 @@ VER="v0.9.19 "
MAN_SCRIPT="pacwrap-man"
EXEC_SCRIPT="pacwrap"
CREATE_SCRIPT="pacwrap-create"
CREATE_SCRIPT="pacwrap"
UTILS_SCRIPT="pacwrap-utils"
SYNC_SCRIPT="pacwrap"
PS_SCRIPT="pacwrap-ps"

View file

@ -1,355 +0,0 @@
#!/bin/bash
#
# PacWrap -- Chroot Initialisation Utility
#
# Copyright (C) 2023 Xavier R.M.
# sapphirus(at)azorium(dot)net
#
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, with only version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
source pacwrap-common
export PACWRAP_CREATE=1
main () {
trap exit INT
parse_args "$@"
init $PACWRAP_UTILS
local instance=$INSTANCE
log "$BAR_GREEN Initializing container $INSTANCE..." \
"Initializing container $INSTANCE running '$RUNTIME_EXEC $RUNTIME_ARGS'"
check_tarball
init_struct
init_chroot
log "$BAR_GREEN Finalizing container..." \
"Finalizing container"
finalise
log "$BAR_GREEN Process complete!" \
"Finished creation of $INSTANCE container"
printf " %s\n" \
"Use pacwrap -Esr $BOLD$INSTANCE$RESET to configure the the container."
}
parse_args () {
for var in "$@"; do case $var in
-v|--verbose) SWITCH+="v";;
-V|--version) SWITCH="V";;
--env=*) ENV_VARS="${var:6}";;
--dep=*) DEPEND="${var:6}";;
--dbus=*) PERMISSIONS_DBUS="${var:7}";;
--concur=*) CONCURRENCY_LIMIT="${var:9}";;
--perms=*) PERMISSIONS="${var:14}";;
--mount=*) MOUNT="${var:8}";;
--is-dep) SWITCH+="d";;
--is-base) SWITCH+="b";;
-C*) SWITCH+="${var:2}";;
*) ARGS+=("$var");;
esac; CLI_INVOCATION+="$var "; done
}
script_init () {
INSTANCE=${ARGS[0]}
check_root 1 $INSTANCE
[[ $DEPEND ]] && check_root $DEPEND
INSTANCE_ROOT="$INSTANCE_ROOT_DIR/$INSTANCE"
INSTANCE_HOME="$INSTANCE_HOME_DIR/$INSTANCE"
INSTANCE_CONFIG_FILE="$INSTANCE_CONFIG_DIR/$INSTANCE"
DEPEND_CONFIG_FILE="$INSTANCE_CONFIG_DIR/$DEPEND.yml"
INSTANCE_DEPEND_ROOT=$INSTANCE_ROOT_DIR/$DEPEND
ARCHLINUX_TARBALL="archlinux-bootstrap-x86_64.tar.gz"
ARCHLINUX_TARBALL_CACHE="$PACWRAP_CACHE_DIR/$ARCHLINUX_TARBALL"
PARAMS="$INSTANCE --exec --root --command"
MACHINE_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1)
case $SWITCH in
*d*) C_TYPE="DEP";;
*b*) C_TYPE="BASE";;
*) C_TYPE="ROOT";;
esac
[[ ! $DEPEND ]] && [[ $C_TYPE != "BASE" ]] &&
log_error $LOG_ERR_HELP "Dependency not specified." 1
INSTANCE_CONFIG[$INSTANCE,$CONF_TYPE]=$C_TYPE
INSTANCE_CONFIG[$INSTANCE,$CONF_DEPS]=""
INSTANCE_CONFIG[$INSTANCE,$CONF_PKGS]=""
INSTANCE_CONFIG[$INSTANCE,$CONF_CONCURRENT_LIMIT]=$CONCURRENCY_LIMIT
INSTANCE_CONFIG[$INSTANCE,$CONF_MOUNT]=$MOUNT
INSTANCE_CONFIG[$INSTANCE,$CONF_PERMS]=$PERMISSIONS
INSTANCE_CONFIG[$INSTANCE,$CONF_ENV]=$ENV_VARS
INSTANCE_CONFIG[$INSTANCE,$CONF_DBUS]=$PERMISSIONS_DBUS
[[ ${#ARGS[@]} -gt 1 ]] && ARGS[0]=""
touch $LOCK_FILE
trap on_exit EXIT
}
select_mirror () {
log "$ARROW Selecting mirror..."
local mirrors=$(cat $INSTANCE_PACMAN_MIRRORLIST | grep Server)
for mirror_candidate in $mirrors; do
[[ $mirror_candidate != *http* ]] && continue
mirror_candidate="${mirror_candidate%'$repo'/*}iso/latest"
local response=$(curl -s -o /dev/null -w "%{http_code}" $mirror_candidate/)
[[ $? == 0 ]] && [[ $response == 200 ]] && MIRROR=$mirror_candidate && break
log "$ARROW_RED $mirror_candidate is unavailable."
done
if [[ ! $MIRROR ]]; then
log_error $ARROW_RED "All candidate mirrors are unavailable." "Operation aborted." 1
fi
log_to_file "Selected $MIRROR/"
}
obtain_tarball() {
log "$ARROW Downloading bootstrap tarball..." \
"Downloading bootstrap tarball"
curl --output-dir "$PACWRAP_CACHE_DIR" \
-O "$MIRROR/$ARCHLINUX_TARBALL" \
-O "$MIRROR/$ARCHLINUX_TARBALL.sig"
[[ $? != 0 ]] && log_error $ARROW_RED "Download of bootstrap tarball failed." \
"Operation aborted." 1
}
check_tarball () {
local key_exec=($(type -P pacman-key gpg))
local date_current=$(date +%Y.%m --date='this month')
local date_cache=
if [[ ! -f $ARCHLINUX_TARBALL_CACHE ]]; then
select_mirror
obtain_tarball
fi
log "$ARROW Verifying bootstrap tarball..." \
"Verifying bootstrap tarball"
${key_exec[0]} --verify "$ARCHLINUX_TARBALL_CACHE.sig" 1>>"$OUTPUT_DEST" 2>>"$OUTPUT_DEST"
if [[ $? == 0 ]]; then
local date=$(tar --occurrence=1 -axOf "$ARCHLINUX_TARBALL_CACHE" root.x86_64/version)
date_cache=$(date +%Y.%m -d $(echo $date | sed -e 's/\./\-/g'))
log_to_file "Successful verification of tarball version $date"
else
log_error $ARROW_RED "Checksum failure occurred. Check pacwrap -Uvl for further details." \
"Operation aborted." 1
fi
if [[ $date_cache != $date_current ]]; then
log "$ARROW Tarball is out of date: $BOLD$date_cache$RESET != $BOLD$date_current$RESET"
[[ ! $MIRROR ]] && select_mirror
local remote_sum=$(curl -s "$MIRROR/sha256sums.txt" | tail -n1)
local sum=$(sha256sum "$ARCHLINUX_TARBALL_CACHE" 2>/dev/null)
if [[ "${remote_sum% *}" != "${sum% *}" ]]; then
obtain_tarball
check_tarball
return
else
log_error $ARROW_RED "Upstream mirror is out of date." \
"Skipping..."
fi
fi
}
init_struct () {
log "$ARROW Pre-initializing structures..." \
"Pre-initializing structures"
mkdir -p "$INSTANCE_ROOT" "$INSTANCE_HOME" \
"$INSTANCE_ROOT/etc" \
"$INSTANCE_ROOT/var/lib/pacman" \
"$INSTANCE_ROOT/etc/pacman.d/hooks" \
"$INSTANCE_ROOT/usr/share/libalpm/hooks" \
"$INSTANCE_ROOT/usr/share/ca-certificates"
ln -s ../usr/share/ca-certificates $INSTANCE_ROOT/etc/ca-certificates
([[ ! -d $INSTANCE_ROOT ]] || [[ ! -d $INSTANCE_HOME ]]) &&
log_error "Directory creation failed." 2
local pacman_hooks=('20-systemd-sysusers'
'30-systemd-tmpfiles'
'30-systemd-daemon-reload'
'30-systemd-sysctl'
'30-systemd-catalog'
'30-systemd-update'
'30-systemd-udev-reload'
'30-systemd-hwdb'
'dbus-reload')
for pacman_hook in ${pacman_hooks[@]}; do
ln -s /dev/null "$INSTANCE_ROOT/etc/pacman.d/hooks/$pacman_hook.hook"; done
if [[ $C_TYPE == "BASE" ]]; then
echo -e $(cat << _CONFIG
[Trigger]
\nOperation = Install
\nOperation = Upgrade
\nOperation = Remove
\nType = Path
\nTarget = usr/share/ca-certificates/trust-source/*
\n\n[Action]
\nDescription = Permissing certificate store...
\nWhen = PostTransaction
\nExec = /usr/bin/chmod -R 755 /usr/share/ca-certificates
_CONFIG
) > $INSTANCE_ROOT/usr/share/libalpm/hooks/42-trust-permission.hook
echo -e $(cat << _CONFIG
[Trigger]
\nOperation = Install
\nOperation = Upgrade
\nType = Path
\nTarget = usr/share/ca-certificates/trust-source/*
\n\n[Action]
\nDescription = Symlinking certificate store...
\nWhen = PostTransaction
\nExec = /usr/bin/sh -c "if [[ ! -d /etc/ca-certificates/ ]]; then ln -s ../usr/share/ca-certificates/ /etc/ca-certificates; fi"
_CONFIG
) > $INSTANCE_ROOT/usr/share/libalpm/hooks/38-link-etc-cert.hook
fi
echo "$LANG ${LANG#*.}" > "$INSTANCE_ROOT/etc/locale.gen"
echo "LANG=$LANG" > "$INSTANCE_ROOT/etc/locale.conf"
echo "user:x:1000:1000::/home/user:/bin/bash" >> "$INSTANCE_ROOT/etc/passwd"
echo $(dbus-uuidgen) > "$INSTANCE_ROOT/etc/machine-id"
echo 'PS1="'$INSTANCE'> "' > "$INSTANCE_HOME/.bashrc"
populate_deps
generate_config
}
populate_deps() {
if [[ $C_TYPE != "BASE" ]]; then
if [[ -f $DEPEND_CONFIG_FILE ]]; then
local instance=$DEPEND
source_configuration
INSTANCE_CONFIG[$INSTANCE,$CONF_DEPS]="${INSTANCE_CONFIG[$instance,$CONF_DEPS]} $DEPEND"
else
INSTANCE_CONFIG[$INSTANCE,$CONF_DEPS]="$DEPEND"
fi
fi
}
init_chroot () {
local exclude_params="
--exclude=etc/credstore*
--exclude=version
--exclude=pkglist.x86_64.txt
--exclude=sys
--exclude=opt
--exclude=run
--exclude=boot
--exclude=mnt"
[[ $DEPEND ]] && exclude_params+=" --exclude=usr"
log_to_file "Extracting bootstrap tarball"
echo -n $ARROW "Extracting bootstrap tarball"
tar xkf "$PACWRAP_CACHE_DIR/archlinux-bootstrap-x86_64.tar.gz" --strip-components=1 \
-C "$INSTANCE_ROOT" --checkpoint=.15000 $exclude_params 2>>/dev/null
echo
$SYNC_SCRIPT -Syyyy -t $INSTANCE
local gnupg=$(get_directory_pop "$INSTANCE_PACMAN_GNUPG")
local sync=$(get_directory_pop "$INSTANCE_PACMAN_SYNC")
[[ $sync == 0 ]] && cp -vr "$INSTANCE_ROOT/var/lib/pacman/sync" \
"$INSTANCE_DATA_DIR/pacman" 1>>"$OUTPUT_DEST" 2>>"$OUTPUT_DEST"
[[ $gnupg == 0 ]] && init_trust
}
get_directory_pop() {
local array=$(ls $1)
echo ${#array}
}
init_trust () {
log "$BAR_GREEN Initializing pacman trust database..." \
"Initializing pacman trust database"
$EXEC_SCRIPT $PARAMS pacman-key --init 1>>"$OUTPUT_DEST" 2>>"$OUTPUT_DEST"
log "$ARROW Populating pacman trust database..."
$EXEC_SCRIPT $PARAMS pacman-key --populate 1>>"$OUTPUT_DEST" 2>>"$OUTPUT_DEST"
}
finalise () {
## TODO: Make configurable or merge into sync_foreign_elements
log "$ARROW Generating locale..."
$EXEC_SCRIPT $PARAMS locale-gen 1>>"$OUTPUT_DEST" 2>>"$OUTPUT_DEST"
[[ $C_TYPE != "BASE" ]] && sync_foreign_elements
[[ $C_TYPE == "BASE" ]] && sync_base_packages
[[ ${#ARGS[@]} -gt 1 ]] && install_packages
}
install_packages () {
[[ $SWITCH != *n* ]] && echo -e "$BAR Install specified packages \n$BOLD\n${ARGS[@]}\n"
if [[ ! $(query_confirm_Yn "Proceed with installation?") ]]; then
log_error $ARROW_RED "Installation aborted by user." "Operation cancelled."
return
fi
log_to_file "Installing specified packages"
$EXEC_SCRIPT -Suyo -t $INSTANCE ${ARGS[@]} --noconfirm
if [[ $? != 0 ]]; then
log_error $ARROW_RED "Installation failed." \
"Use pacwrap -Cv and examine stdout for details."
else
generate_config ${ARGS[@]}
log " Installation of specified packages is complete!" \
"Installation complete"
fi
}
sync_base_packages () {
log "$ARROW Some housekeeping..." "Removing arch-install-scripts"
$EXEC_SCRIPT -R -t $INSTANCE arch-install-scripts 2>/dev/null 1>>$VERBOSE
log "$BAR_GREEN Checking $INSTANCE for updates..." "Checking $INSTANCE for updates"
$EXEC_SCRIPT -Suyo -t $INSTANCE --noconfirm
}
sync_foreign_elements() {
log "$ARROW Synchronizing mutable filesystem elements..." \
"Synchronizing mutable filesystem elements"
rm -r "$INSTANCE_ROOT/var/lib/pacman/local"
cp -rn "$INSTANCE_DEPEND_ROOT/etc" "$INSTANCE_ROOT/" 2>/dev/null
cp -rn "$INSTANCE_DEPEND_ROOT/var" "$INSTANCE_ROOT/" 2>/dev/null
}
on_exit() {
[[ ! $PACWRAP_UTILS ]] && [[ -f $LOCK_FILE ]] && rm $LOCK_FILE
}
main $@

View file

@ -353,7 +353,7 @@ replicate_instance() {
local depend=
local type=$(return_type)
local params="-Cn"
local params="c"
[[ $SWITCH == *v* ]] && params+="v"
[[ $type != BASE ]] && depend=$(return_dependency)
@ -371,12 +371,13 @@ replicate_instance() {
return;;
esac
export CONCURRENCY_LIMIT=${INSTANCE_CONFIG[$instance,$CONF_CONCURRENT_LIMIT]} \
ENV_VARS="${INSTANCE_CONFIG[$instance,$CONF_ENV]}" \
MOUNT="${INSTANCE_CONFIG[$instance,$CONF_MOUNT]}" \
PERMISSIONS="${INSTANCE_CONFIG[$instance,$CONF_PERMS]}" \
PERMISSIONS_DBUS="${INSTANCE_CONFIG[$instance,$CONF_DBUS]}" \
DEPEND=$depend; $CREATE_SCRIPT $params $instance $(return_packages)
local depend_params
for dep in $(return_dependencies); do
depend_params+="-t $dep "
done
$CREATE_SCRIPT -Syut$params --noconfirm $instance $depend_params $(return_packages)
if [[ $? == 0 ]]; then
printf " %s$RESET\n" "Replication of $BOLD$instance$RESET complete!"