Назад | Перейти на главную страницу

Проверяете подключение yum из скрипта?

Когда возникает проблема с доступом к репозиториям yum (например, если необходимый прокси не настроен), выполнение команды типа «yum update» будет ждать очень долго, пробуя множество разных зеркал. Иногда это хорошо, но иногда я предпочитаю быстро проверить, в порядке ли доступ к репозиториям yum.

Есть ли способ заставить yum быстро проверить его подключение и дать мне код состояния, указывающий, в порядке ли доступ к удаленным репозиториям?

Вот один из способов сделать это, суть в этом * Repo-baseurl: ", о котором сообщает команда yum repolist:

# curl -s --dump-header - `yum repolist rhcd -v | grep Repo-baseurl | awk  '{print $2}'` -o  /dev/null

HTTP/1.1 200 OK
Date: Fri, 17 May 2013 09:58:30 GMT
Server: Apache/2.2.3 (CentOS)
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html;charset=ISO-8859-1

Разбивка этого:

 yum repolist rhcd -v
Loading "fastestmirror" plugin
Config time: 0.104
Yum Version: 3.2.22
Loading mirror speeds from cached hostfile
Repo-id     : rhcd
Repo-name   : rhcd
Repo-status : enabled:
Repo-updated: Mon Nov  1 14:37:19 2010
Repo-pkgs   : 2,599
Repo-size   : 3.7 G
Repo-baseurl: http://lochost:81/core_build/il31/centos/5Server/i386/CentOS/

Извлеките baseurl с помощью grep и pipe to awk для URL-адреса.

используйте параметр заголовка дампа curl, чтобы увидеть статус http:

HTTP/1.1 200 OK
Date: Fri, 17 May 2013 09:58:30 GMT
Server: Apache/2.2.3 (CentOS)
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html;charset=ISO-8859-1

Конечно, yum - это действительно хорошо скомпонованная программа на Python, поэтому я думаю, вы также можете собрать ее как утилиту python, импортирующую соответствующие части yum.

Без репозитория yum repolist отобразит все репозитории yum. Затем вы можете обрабатывать их в цикле.

Для меня сработала следующая команда:

yum repolist -v | grep Repo-baseurl | awk  '{print $3}'

вместо этого:

yum repolist rhcd -v | grep Repo-baseurl | awk  '{print $2}'

А для нескольких yum-репозиториев вы можете сделать следующее:

for repourl in $(yum repolist -v | grep Repo-baseurl | awk  '{print $3}') ; do echo $repourl; curl -s --dump-header - $repourl -o  /dev/null; done

Результатом будет:

http://repo-url-1/
HTTP/1.1 200 OK
Date: Sat, 31 Aug 2019 08:32:35 GMT
Server: Apache/2.2.15 (CentOS)
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html;charset=UTF-8

http://repo-url-2/
HTTP/1.1 200 OK
Date: Sat, 31 Aug 2019 08:32:36 GMT
Server: Apache/2.2.15 (CentOS)
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html;charset=UTF-8

Я не думаю, что есть общая команда для проверки подключения yum. Что вы можете сделать, так это создать тестовое репо в /etc/yum.repos.d/test.repo который просто проверяет одно место, а не весь список зеркал, поэтому все идет быстрее.

[test]
name= test
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
enabled = 0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

а затем введите команду yum в форме

yum --disablerepo=* --enablerepo=test list available

если вы получаете сообщение об ошибке подключения, скорее всего, неисправно ваше подключение к Интернету. Конечно, centos.org также может быть недоступен в приведенном выше примере, но шансы на это меньше.

У меня была такая же потребность (проверьте, правильно ли настроен прокси), и хотя приведенные выше решения давали подсказки, ни одно из них не было полным решением, поскольку проверка с помощью curl не использует прокси-сервер http, настроенный в yum.

Во-первых, прокси yum можно настроить:

  • за репо, добавив proxy=http://<proxy_ip>:<proxy_port> в каждом /etc/yum.repos.d/*.repo

  • глобально, добавив proxy=http://<ip>:<port> и http_caching=none в yum.conf (без кеширования, чтобы избежать устаревания repmod.xml, вызывающего несоответствие контрольной суммы)

1. Сначала получите список репозиториев и URL-адресов:

#Produces a csv with 'repo_id#repo_url' rows
yum repolist enabled -v|egrep 'Repo-id|Repo-baseurl' | paste -sd ' \n' | awk '{printf ("%s#%s\n",$3,$6)}' > repolist.csv

2. Очистите кеш yum, чтобы избежать кеширования ответов.

yum clean all

Затем для каждого репозитория в repolist.csv выполните следующие действия:

3а. запросить содержимое репо с помощью yum (около 15 секунд для базы)

#count packages, outputs: 9352
yum --quiet --disablerepo=* --enablerepo=base list available|wc -l

3b. в качестве альтернативы запросить конкретный пакет с повторным запросом (около 7 секунд для базы)

# outputs: 1
repoquery --repoid=base --qf "%-20{repoid} %{name}"  openssh-clients|wc -l