Last active 3 months ago

Скрипт заменяет штатные репозитории в Debian 12/13 и AlmaLinux 8/9/10 на локальные российские зеркала.

mnogoweb revised this gist 11 months ago. Go to revision

1 file changed, 1 insertion, 1 deletion

setup-local-repos.sh

@@ -6,7 +6,7 @@
6 6 # Как использовать:
7 7 #
8 8 # Установка:
9 - # wget -O setup-local-repos.sh https://t.mnogoweb.com/mnogoweb/bfc651ecb5b64d798a70eb9a7dee02e7/raw/HEAD/update-repos.sh
9 + # wget -O setup-local-repos.sh https://t.mnogoweb.com/mnogoweb/bfc651ecb5b64d798a70eb9a7dee02e7/raw/HEAD/setup-local-repos.sh
10 10 # chmod +x setup-local-repos.sh
11 11 #
12 12 # Основной режим:

mnogoweb revised this gist 11 months ago. Go to revision

No changes

mnogoweb revised this gist 11 months ago. Go to revision

No changes

mnogoweb revised this gist 11 months ago. Go to revision

1 file changed, 18 insertions

update-repos.sh renamed to setup-local-repos.sh

@@ -3,6 +3,24 @@
3 3 # Скрипт для замены репозиториев на локальные российские зеркала
4 4 # Поддерживает Debian 12/13 и AlmaLinux 8/9/10
5 5
6 + # Как использовать:
7 + #
8 + # Установка:
9 + # wget -O setup-local-repos.sh https://t.mnogoweb.com/mnogoweb/bfc651ecb5b64d798a70eb9a7dee02e7/raw/HEAD/update-repos.sh
10 + # chmod +x setup-local-repos.sh
11 + #
12 + # Основной режим:
13 + # sudo ./setup-local-repos.sh
14 + #
15 + # Проверить текущие репозитории:
16 + # sudo ./setup-local-repos.sh --check
17 + #
18 + # Откатить изменения:
19 + # sudo ./setup-local-repos.sh --rollback
20 + #
21 + # Подробный вывод:
22 + # sudo ./setup-local-repos.sh --verbose
23 +
6 24 set -e # Выход при ошибках
7 25
8 26 # Цвета для вывода

mnogoweb revised this gist 11 months ago. Go to revision

No changes

mnogoweb revised this gist 11 months ago. Go to revision

1 file changed, 509 insertions

update-repos.sh(file created)

