Skip to content

Instantly share code, notes, and snippets.

@yunginnanet
Created May 24, 2024 22:11
Show Gist options
  • Save yunginnanet/23f958f382e9a4e42a739cd07bdd0ad1 to your computer and use it in GitHub Desktop.
Save yunginnanet/23f958f382e9a4e42a739cd07bdd0ad1 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
function newFile() {
_resfile="dns_results.$(date +%s).csv"
echo "hostname,ips" >>"$_resfile"
echo "$_resfile"
}
resfile="$(newFile)"
export resfile
function resolve() {
dig +tries=5 +short "$1" | tr '\n' ' ' | grep -v ';;' | grep . || return 1
}
function writeResult() {
(
flock 5
echo "$@" >>"$resfile"
) 5>>"$resfile.lock"
}
export resolve
export writeResult
function tryResolve() {
for delay in {1,2,3,4,5,10,15,20,30,45}; do
if resolve "$1"; then
return 0
else
echo -n "."
sleep "$delay"
fi
done
# fail
return 1
}
export tryResolve
function try() {
(
flock -s 6
if _t="$(tryResolve "$domain")"; then
writeResult "$domain,$_t"
else
echo "$domain" >>"$resfile.failed"
fi
) 6>>"$resfile.readlock"
}
clear
function log() {
tput home
_fin="$(wc -l "$resfile" 2>/dev/null | awk '{print $1}')"
_failed="$(wc -l "$resfile.failed" 2>/dev/null | awk '{print $1}')"
echo -e "\nfinished: \e[0;32m$_fin\e[0m\nfailed: \e[31m$_failed\e[0m\n"
}
_want=0
export _want
while read -r domain; do
(("_want = $_want + 1"))
try "$domain" &
log
done
function _total() {
wc -l --total always "$resfile" "$resfile.failed" 2>/dev/null | grep total | tr -d ' total' 2>/dev/null
}
while :; do
sleep 1
log
if test "$(_total)" -ge "$_want" 2>/dev/null; then
if flock -n "$resfile.readlock"; then
echo -e "\n\nfin."
break
else
echo -n "."
sleep 1
continue
fi
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment