713c7160fc
See https://github.com/termux/termux-packages/issues/5620. Implements automatic mirror selection: * Pick a random URL of top 4 mirrors of Termux main repository and use it during 30 minutes limit, then rotate to a new one. Distribute traffic accross multiple mirrors, including origin Bintray repository. * During 30 minutes limit, let `pkg` to check whether mirror is accessible on each run. If mirror is not accessible, use a new one. Mirrors are not guaranteed to be 100% accessible, so let pkg to check which one is working before using `apt`. * Skip rotating if using `.cn` mirrors - Chinese users will not want to use something else due to great firewall and download speed issues.
100 lines
2.7 KiB
Bash
Executable File
100 lines
2.7 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e -u
|
|
|
|
show_help() {
|
|
echo 'Usage: pkg command [arguments]'
|
|
echo ''
|
|
echo 'A tool for managing packages. Commands:'
|
|
echo ''
|
|
echo ' files <packages>'
|
|
echo ' install <packages>'
|
|
echo ' list-all'
|
|
echo ' list-installed'
|
|
echo ' reinstall <packages>'
|
|
echo ' search <query>'
|
|
echo ' show <packages>'
|
|
echo ' uninstall <packages>'
|
|
echo ' upgrade'
|
|
exit 1
|
|
}
|
|
|
|
select_mirror() {
|
|
local main_repo="https://dl.bintray.com/termux/termux-packages-24"
|
|
local top_mirrors="${main_repo} https://termux.mentality.rip/termux-packages-24 https://grimler.se/termux-packages-24 https://main.termux-mirror.ml"
|
|
|
|
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
|
|
|
|
if [ -n "$(find @TERMUX_PREFIX@/var/cache/apt/pkgcache.bin -mmin -180 2>/dev/null)" ]; then
|
|
# Mirrors are rotated if either they are not working or 180 minutes timeout
|
|
# has passed.
|
|
if [ -n "${current_mirror}" ] && curl --user-agent 'Termux-PKG/1.0 mirror-checker' --head --fail --location "${current_mirror}/dists/stable/Release" >/dev/null 2>&1; then
|
|
echo "Reusing mirror: ${current_mirror}"
|
|
return
|
|
fi
|
|
fi
|
|
|
|
# Shuffle mirrors and pick the first one which is accessible.
|
|
local m selected_mirror=""
|
|
for m in $(echo "$top_mirrors" | tr ' ' '\n' | shuf); do
|
|
echo "Trying mirror: $m"
|
|
if curl --user-agent 'Termux-PKG/1.0 mirror-checker' --head --fail --location "${m}/dists/stable/Release" >/dev/null 2>&1; then
|
|
selected_mirror="$m"
|
|
break
|
|
fi
|
|
done
|
|
|
|
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_PREFIX@/var/cache/apt/pkgcache.bin -mmin -5 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 "$@"
|
|
;;
|
|
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
|