Zadani prikladu na sestnactem terminu UNIXu (19.9.2000)
Naprogramujte Aligatora
From: "Michal Konecny"
Sent: Wed, 20 Sep 2000 02:47:32 +0200 (CEST)
Forwarded
...No v cem to spocivalo.
Mas soubor db - jako databaze. Ten ma "vhodny format" obsahujici polozky:
login
cele jmeno bez diakritiky ve tvaru jmeno mezera prijmeni
[ adresa ]
[ klic ]
Teda maximalne 4 polozky pricemz posledni dve jsou nepovinne. Jeste se k nim
vratim.
Dale existuje soubor /etc/aliases a obsahuje radky bud:
jmeno.prijmeni:adresa,adresa,adresa,....
nebo
alias:adresa
Tebe zajimaji jenom radku jmeno.rijmeni. Druhe jsou tam jenom pro paradu,
aby to mel Forst cim zpestrit.
Tedy soubor db byl textovy soubor v libovolnem vhodnem formatu, jak uz jsem
psal. Forst primo rekl ze nejidealnejsi by byl format:
login:full_name:[adresa]:[klic]
-Ty dve polozku jsou nepovinne. Kazdy student ma takovyto zaznam v databazi.
A soubor aliases obsahuje veskere studenty kteri zadali o udeleni emailove
adresy tvary jmeno.prijmeni@...
Zamerne pisu ze soubor /etc/aliases muze mit u jednoho jmena vice adres. To
z toho duvodu ze muze byt vic nez jeden clovek se stejnym jmenem. Treba Josefu
Novaku bude pravdepodobne vic nez jeden. Pak bude na tomto radku taky vic
nez jedna adresa.
No to bylo jen tak na uvod.
A ted konecne ten script.
Mas napsat script ktery na vstupu dostane mail.
Mail je ve tvaru: hlavicka oddelena od tela jednou prazdnou radkou. Tak jak
to zname.
Dal muzes predpokladat ze se tam vyskutuje jednoznacne radek s nazvem:
From:adresa
Muzes predpokladatr ze za From: je primo adresa. Zadne znaky navic nebo tak
neco... znacne zjednoduseni.
Dal se tam muze vyskytovat radek se tvarem:
Subject: text
kde text muze mit tvar: ALIGATOR login adresa [klic]
Ale taky nemusi.
Pokud nenajdes takovyto tvar subjectu, pak musis najit uplne stejny tvar na
prvnim radku v casti telo mailu...
To vlastne definuje prikaz pro databazi.
Tvym ukolem je aby script zpracoval prichozi mail nasledovne:
1) Dostane-li mail se subjectem jaky jsem popsal bez klice tak se podiva do
soub db. Pokud tam neni uvedena adresa u prislusneho loginu (ten mas v subjectu
), tak tam tuto adresu ( ktera je za slovama ALIGATOR login ) vlozis a zaroven
upravis /etc/aliases tak aby prislusny radek s fullname obsahoval danou adresu.
Pokud takovy radek neexistuje tak ho vygenerujes.
Posles mail na tuto adresu ze zaregistrovani probehlo uspesne.
2)Dostane-li mail se subjectem jaky jsem popsal bez klice tak se podiva do
soub db. Pokud tam uz je uvedena adresa znamena to ze uzivatel ji chce zmenit.
Ty ted musis vygenerovat "nahodny retezec" ktery zapises do db na misto klice
a taky tento nahodny retezec posles uzivateli na starou adresu ( tu mas stale
v db ) - nahodny retezec ???
3)Dostane-li mail se subjectem jaky jsem popsal s klicem takse podiva do db
jestli tento klic s nim odpovida. Pokud ano je vse v poradku a ty muzes zmenit
adresu prislusneho uzivatele v /etc/aliases. Nezapomen ze na jednom radku
muze byt vice nez jedna adresa uzivatelu a ty musis vybrat tu zpravnou a
zmenit ji. Zaroven musis smazat klic v souboru db a zmenit adresu starou
za novou.
Taky jeste musis upozornit uzivatele ze vse je OK.
4) Pokud nastane jakykoliv jiny pripad, treba ze klic ktery ti posle uzivatel
na zpatek nebo treba ze ti posle mail bez klice a ty mas nejaky klic zapsany
v soub db ( pak tento klic musis take smazat ) a dalsi jine chyby zpusobi
ze posles mail uzovateli o neuspesnosti akce.
Toto vsechno jsem popisoval pouze pro pripad ze se takto definovany retezec
( ALIGATOR login adresa [klic] ) objevuje v subjectu. Pokud ale subject nenajdes
nebo najdes jiny retezec tak se podvas na prvni radek tela mailu. A tam
se musi vyskytovat uplne stejny tvar. Pokud ne je mail neplatny a zahodis
ho.
jeste dalsi hovadinky ktere se tam vyskytovali.
1. uzivatel dostane mail s unikatnim retezcem ktery jsi ty nahodne vygeneroval
a uzivatel zada pouze Reply. Co se ale stane. V subjectu se objevi najednou
zname "Re". A to musis preventivne vzdy nejakym sedem odstranit. Dal kdyz
odpovidas tak se na kazdem radku tela mailu objevuje retezec "> " a s tim
udelas to same.
2) Musis zajistit aby do databaze nemeli pristu najedmou dve instance scriptu.
Dovedes si prestavit kdyby najedmou do db nebo /etc/aliases najednou zapisovali
dva scripty. Teda to chce nejaky zamek. Nejlepe pomoci nejakeho souboru.
3) Na zacatku scriptu si musis definovat promenou REJECT tvaru:
REJECT="root administrator Aligator..."
A to ti rika ze pokud dostanes mail od cloveka jehoz adresa pred @ je obsazena
v promenne REJECT tak se nic nevykona a script skonci.
Bylo by totiz asi blbe kdyby posilal skript maily Aligatorovi a ten je porad
dal posilal sam sobe. Jak rikal Forst: Elegantni nekonecny cyklus.
No a to by bylo asi tak vsechno...