• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

fetchmail - postconnect Befehl scheitert

OpenSuse 42.3

Hallo Forum,
mich hat schon immer gestört, dass fetchmail keine Zeitstempel ins Log schreibt.
In der Datei /etc/fetchmailrc habe ich daher bei jedem der 7 abzufragenden Mail-Account folgendes angefügt:
Code:
preconnect "date >> /var/log/fetchmail"
Das funktioniert prima, hat aber den Nachteil, dass alle 2 Minuten 7 Zeitstempel ins Log geschrieben werden, auch wenn gar keine Nachrichten abzuholen waren.
Daher habe ich die postconnect-Option ausprobiert: wenn die letzte Zeile im Log-File ein Zeitstempel ist (d. h. "CEST" gefunden wird), dann lösche sie.
Code:
postconnect "sed -i '${/CEST /d;}' /var/log/fetchmail"
Auf der Kommandozeile funktioniert das. Wenn fetchmail das machen soll, erhalte ich folgende Fehlermeldung
Code:
sed: Kann temporäre Datei /var/log/sedgkPetA nicht öffnen: Keine Berechtigung
fetchmail: Nach-Verbindungs-Befehl scheiterte mit Status 4

Die Log-Datei gehört fetchmail und ist in der Gruppe root.

Kann mir jemand weiterhelfen?

Danke für Tipps!

Gruß,
Radiergummi
 

spoensche

Moderator
Teammitglied
Mit welchem User führst du denn fetchmail aus?

Fetchmail schreibt sehr wohl ein Logfile, wenn man in der Konfig den Syslog aktiviert.

Code:
set syslog
 

josef-wien

Ultimate Guru
radiergummi schrieb:
Auf der Kommandozeile funktioniert das.
... aber nur als root, denn außer ihm darf üblicherweise niemand in /var/log eine Datei anlegen und löschen, denn dafür sind die Berechtigungsdefinitionen des Verzeichnisses zuständig. Ob und wie Du sed abgewöhnen kannst, im Verzeichnis der zu bearbeitenden Datei seine temporäre Datei anzulegen, kann ich Dir aber nicht sagen.
 
OP
R

radiergummi

Member
Danke für Eure Antworten!

spoensche schrieb:
Mit welchem User führst du denn fetchmail aus?
fetchmail läuft als daemon
Code:
fileserver:/tmp # ps -aef | grep fetchmail
root     19564 16142  0 19:07 pts/4    00:00:00 grep --color=auto fetchmail
fetchma+ 21719     1  0 03:19 ?        00:01:02 /usr/bin/fetchmail -d 120 -a -L /var/log/fetchmail -f /etc/fetchmailrc
spoensche schrieb:
Fetchmail schreibt sehr wohl ein Logfile, wenn man in der Konfig den Syslog aktiviert.
Ja, ich kann das Logging in der /etc/sysconfig/fetchmail mit
Code:
FETCHMAIL_DEFAULT_LOGFILE="/var/log/fetchmail" 
oder
FETCHMAIL_DEFAULT_LOGFILE="syslog"
einschalten (bei mir die obere Variante). Mit
Code:
FETCHMAIL_EXPERT_OPTIONS="-v" ... "vvv"
wird die Gesprächigkeit justiert. Aber selbst nur ein "v" erzeugt unglaublich viel (zuviel) Daten, die ich gar nicht will.

josef-wien schrieb:
Ob und wie Du sed abgewöhnen kannst, im Verzeichnis der zu bearbeitenden Datei seine temporäre Datei anzulegen, kann ich Dir aber nicht sagen.
Genau da setze ich jetzt an. Ich kam leider erst heute auf die Idee, nach einem sed-Problem zu suchen. Was ich jetzt vorhabe gefällt mir zwar nicht, weil ich von der Standardkonfiguration abweiche, aber wenn ich dadurch bekomme, was ich möchte, so what.

Ich möchte folgendes probieren:
Code:
FETCHMAIL_DEFAULT_LOGFILE="/var/log/fetchmail/fetchmail.log
Für das Verzeichnis /var/log/fetchmail vergebe ich dann entsprechende Schreibrechte.

Das sollte doch gehen, oder?

Parallel schau ich mal, ob man nicht doch dem sed ein beliebiges temp-Verzeichnis unterjubeln kann. Das wäre dann m. E. die bessere Lösung.

Gruß,
Radiergummi
 

spoensche

Moderator
Teammitglied
radiergummi schrieb:
Danke für Eure Antworten!

spoensche schrieb:
Mit welchem User führst du denn fetchmail aus?
fetchmail läuft als daemon
Code:
fileserver:/tmp # ps -aef | grep fetchmail
root     19564 16142  0 19:07 pts/4    00:00:00 grep --color=auto fetchmail
fetchma+ 21719     1  0 03:19 ?        00:01:02 /usr/bin/fetchmail -d 120 -a -L /var/log/fetchmail -f /etc/fetchmailrc

Wie man sieht, läuft der fetchmail, vernünftigerweise, mit einem eigenen Benutzer. Daher kann unter /var/log/ das Logfile nicht geschrieben werden.


