Ecco una soluzione rapida e sporca a questo in Python. Fa il caching (incluso il caching negativo), ma non il threading e non è la cosa più veloce che tu abbia mai visto. Se lo salvi come qualcosa del genere rdns
, puoi chiamarlo così:
zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...
L'esecuzione annoterà gli indirizzi IP con i loro record PTR sul posto:
$ echo "74.125.132.147, 64.34.119.12." | rdns
74.125.132.147 (rdns: wb-in-f147.1e100.net), 64.34.119.12 (rdns: stackoverflow.com).
Ed ecco la fonte:
#!/usr/bin/env python
import sys, re, socket
cache = dict()
def resolve(x):
key = x.group(0)
try:
return "%s (rdns: %s)" % (key, cache[key])
except KeyError:
try:
cache[key] = socket.gethostbyaddr(key)[0]
except socket.herror:
cache[key] = '?'
return "%s (rdns: %s)" % (key, cache[key])
for f in [open(x) for x in sys.argv[1:]] or [sys.stdin]:
for line in f:
sys.stdout.write(re.sub("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", resolve, line))
# End of file.
Nota: questo non è esattamente ciò che stai cercando nella lettera (usando "strumenti standard"). Ma probabilmente ti aiuta più di un hack che risolve ogni indirizzo IP ogni volta che viene rilevato. Con poche altre righe, puoi persino far sì che i risultati della cache vengano memorizzati in modo persistente, il che aiuterebbe a ripetere le chiamate.