#!/usr/bin/env bash # # JbTecWiz Support Centre -- generated fix script # # Fault : "Failed to synchronize cache for repo" / "Cannot prepare internal mirrorlist" # Fix : Work through the curl error # Source: https://jbtecwiz.com/support/lnx-dnf-cache # # Run as : Shell as root # Expect : 30 minutes # Risk : low # Reversible : yes # # WHEN THIS IS THE RIGHT FIX # A supported distribution whose repositories should still exist. # # HOW TO UNDO IT # Re-enable a repository with dnf config-manager --set-enabled. # # Walks the fix one step at a time and asks before each. Steps with no # command are yours to do -- it prints those and waits. DRYRUN=1 prints # without executing; UNATTENDED=1 does not ask. # # -------------------------------------------------------------------- # NO WARRANTY - USE AT YOUR OWN RISK # # This script is provided by JbTecWiz as-is and with no warranty of any # kind, express or implied. You run it entirely at your own risk. # # JbTecWiz accepts no liability for any loss or damage arising from its # use, including but not limited to data loss, downtime, or configuration # changes that turn out to be wrong for your system. # # You are responsible for reading this script before running it, for # satisfying yourself that it suits the machine in front of you, and for # having a working backup first. Some steps cannot be undone. # -------------------------------------------------------------------- set -uo pipefail DRYRUN="${DRYRUN:-0}" UNATTENDED="${UNATTENDED:-0}" failed=0 if [ "$(id -u)" -ne 0 ]; then echo " This fix is documented as needing root. Re-run with sudo." >&2 exit 3 fi rule() { printf "\n%s\n" "$(printf '-%.0s' $(seq 1 70))"; if [ $# -gt 0 ]; then echo "$1"; fi; } prose() { echo "$1" | fold -s -w 74 | sed "s/^/ /"; } # Returns 0 when the caller should run the command, 1 when it should not. # A manual step always returns 1 -- there is nothing for the caller to run. step() { # step [command lines...] local n="$1" dotext="$2" why="$3" mode="$4"; shift 4 rule " Step $n of 6" prose "$dotext" if [ -n "$why" ]; then echo; prose "$why"; fi if [ "$mode" = "manual" ]; then echo; echo " -> Do this yourself, then press Enter to carry on." if [ "$UNATTENDED" = "0" ] && [ "$DRYRUN" = "0" ]; then read -r _; fi return 1 fi echo; printf " %s\n" "$@"; echo if [ "$DRYRUN" = "1" ]; then echo " (dry run -- not executed)"; return 1; fi if [ "$UNATTENDED" = "0" ]; then read -r -p " Run this step? [Y]es / [S]kip / [Q]uit " a case "$a" in [Qq]*) echo " Stopped at your request."; exit 0 ;; [Ss]*) echo " Skipped."; return 1 ;; esac fi return 0 } rule echo " "Failed to synchronize cache for repo" / "Cannot prepare internal mirrorlist"" echo " Work through the curl error" echo echo " Risk: low Reversible 30 minutes" echo prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' rule echo if [ "$UNATTENDED" = "0" ] && [ "$DRYRUN" = "0" ]; then read -r -p " Ready? [y/N] " go case "$go" in [Yy]*) ;; *) echo " Nothing was changed."; exit 0;; esac fi if step 1 'Get the full error including the curl number.' '' cmd 'sudo dnf clean all && sudo dnf makecache 2>&1 | tail -20'; then sudo dnf clean all && sudo dnf makecache 2>&1 | tail -20 if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 1 failed. The rest of the fix may depend on it." >&2 fi fi if step 2 'Curl error 6 -- DNS. Test resolution.' '' cmd 'getent hosts mirrors.rockylinux.org' 'cat /etc/resolv.conf'; then getent hosts mirrors.rockylinux.org cat /etc/resolv.conf if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 2 failed. The rest of the fix may depend on it." >&2 fi fi if step 3 'Curl error 60 -- certificate. Check the clock first, then the CA bundle.' 'A clock wrong by more than the certificate'\''s validity window makes every HTTPS mirror fail validation, and the error says nothing about time.' cmd 'timedatectl' 'sudo update-ca-trust extract'; then timedatectl sudo update-ca-trust extract if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 3 failed. The rest of the fix may depend on it." >&2 fi fi if step 4 'Curl error 7 or 28 -- connectivity or proxy. Set the proxy in dnf'\''s own config if one is needed.' '' cmd 'grep -i proxy /etc/dnf/dnf.conf /etc/yum.conf 2>/dev/null' 'curl -sS -o /dev/null -w '\''%{http_code}\n'\'' https://mirrors.rockylinux.org'; then grep -i proxy /etc/dnf/dnf.conf /etc/yum.conf 2>/dev/null curl -sS -o /dev/null -w '%{http_code}\n' https://mirrors.rockylinux.org if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 4 failed. The rest of the fix may depend on it." >&2 fi fi if step 5 'Test one repository at a time to find which is broken.' '' cmd 'sudo dnf repolist --all' 'sudo dnf makecache --repo=baseos'; then sudo dnf repolist --all sudo dnf makecache --repo=baseos if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 5 failed. The rest of the fix may depend on it." >&2 fi fi if step 6 'Disable a repository that is genuinely gone rather than letting it block everything.' '' cmd 'sudo dnf config-manager --set-disabled brokenrepo'; then sudo dnf config-manager --set-disabled brokenrepo if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 6 failed. The rest of the fix may depend on it." >&2 fi fi rule " Confirm it worked" prose 'Metadata downloads.' if [ "$DRYRUN" = "0" ]; then sudo dnf makecache && sudo dnf repolist fi rule if [ "$failed" -gt 0 ]; then echo " Finished with $failed failed step(s)." echo " Read the full write-up at https://jbtecwiz.com/support/lnx-dnf-cache" else echo " Finished." fi echo prose 'To undo: Re-enable a repository with dnf config-manager --set-enabled.' rule