Voici une solution rapide et sale à cela en Python. Il fait de la mise en cache (y compris la mise en cache négative), mais pas de thread et ce n'est pas la chose la plus rapide que vous ayez vue. Si vous l'enregistrez comme quelque chose comme rdns
, vous pouvez l'appeler comme ceci:
zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...
L'exécuter annotera les adresses IP avec leurs enregistrements PTR en place:
$ 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).
Et voici la source:
#!/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.
Veuillez noter: ce n'est pas tout à fait ce que vous recherchez à la lettre (en utilisant des «outils standard»). Mais cela vous aide probablement plus qu'un hack qui résout chaque adresse IP à chaque fois qu'elle est rencontrée. Avec quelques lignes supplémentaires, vous pouvez même lui faire mettre en cache ses résultats de manière persistante, ce qui aiderait à répéter les appels.