radiergummi schrieb:
Ich möchte folgendes probieren:
Code:
FETCHMAIL_DEFAULT_LOGFILE="/var/log/fetchmail/fetchmail.log
Für das Verzeichnis /var/log/fetchmail vergebe ich dann entsprechende Schreibrechte.

Das sollte doch gehen, oder?

Nein. Der User fetchmail hat unter /var/log keine Rechte um Dateien anzulegen und zu schreiben. Setze die Variable auf "syslog".

radiergummi schrieb:
Parallel schau ich mal, ob man nicht doch dem sed ein beliebiges temp-Verzeichnis unterjubeln kann. Das wäre dann m. E. die bessere Lösung.

Wozu willst du alle Logmeldungen, in denen ein CEST drin vorkommt löschen? Wenn es im Logfile stünde, würdest du alle Zeilen löschen und dich selbst jeglicher Möglichkeit zur Fehleranalyse berauben und das ist alles andere als sinnvoll, um nicht zu sagen totaler Unsinn.
 
OP
R

radiergummi

Member
spoensche schrieb:
Daher kann unter /var/log/ das Logfile nicht geschrieben werden.
Doch, doch, das Log wird brav geschrieben, bloss der Inhalt gefällt mir nicht.
spoensche schrieb:
Der User fetchmail hat unter /var/log keine Rechte um Dateien anzulegen und zu schreiben.
In /var/log scheint fetchmail tatsächlich eine Datei nicht ANLEGEN zu dürfen, eine existierende Datei VERÄNDERN darf fetchmail schon. Daher fällt fetchmail auf den Bauch, wenn das Log-File nicht existiert (vorher mit touch anlegen!).
spoensche schrieb:
Wozu willst du alle Logmeldungen, in denen ein CEST drin vorkommt löschen? Wenn es im Logfile stünde, würdest du alle Zeilen löschen und dich selbst jeglicher Möglichkeit zur Fehleranalyse berauben und das ist alles andere als sinnvoll, um nicht zu sagen totaler Unsinn.
Äh (räusper) nein, gar nicht.


Mit dem Ausdruck
Code:
'${/CEST /d;}'
sucht sed das Muster in der letzten Zeile ($) der Datei und auch nur die letzte Zeile würde gelöscht.

Ich will das Suchmuster übrigens auf "CE?T 20" ändern, sonst würde das alles nur während des Sommers funktionieren.

Fall 1: es gibt Nachrichten zu holen
  • preconnect schreibt einen Zeitstempel
  • fetchmail loggt "x Nachrichten blablablubb gelesen .... gelöscht"
  • postconnect sucht und findet kein CEST und macht daher nichts.

Im Ergebnis sähe das dann so aus:
Code:
So 12. Aug 17:05:25 CEST 2018
fetchmail: 1 Nachricht für X bei Y (21735 Bytes).
fetchmail: Nachricht Z:1 von 1 wird gelesen (21735 Bytes) gelöscht
So 12. Aug 17:23:05 CEST 2018
fetchmail: 1 Nachricht für R bei S (45623 Bytes).
fetchmail: Nachricht T:1 von 1 wird gelesen (45623 Bytes) gelöscht

Und genau so würde ich es gerne haben.


Fall 2: es gibt keine Nachrichten zu holen
  • preconnect schreibt einen Zeitstempel (enthält "CEST")
  • fetchmail loggt nichts
  • postconnect sucht und findet ein CEST und löscht den eben geschriebenen Zeitstempel wieder.

Damit bliebe das Log ohne neue Nachrichten im Ergebnis unverändert.

Da Fall 2 noch nicht richtig behandelt wird, sieht das Log derzeit so aus.
Code:
So 12. Aug 17:11:38 CEST 2018
So 12. Aug 17:11:39 CEST 2018
So 12. Aug 17:11:39 CEST 2018
So 12. Aug 17:11:40 CEST 2018
So 12. Aug 17:11:40 CEST 2018
So 12. Aug 17:11:41 CEST 2018
So 12. Aug 17:11:42 CEST 2018
So 12. Aug 17:13:43 CEST 2018
So 12. Aug 17:13:43 CEST 2018
So 12. Aug 17:13:44 CEST 2018
So 12. Aug 17:13:44 CEST 2018
So 12. Aug 17:13:45 CEST 2018
So 12. Aug 17:13:45 CEST 2018
So 12. Aug 17:13:47 CEST 2018
So 12. Aug 17:15:47 CEST 2018
So 12. Aug 17:15:48 CEST 2018
So 12. Aug 17:15:48 CEST 2018
So 12. Aug 17:15:49 CEST 2018
So 12. Aug 17:15:49 CEST 2018
So 12. Aug 17:15:50 CEST 2018
So 12. Aug 17:15:51 CEST 2018
So 12. Aug 17:17:52 CEST 2018
So 12. Aug 17:17:52 CEST 2018
So 12. Aug 17:17:53 CEST 2018
So 12. Aug 17:17:53 CEST 2018
So 12. Aug 17:17:54 CEST 2018
So 12. Aug 17:17:54 CEST 2018
So 12. Aug 17:17:56 CEST 2018

Gruß,
Radiergummi
 
Oben