@@ -0,0 +1,509 @@
1 + #!/bin/bash
2 +
3 + # Скрипт для замены репозиториев на локальные российские зеркала
4 + # Поддерживает Debian 12/13 и AlmaLinux 8/9/10
5 +
6 + set -e # Выход при ошибках
7 +
8 + # Цвета для вывода
9 + RED='\033[0;31m'
10 + GREEN='\033[0;32m'
11 + YELLOW='\033[1;33m'
12 + BLUE='\033[0;34m'
13 + NC='\033[0m' # No Color
14 +
15 + # Функция для вывода с цветом
16 + print_message() {
17 + echo -e "${GREEN}[INFO]${NC} $1"
18 + }
19 +
20 + print_warning() {
21 + echo -e "${YELLOW}[WARN]${NC} $1"
22 + }
23 +
24 + print_error() {
25 + echo -e "${RED}[ERROR]${NC} $1"
26 + }
27 +
28 + print_debug() {
29 + echo -e "${BLUE}[DEBUG]${NC} $1"
30 + }
31 +
32 + # Функция для определения ОС
33 + detect_os() {
34 + if [ -f /etc/os-release ]; then
35 + . /etc/os-release
36 + OS_NAME="$ID"
37 + OS_VERSION="$VERSION_ID"
38 + OS_VERSION_MAJOR=$(echo "$OS_VERSION" | cut -d. -f1)
39 + OS_CODENAME="$VERSION_CODENAME"
40 + elif [ -f /etc/redhat-release ]; then
41 + if grep -qi "alma" /etc/redhat-release; then
42 + OS_NAME="almalinux"
43 + elif grep -qi "centos" /etc/redhat-release; then
44 + OS_NAME="centos"
45 + elif grep -qi "rocky" /etc/redhat-release; then
46 + OS_NAME="rocky"
47 + else
48 + OS_NAME="rhel"
49 + fi
50 + # Извлекаем версию из redhat-release
51 + OS_VERSION=$(grep -oE '[0-9]+\.[0-9]+' /etc/redhat-release | head -1)
52 + if [ -z "$OS_VERSION" ]; then
53 + OS_VERSION=$(grep -oE '[0-9]+' /etc/redhat-release | head -1)
54 + fi
55 + OS_VERSION_MAJOR=$(echo "$OS_VERSION" | cut -d. -f1)
56 + else
57 + print_error "Не удалось определить операционную систему"
58 + exit 1
59 + fi
60 +
61 + print_message "Обнаружена ОС: $OS_NAME $OS_VERSION (мажорная версия: $OS_VERSION_MAJOR)"
62 + }
63 +
64 + # Функция для создания резервной копии файла
65 + backup_file() {
66 + local file="$1"
67 + local backup="${file}.backup.$(date +%Y%m%d_%H%M%S)"
68 +
69 + if [ -f "$file" ]; then
70 + cp "$file" "$backup"
71 + print_message "Создана резервная копия: $backup"
72 + echo "$backup" # Возвращаем имя резервной копии
73 + fi
74 + }
75 +
76 + # Функция для проверки доступности зеркала
77 + check_mirror() {
78 + local mirror="$1"
79 + local test_url="$2"
80 +
81 + print_debug "Проверка доступности зеркала: $mirror"
82 +
83 + if curl --silent --head --fail --max-time 5 "$test_url" > /dev/null 2>&1; then
84 + print_message "Зеркало $mirror доступно"
85 + return 0
86 + else
87 + print_warning "Зеркало $mirror недоступно или отвечает медленно"
88 + return 1
89 + fi
90 + }
91 +
92 + # Функции для Debian
93 + setup_debian_repos() {
94 + local version="$1"
95 + local sources_list="/etc/apt/sources.list"
96 + local sources_dir="/etc/apt/sources.list.d/"
97 +
98 + print_message "Настройка репозиториев для Debian $version"
99 +
100 + # Создаем резервную копию
101 + backup_file "$sources_list"
102 +
103 + # Российские зеркала для Debian
104 + # Список приоритетных зеркал (проверяем доступность)
105 + local mirrors=(
106 + "http://mirror.yandex.ru/debian/"
107 + "http://ftp.ru.debian.org/debian/"
108 + "http://mirror.truenetwork.ru/debian/"
109 + )
110 +
111 + local selected_mirror=""
112 + local selected_security_mirror=""
113 +
114 + # Проверяем доступность зеркал
115 + for mirror in "${mirrors[@]}"; do
116 + if check_mirror "$mirror" "${mirror}dists/stable/Release"; then
117 + selected_mirror="$mirror"
118 + # Для зеркал безопасности используем соответствующие URL
119 + if [[ "$mirror" == *"mirror.yandex.ru"* ]]; then
120 + selected_security_mirror="http://mirror.yandex.ru/debian-security/"
121 + elif [[ "$mirror" == *"ftp.ru.debian.org"* ]]; then
122 + selected_security_mirror="http://ftp.ru.debian.org/debian-security/"
123 + else
124 + selected_security_mirror="${mirror%-}/debian-security/"
125 + fi
126 + break
127 + fi
128 + done
129 +
130 + # Если ни одно зеркало не доступно, используем Yandex по умолчанию
131 + if [ -z "$selected_mirror" ]; then
132 + print_warning "Все зеркала недоступны, используем Yandex по умолчанию"
133 + selected_mirror="http://mirror.yandex.ru/debian/"
134 + selected_security_mirror="http://mirror.yandex.ru/debian-security/"
135 + fi
136 +
137 + print_message "Используется основное зеркало: $selected_mirror"
138 + print_message "Используется зеркало безопасности: $selected_security_mirror"
139 +
140 + # Определяем кодовое имя релиза
141 + local codename
142 + case "$version" in
143 + "12") codename="bookworm" ;;
144 + "13") codename="trixie" ;;
145 + *) codename="bookworm" ;; # По умолчанию для других версий
146 + esac
147 +
148 + # Создаем новый sources.list с выбранными зеркалами
149 + cat > "$sources_list" << EOF
150 + # Российские зеркала для Debian $version ($codename)
151 + deb $selected_mirror $codename main contrib non-free non-free-firmware
152 + deb $selected_mirror $codename-updates main contrib non-free non-free-firmware
153 + deb $selected_security_mirror $codename-security main contrib non-free non-free-firmware
154 +
155 + # Дополнительные компоненты
156 + # deb $selected_mirror $codename-backports main contrib non-free non-free-firmware
157 + EOF
158 +
159 + # Обновляем репозитории в sources.list.d с помощью sed
160 + for file in "$sources_dir"*.list; do
161 + if [ -f "$file" ]; then
162 + backup_file "$file"
163 + print_debug "Обновление репозиториев в файле: $(basename "$file")"
164 +
165 + # Заменяем стандартные репозитории на российские зеркала
166 + sed -i \
167 + -e "s|http://deb.debian.org/debian|$selected_mirror|g" \
168 + -e "s|https://deb.debian.org/debian|$selected_mirror|g" \
169 + -e "s|http://security.debian.org|$selected_security_mirror|g" \
170 + -e "s|https://security.debian.org|$selected_security_mirror|g" \
171 + -e "s|http://ftp.debian.org|$selected_mirror|g" \
172 + -e "s|https://ftp.debian.org|$selected_mirror|g" \
173 + "$file"
174 + fi
175 + done
176 +
177 + print_message "Обновление списка пакетов..."
178 + if apt-get update; then
179 + print_message "Список пакетов успешно обновлен"
180 + else
181 + print_warning "Обновление списка пакетов завершилось с предупреждениями"
182 + fi
183 + }
184 +
185 + # Функции для AlmaLinux
186 + setup_almalinux_repos() {
187 + local version="$1"
188 + local repo_dir="/etc/yum.repos.d/"
189 +
190 + print_message "Настройка репозиториев для AlmaLinux $version"
191 +
192 + # Российские зеркала для AlmaLinux
193 + local mirrors=(
194 + "http://mirror.yandex.ru/almalinux/"
195 + "http://mirror.nucleus.be/almalinux/" # Российское зеркало Selectel
196 + "http://mirror.docker.ru/almalinux/"
197 + )
198 +
199 + local selected_mirror=""
200 +
201 + # Проверяем доступность зеркал
202 + for mirror in "${mirrors[@]}"; do
203 + if check_mirror "$mirror" "${mirror}${version}/BaseOS/x86_64/os/repodata/repomd.xml"; then
204 + selected_mirror="$mirror"
205 + break
206 + fi
207 + done
208 +
209 + # Если ни одно зеркало не доступно, используем Yandex по умолчанию
210 + if [ -z "$selected_mirror" ]; then
211 + print_warning "Все зеркала недоступны, используем Yandex по умолчанию"
212 + selected_mirror="http://mirror.yandex.ru/almalinux/"
213 + fi
214 +
215 + print_message "Используется зеркало: $selected_mirror"
216 +
217 + # Создаем резервные копии всех репозиториев
218 + print_message "Создание резервных копий репозиториев..."
219 + for repo_file in "$repo_dir"*.repo; do
220 + if [ -f "$repo_file" ]; then
221 + backup_file "$repo_file"
222 + fi
223 + done
224 +
225 + # Основные файлы репозиториев для AlmaLinux
226 + local repo_files=(
227 + "almalinux.repo"
228 + "almalinux-baseos.repo"
229 + "almalinux-appstream.repo"
230 + "almalinux-extras.repo"
231 + "almalinux-powertools.repo" # Для версии 8
232 + "almalinux-crb.repo" # Для версий 9+
233 + )
234 +
235 + # Список паттернов для замены
236 + local patterns=(
237 + "https://repo.almalinux.org"
238 + "http://repo.almalinux.org"
239 + "https://mirror.almalinux.org"
240 + "http://mirror.almalinux.org"
241 + "https://cdn.redhat.com"
242 + "http://cdn.redhat.com"
243 + )
244 +
245 + # Заменяем URL во всех репозиторных файлах с помощью sed
246 + print_message "Замена URL репозиториев на российские зеркала..."
247 +
248 + for repo_file in "$repo_dir"*.repo; do
249 + if [ -f "$repo_file" ]; then
250 + local filename=$(basename "$repo_file")
251 + print_debug "Обработка файла: $filename"
252 +
253 + # Создаем временный файл для новой конфигурации
254 + local temp_file=$(mktemp)
255 +
256 + # Обрабатываем файл построчно
257 + while IFS= read -r line; do
258 + # Заменяем baseurl и metalink
259 + if [[ "$line" =~ ^(baseurl|metalink)\s*= ]]; then
260 + # Заменяем все паттерны на выбранное зеркало
261 + local new_line="$line"
262 + for pattern in "${patterns[@]}"; do
263 + new_line="${new_line//$pattern/$selected_mirror}"
264 + done
265 +
266 + # Для baseurl добавляем параметры репозитория
267 + if [[ "$new_line" =~ ^baseurl= ]] && [[ ! "$new_line" =~ /\$releasever/ ]]; then
268 + new_line="baseurl=$selected_mirror\$releasever/\$basearch/os/"
269 + fi
270 +
271 + echo "$new_line" >> "$temp_file"
272 + else
273 + echo "$line" >> "$temp_file"
274 + fi
275 + done < "$repo_file"
276 +
277 + # Заменяем оригинальный файл
278 + mv "$temp_file" "$repo_file"
279 +
280 + # Дополнительная обработка sed для надежности
281 + sed -i \
282 + -e "s|https://repo.almalinux.org|$selected_mirror|gI" \
283 + -e "s|http://repo.almalinux.org|$selected_mirror|gI" \
284 + -e "s|https://mirror.almalinux.org|$selected_mirror|gI" \
285 + -e "s|http://mirror.almalinux.org|$selected_mirror|gI" \
286 + -e "s|https://cdn.redhat.com|$selected_mirror|gI" \
287 + -e "s|http://cdn.redhat.com|$selected_mirror|gI" \
288 + "$repo_file"
289 +
290 + # Отключаем metalink и включаем baseurl
291 + sed -i \
292 + -e '/^metalink/s/^/#/' \
293 + -e '/^#baseurl/s/^#//' \
294 + -e '/^mirrorlist/s/^/#/' \
295 + "$repo_file"
296 + fi
297 + done
298 +
299 + # Специфичные настройки для разных версий
300 + case "$version" in
301 + "8")
302 + # Для версии 8
303 + for repo_file in "$repo_dir"almalinux*.repo; do
304 + if [ -f "$repo_file" ]; then
305 + sed -i \
306 + -e "s|/AppStream/|/AppStream/|g" \
307 + -e "s|/PowerTools/|/PowerTools/|g" \
308 + -e "s|/BaseOS/|/BaseOS/|g" \
309 + "$repo_file"
310 + fi
311 + done
312 + ;;
313 + "9"|"10")
314 + # Для версий 9 и 10
315 + for repo_file in "$repo_dir"almalinux*.repo; do
316 + if [ -f "$repo_file" ]; then
317 + sed -i \
318 + -e "s|/AppStream/|/AppStream/|g" \
319 + -e "s|/CRB/|/CRB/|g" \
320 + -e "s|/BaseOS/|/BaseOS/|g" \
321 + "$repo_file"
322 + fi
323 + done
324 + ;;
325 + esac
326 +
327 + print_message "Очистка кэша DNF..."
328 + dnf clean all
329 +
330 + print_message "Проверка доступности репозиториев..."
331 + if dnf repolist -v; then
332 + print_message "Репозитории успешно настроены"
333 +
334 + # Показываем информацию о репозиториях
335 + echo ""
336 + print_message "Список активных репозиториев:"
337 + dnf repolist enabled
338 + else
339 + print_warning "Есть проблемы с доступностью репозиториев"
340 + print_warning "Проверьте настройки сети или выберите другое зеркало"
341 + fi
342 + }
343 +
344 + # Функция для проверки текущих репозиториев
345 + check_current_repos() {
346 + print_message "Текущие репозитории:"
347 +
348 + case "$OS_NAME" in
349 + "debian")
350 + grep -h "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null | head -10
351 + ;;
352 + "almalinux")
353 + grep -h "^\s*baseurl" /etc/yum.repos.d/*.repo 2>/dev/null | head -10
354 + ;;
355 + esac
356 + }
357 +
358 + # Функция для отката изменений
359 + rollback_changes() {
360 + print_message "Поиск резервных копий для отката..."
361 +
362 + case "$OS_NAME" in
363 + "debian")
364 + local backup_files=$(find /etc/apt -name "*.backup.*" -type f | sort -r)
365 + ;;
366 + "almalinux")
367 + local backup_files=$(find /etc/yum.repos.d -name "*.backup.*" -type f | sort -r)
368 + ;;
369 + esac
370 +
371 + if [ -z "$backup_files" ]; then
372 + print_error "Резервные копии не найдены"
373 + return 1
374 + fi
375 +
376 + # Берем последнюю резервную копию
377 + local latest_backup=$(echo "$backup_files" | head -1)
378 + local original_file="${latest_backup%.backup.*}"
379 +
380 + print_message "Восстановление из: $latest_backup"
381 + print_message "В файл: $original_file"
382 +
383 + if cp "$latest_backup" "$original_file"; then
384 + print_message "Откат выполнен успешно"
385 +
386 + # Обновляем кэш пакетов
387 + case "$OS_NAME" in
388 + "debian")
389 + apt-get update
390 + ;;
391 + "almalinux")
392 + dnf clean all
393 + dnf repolist
394 + ;;
395 + esac
396 + else
397 + print_error "Ошибка при откате изменений"
398 + fi
399 + }
400 +
401 + # Основная функция
402 + main() {
403 + # Проверяем права суперпользователя
404 + if [ "$EUID" -ne 0 ]; then
405 + print_error "Запустите скрипт с правами root (sudo)"
406 + exit 1
407 + fi
408 +
409 + print_message "Начало настройки локальных репозиториев..."
410 +
411 + # Определяем ОС
412 + detect_os
413 +
414 + # Показываем текущие репозитории
415 + check_current_repos
416 +
417 + echo ""
418 + print_warning "Вы собираетесь заменить репозитории на российские зеркала."
419 + print_warning "Будут созданы резервные копии конфигурационных файлов."
420 + echo ""
421 +
422 + read -p "Продолжить? (y/N): " -n 1 -r
423 + echo
424 + if [[ ! $REPLY =~ ^[Yy]$ ]]; then
425 + print_message "Операция отменена пользователем"
426 + exit 0
427 + fi
428 +
429 + # Выбираем действие в зависимости от ОС
430 + case "$OS_NAME" in
431 + "debian")
432 + setup_debian_repos "$OS_VERSION_MAJOR"
433 + ;;
434 + "almalinux")
435 + setup_almalinux_repos "$OS_VERSION_MAJOR"
436 + ;;
437 + "centos"|"rocky"|"rhel")
438 + print_warning "Обнаружена $OS_NAME, будет применена конфигурация для AlmaLinux"
439 + setup_almalinux_repos "$OS_VERSION_MAJOR"
440 + ;;
441 + *)
442 + print_error "Неподдерживаемая операционная система: $OS_NAME"
443 + print_warning "Поддерживаются только Debian, AlmaLinux, CentOS, Rocky Linux и RHEL"
444 + exit 1
445 + ;;
446 + esac
447 +
448 + echo ""
449 + print_message "Настройка репозиториев успешно завершена!"
450 + print_warning "Рекомендуется проверить работоспособность репозиториев:"
451 +
452 + case "$OS_NAME" in
453 + "debian")
454 + echo " apt update && apt install -y neofetch"
455 + ;;
456 + "almalinux"|"centos"|"rocky"|"rhel")
457 + echo " dnf update && dnf install -y neofetch"
458 + ;;
459 + esac
460 + }
461 +
462 + # Обработка аргументов командной строки
463 + if [[ $# -gt 0 ]]; then
464 + case $1 in
465 + "-h"|"--help")
466 + echo "Использование: $0 [OPTIONS]"
467 + echo "Скрипт для замены штатных репозиториев на локальные российские зеркала"
468 + echo ""
469 + echo "Опции:"
470 + echo " -h, --help Показать эту справку"
471 + echo " -c, --check Проверить текущие репозитории"
472 + echo " -r, --rollback Откатить последние изменения"
473 + echo " -v, --verbose Подробный вывод"
474 + echo ""
475 + echo "Поддерживаемые ОС:"
476 + echo " - Debian 12 (Bookworm)"
477 + echo " - Debian 13 (Trixie)"
478 + echo " - AlmaLinux 8"
479 + echo " - AlmaLinux 9"
480 + echo " - AlmaLinux 10"
481 + echo " - CentOS/Rocky Linux/RHEL 8/9/10"
482 + echo ""
483 + echo "Автоматически создаются резервные копии конфигурационных файлов"
484 + exit 0
485 + ;;
486 + "-c"|"--check")
487 + detect_os
488 + check_current_repos
489 + exit 0
490 + ;;
491 + "-r"|"--rollback")
492 + detect_os
493 + rollback_changes
494 + exit 0
495 + ;;
496 + "-v"|"--verbose")
497 + set -x # Включить режим отладки
498 + main
499 + ;;
500 + *)
501 + print_error "Неизвестный аргумент: $1"
502 + echo "Используйте $0 --help для справки"
503 + exit 1
504 + ;;
505 + esac
506 + else
507 + # Запуск основной функции
508 + main
509 + fi
Newer Older