setup-apkrepos.in 4.17 KB
Newer Older
1 2 3 4 5 6 7
#!/bin/sh

PROGRAM=setup-apkrepos
PREFIX=

. $PREFIX/lib/libalpine.sh

Matt Smith's avatar
Matt Smith committed
8

9 10 11 12 13
get_hostname_from_url() {
	local n=${1#*://}
	echo ${n%%/*}
}

Matt Smith's avatar
Matt Smith committed
14
prompt_setup_method() {
15 16 17 18 19
	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]: "
Matt Smith's avatar
Matt Smith committed
20 21
}

22
add_random_mirror() {
Matt Smith's avatar
Matt Smith committed
23
	local i=0
24
	local random_mirror_index=$(( $RANDOM % $mirror_count ))
Matt Smith's avatar
Matt Smith committed
25 26 27 28 29 30
	
	echo -n "Picking random mirror... "
	for mirror in $MIRRORS; do
		if [ $i -eq $random_mirror_index ]; then
			break
		fi
31
		i=$(( $i + 1 ))
Matt Smith's avatar
Matt Smith committed
32
	done
33
	add_mirror $mirror
Matt Smith's avatar
Matt Smith committed
34 35
}

36 37 38 39 40 41
time_cmd() {
	local start=$(cut -d ' ' -f1 /proc/uptime)
	$@ >&2
	awk -v start=$start -v end=$(cut -d ' ' -f1 /proc/uptime) \
		'BEGIN {print end - start; exit}'
}
Matt Smith's avatar
Matt Smith committed
42

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
find_fastest_mirror() {
	export http_proxy=
	local url=
	for url in $MIRRORS; do
		echo $(time_cmd apk update --quiet \
				--repository $url/edge/main \
				--repositories-file /dev/null) $url
	done | awk ' {
		if (!current) {
			current=$1
			url=$2
		} else {
			if ($1 < current) {
				current=$1
				url=$2
			}
		}
		printf("%6.2f %s\n", $1, $2) > "/dev/stderr"
	}
	END { print url }'
}

add_fastest_mirror() {
	echo "Finding fastest mirror... "
	local fastest=$(find_fastest_mirror)
	add_mirror "$fastest"
Matt Smith's avatar
Matt Smith committed
69 70
}

71
# show mirrors and store how many in global mirror_count
72
show_mirror_list() {
73 74 75
	local mirror i=0
	mirror_count=0
	[ -z "$MIRRORS" ] && return
76
	echo ""
77
	echo "Available mirrors:"
78 79
	for mirror in $MIRRORS; do
		i=$(($i + 1))
80
		echo "$i) $(get_hostname_from_url $mirror)"
81
	done
82 83
	echo ""
	mirror_count=$i
84 85
}

86 87 88 89 90
add_from_list() {
	local mirror_index=$1
	if [ $mirror_index -lt 1 ] || [ $mirror_index -gt $mirror_count ]; then
		return 1
	fi
Matt Smith's avatar
Matt Smith committed
91
	set $MIRRORS
92
	eval "mirror=\$$mirror_index"
93
	add_mirror "$mirror"
Matt Smith's avatar
Matt Smith committed
94 95 96
}

get_alpine_release() {
97 98
	local version=$(cat /etc/alpine-release 2>/dev/null)
	case "$version" in
99
		*_git*|*_alpha*) release="edge";;
100 101
		[0-9]*.[0-9]*.[0-9]*)
			# release in x.y.z format, cut last digit
102 103 104
			release=v${version%.[0-9]*};;
		*)	# fallback to edge
			release="edge";;
105
	esac
Matt Smith's avatar
Matt Smith committed
106
}
107

108 109
add_mirror() {
	local mirror="$1"
110 111
	echo "${mirror%/}/${release}/main" >> $APKREPOS_PATH
	echo "#${mirror%/}/${release}/testing" >> $APKREPOS_PATH
112 113 114
	echo "" >> $APKREPOS_PATH
	echo "Added mirror $(get_hostname_from_url $mirror)"
}
Matt Smith's avatar
Matt Smith committed
115

116 117 118
add_from_url() {
	echo "$1" >> $APKREPOS_PATH
	echo "" >> $APKREPOS_PATH
Matt Smith's avatar
Matt Smith committed
119 120
}

121 122 123 124 125 126
edit_repositories() {
	local md5=$(md5sum $APKREPOS_PATH)
	${EDITOR:-vi} "$APKREPOS_PATH"
	# return true if file changed
	test "$(md5sum $APKREPOS_PATH)" != "$md5"
}
Matt Smith's avatar
Matt Smith committed
127

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
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


Matt Smith's avatar
Matt Smith committed
150
# main
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
# 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

173 174


175 176 177 178
get_alpine_release
default_answer=f
changed=
while true; do
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
	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
196
			break
197
		fi
198 199
	fi
done
Matt Smith's avatar
Matt Smith committed
200

201 202 203
if [ -n "$changed" ]; then
	echo -n "Updating repository indexes... "
	apk update -q && echo "done."
204
fi
205 206 207 208 209

# clean up
if [ -n "$to_uninstall" ]; then
	apk del -q alpine-mirrors
fi