Reverse-DNS

von jNotes - Team

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 lotus.domino.*;
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.

erstellt am 29.09.2004 - nicht bewertet
Abgelegt unter: Domino

Bewerten Sie diesen Artikel:


Senden Sie einen Kommentar

Name
E-Mail
Kommentar
FrageGATY-97XQPF (bitte diesen Wert in unten stehendes Feld eintragen)
Antwort