From 88ab56c61779402d02ef8c577112b25d33f41f03 Mon Sep 17 00:00:00 2001 From: cytopia Date: Wed, 25 Jul 2018 17:17:36 +0200 Subject: [PATCH] Harden linkcheck --- docs/linkcheck.sh | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/docs/linkcheck.sh b/docs/linkcheck.sh index 2f5c00f0..8b5bc4ce 100755 --- a/docs/linkcheck.sh +++ b/docs/linkcheck.sh @@ -1,19 +1,42 @@ #!/usr/bin/env bash +setval() { + printf -v "$1" "%s" "$(cat)"; + declare -p "$1"; +} RETURN=0 for url in $(find _includes/ -name \*.rst -exec grep -Eo 'http(s)?://[-?:,._a/#-Z0-9]+' {} \; | sort -u ); do - header="$( curl -I "${url}" 2>/dev/null )" - line="$( echo "${header}" | grep -E '^HTTP/(1|2)' )" - stat="$( echo "${line}" | awk '{print $2}' )" + # Try to curl multiple times in case host is currently not reachable + max=60; i=0; fail=0 + eval "$( curl -SsI "${url}" 2> >(setval errval) > >(setval header); <<<"$?" setval retval; )" + while [ "${retval}" != "0" ] ; do + #while ! header="$( curl -I "${url}" 2>/dev/null )"; do + i=$(( i + 1 )) + sleep 2 + if [ "${i}" -gt "${max}" ]; then + fail=1 + break; + fi + done - if [ "${stat}" != "200" ]; then - printf "\e[0;31m[ERR]\e[0m %s %s\n" "${url}" "${line}" - RETURN=1 + # Curl request failed + if [ "${fail}" = "1" ]; then + printf "\e[0;31m[FAIL]\e[0m %s %s\n" "${url}" "${errval}" + + # Curl request succeeded else - printf "\e[0;32m[OK]\e[0m %s\n" "${url}" + line="$( echo "${header}" | grep -E '^HTTP/(1|2)' )" + stat="$( echo "${line}" | awk '{print $2}' )" + + if [ "${stat}" != "200" ]; then + printf "\e[0;31m[ERR]\e[0m %s %s\n" "${url}" "${line}" + RETURN=1 + else + printf "\e[0;32m[OK]\e[0m %s\n" "${url}" + fi fi done