Reverse-DNS
Das Problem
Beim Logging von Webzugriffen erhält man als Angabe die IP-Adresse. Beim Domino kann man durch den Server gleichzeitig eine Auflösung des Host-Namens aus der IP-Adresse durchführen. Diese Auflösung des Host-Namens nennt man Reverse-DNS-Lookup als Gegenpart zum DNS-Lookup, der aus einem Host-Namen die IP-Adresse ermittelt. Der Reverse-DNS-Lookup muß für die entsprechenden Adressen eingerichtet sein.
Zurück zum Domino. Die Online-Reverse-Auflösung bringt ein Problem mit sich: die unnötige Erhöhung der Serverlast. Man geht daher den Weg, diesen Vorgang durch Analyseprogramme in einer Nachbereitung durchführen zu lassen. Für Notes-Datenbanken, z.B. domlog.nsf, ist dies mit vertretbaren Aufwand kaum zu lösen. Ein Kollege von mir hatte dieses Problem. Aber bei der Beschäftigung mit dem Thema ergab sich, das die Lösung mit einem Java-Agenten erstaunlich einfach ist.
Die Lösung
Hier ist der Quelltext des Agenten:
import java.net.InetAddress ;
import java.util.Properties ;
public class JavaAgent extends AgentBase {
public void NotesMain() {
boolean debug = true ;
Properties hostNameCache = new Properties() ;
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// current database
Database db = agentContext.getCurrentDatabase() ;
// a view with all Documents in the database
View view = db.getView("all") ;
// ... and THE STANDART NOTES LOOP
Document doc ;
for( doc = view.getFirstDocument();
doc != null ;
doc = view.getNextDocument(doc))
{
// loop body
// check: is the Hostname-Field empty
// -> yes then fill it
String remote_host = doc.getItemValueString("remote_host") ;
String remote_addr = doc.getItemValueString("remote_addr") ;
if( remote_host == null || remote_host.length()== 0 )
{
// first, check cache
if( ( remote_host = (String) hostNameCache.get( remote_addr ))
== null )
{
// sorry, hostname not found in cache
try
{
// critical section: network error is possible
InetAddress a = InetAddress.getByName(remote_addr) ;
String hostName ;
remote_host = a.getHostName() ;
if( debug )
{
System.out.print( remote_addr + "->") ;
System.out.println( remote_host ) ;
}
}
catch( Exception e1)
{
remote_host=remote_addr ;
e1.printStackTrace() ;
}
// save result in cache
hostNameCache.put( remote_addr, remote_host ) ;
}
// save entry in document
doc.replaceItemValue("remote_Host",remote_host) ;
doc.save() ;
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
Der Algorithmus ist einfach. Es werden durch einen zeitgesteuerten Agenten alle Dokumente in der Ansicht "All" untersucht. Ist das Feld Remote_Host noch leer, wird es gefüllt. Dazu wird mithilfe der Klasse InetAddress das Reverse-DNS aus dem Feld Remote_Addr ermittelt. Da jedoch mehrere Zugriffe von einer Adresse erfolgen und die Auflösung des Namen einige Zeit (bis max. Timout 5 s) benötigt, lohnt es sich, die ermittelten Adressen zu cachen. Dies erfolgt mit Object hostNameCache der Klasse Properties.
Weitere Möglichkeiten
Klar, man kann es besser machen. Zum einen könnte man den Hostname-Cache zwischen den Agent-Läufen zwischenspeichern (das geht!!!). Weiterhin kann man natürlich die DNS-Abfrage parallelisieren durch den Einsatz von Threads.
Abgelegt unter:
Bewerten Sie diesen Artikel:

Senden Sie einen Kommentar