Re: [maillist] qmail und sql

Andreas Demmer (ademmer@knuut.de)
Tue, 04 May 1999 01:01:00 +0200

>
> es geht hierbei darum, dem qmail überhaupt zugriff auf eine solche database zu
> ermöglichen. Die Relationen stehen schon fast und ein Passendes
> Perl-CGI-Interface bastel ich mir gerade. (Ich beginne Perl wirklich zu lieben
> :-))
>
> Qmail muß wenn ein Host eine Verbindung aufbaut, in der Datenbank nach dem
> Host, bzw. der IP-Suchen und sehen ob er in der allow oder deny Regel
> enthalten ist, wenn nicht wird nach einem Standard den ich noch genauer
> spezifizieren muß weiter vorgegangen.
>

Also, wenn Du aus qmail heraus Perl verwenden kannst, hast Du eigentlich schon
gewonnen.
Fuer diverse Datenbanken gibt es zwischenzeitlich Perl-Module; fuer IBM DB2 z.B.
auf www.software.ibm.com/data/db2/perl.
Damit kannst Du dann alle ueblichen SQL-Befehle absetzen.

Da Du die Relationen bereits erstellt hast, fuege ich folgenden Loesungsansatz,
bestehend aus lediglich einer Tabelle, nur der Vollstaendigkeit halber an:
Angenommen, Du haettest folgende Tabelle angelegt (Die SQL-Befelhe beziehen sich
auf DB2, wer haette das gedacht, gell!!!):
CREATE TABLE HOSTS (
IP_ADR CHAR(15) NOT NULL,
HOSTNAME CHAR(40),
REGEL CHAR(1) CHECK(REGEL IN ('A', 'D')),
PRIMARY KEY (IP_ADR))
Dann kannst Du ueber Dein Perl-Script mittels dem SQL-Befehl
SELECT DISTINCT TAB1.IP_ADR, TAB1.HOSTNAME, TAB1.REGEL
INTO (hier muessen jetzt Variablen angegeben werden, wohl in der
Form :variablenname)
FROM HOSTS TAB1
WHERE TAB1.IP_ADR = '192.168.1.5' (Variable anstelle der
Konstanten, diesmal ohne :)
OR TAB1.HOSTNAME = 'www.delix.de' (rate mal: auch hier sollte
wieder eine Variable stehen)
(Die Variablen fuer IP_ADR und HOSTNAME sollten jedesmal gefuellt werden)
Damit erhaeltst Du dann in Deinen :Variablen die entsprechenden Angaben zu dem von
Dir gesuchten Host.
Bevor Du die Daten weiter verarbeitest, solltest Du uebrigens den SQL-Code
pruefen: SQLCODE = 0 => Es wurde ein Datensatz gefunden, SQLCODE = 100 => Es
wurde kein Datensatz gefunden, der Deinem Auswahlkriterium entspricht.
Erhaelst Du also SQLCODE = 0, dann kannst Du Deine Variablen mittels Perl weiter
auswerten; in Deinem Fall also REGEL mit dem Resultat 'A' oder 'D'. Erhaelst Du
hingegen SQLCODE = 100, dann muss Deine Ausnahmebehandlung greifen.
Das ist zwar sicher noch nicht die Loesung aller Loesungen, aber fuer den Anfang
und in Anbetracht des Umstandes, dass es inzwischen 00:55 Uhr ist, brauchbar, so
hoffe ich wenigstens :-).
Nur so als Gedanke zum Schluss: Verschiedene Datenbanken bieten
Triggerverarbeitung an, ueber die Programmlogik direkt durch die Datenbank
ausgefuehrt werden kann. Vielleicht ist das ein sinnvoller Ansatz, um nicht alles
in Perl-Scripten einprogrammieren zu muessen.

Viele Gruesse
Andreas

--
Andreas Demmer, email:ademmer@knuut.de