Code of Amor 💘<p><span class="h-card" translate="no"><a href="https://hsnl.social/@eloy" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>eloy</span></a></span> here's the script (zsh) for reference:</p><pre><code>#!/usr/bin/zsh</code><br><code>#set -x</code><br><code># tests domain name resolution on a host using all mechanisms available (ref. Arch)</code><br><code></code><br><code># text styling</code><br><code>BLACK='\033[0;30m'</code><br><code>RED='\033[0;31m'</code><br><code>GREEN='\033[0;32m'</code><br><code>YELLOW='\033[0;33m'</code><br><code>BLUE='\033[0;34m'</code><br><code>PURPLE='\033[0;35m'</code><br><code>CYAN='\033[0;36m'</code><br><code>WHITE='\033[0;37m'</code><br><code>BOLD='\033[1m'</code><br><code>NC='\033[0m' # Reset Style</code><br><code></code><br><code>fargs=("${argv[@]}")</code><br><code></code><br><code># array of tool names to search for</code><br><code>typeset -A toolname=(</code><br><code> 'getent' 'nss'</code><br><code> 'host' 'glibc'</code><br><code> 'nslookup' 'glibc'</code><br><code> 'dig' 'glibc'</code><br><code> 'drill' 'glibc'</code><br><code> 'resolvectl' 'systemd-resolved'</code><br><code> 'doggo' 'other'</code><br><code>)</code><br><code># array of methods to group and order by</code><br><code>typeset -gU method=(</code><br><code> 'nss'</code><br><code> 'glibc'</code><br><code> 'systemd-resolved'</code><br><code> 'other'</code><br><code>)</code><br><code># array of explanations for the methods</code><br><code>typeset -A method_desc=(</code><br><code> 'nss' 'nss-resolve,nss-myhostname,nss-mymachines (systemd)'</code><br><code> 'glibc' '/etc/resolv.conf'</code><br><code> 'systemd-resolved' 'systemd-resolved service (systemd)'</code><br><code> 'other' 'unknown'</code><br><code>)</code><br><code># array of required args for those that need it only</code><br><code>typeset -A required_args=(</code><br><code> 'getent' 'ahosts'</code><br><code> 'resolvectl' 'query'</code><br><code>)</code><br><code># array of prerequisites for those that need them only</code><br><code>typeset -A required_service=(</code><br><code> 'resolvectl' 'systemd-resolved'</code><br><code>)</code><br><code></code><br><code>function print_div() {</code><br><code> if [[ $1 = "1" ]]; then</code><br><code> print -r -- "====================================================="</code><br><code> elif [[ $1 = "2" ]]; then</code><br><code> print -r -- "-----------------------------------------------------"</code><br><code> elif [[ $1 = "3" ]]; then</code><br><code> print -r -- "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"</code><br><code> else</code><br><code> print -r -- "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"</code><br><code> fi</code><br><code>}</code><br><code></code><br><code>function run_tool() {</code><br><code> local tool=$1</code><br><code> local tool_args=$2</code><br><code> local args=("${fargs[@]}")</code><br><code> # add defaults if no args given</code><br><code> if [[ ${#args[@]} -eq 0 ]]; then</code><br><code> args=( 'localhost' $(</etc/hostname) )</code><br><code> fi</code><br><code> while [[ ${#args[@]} -gt 0 ]]; do</code><br><code> printf "\nResolving ${BOLD}%s${NC}...\n" "${args[1]}"</code><br><code> print_div 3</code><br><code> $tool $tool_args ${args[1]}</code><br><code> print_div 4</code><br><code> shift args</code><br><code> done</code><br><code>}</code><br><code></code><br><code>function run_all_tools() {</code><br><code> for k ("${(@k)method}")</code><br><code> do</code><br><code> subscript=$k</code><br><code> printf "${BOLD}%s${NC} - uses %s\n" "$k" "$method_desc[$k]"</code><br><code> print_div 1</code><br><code> for tn methd ("${(@kv)toolname}")</code><br><code> do</code><br><code> if ! [[ $methd = $k ]] continue</code><br><code> printf "${BOLD}${PURPLE}%s:${NC} " "$tn"</code><br><code> bin=$(command -v $tn)</code><br><code> if [[ -z $bin ]]; then</code><br><code> print -r -- "not installed"</code><br><code> else</code><br><code> print -r -- ""</code><br><code> run_tool $bin ${required_args[$tn]}</code><br><code> fi </code><br><code> print_div 2</code><br><code> done</code><br><code> print_div 1</code><br><code> done</code><br><code>}</code><br><code></code><br><code>function report_on(){</code><br><code> local info=$(stat --format %F $1)</code><br><code> printf "\n\n%s is a %s\n" "$1" "$info"</code><br><code> if [[ $info = "regular file" ]]; then</code><br><code> print -r -- "contents:"</code><br><code> cat $1</code><br><code> fi</code><br><code>}</code><br><code></code><br><code>run_all_tools</code><br><code>report_on /etc/hosts</code><br><code>report_on /etc/resolv.conf</code></pre>