Bonusové cvičení – Databáze řízená emailem (velký příklad)
MSD – Moje Skvělá Databáze
Úkolem je napsat databázi MSD – Moje Skvělá Databáze, která si bude pamatovat emailové adresy, jména a popisky osob a bude řízená přes emailové příkazy.
Struktura databáze
Databáze by si měla pamatovat následující položky:
- Emailová adresa (primární unikátní klíč)
- Jméno (i víceslovné)
- Telefonní číslo
- Popis (i víceřádkový, databáze ho musí uchovat i se všemi speciálními znaky)
Jak bude databáze uložené je čistě na vás.
Ovládání
Databáze se bude ovládat příkazy přes email. Váš skript bude zavolán tak, že mu na vstupu bude předán celý email včetně hlaviček, a on na něj musí odpovídajícím způsobem zareagovat a odeslat výsledek operace emailem nazpět.
Z hlavičky emailu nás zajímá pouze hlavička From:
, která obsahuje emailovou
adresu odesílatele emailu. V těle každého emailu (tedy za prvním prázdným řádkem)
pak bude právě jeden MSD příkaz (ale před i za MSD příkazem může být nějaký balast,
třeba podpis nebo jiný text).
MSD příkaz bude zapsaný jako MSD <příkaz> <parametr>
na samostatném řádku
(příkaz je uvedený vždy, parametr když ho příkaz potřebuje). Pod příkazem pak
mohou být zapsané jednotlivé klíče, viz následující ukázka:
From: emailova@adresa.cz
Subject: Nějaký subject, nezajímá nás
Hlavička: Jiná nezajímavá hlavička
Balast okolo, který nás nezajímá
MSD ADD
:NAME Tomáš Novák
:EMAIL tomas@novak.cz
:PHONE 777666555
:DESCR Nějaký slovní popis, který může být
i víceřádkový, dokud jsou navazující řádky uvozeny mezerou.
Takže tento řádek do popisu ještě patří.
Ale tento už do popisu nepatří a je to zase nějaký balast.
Pokud pod příkazem není zapsaný klíč EMAIL
, tak se vezme email odesílatele.
Zbylé položky (NAME
, PHONE
a DESCR
) jsou nepovinné. Někde se ještě může
vyskytnout položka KEY
.
Podporované příkazy
- MSD ADD: Zkontroluje, že zadaná adresa není v databázi a přidá ji (se všemi položkami, které v emailu byly -- takže třeba jméno nebo popis mohou být vynechané) a pošle emailem odesílateli krátké potvrzení. Pokud adresa již v databázi je, tak si odesílateli emailem postěžuje a nic nepřidá.
- MSD UPDATE: Provede update záznamu podle položek z emailu (tedy updatuje
ty položky, které v emailu jsou, zbylé nechá beze změny). Važaduje ale
{\bf autorizaci klíčem} od vlastníka:
- Pokud emailový příkaz neobsahuje klíč $\rightarrow$ vyrobí náhodný klíč, uloží si ho do databáze a pošle ho emailem na adresu \uv{vlastníka} záznamu (ideálně ve tvaru, kdy bude vlastníkovi emailu stačit dát jenom odpovědět na email, tedy ve tvaru s připraveným příkazem k autorizaci).
- Pokud email obsahuje klíč a klíč souhlasí $\rightarrow$ provede update a odešle odesílateli příkazu krátké potvrzení,
- Pokud email obsahuje klíč, ale ten je nevalidní $\rightarrow$ postěžuje si emailem odesílateli emailového příkazu.
- MSD DEL: Odstraní záznam daný emailem, vyžaduje stejnou autorizaci, jako update.
- MSD FIND výraz: Vyhledává v záznamech podle výrazu, ideálně zvolte nějaký regex. Vyhledávat by se mělo ve všech polích databáze. Odešle emailem nazpět všechny výsledky (vypsané ve formátu, jako při přidávání a pokud by výsledků bylo víc, tak oddělené třemi prázdnými řádky).
Bonusové věci
- Zamykání – buďte připraveni na to, že váš skript se může chtít spustit vícekrát v tu samou chvíli, implementujte nějaký jednoduchý zamykací mechanismus, ať se vždy zpracuje nejdříve jeden proces a ať ostatní mezitím čekají (nemusí být úplně atomický, stačí když bude {\I v praxi dostatečně atomický}).
- Blacklist – V proměnné BLACKLIST v shellu může být (mezerou oddělený) seznam jmen (částí emailu před {\tt @}), který je zakázaný. Pokud dorazí email od někoho takového, tak ho bez odpovědi ignorujte.
Odesílání emailů
Odesílání emailů je velmi jednoduché, stačí k tomu použít příkaz {\tt mail} a předat mu na standardním vstupu tělo emailu (hlavičky si vytvoří sám):
echo "Moje zprava" | mail -s "Predmet" nejaky@adresat.cz
Ukázkové řešení
Skryto pro možnost znovupoužití příkladu v dalším roce.