qmail-queue erweitern

archer2000

New Member
Hallo allerseits,

ich stöbere und lese schon seit einigen Tagen in diesem Forum, und auch anderen Quellen, doch leider kann ich keine Lösung für mein Problem finden.

ich wollte gerne einen Counter einbauen, welcher die "qmail-queue" aufrufe zählt (um z.B. eine Statistik zu führen). Dafür habe ich ein einfaches C++ Programm gechrieben, welches dies auch wunderbar erledigt. Das Dummy-Programm bietet nicht viel spannendes:

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
// TODO: Counter
return 0;
}

Die habe ich dann schön mit g++ kompiliert. Dann dachte ich mir, das ich diesen Counter doch einfach beim Aufruf von "qmail-queue" mit einbaue.
Gesagt getan.

Zuerst habe ich Backup der qmail-queue gemacht:
cp qmail-queue qmail-queue.orig
chown root:qmail qmail-queue.orig

Im Anschluss erstmal ein Aufruf der Backup-queue durch meine neue erstellt:
/etc/init.d/qmail stop
echo '#!/bin/sh' >/var/qmail/bin/qmail-queue
echo '/var/qmail/bin/qmail-queue.orig' >>/var/qmail/bin/qmail-queue
chmod 4755 /var/qmail/bin/qmail-queue
/etc/init.d/qmail start

Soweit sogut. Läuft wie erwartet genau wie zuvor.

Im nächsten schritt wollte ich nun mein Programm mit einbinden. Also erst zählen, dann qmail-queue Ausführen. Ausführung wie oben, nur mit folgender Änderung:
echo '/var/qmail/bin/cnt | /var/qmail/bin/qmail-queue.orig' >>/var/qmail/bin/qmail-queue

Die nun empfangenden Mails sind leer und liefern im Header folgendes:
qmail 28082 invoked from network

Okay, dann versuchte ich es andersrum:
echo '/var/qmail/bin/qmail-queue.orig | /var/qmail/bin/cnt' >>/var/qmail/bin/qmail-queue
Das brachte ein "Undelivered Mail Returned to Sender" beim Versuch an die Adresse zu senden. In der Mail stand dann folgender Fehler:

said: /bin/sh: /var/qmail/bin/qmail-queue.orig: Permission denied 451 qq
temporary problem (#4.3.0) (in reply to end of DATA command)

Nun die Quizfrage: Wie kann ich die beiden Sachen nacheinander in der qmail-queue aufrufen? Ich vermute ja, das ich den Return-Code meines C++ Programmes irgendwie anpassen muss.

Viele Grüße
Dennis
 
Das hängt davon ab, was Dein C++-Programm genau tut.

Wenn es istream nimmt und die Daten schrittweise via ostream wieder ausgibt, ist Deine Aufrufsweise mit dem Pipe-Symbol '|' richtig.

Wenn es "nur" zählt, muss der Aufruf so aussehen:
Code:
/var/qmail/bin/qmail-queue.orig ; /var/qmail/bin/cnt'
, da qmail seine Daten als Stream empfängt und auch weitergibt.

Viele Grüße,
LinuxAdmin
 
Mit dem ";" kommen die Mails zumindest wieder an.
Wenn ich das Programm auf dem Server manuell ausführe, zählt es meinen Counter hoch.
Wenn ich es in die qmail-queue mit einbaue zählt er nichts.

Ich habe es auf zwei Arten versucht:

int main()
{
int zahl;

{
ifstream file("counter.txt");
file>>zahl;
}

{
ofstream file("counter.txt");
file<< ++zahl;
}

return 0;
}

und

int main()
{
int zahl;

fstream datei_read("counter.txt",ios::in);
datei_read >> zahl;
datei_read.close();

fstream datei_write("counter.txt",ios::out);
datei_write << ++zahl;
datei_write.close();

return 0;
}
 
Hm ... zu doof. Hätte ich auch von alleine drauf kommen müssen/können/dürfen.
Somit ist klar, dass der Counter in der "anderen" counter.txt fleißig hochgezählt wurde. Klappt alles wunderbar. ;)

Nachdem ich nochmal in Ruhe drüber nachgedacht habe, ist auch der Unterschied zwischen Pipe (Ausgabe wird in folgenden Programm weiterverarbeitet) und Semikolon (Programme werden nacheinander abgearbeitet) sonnenklar.

So far. Danke soweit!
 
Back
Top