# common useful functions w3m_safe() { url="$1" output=$(/opt/homebrew/bin/w3m "$url" -M -cols 400 -graph -dump 2>&1) if echo "$output" | grep -q "Can't load"; then return 2 else echo "$output" return 0 fi } # Returns: # 0 = server reachable & command ran # 1 = network/host-not-up-yet # 2 = SSH auth failure (likely passphrase/key issue) -> caller should abort is_server_up() { host=$1 # Capture only stderr (order of redirs matters: 2>&1 >/dev/null) err=$(/usr/bin/ssh \ -o BatchMode=yes \ -o PreferredAuthentications=publickey \ -o ConnectTimeout=10 \ -o ServerAliveInterval=20 \ -o ServerAliveCountMax=3 \ -o ConnectionAttempts=1 \ -o StrictHostKeyChecking=no \ -o UserKnownHostsFile=/dev/null \ -o LogLevel=ERROR \ -n -q "$host" 'uname -n || hostname' 2>&1 >/dev/null) st=$? [ $st -eq 0 ] && return 0 # Normalize to lowercase for robust matching err_lc=$(printf '%s' "$err" | tr '[:upper:]' '[:lower:]') case $err_lc in *"permission denied"*|\ *"no supported authentication methods available"*|\ *"too many authentication failures"*|\ *"agent admitted failure"*|\ *"publickey authentication failed"*) printf 'FATAL: SSH authentication failed for "%s": %s\n' "$host" "$err" >&2 return 2 ;; esac # Anything else (timeout, connection refused, kex read/reset, etc.) return 1 } wait_for_server_to_boot_up() { server=$1 while :; do if is_server_up "$server"; then printf '"%s" is up and running.\n' "$server" return 0 fi rc=$? if [ $rc -eq 2 ]; then printf 'Aborting: SSH authentication failed for "%s" (likely passphrase needed or wrong key).\n' "$server" >&2 exit 2 fi printf 'Server "%s" is not up\n' "$server" sleep 10 done } # vim: set ts=4 sw=4 tw=0 noet ft=bash: