From ce5ef79a3a7717c9f85e449658fc8d39c386fac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6nig?= Date: Wed, 11 Sep 2024 13:31:47 +0200 Subject: [PATCH] Reduce code duplications and add check via IPv6 without hard-coded nameserver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian König --- automated install/basic-install.sh | 92 ++++++++++++++++++------------ 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 873d6d7c..f9cfc94c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -167,88 +167,108 @@ is_command() { command -v "${check_command}" >/dev/null 2>&1 } +os_check_dig(){ + local protocol="$1" + local domain="$2" + local nameserver="$3" + local response + + response="$(dig "${protocol}" +short -t txt "${domain}" "${nameserver}" 2>&1 + echo $? + )" + echo "${response}" +} + +os_check_dig_response(){ + # Checks the reply from the dig command to determine if it's a valid response + local digReply="$1" + local response + + # Dig returned 0 (success), so get the actual response, and loop through it to determine if the detected variables above are valid + response="${digReply%%$'\n'*}" + # If the value of ${response} is a single 0, then this is the return code, not an actual response. + if [ "${response}" == 0 ]; then + echo false + else + echo true + fi +} + os_check() { if [ "$PIHOLE_SKIP_OS_CHECK" != true ]; then # This function gets a list of supported OS versions from a TXT record at versions.pi-hole.net # and determines whether or not the script is running on one of those systems local remote_os_domain valid_os valid_version valid_response detected_os detected_version display_warning cmdResult digReturnCode response + local piholeNameserver="@ns1.pi-hole.net" remote_os_domain=${OS_CHECK_DOMAIN_NAME:-"versions.pi-hole.net"} detected_os=$(grep '^ID=' /etc/os-release | cut -d '=' -f2 | tr -d '"') detected_version=$(grep VERSION_ID /etc/os-release | cut -d '=' -f2 | tr -d '"') # Test via IPv4 and hardcoded nameserver ns1.pi-hole.net - cmdResult="$( - dig -4 +short -t txt "${remote_os_domain}" @ns1.pi-hole.net 2>&1 - echo $? - )" + cmdResult=$(os_check_dig 4 "${remote_os_domain}" "${piholeNameserver}") + # Gets the return code of the previous command (last line) digReturnCode="${cmdResult##*$'\n'}" if [ ! "${digReturnCode}" == "0" ]; then valid_response=false else - # Dig returned 0 (success), so get the actual response, and loop through it to determine if the detected variables above are valid - response="${cmdResult%%$'\n'*}" - # If the value of ${response} is a single 0, then this is the return code, not an actual response. - if [ "${response}" == 0 ]; then - valid_response=false - else - valid_response=true - fi + valid_response=$(os_check_dig_response cmdResult) fi # Try again via IPv6 and hardcoded nameserver ns1.pi-hole.net if [ "$valid_response" = false ]; then unset valid_response + unset cmdResult + unset digReturnCode - cmdResult="$( - dig -6 +short -t txt "${remote_os_domain}" @ns1.pi-hole.net 2>&1 - echo $? - )" + cmdResult=$(os_check_dig 6 "${remote_os_domain}" "${piholeNameserver}") # Gets the return code of the previous command (last line) digReturnCode="${cmdResult##*$'\n'}" if [ ! "${digReturnCode}" == "0" ]; then valid_response=false else - # Dig returned 0 (success), so get the actual response, and loop through it to determine if the detected variables above are valid - response="${cmdResult%%$'\n'*}" - # If the value of ${response} is a single 0, then this is the return code, not an actual response. - if [ "${response}" == 0 ]; then - valid_response=false - else - valid_response=true - fi + valid_response=$(os_check_dig_response cmdResult) fi fi # Try again without hardcoded nameserver if [ "$valid_response" = false ]; then unset valid_response + unset cmdResult + unset digReturnCode - cmdResult="$( - dig +short -t txt "${remote_os_domain}" 2>&1 - echo $? - )" + cmdResult=$(os_check_dig 4 "${remote_os_domain}") # Gets the return code of the previous command (last line) digReturnCode="${cmdResult##*$'\n'}" if [ ! "${digReturnCode}" == "0" ]; then valid_response=false else - # Dig returned 0 (success), so get the actual response, and loop through it to determine if the detected variables above are valid - response="${cmdResult%%$'\n'*}" - # If the value of ${response} is a single 0, then this is the return code, not an actual response. - if [ "${response}" == 0 ]; then - valid_response=false - else - valid_response=true - fi + valid_response=$(os_check_dig_response cmdResult) + fi + fi + + if [ "$valid_response" = false ]; then + unset valid_response + unset cmdResult + unset digReturnCode + + cmdResult=$(os_check_dig 6 "${remote_os_domain}") + # Gets the return code of the previous command (last line) + digReturnCode="${cmdResult##*$'\n'}" + + if [ ! "${digReturnCode}" == "0" ]; then + valid_response=false + else + valid_response=$(os_check_dig_response cmdResult) fi fi if [ "$valid_response" = true ]; then + response="${cmdResult%%$'\n'*}" IFS=" " read -r -a supportedOS < <(echo "${response}" | tr -d '"') for distro_and_versions in "${supportedOS[@]}"; do distro_part="${distro_and_versions%%=*}"