E.1.2 Hauptprogramm der Schnittstellenkomponente

#!/usr/users2/diplom/hans/python/python/bin/python
# -------------------------------------------------------------
# Projekt : Digitale Bibliotheken Projekt
# Uni-Frankfurt/M, Professur Telematik und
# verteilte Systeme, Prof. O. Drobnik
# Diplomarbeit, Matzen,Hans, 1997
# Dateiname : ifobject.py
# Datum : 03.11.1997
# letzte Änderung :
# Autor : Hans Matzen, 1997, Frankfurt/M, Deutschland
# Sprache : Python v1.4
# Beschreibung : Dieses Programm realisiert die
# Schnittstellenkomponente des Speichersystems
#
# Anmerkungen :
#
# -------------------------------------------------------------
 
# globale Variable
CONFIG_FILE="interface.conf"
 
# imports
import sys
import string
import signal
 
# Klasse zum parsen der Konfigurationsdatei
import confparse
# Klasse zur Verwaltung einer Socketmenge
import c_multiconn
# Klasse um in ein Logfile zu schreiben
import c_log
# Klasse zur Auftragsverwaltung (Zuordnung Socket <-> Auftrag)
import c_orgalists
 
 
# Verarbeitung Kommandozeilenparameter
# pruefe parameter
if len(sys.argv)<2:
    print "Usage: ifobject.py <name> [-f <configfile>]"
    sys.exit(1)
 
# hole Kommandozeilenparameter
ifobjname=sys.argv[1]
try:
    CONFIG_FILE=sys.argv[3]
except:
    pass
 
# installiere Signalhandler
doit=1
 
def sig_int(a,b):
    global doit
    # Abbruchbedingung fuer Mainloop
    doit=0
 
signal.signal(signal.SIGINT,sig_int)
 
 
 
# instanziiere Socketmengenobjekt
conn=c_multiconn.c_multiconn()
 
# Verarbeite Konfigurationsfile
params=confparse.confparse(CONFIG_FILE)
 
brlist=[]
rcvlist=[]
modlist=[]
mapdict={}
lfile="./if.log"
i=0
 
# durchlaufe alle Parameter und speichere sie in
# der dafür vorgesehenen Liste
while i<len(params):
    el=params[i]
    if el[0]=="RECEIVE_PORT":
        rport=eval(el[1])
        rcvlist.append(conn.open_sock("",rport))
    elif el[0]=="BROKER_ADDRESS":
        baddr=string.split(el[1],",")
        brlist.append(baddr)
    elif el[0]=="MAP_MODULE":
        mmod=el[1]
        modlist=string.split(mmod,",")
    elif el[0]=="MAP_COMMAND":
        map=string.split(el[1],",")
        mapdict[map[0]]=map[1]
    elif el[0]=="MAX_ORDERS":
        maxorders=eval(el[1])
    elif el[0]=="LOG_FILE":
        lfile=el[1]
     
    i=i+1
 
 
# Oeffne Logfile
log=c_log.c_log("Schnittstelle "+ifobjname,lfile)
 
log.log("Gestartet")
 
# init. Variablen fuer Auftragslistenverwaltung
# instanziiere Speicherliste und Jobliste
rcv_connlist=[]
jobs=c_orgalists.c_joblist()
 
# Schnittstellenelement-Sockets vorbereiten
i=0
log.log("Verbindung fuer Klienten unter:")
while (i<len(rcvlist)):
    log.log(str(conn.get_localaddr(rcvlist[i])))
    conn.listen(rcvlist[i])
    i=i+1
 
# -------------------------------------------------------------
# Main Loop
# -------------------------------------------------------------
doit=1
while doit==1:
    log.log("Warte auf Auftraege")
    active_socks=[]
    # Warte auf Auftraege
    active_socks=conn.wait_event()
     
    # Ereignisse abarbeiten
    i=0
    while i<len(active_socks):
        actsock=active_socks[i]
 
        if actsock in rcvlist:
            log.log("Ein Klient bittet um Verbindung.")
            # Klient baut verbindung auf
            newfd=conn.accept(actsock)
            rcv_connlist.append(newfd)
        elif actsock in rcv_connlist:
            # Nachricht ueber bestehende Verbindung
            log.log("Ein Klient bittet um Gehoer.")
            msg=""
            msg=conn.read_sock(actsock)
            if msg=="":
                log.log("Oops, der hat einfach aufgelegt ["+str(actsock)+"].")
                conn.close_sock(actsock)
                del rcv_connlist[rcv_connlist.index(actsock)]
            else:
                # Verarbeitung des auftrages
                msg_parts=string.split(msg," ")
                # Nachricht filtern/konvertieren
                if mapdict.has_key(msg_parts[0]):
                    # aufruf der filterroutine
                    statement="import "+modlist[0]
                    exec statement
                    statement="msgnew="+modlist[0]+"."+mapdict[msg_parts[0]]+"(msg)"
                    exec statement
                     
                #verbindung zum broker aufbauen und auftrag abschicken
                newfd=conn.open_sock("",0)
                conn.connect(newfd,brlist[0][0],eval(brlist[0][1]))
                conn.write_sock(newfd,msgnew)
                # und Auftrag in Auftragsliste speichern
                jobs.addjob(actsock,"c",0,newfd,"c")
 
        else:
            # Nachricht ueber bestehende Verbindung
            log.log("Ein Broker bittet um Gehoer.")
            msg=conn.read_sock(actsock)
            if msg=="":
                log.log("Oops, der hat einfach aufgelegt ["+str(actsock)+"].")
                conn.close_sock(actsock)
                del rcv_connlist[rcv_connlist.index(actsock)]
            else:
                # zuordnung der antwort zum klienten
                clifd=jobs.get_job_by_repfd(actsock)
                tuple=jobs.get_jobdata(clifd)
                # job aus liste loeschen
                jobs.remjob(clifd)
                # verbindung zum broker abbauen
                conn.close_sock(actsock)
                # antwort an client schicken
                conn.write_sock(tuple[2],msg)
                # verbindung zum klienten beenden
                conn.close_sock(tuple[2])
                # verbindung aus liste loeschen
                del rcv_connlist[rcv_connlist.index(tuple[2])]
 
        i=i+1
 
# löschen des Verbindungsobjekts
del conn