Tipy, triky, vtipy...
: je dobre si udelat kopii mailu (hodi se po dalsi parsovani, preposilani odpovedi s potvrzovacim klicem a t.d.). To lze zaroven spojit s odstranovanim "reply zobacku"
Kód: Vybrat vše
kopie=$(mktemp)
cat | sed 's/^> //g' >"$kopie" # 'g' priznak odstrani i pripadny opakovany pocet zopacku
: zamek quli vice bezicim instancim stejneho programu lze poresit nasledovne
Kód: Vybrat vše
lockfile='/jednotna/cesta/k/lockfilu'
while [ -f $lockfile ]; do
sleep 1
done
touch $lockfile
Tady clovek musi mit pevnou viru, ze mezi instrukcemi testu ve "while" a nasledneho "touch" nevytvori jina instance taky zamek, ale takova sance je brutalne mikrospicka
.
Take je dobre pridat nejake pocitadlo, aby vse netrvalo moc dlouho.
: kontrola pritomnosti adresy "$sender" v blacklistu lze jednoduse takto
Kód: Vybrat vše
prefix=${sender%%@*} # zbav se casti za @
case "$REJECT" in # viz Forstova kniha
*$prefix*) exit 1;;
esac
: nejdulezitejsi cast ulohy je navrh database. Obtiz zpusobuje viceradkovy DESCRiption. Nelze jednodusse pouzivat klasicke databasove formaty - napr. ':' oddelovac polozek se zastupnymi znaky pro '
' v popisu by zpusobila mensi (ci vetsi - zalezi na navrhu) obtize v regexech pro "find"
Forstuv navrh:
ukladat DESCR do jednotlivych zvlastnich souboru. Pritom e-mailove adresy lze pouzivat jako jmena prislusnych souboru (jedine '/' by nam vadily, ale ten v adrese neni; ovsem v adrese se uvnitr uvozovek muze vyskytnout libovolne znaky, ale to jeste nikdy nikdo normalni pouzil, pac to prinasi vic skody nez uzitku).
Pak nekde stranou staci mit databasi ve formatu "e-mail:name:/cesta/k/souboru/s/popisem".
Mensi obtize by mohla delat pripadna giganticka mohutnost database (dosly by cisla inode ci co), to by se muselo resit nejak pres adresarovou hierarchii.
Vyhoda tohoto pristupu je snadnost operace "find" - jednoduse by se pouzil grep/find na jmena souboru, 1 prikazem hotovo (nejak si jen nejsem jistej, jak to chtel provest s wildcardem pro DESCR, asi nejaky special option pro grep/find)
Muj navrh (ne moc dobry, proto ho pisu az po autorskem reseni:) :
Database v 1 souboru ve tvaru:
E-MAIL:eadresa
NAME:jmeno prijmeni dalsiprijmeni
DESCR:popis
muze byt i viceradkovy
ale ma stejnou strukturu jako
puvodni text v prichozim mailu
a konci "prazdnou radkou" jakozto oddelovacem zaznamu
...
(dalsi zaznam)
...
Parsing mailu pres awk a jeho "printf" (radky DESCR lze jednodusse pres regex + stavova promenna, ze jsem uvnitr DESCR bloku)
-> vypis prislusnych dosazovacich prikazu pro shell (tedy jmenoPromenne="hodnota promenne")
-> rourou poslat shellu k vykonani (zde jsem si nebyl jistej, estli "... | sh" nenastavi jen v subshellu, tak jsem kazdy radek vykonal pres "eval", ovsem pak mi doslo, ze by to pro prirazovani viceradkove hodnoty neproslo, takze asi nejjednodussi je "sh" s pripadnym exportovanim promennych)
-> v prislusnych promennych ($odesilatel, $prikaz, $e-mail, $jmeno, $popis, $tretiParametr...) jsou tim dosazeny to, co potrebuji
-> case "$prikaz" in... vyhodnit, kterou operaci provedu
-> prislusne operace:
add, del, rep <- ed (a, d, c prikazy) + here-document s vhodnymi promennymi
find <- awk (RS=""... prazdne radky jako oddelovac zaznamu; FS=: ... diky tomu vim presne, co ve kterem poli je - viz navrh database; musim poresit pripadne ':' uvnitr DESCR, ale to lze jednodusse akumulovat do stringu s oddelovanim ':') a porovnani pozadovane polozky a namatchovani jeji hodnoty se zadanym regexem. Pokud vse souhlasi, vypise se cely zaznam. Po ceste se muze pocitat #nalezenych zaznamu a i to vypsat (pro pripad nenalezeni zaznamu, podobne jako vypisuje Google)
Neni to zrovna nejak extra kosher reseni (dyt ani newm, jestli muj pravopis slova "kosher" je kosher:), ale ukladat do zvlastnich souboru mne proste nenapadla...