#!/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
# 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]
# -------------------------------------------------------------
# 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])]