When automating system administration tasks, we often need to verify repository connectivity before proceeding with package operations. The default yum update
behavior of trying multiple mirrors with long timeouts can be problematic in scripts.
The most efficient way to test connectivity is using yum
with the --noplugins
and -q
flags:
yum --noplugins -q check-update &>/dev/null
echo $? # Returns 0 if repos are accessible, non-zero otherwise
Here's a robust implementation for your scripts:
#!/bin/bash
check_yum_connectivity() {
local timeout=10 # seconds
local yum_test_cmd="yum --noplugins -q check-update"
# Use timeout in case of hanging
timeout $timeout $yum_test_cmd &>/dev/null
return $?
}
if check_yum_connectivity; then
echo "Yum repositories are accessible"
# Proceed with your package operations
else
echo "ERROR: Could not access yum repositories" >&2
exit 1
fi
To check individual repositories while ignoring others:
yum --disablerepo="*" --enablerepo="epel" -q check-update
For environments requiring proxies, you might want to explicitly test the proxy first:
check_http_proxy() {
local proxy=${1:-$http_proxy}
curl -s --connect-timeout 5 --max-time 10 \
--proxy "$proxy" http://mirrorlist.centos.org &>/dev/null
}
The --noplugins
option significantly speeds up the check by skipping unnecessary plugin initialization. In testing, this reduces the check time from 20-30 seconds to typically under 5 seconds.
When automating system administration tasks, we often need to verify yum repository connectivity before proceeding with package operations. The default yum update
or yum list
commands can hang for minutes when network connectivity issues exist, especially when:
- Proxy settings are misconfigured
- Repository mirrors are unreachable
- DNS resolution fails
- Corporate firewalls block access
Here are three reliable methods to test yum connectivity with minimal overhead:
1. Using yum's --noplugins and --quiet Flags
yum --noplugins --quiet check-update &> /dev/null
if [ $? -eq 0 ]; then
echo "Yum repositories accessible"
else
echo "Yum connectivity issue detected"
fi
2. Testing Specific Repository Metadata
timeout 10 yum --disablerepo="*" --enablerepo="base" makecache &> /dev/null
case $? in
0) echo "Success";;
124) echo "Timeout occurred";;
*) echo "Other failure";;
esac
3. Direct URL Testing with curl
For more granular control, test against actual repository URLs:
REPO_URL=$(yum repoinfo base | grep -oP 'baseurl=\\K[^ ]*')
if curl --connect-timeout 5 --silent --head "$REPO_URL/repodata/repomd.xml" | grep "200 OK" > /dev/null; then
echo "Repository is responsive"
else
echo "Connectivity problem"
fi
For production use, consider this robust implementation:
#!/bin/bash
check_yum_connectivity() {
local timeout_seconds=15
local status_file=$(mktemp)
(yum --noplugins --quiet check-update &> "${status_file}") & pid=$!
(sleep "${timeout_seconds}" && kill -HUP "${pid}") &>/dev/null & killer=$!
if wait "${pid}" &>/dev/null; then
pkill -HUP -P "${killer}"
wait "${killer}"
if grep -q "Error:" "${status_file}"; then
return 1
else
return 0
fi
else
return 124
fi
rm -f "${status_file}"
}
check_yum_connectivity
case $? in
0) exit 0;;
1) exit 1;;
124) exit 2;;
esac
For tools like Ansible, create custom facts:
- name: Check yum connectivity
shell: yum --noplugins --quiet check-update &> /dev/null
register: yum_check
ignore_errors: yes
changed_when: false
timeout: 10
- name: Set connectivity fact
set_fact:
yum_accessible: "{{ yum_check.rc == 0 }}"