28. 6. 2017 Graylist

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.

28. 6. 2017 Graylist

Příspěvekod Sykorajak » 30. 6. 2017 08:18

Úloha na zpracování elektronické pošty podle stavů odesilatelů.

V proměnné $MAIL je cesta k souboru, v kterém jsou uloženy maily (formát souboru):

From Odesilatel Datum

Subject TextSubjectu
Telo
.
.
Konec tela

From Odesilatel Datum

.atd

Bude se pracovat s daty, formát si můžete rozmyslet (zvolil jsem ten, co se používá u touch -t)
Budeme si někde vést informaci o stavech odesilatelů (odesilatel se může nacházet v graylistu, whitelistu nebo blacklistu).
Podle stavů budeme maily zpracovávat. Na to poslouží dva soubory.

graylist (formát volitelný, já si třeba zvolil podobný /etc/passwd, takto:)
Odesilatel:Stav:Timeout
Graylist je váš soubor (databáze), můžete si s ní dělat co chcete, měly by se v ní dát lehce uložit a upravit jednotlivá pole.
Stav: (CHECK|ALLOW,DENY)

sender.cfg (formát pevně daný, co řádek, to odesilatel, bud' je ve whitelistu nebo blacklistu)
odesilatel (ALLOW|DENY)

Dále existuje konfigurační soubor, který nám nastaví, jak budeme zpracovávat stavy a posílat jeden speciální mail:
graylist.cfg (formát volitelný, já si zvolil řádky)
#1 Subject potvrzovacího mailu
#2 Jméno souboru s textem potvrzovacího mailu
#3 CHECK ALLOW DENY timeouty ve dnech, třeba (30 30 30 - každý časový interval je nastaven na 30 dnů)
#4 Jméno souboru s log filem (všechny operace skriptu s poštou budeme někam vypisovat)

Co máte dělat
Máte vytvořit skript, který soubor s maily projde právě jednou a každý mail zpracuje podle stavu odesilatele.

Podívám se, zda je odesilatel uveden v sender.cfg nebo graylistu. Pokud má nastaven ALLOW nebo DENY v sender.cfg,
mail hned odešlu nebo zahodím. Pokud je v graylistu, musím zkontrolovat stav, ale i timeout, který mi udává platnost
stavu. Pokud jsem s datem mailu mimo timeout, stav se mění.
stav CHECK
(datum odeslání < TIMEOUT)
Čekám na potvrzovací mail a pokud mail potvrzovací není, někam ho ukládám (můžu si zvolit, jak a kde).
Pokud mail je potvrzovací mail, stav se mění na ALLOW (ten se nastaví na X dnů, podle záznamu v graylist.cfg) a posílám
potvrzovací mail (jeho konfigurace uvedena v graylist.cfg na prvních dvou řádcích) a dále odesilám ty maily, které jsem si
uložil, protože přišly ve stavu CHECK.
(datum odeslání > TIMEOUT)
Zahazuji uložené maily ze stavu check. Stav se mění asi na DENY nebo řádka s odesilatem se z graylistu ztratí (to už si nepamatuju,
moc podstatné to není).
stav ALLOW
(datum odeslání < TIMEOUT)
Mail pošlu, timeout updatuju (datum odeslání + X ALLOW dní z graylist.cfg).
(datum odeslání > TIMEOUT)
Mail zahodím, přejdu do stavu DENY a nastavím timeout (datum odeslání + X DENY dní z graylist.cfg).
stav DENY
(datum odeslání < TIMEOUT)
Mail zahazuji.
(datum odeslání > TIMEOUT)
Přecházím do stavu CHECK, mail se ukládá.

Řešení
Řešil jsem s AWK za jedna, načetl jsem graylist.cfg, sender.cfg, graylist, soubor v $MAIL.
Pracoval jsem s odesilateli jako s polem: stav[odesilatel],timeout[odesilatel] (pokud byl odesilatel v sender.cfg, tak jsem si dal timeout -1, pro rozlišení whitelistu, blacklistu a graylistu)
Pokud bylo potřeba, mail jsem si uložil výpisem do souboru (podle názvu těchto souborů a jejich existence mimo AWK jsem maily potom odesílal).
Při průchodu souboru s poštou v $MAIL jsem si přečetl From, ale pamatoval si, že hned za ním je o dva řádky dole bude Subject. Po čtení Subjectu jsem mail zpracoval.
Graylist jsem updatoval tak, že jsem si udělal nový soubor (new_graylist), do kterého jsem v END větvi vypisoval nové řádky odesilatel:stav:timeout podle hodnot pole.
Potom jsem za tato data vypsal původní obsah graylistu a použil sort -u na new_graylist, abych si uchoval jen ty novější záznamy. To jsem uložil do graylistu.

Dál se dalo řešit odesílání mailu, ale to Forst moc neřešil, tohle asi šlo udělat líp:

soubory s maily, které jsou s odesláním závislé na potvrzovacím mailu (proměnná mail nějaká counter proměnná v awk):
---CEKAM$mail$odesilatel
pokud odesilatel poslal potvrzovací mail, existuje soubor
---POTVRZ$odesilatel, jeho existencí pošlu všechny maily v CEKAM$mail$odesilatel
pokud mail můžu hned odeslat
---OK$mail
pokud mail zahazuji, no tak ani nemusí soubor existovat

Forst dál zmínil, že dobrý nápad bylo použít nějaký zámek na skript.
Sykorajak
 

Zpět na SWI095 Úvod do UNIXu

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník

cron