b10c5eb196
Clients using ipfs.sloppyta.co IPFS gateway won't see repo updates. Use termux.mentality.rip web mirror as it seems working fine now.
167 lines
4.8 KiB
Bash
Executable File
167 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e -u
|
|
|
|
show_help() {
|
|
local cache_size
|
|
cache_size=$(du -sh @TERMUX_CACHE_DIR@/apt/archives 2>/dev/null | cut -f1)
|
|
|
|
echo 'Usage: pkg command [arguments]'
|
|
echo
|
|
echo 'A tool for managing packages. Commands:'
|
|
echo
|
|
echo ' autoclean - Remove all outdated packages from .deb package'
|
|
echo ' cache.'
|
|
echo
|
|
echo ' clean - Remove all packages from .deb package cache.'
|
|
[ -n "$cache_size" ] && echo " Using ${cache_size} now."
|
|
echo
|
|
echo ' files <packages> - Show all files installed by packages.'
|
|
echo
|
|
echo ' install <packages> - Install specified packages.'
|
|
echo
|
|
echo ' list-all - List all packages available in repositories.'
|
|
echo
|
|
echo ' list-installed - List installed packages.'
|
|
echo
|
|
echo ' reinstall <packages> - Reinstall specified installed packages at the'
|
|
echo ' latest version.'
|
|
echo
|
|
echo ' search <query> - Search package by query, for example by name or'
|
|
echo ' description part.'
|
|
echo
|
|
echo ' show <packages> - Show basic metadata, such as dependencies.'
|
|
echo
|
|
echo ' uninstall <packages> - Uninstall specified packages. Configuration files'
|
|
echo ' will be left intact.'
|
|
echo
|
|
echo ' upgrade - Upgrade all installed packages to the latest'
|
|
echo ' version.'
|
|
echo
|
|
exit 1
|
|
}
|
|
|
|
select_mirror() {
|
|
local main_repo="https://termux.org/packages"
|
|
|
|
declare -A mirrors
|
|
mirrors[30]="$main_repo"
|
|
mirrors[20]="https://ipfs.io/ipns/k51qzi5uqu5dg9vawh923wejqffxiu9bhqlze5f508msk0h7ylpac27fdgaskx"
|
|
mirrors[19]="https://ipfs.2read.net/ipns/k51qzi5uqu5dg9vawh923wejqffxiu9bhqlze5f508msk0h7ylpac27fdgaskx"
|
|
mirrors[18]="https://termux.mentality.rip/termux-packages-24"
|
|
mirrors[13]="https://grimler.se/termux-packages-24"
|
|
|
|
local current_mirror
|
|
current_mirror=$(grep -P "^\s*deb\s+" @TERMUX_PREFIX@/etc/apt/sources.list | grep -oP 'https?://[a-z0-9/._-]+')
|
|
|
|
# Do not update mirror if:
|
|
# * Uses .cn domain - specific to Chinese users.
|
|
# * If $TERMUX_PKG_NO_MIRROR_SELECT was set.
|
|
if [ -n "${TERMUX_PKG_NO_MIRROR_SELECT-}" ] || grep -qP '.+\.cn/' <(echo "${current_mirror-x}"); then
|
|
return
|
|
fi
|
|
|
|
# Mirrors are rotated if 6 hours timeout has been passed or mirror is no longer accessible.
|
|
if [ -n "$(find @TERMUX_CACHE_DIR@/apt/pkgcache.bin -mmin -360 2>/dev/null)" ]; then
|
|
if [ -n "${current_mirror}" ]; then
|
|
echo -n "Checking availability of current mirror: "
|
|
if timeout 6 curl \
|
|
--head \
|
|
--fail \
|
|
--connect-timeout 5 \
|
|
--location \
|
|
--user-agent 'Termux-PKG/1.0 mirror-checker (termux-tools @PACKAGE_VERSION@) Termux (@TERMUX_APP_PACKAGE@; install-prefix:@TERMUX_PREFIX@)' \
|
|
"${current_mirror%/}/dists/stable/Release" >/dev/null 2>&1; then
|
|
echo "ok"
|
|
return
|
|
else
|
|
echo "bad"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Test mirror availability, remove unaccessible mirrors from list.
|
|
echo "Testing the available mirrors:"
|
|
local w total_mirror_weight=0
|
|
for w in "${!mirrors[@]}"; do
|
|
echo -n "[*] ${mirrors[$w]}: "
|
|
if timeout 6 curl \
|
|
--head \
|
|
--fail \
|
|
--connect-timeout 5 \
|
|
--location \
|
|
--user-agent 'Termux-PKG/1.0 mirror-checker (termux-tools @PACKAGE_VERSION@) Termux (@TERMUX_APP_PACKAGE@; install-prefix:@TERMUX_PREFIX@)' \
|
|
"${mirrors[$w]%/}/dists/stable/Release" >/dev/null 2>&1; then
|
|
echo "ok"
|
|
total_mirror_weight=$((total_mirror_weight + w))
|
|
else
|
|
echo "bad"
|
|
unset "mirrors[$w]"
|
|
fi
|
|
done
|
|
unset w
|
|
|
|
# Weight-based mirror selection.
|
|
local selected_mirror=""
|
|
if ((total_mirror_weight > 0)); then
|
|
local w random_weight calc_weight=0
|
|
random_weight=$((RANDOM % total_mirror_weight + 1))
|
|
for w in $(echo "${!mirrors[@]}" | tr ' ' '\n' | sort -n); do
|
|
calc_weight=$((calc_weight + w))
|
|
|
|
if ((calc_weight >= random_weight)); then
|
|
echo "Picking mirror: ${mirrors[$w]}"
|
|
selected_mirror="${mirrors[$w]}"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -n "${selected_mirror}" ]; then
|
|
echo "deb ${selected_mirror}/ stable main" > @TERMUX_PREFIX@/etc/apt/sources.list
|
|
else
|
|
echo "Using fallback mirror: ${main_repo}"
|
|
echo "deb ${main_repo}/ stable main" > @TERMUX_PREFIX@/etc/apt/sources.list
|
|
fi
|
|
}
|
|
|
|
update_apt_cache() {
|
|
if [ -z "$(find @TERMUX_CACHE_DIR@/apt/pkgcache.bin -mmin -20 2>/dev/null)" ]; then
|
|
apt update
|
|
fi
|
|
}
|
|
|
|
if [ $# = 0 ]; then
|
|
show_help
|
|
fi
|
|
|
|
CMD="$1"
|
|
shift 1
|
|
|
|
case "$CMD" in
|
|
f*) dpkg -L "$@";;
|
|
h*) show_help;;
|
|
add|i*)
|
|
select_mirror
|
|
update_apt_cache
|
|
apt install "$@"
|
|
;;
|
|
autoc*) apt autoclean;;
|
|
cl*) apt clean;;
|
|
list-a*) apt list "$@";;
|
|
list-i*) apt list --installed "$@";;
|
|
rei*) apt install --reinstall "$@";;
|
|
se*)
|
|
select_mirror
|
|
update_apt_cache
|
|
apt search "$@"
|
|
;;
|
|
sh*) apt show "$@";;
|
|
un*|rem*|rm|del*) apt remove "$@";;
|
|
up*)
|
|
select_mirror
|
|
apt update
|
|
apt full-upgrade "$@"
|
|
;;
|
|
*) echo "Unknown command: '$CMD' (run 'pkg help' for usage information)"; exit 1;;
|
|
esac
|