mirror of
https://github.com/termux/termux-packages
synced 2024-06-18 23:27:06 +00:00
scripts/generate-bootstraps.sh: improve pacman-based bootstrap creations (#19619)
This commit is contained in:
parent
0fd3066e07
commit
fb8ce2e219
47
scripts/boot-set-up-pkgs.sh
Normal file
47
scripts/boot-set-up-pkgs.sh
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#!@TERMUX_PREFIX@/bin/bash
|
||||||
|
|
||||||
|
# --- boot-set-up-pkgs.sh ---
|
||||||
|
# This script runs the packages 'postinst' function.
|
||||||
|
# They are not run during the creation of bootstrap based
|
||||||
|
# on pacman as this is not possible. They must be running
|
||||||
|
# on Termux devices for the packages to function completely properly.
|
||||||
|
#
|
||||||
|
# This script is one-time only. After launching, it will
|
||||||
|
# be automatically deleted to avoid running it again.
|
||||||
|
|
||||||
|
(
|
||||||
|
export TERMUX_PREFIX="@TERMUX_PREFIX@"
|
||||||
|
export TERMUX_PACKAGE_MANAGER="@TERMUX_PACKAGE_MANAGER@"
|
||||||
|
|
||||||
|
_boot_message() {
|
||||||
|
echo "[*] ${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_boot_message "Automatic one-time setup of packages has been launched, setup is in progress..."
|
||||||
|
|
||||||
|
case "${TERMUX_PACKAGE_MANAGER}" in
|
||||||
|
"pacman")
|
||||||
|
for i in ${TERMUX_PREFIX}/var/lib/pacman/local/*/install; do
|
||||||
|
(
|
||||||
|
source $i
|
||||||
|
if type post_install &> /dev/null; then
|
||||||
|
DIR="${i::-8}"
|
||||||
|
_boot_message "Setting up the ${DIR##*/} package..."
|
||||||
|
post_install &> /dev/null || true
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
done;;
|
||||||
|
"apt")
|
||||||
|
for i in ${TERMUX_PREFIX}/var/lib/dpkg/info/*.postinst; do
|
||||||
|
DIR="${i##*/}"
|
||||||
|
_boot_message "Setting up the ${DIR::-9} package..."
|
||||||
|
bash $i
|
||||||
|
done;;
|
||||||
|
*)
|
||||||
|
_boot_message "unknown package manager '${TERMUX_PACKAGE_MANAGER}', because of this it is not possible to configure packages"
|
||||||
|
esac
|
||||||
|
|
||||||
|
_boot_message "Setting up packages is complete, pleasant use Termux :)"
|
||||||
|
|
||||||
|
rm ${BASH_SOURCE[0]}
|
||||||
|
)
|
|
@ -24,7 +24,7 @@ TERMUX_PACKAGE_MANAGERS=("apt" "pacman")
|
||||||
# The repository base urls mapping for package managers.
|
# The repository base urls mapping for package managers.
|
||||||
declare -A REPO_BASE_URLS=(
|
declare -A REPO_BASE_URLS=(
|
||||||
["apt"]="https://packages-cf.termux.dev/apt/termux-main"
|
["apt"]="https://packages-cf.termux.dev/apt/termux-main"
|
||||||
["pacman"]="https://s3.amazonaws.com/termux-pacman.us/main"
|
["pacman"]="https://service.termux-pacman.dev/main"
|
||||||
)
|
)
|
||||||
|
|
||||||
# The package manager that will be installed in bootstrap.
|
# The package manager that will be installed in bootstrap.
|
||||||
|
@ -41,7 +41,7 @@ declare -a ADDITIONAL_PACKAGES
|
||||||
|
|
||||||
# Check for some important utilities that may not be available for
|
# Check for some important utilities that may not be available for
|
||||||
# some reason.
|
# some reason.
|
||||||
for cmd in ar awk curl grep gzip find sed tar xargs xz zip; do
|
for cmd in ar awk curl grep gzip find sed tar xargs xz zip jq; do
|
||||||
if [ -z "$(command -v $cmd)" ]; then
|
if [ -z "$(command -v $cmd)" ]; then
|
||||||
echo "[!] Utility '$cmd' is not available in PATH."
|
echo "[!] Utility '$cmd' is not available in PATH."
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -93,22 +93,21 @@ read_package_list_deb() {
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
read_package_list_pac() {
|
download_db_packages_pac() {
|
||||||
if [ ! -e "${BOOTSTRAP_TMPDIR}/main_${1}.db" ]; then
|
if [ ! -e "${PATH_DB_PACKAGES}" ]; then
|
||||||
echo "[*] Downloading package list for architecture '${1}'..."
|
echo "[*] Downloading package list for architecture '${package_arch}'..."
|
||||||
curl --fail --location \
|
curl --fail --location \
|
||||||
--output "${BOOTSTRAP_TMPDIR}/main_${1}.db" \
|
--output "${PATH_DB_PACKAGES}" \
|
||||||
"${REPO_BASE_URL}/${1}/main.db"
|
"${REPO_BASE_URL}/${package_arch}/main.json"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
echo "[*] Reading package list for '${1}'..."
|
read_db_packages_pac() {
|
||||||
mkdir -p "${BOOTSTRAP_TMPDIR}/packages"
|
jq -r '."'${package_name}'"."'${1}'" | if type == "array" then .[] else . end' "${PATH_DB_PACKAGES}"
|
||||||
tar -xf "${BOOTSTRAP_TMPDIR}/main_${1}.db" -C "${BOOTSTRAP_TMPDIR}/packages"
|
}
|
||||||
local packages_name=($(grep -h -A 1 "%NAME%" "${BOOTSTRAP_TMPDIR}"/packages/*/desc | sed 's/%NAME%//g; s/--//g'))
|
|
||||||
local packages_filename=($(grep -h -A 1 "%FILENAME%" "${BOOTSTRAP_TMPDIR}"/packages/*/desc | sed 's/%FILENAME%//g; s/--//g'))
|
print_desc_package_pac() {
|
||||||
for i in $(seq 0 $((${#packages_name[@]}-1))); do
|
echo -e "%${1}%\n${2}\n"
|
||||||
PACKAGE_METADATA["${packages_name[$i]}"]="${1}/${packages_filename[$i]}"
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Download specified package, its depenencies and then extract *.deb or *.pkg.tar.xz files to
|
# Download specified package, its depenencies and then extract *.deb or *.pkg.tar.xz files to
|
||||||
|
@ -201,17 +200,9 @@ pull_package() {
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
local package_desc=$(grep -l $(echo ${PACKAGE_METADATA[${package_name}]} | awk -F "/" '{printf $2}') "${BOOTSTRAP_TMPDIR}"/packages/${package_name}*/desc | head -1)
|
local package_dependencies=$(read_db_packages_pac "DEPENDS" | sed 's/<.*$//g; s/>.*$//g; s/=.*$//g')
|
||||||
local package_dependencies
|
|
||||||
local i=0
|
|
||||||
package_dependencies=$(
|
|
||||||
while [[ -n $(grep -A ${i} %DEPENDS% ${package_desc} | tail -1) ]]; do
|
|
||||||
i=$((${i}+1))
|
|
||||||
echo $(grep -A ${i} %DEPENDS% ${package_desc} | tail -1 | sed 's/</ /g; s/>/ /g; s/=/ /g' | awk '{printf $1}')
|
|
||||||
done
|
|
||||||
)
|
|
||||||
|
|
||||||
if [ -n "$package_dependencies" ]; then
|
if [ "$package_dependencies" != "null" ]; then
|
||||||
local dep
|
local dep
|
||||||
for dep in $package_dependencies; do
|
for dep in $package_dependencies; do
|
||||||
if [ ! -e "${BOOTSTRAP_PKGDIR}/${dep}" ]; then
|
if [ ! -e "${BOOTSTRAP_PKGDIR}/${dep}" ]; then
|
||||||
|
@ -223,36 +214,31 @@ pull_package() {
|
||||||
|
|
||||||
if [ ! -e "$package_tmpdir/package.pkg.tar.xz" ]; then
|
if [ ! -e "$package_tmpdir/package.pkg.tar.xz" ]; then
|
||||||
echo "[*] Downloading '$package_name'..."
|
echo "[*] Downloading '$package_name'..."
|
||||||
curl --fail --location --output "$package_tmpdir/package.pkg.tar.xz" "${REPO_BASE_URL}/${PACKAGE_METADATA[${package_name}]}"
|
local package_filename=$(read_db_packages_pac "FILENAME")
|
||||||
|
curl --fail --location --output "$package_tmpdir/package.pkg.tar.xz" "${REPO_BASE_URL}/${package_arch}/${package_filename}"
|
||||||
|
|
||||||
echo "[*] Extracting '$package_name'..."
|
echo "[*] Extracting '$package_name'..."
|
||||||
(cd "$package_tmpdir"
|
(cd "$package_tmpdir"
|
||||||
tar xJf package.pkg.tar.xz
|
local package_desc="${package_name}-$(read_db_packages_pac VERSION)"
|
||||||
if [ -d ./data ]; then
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_desc}"
|
||||||
cp -r ./data "$BOOTSTRAP_ROOTFS"
|
|
||||||
fi
|
|
||||||
local metadata_package_sp=(${PACKAGE_METADATA[${package_name}]//// })
|
|
||||||
if [ $(echo "${metadata_package_sp[1]}" | grep "any.") ]; then
|
|
||||||
local local_dir_sp=(${metadata_package_sp[1]//-any/ })
|
|
||||||
else
|
|
||||||
local local_dir_sp=(${metadata_package_sp[1]//-${metadata_package_sp[0]}/ })
|
|
||||||
fi
|
|
||||||
if [ $(echo "${package_name}" | grep "+") ]; then
|
|
||||||
local package_name_in_host="${package_name//+/0}"
|
|
||||||
local_dir_sp[0]="${local_dir_sp[0]//${package_name_in_host}/${package_name}}"
|
|
||||||
fi
|
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${local_dir_sp[0]}"
|
|
||||||
cp -r .MTREE "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${local_dir_sp[0]}/mtree"
|
|
||||||
cp -r "${package_desc}" "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${local_dir_sp[0]}/desc"
|
|
||||||
if [ -f .INSTALL ]; then
|
|
||||||
cp -r .INSTALL "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${local_dir_sp[0]}/install"
|
|
||||||
fi
|
|
||||||
{
|
{
|
||||||
echo "%FILES%"
|
echo "%FILES%"
|
||||||
if [ -d ./data ]; then
|
tar xvf package.pkg.tar.xz -C "$BOOTSTRAP_ROOTFS" .INSTALL .MTREE data 2> /dev/null | grep '^data/' || true
|
||||||
find data
|
} >> "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_desc}/files"
|
||||||
fi
|
mv "${BOOTSTRAP_ROOTFS}/.MTREE" "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_desc}/mtree"
|
||||||
} >> "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${local_dir_sp[0]}/files"
|
if [ -f "${BOOTSTRAP_ROOTFS}/.INSTALL" ]; then
|
||||||
|
mv "${BOOTSTRAP_ROOTFS}/.INSTALL" "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_desc}/install"
|
||||||
|
fi
|
||||||
|
{
|
||||||
|
local keys_desc="VERSION BASE DESC URL ARCH BUILDDATE PACKAGER ISIZE GROUPS LICENSE REPLACES DEPENDS OPTDEPENDS CONFLICTS PROVIDES"
|
||||||
|
for i in "NAME ${package_name}" \
|
||||||
|
"INSTALLDATE $(date +%s)" \
|
||||||
|
"VALIDATION $(test $(read_db_packages_pac PGPSIG) != 'null' && echo 'pgp' || echo 'sha256')"; do
|
||||||
|
print_desc_package_pac ${i}
|
||||||
|
done
|
||||||
|
jq -r -j '."'${package_name}'" | to_entries | .[] | select(.key | contains('$(sed 's/^/"/; s/ /","/g; s/$/"/' <<< ${keys_desc})')) | "%",(if .key == "ISIZE" then "SIZE" else .key end),"%\n",.value,"\n\n" | if type == "array" then (.| join("\n")) else . end' \
|
||||||
|
"${PATH_DB_PACKAGES}"
|
||||||
|
} >> "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_desc}/desc"
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -393,6 +379,7 @@ if [ -z "$REPO_BASE_URL" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for package_arch in "${TERMUX_ARCHITECTURES[@]}"; do
|
for package_arch in "${TERMUX_ARCHITECTURES[@]}"; do
|
||||||
|
PATH_DB_PACKAGES="$BOOTSTRAP_TMPDIR/main_${package_arch}.json"
|
||||||
BOOTSTRAP_ROOTFS="$BOOTSTRAP_TMPDIR/rootfs-${package_arch}"
|
BOOTSTRAP_ROOTFS="$BOOTSTRAP_TMPDIR/rootfs-${package_arch}"
|
||||||
BOOTSTRAP_PKGDIR="$BOOTSTRAP_TMPDIR/packages-${package_arch}"
|
BOOTSTRAP_PKGDIR="$BOOTSTRAP_TMPDIR/packages-${package_arch}"
|
||||||
|
|
||||||
|
@ -423,7 +410,7 @@ for package_arch in "${TERMUX_ARCHITECTURES[@]}"; do
|
||||||
if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
||||||
read_package_list_deb "$package_arch"
|
read_package_list_deb "$package_arch"
|
||||||
else
|
else
|
||||||
read_package_list_pac "$package_arch"
|
download_db_packages_pac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Package manager.
|
# Package manager.
|
||||||
|
@ -477,6 +464,15 @@ for package_arch in "${TERMUX_ARCHITECTURES[@]}"; do
|
||||||
done
|
done
|
||||||
unset add_pkg
|
unset add_pkg
|
||||||
|
|
||||||
|
# Adding pacman package configuration
|
||||||
|
if [ ${TERMUX_PACKAGE_MANAGER} = "pacman" ] || [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
||||||
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/etc/profile.d"
|
||||||
|
sed -e "s|@TERMUX_PREFIX@|${TERMUX_PREFIX}|g" \
|
||||||
|
-e "s|@TERMUX_PACKAGE_MANAGER@|${TERMUX_PACKAGE_MANAGER}|g" \
|
||||||
|
$(dirname "$(realpath "$0")")/boot-set-up-pkgs.sh \
|
||||||
|
> "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/etc/profile.d/boot-set-up-pkgs.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
# Create bootstrap archive.
|
# Create bootstrap archive.
|
||||||
create_bootstrap_archive "$package_arch"
|
create_bootstrap_archive "$package_arch"
|
||||||
done
|
done
|
||||||
|
|
Loading…
Reference in New Issue
Block a user