-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate-mirrors
executable file
·146 lines (106 loc) · 2.55 KB
/
update-mirrors
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
# set -o xtrace
declare -r PACDIR="/etc/pacman.d"
declare -r PACNOW="mirrorlist"
declare Pacold="mirrorlist.pacold"
declare -r PACNEW="mirrorlist.pacnew"
declare -r PACTMP="mirrorlist.tmp"
declare -r PACBAK="mirrorlist.backup"
main() {
if ! pushd "${PACDIR}" &>/dev/null; then
fail "Failed to open directory '${PACDIR}'" $?
fi
if ! [[ -e "${PACNOW}" ]]; then
fail "Missing file '${PACNOW}'" 1
fi
set_pacold
echo 'Current mirrorlist:'
print_pacnow
echo
echo 'Backing up current mirrorlist...'
create_pacold
echo
echo 'Creating temporary list of United States servers...'
create_pacnew
filter_mirrors
uncomment_mirrors
echo
echo 'Finding 6 fastest mirrors...'
rank_mirrors
echo
echo 'New mirrorlist:'
print_pacnow
echo
echo 'Backing up new mirrorlist...'
create_pacbak
popd &>/dev/null
echo
echo 'Success.'
}
set_pacold() {
local -i i
local generated
for i in $(seq 1 1000); do
generated="${Pacold}$i"
! [[ -e "${generated}" ]] && break
done
Pacold="${generated}"
}
print_pacnow() {
if ! cat "${PACNOW}"; then
fail "Failed to print '${PACNOW}'" $?
fi
return 0
}
create_pacold() {
copy_file "${PACNOW}" "${Pacold}"
}
copy_file() {
local src="$1"
local dst="$2"
echo "sudo cp -a \"${src}\" \"${dst}\""
if ! sudo cp -a "${src}" "${dst}"; then
fail "Unable to copy '${src}' to '${dst}'" $?
fi
return 0
}
create_pacnew() {
[[ -e "${PACNEW}" ]] && return 0
copy_file "${PACNOW}" "${PACNEW}"
}
filter_mirrors() {
if ! sudo sed -n '/United States/,/##/{p}' "${PACNEW}" | sudo head -n -2 | sudo tee "${PACTMP}" &>/dev/null; then
fail "Failed to remove all non-US mirrors from '${PACNEW}'" $?
fi
return 0
}
uncomment_mirrors() {
if ! sudo sed -i 's/#Server/Server/' "${PACTMP}"; then
fail "Failed to uncomment all mirrors in '${PACTMP}'" $?
fi
return 0
}
rank_mirrors() {
echo "sudo rankmirrors -n 6 \"${PACTMP}\" > \"${PACNOW}\""
if ! sudo rankmirrors -n 6 "${PACTMP}" | sudo tee "${PACNOW}" &>/dev/null; then
fail "Failed to rank mirrors and record them in '${PACNOW}'" $?
fi
cat "${PACNOW}"
}
create_pacbak() {
copy_file "${PACNOW}" "${PACBAK}"
}
err() {
local msg="$1"
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: ${msg}" >&2
}
fail() {
local msg="$1"
local scode="$2"
err "${msg}"
exit "${scode}"
}
main