#!/bin/sh PROGRAM=setup-apkrepos PREFIX= . $PREFIX/lib/libalpine.sh get_hostname_from_url() { local n=${1#*://} echo ${n%%/*} } prompt_setup_method() { echo "r) Add random from the above list" echo "f) Detect and add fastest mirror from above list" echo "e) Edit /etc/apk/repositores with text editor" echo "" echo -n "Enter mirror number (1-$mirror_count) or URL to add (or r/f/e/done) [$1]: " } add_random_mirror() { local i=0 local random_mirror_index=$(( $RANDOM % $mirror_count )) echo -n "Picking random mirror... " for mirror in $MIRRORS; do if [ $i -eq $random_mirror_index ]; then break fi i=$(( $i + 1 )) done add_mirror $mirror } add_fastest_mirror() { local tmp_mirror_nslookup local tmp_mirror_time local tmp_mirror_time_failed local tmp_mirror_rtt local mirror_lowest_rtt local mirror_lowest_rtt_mirror echo -n "Finding fastest mirror... " mirror_lowest_rtt=-1 for mirror in $MIRRORS; do tmp_mirror_time="`(time wget -qO - $mirror) 2>&1 || echo "E_MIRROR_FAILED"`" tmp_mirror_time_failed=`echo $tmp_mirror_time | grep "E_MIRROR_FAILED"` if [ ${#tmp_mirror_time_failed} -eq 0 ]; then tmp_mirror_rtt=`echo "$tmp_mirror_time" | grep -E "^real" | sed -r "s/^real[ ]+[0-9]+m[ ]+([0-9]+)\.([0-9]+)s$/\1\2/"` if [ $mirror_lowest_rtt -eq -1 ]; then mirror_lowest_rtt=$tmp_mirror_rtt mirror_lowest_rtt_mirror=$mirror else if [ $tmp_mirror_rtt -lt $mirror_lowest_rtt ]; then mirror_lowest_rtt=$tmp_mirror_rtt mirror_lowest_rtt_mirror=$mirror fi fi fi done mirror=$mirror_lowest_rtt_mirror if [ -z "$mirror" ]; then eecho "Failed to ping any mirror" return 1 fi add_mirror "$mirror" } # show mirrors and store how many in global mirror_count show_mirror_list() { local mirror i=0 mirror_count=0 [ -z "$MIRRORS" ] && return echo "" echo "Available mirrors:" for mirror in $MIRRORS; do i=$(($i + 1)) echo "$i) $(get_hostname_from_url $mirror)" done echo "" mirror_count=$i } add_from_list() { local mirror_index=$1 if [ $mirror_index -lt 1 ] || [ $mirror_index -gt $mirror_count ]; then return 1 fi set $MIRRORS eval "mirror=\$$mirror_index" add_mirror "$mirror" } get_alpine_release() { local version=$(cat /etc/alpine-release 2>/dev/null) case "$version" in *_git*|*_alpha*) release="edge";; [0-9]*.[0-9]*.[0-9]*) # release in x.y.z format, cut last digit release=v${version%.[0-9]*};; *) # fallback to edge release="edge";; esac } add_mirror() { local mirror="$1" echo "${mirror%/}/${release}/main" >> $APKREPOS_PATH echo "#${mirror%/}/${release}/testing" >> $APKREPOS_PATH echo "" >> $APKREPOS_PATH echo "Added mirror $(get_hostname_from_url $mirror)" } add_from_url() { echo "$1" >> $APKREPOS_PATH echo "" >> $APKREPOS_PATH } edit_repositories() { local md5=$(md5sum $APKREPOS_PATH) ${EDITOR:-vi} "$APKREPOS_PATH" # return true if file changed test "$(md5sum $APKREPOS_PATH)" != "$md5" } usage() { cat <<__EOF__ usage: setup-apkrepos [-hr] Setup apk repositories options: -h Show this help -r Add a random mirror and do not prompt __EOF__ exit 1 } while getopts "hr" opt; do case $opt in h) usage;; r) JUSTADDRANDOM=1;; esac done # main # install alpine-mirrors if its not already there to_uninstall= if ! apk info -q -e alpine-mirrors; then apk add -q alpine-mirrors to_uninstall=alpine-mirrors fi MIRRORS_PATH=/usr/share/alpine-mirrors/MIRRORS.txt if [ -z "$MIRRORS" ] && [ -r "$MIRRORS_PATH" ]; then MIRRORS=`cat $MIRRORS_PATH` fi RELEASES_PATH=/usr/share/alpine-mirrors/RELEASES.txt if [ -z "$RELEASES" ] && [ -r "$RELEASES_PATH" ]; then RELEASES=`cat $RELEASES_PATH` fi APKREPOS_PATH=/etc/apk/repositories if [ -r "$APKREPOS_PATH" ]; then APKREPOS=`cat "$APKREPOS_PATH"` fi get_alpine_release default_answer=f changed= while true; do if [ -n "$JUSTADDRANDOM" ]; then show_mirror_list > /dev/null add_random_mirror && changed=1 && break else show_mirror_list prompt_setup_method $default_answer default_read answer $default_answer case "$answer" in "done") break;; [0-9]*) add_from_list $answer && changed=1;; /*|http://*|ftp://*|https://*) add_from_url "$answer" && changed=1;; r) add_random_mirror && changed=1;; f) add_fastest_mirror && changed=1;; e) edit_repositories && changed=1 && break;; esac if [ -n "$changed" ]; then break fi fi done if [ -n "$changed" ]; then echo -n "Updating repository indexes... " apk update -q && echo "done." fi # clean up if [ -n "$to_uninstall" ]; then apk del -q alpine-mirrors fi