Portál AbcLinuxu, 10. května 2025 08:10

Dotaz: Fetchmail spousteny z dovecot?

13.2.2007 16:08 Freeman
Fetchmail spousteny z dovecot?
Přečteno: 202×
Odpovědět | Admin
Dobry den,

potreboval bych poradit v nastaveni stahovani posty. Mam nekolik e-mail uctu, z nich si pomoci fetchmail stahuji pravidelne vse k sobe na server, kde bezi dovecot jako IMAP server. Postu pak ctu pouze pres IMAP z ruznych mist.

Fetchmail v soucasne dobe bezi s cca 3 minutovym intervalem, to je ale na celodenni beh prilis casto, zato ale zas, kdyz se trebas nekde registruji a cekam na potvrzovaci e-mail, prilis malo casto.

Napadlo me zvolnit interval na cca 1 hodinu ale probouzet fetchmail vzdy, kdyz se pripojim/prihlasim k IMAPu. Bohuzel nevim, jak to nejlepe zintegrovat s dovecotem. Nechci ho nejak patchovat, spis, zda neni nejaka moznost to dat do tcpd nebo do PAM (ktery asi bude overovat heslo). Nemam s tim zkusenosti, takze uvitam tipy, jak vec resit, trebas i uplne jinak.

Diky.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.2.2007 19:00 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Fetchmail spousteny z dovecot?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Asi bych na to šel nějak takhle:
#!/usr/bin/env python
import time
def is_conn_established(port):
    retvalue = False
    for line in file('/proc/net/tcp'):
        spl = line.split()
        if spl[3] != '01': continue #01 is ESTABLISHED
        local_port = int(spl[1].split(':')[1], 16)
        if local_port == port:
            retvalue = True
            break
    return retvalue

def run_fetchmail():
    print 'running fetchmail'

while True:
    if is_conn_established(993):
        run_fetchmail()
        delay = 3 * 60
    else:
        print 'nothing to do'
        delay = 1
    time.sleep(delay)
Program každou sekundu sleduje, zda je navázáno tcp spojení na sledovaný port (v mém případě 993) a pokud ano, tak pustí fetchmail a interval sledování prodlouží na tři minuty. Jestliže spojení navázáno není, nic se nespouští a spojení se kontroluje opět jednou za sekundu.
Ten fetchmail se prozatím ve skutečnosti nevolá, jen je pro něj nachystaná funkce.
Josef Kufner avatar 13.2.2007 19:18 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Fetchmail spousteny z dovecot?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud pouštíš dovecat přes inetd, tak prostě jeho příkaz uprav z "dovecat" na "killall -HUP fetchmail & dovecat". Čímž souběžně s navázáním spojení na IMAP spustíš i stahování pošty. Nazkoušel jsem to, ale mělo by to bez problémů fungovat. Má to však pár neduhů na které jistě brzy přijdeš. Třeba právě to, že klient obvykle udržuje spojení na IMAP nepřetržitě (u POP3 by to nevadilo).

Drobnou modifikací by se dalo udělat to, že pokud jsi připojen k IMAPu, tak by se zkrátil interval stahování fetchmailem. K tomu budeš potřebovat jednoduchý script, který upraví konfiguraci fetchmailu (postavený okolo sed -i) nebo upraví konfiguraci cronu -- záleží na stylu jakým fetchmail používáš. Pak by příkaz v inetd vypadal nějak takto: "uprav-interval 3 ; dovecat ; uprav-interval 30". Prostě to spustí script při začátku navazování spojení a po ukončení.

V obou případech platí, že to co spouštíš navíc kromě dovecatu nesmí nijak sahat na standardní vstup a výstup. V druhé variantě se k době navazování spojení přičte doba prvního spuštění onoho scriptu. Ten script musí také zvládat více souběžných spojení (stačí aby nic nedělal, pokud už jiná instance scriptu upravila konfiguraci, tzn. držet si někde záznam o úpravě, třeba přímo v konfiguráku fetchmailu).

Další možností je sledovat logy (pomocí tail -f), odposlouchávat provoz na síti (tcpflow, tcpdump) nebo třeba jen sledovat navázaná spojení (netstat) či se dívat, kdo má otevřený mailbox (lsof, incron). Myslím, že použití incronu by mohlo být zajímavé (pokud dokáže zachytit i pouhé otevření souboru pro čtení).
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 13.2.2007 19:20 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Fetchmail spousteny z dovecot?
Ještě nutno poznamenat, že periodicky kontrolovat, zda něco je či není, je poněkud neefektivní a ošklivé. To se týká právě sledování pomocí netstat, lsof nebo podobných nástrojů.
Hello world ! Segmentation fault (core dumped)
14.2.2007 11:36 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Fetchmail spousteny z dovecot?
Ještě nutno poznamenat, že periodicky kontrolovat, zda něco je či není, je poněkud neefektivní a ošklivé. To se týká právě sledování pomocí netstat, lsof nebo podobných nástrojů.
Obecně s tím souhlasím, ale přesto to tak v tomto případě dělám. Aby byla nějaká názorná představa, tak jedno otestování trvá asi milisekundu, přičemž nespouštím žádný externí program (stačí poslat signál fetchmailu) ani nijak nehrabu na disk a nepotřebuji práva roota.
Všechno má svá pro a proti. Tail -f koneckonců taky periodicky zjišťuje stav -- pokud je mi známo, tak zatím žádnou pokročilejší techniku nepoužívá. Další varianta testování mailboxu pomocí inotify taky nemá význam, protože dovecot je inteligentní a nečte z něj, dokud do něj někdo nezapíše, takže by se z toho stal bludný kruh. Ta varianta s tcpdumpem by dost zatížila systém a navíc to musí běžet jako root. Pak zbývají ty čachry vyžadující xinetd, cron, přepisování konfiguráku ...
No zkrátka by to opravdu chtělo nějaký upozorňovací modul do PAMu. Umí to někdo?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.