I have a program that needs to do DNS lookups, etc. Things will go Really
Wonky if there's a problem with DNS (from a client perspective). Thus,
I'd like the program to be able to check if DNS isn't working. In this
particular setup, the box runs its own named with a view setup for
resolution/caching.
In particular, I want to test that:
1. named is running and answering calls to its port
2. named is getting real answers from the net (i.e. doing its recursive
resolution properly; and port 53 to outside NS's isn't being blocked)
3. (rare) root NS's aren't getting DDoS'd / whole world's DNS is down
I want to do this inside a perl or php program, but any language
pseudo-code will be fine as a template. I don't want to run a full-blown
monitoring program separately.
Ideally, I'll have some php like:
function IsDnsOk() {
check named
check resolution ok
}
To be used possibly like:
while (!IsDnsOk()) {
sleep 10;
}
$important_dns_result=gethostbyname($host);
But I want any check to be fairly lightweight. I don't want to fire off
useless DNS lookups to root name servers at a potential rate of thousands
a minute. Plus, I guess I have to worry about cached results making
things look ok when they are really not. Any solution I implement will
probably be designed to only run these tests once a minute or something,
which won't catch the instant DNS goes down, but will mitigate the damage
caused.
I can think of a number of fairly simple tests I can try, but they feel
kind of kludgy. Is there a better way?
Ideally, the PHP calls, like gethostbyname would be able to return a
"down" status, but they decided to lump in to the same return value
failure due to no dns record and failure due to any other reason.
Thanks!