Uvod do Unixu Libor 27. 6. 2012

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.

Uvod do Unixu Libor 27. 6. 2012

Příspěvekod mathemage » 3. 7. 2012 22:33

Dnesni tema: UDS

Historie: Pred davnymi casy v predalekem m@f#u bezela sluzba jmenem User Directory Service. Slo o jakysi "telefonni seznamy" s e-maily namisto tel. c., takze o jakousi databasi emailovych adres. Kdyz se zhruba ve stejne dobe Seznam.cz pokusil o obdobnou sluzbu, nabidli softwarovi magove z m@f#u poskytnuti sve database, neb preci jen za tu dobu ziskali slusne mnozstvi dat. Internetovy portal toto vsak odmitl s argumentem, ze se jedna o "konkurenci". Od tech dob je v mysli pana doktora Forsta postaven mentalni blok (jinymi slovy nesnasenlivost) vuci Seznamu obecne, proto toto slovo v jeho pritomnosti radeji vubec nevyslovujte a promenne ve zkouskove pisemce radeji pojmenovavejte "list".

Zadani: Implementujte databasi s polozkami:
:E-MAIL (jakozto unikatni klic /
index)
:NAME (muze byt i vice nez dvouslovne - to poznamenal po povsimnuti meho
trojslovneho jmena:)
:DESCR (upresnujici popis o vlastnikovi adresy - pozor, muze byt i viceradkovy! Database si musi uchovat i puvodni strukturu textu se vsemi puvodnimi bilymi znaky to byl kamen urazu cele ulohy, neb nejde jednodusse pouzit /etc/passwd "dvojteckovy" format db)


Prikazy se zasilaji e-mailem (v 1 e-mailu max. 1 prikaz). Program dostane na svuj stdin mail ve formatu:

...
hlavicka mailu, dulezita je jen polozka odesilatele
From: jmeno@domena.tld
- za "From:" je mezera a rovnou adresa (zadny MIME garbage - velke usnadneni:)
- automaticky se ignoruji jmena (konkr. predzavinacova cast) pritomna v systemove promenne "REJECT" (takovy blacklist)
...
hlavicka oddelena od tela mailu prazdnou radkou

> ...
> telo mailu
> jak je videt, muze obsahovat i "reply zobacky", to quli automatickym odpovedi
> na potvrzovaci klice (viz nize) -> tech je treba se zbavit!!!
> ...
> prikaze pro UDS (vzdy jen jeden) vypadaji takto:
UDS PRIKAZVELKYMIPISMENY tretiparametr
:NAME moje jmeno
:E-MAIL moje@jmeno.fb (chybi-li, pouzije se udaj z From: hlavicky)
:DESCR slovni popis, a to
_muze byt
_i
_nekolikaradkovy
_ovsem vzdy zacinajici mezerou (zde videt jako _podtrzitko_, forum mi mezery maze)
Toto jiz neni soucast popisu (nezacina mezerou). Tudiz i prazdny radek uz nepatri k popisu (opet nezacina mezerou) a chce-li ho klient v popisu, musi napsat mezeru a odradkovat!
...


Ma-li dopis spatny format (napr. UDS cast uplne chybi), zasle se odesilateli o
tom zprava.

Podporovane operace (viz PRIKAZVELKYMIPISMENY):
Kód: Vybrat vše
ADD - zkontroluje, zda-li adresa neni v db zanesena, a prida ji


Kód: Vybrat vše
REP - nahradi udaje zaznamu (resp. jen nekterou cast, je-li zadana k nahrazeni jen nejaka z polozek zaznamu)
... zde je nutne zavest bezpecnostni prvek = jednorazovy potvrzovaci klic.
Situace:
1) v db u zaznamu neni klic, v textu mailu tez ne -> vygeneruj dostatecne
nahodny klic (neda se predem odvodit), zapis si ho k e-mailu v db a posli tento
klic na adresu editovaneho zaznamu
2) v db u zaznamu je klic, shoduje se klicem v mailu -> uspesna nahrada
3) v db u zaznamu je klic, neshoduje se klicem v mailu / v textu mailu neni
  NEBO
   v db u zaznamu neni klic, v textu mailu je
  (proste jde o jakykoli nesoulad)
  -> zprava o nesouladu, smazani potvrzovaciho klice z db


Kód: Vybrat vše
DEL - smaze zaznam (staci bez potvrzeni, bezpecnostni prvek uz je pouzit u REP, bylo by to v podstate stejne)


Kód: Vybrat vše
FIND - zadana !1 polozka, dle ktere se vyhledava, !1 regex/wildcard (podle
     naseho uvazeni), ktery se matchuje. Muze se tedy vyhledavat i v "descr",
     coz trochu ztizi celou situaci, ale samozrejme to zalezi na konkretnim
     navrhu.


V kazdem pripade se po provedeni odesle vhodna zprava o uspesnosti operace (OK,
spatny klic, a t.p.).

Kterakoli polozka muze chybet - v zavislosti na pouzitem prikazu to, co lze
rozumne vynechat (napr. ADD, DEL, REP by meli vzdy obsahovat mail, pod FINDem z
principu nemusi byt nic), v takovem pripade se defaultne pouzije stara hodnota
z db.

Melo by se pocitat s behem i 2 a vice instanci programu najednou, k db smi mit
v kazdem okamziku pristup jen 1 (jinak bude vse nekonsistentni - viz predmet
Databasove systemy), takze pres nejake zamky/lockfily.
Carpe Diem!
mathemage
Matfyz(ák|ačka) level III
 
Příspěvky: 130
Registrován: 14. 1. 2011 10:03
Typ studia: Informatika Ph.D.
Login do SIS: had

Re: Uvod do Unixu Libor 27. 6. 2012

Příspěvekod mathemage » 4. 7. 2012 18:42

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...
Carpe Diem!
mathemage
Matfyz(ák|ačka) level III
 
Příspěvky: 130
Registrován: 14. 1. 2011 10:03
Typ studia: Informatika Ph.D.
Login do SIS: had

Re: Uvod do Unixu Libor 27. 6. 2012

Příspěvekod mathemage » 7. 7. 2012 11:10

Jo, malem bych zapomnel na skore

Libor vs ostatni = 2:5


4x1 (ta 1 byla spis 1-, ale Unixaci dikybohu zaokrouhluji truncatem:)
1x2
2xout

Ale puvodne prislo 8 lidi, 1 odesel uz po 15 min - velika skoda, to by Libor tak rychle neskoroval :twisted:
Carpe Diem!
mathemage
Matfyz(ák|ačka) level III
 
Příspěvky: 130
Registrován: 14. 1. 2011 10:03
Typ studia: Informatika Ph.D.
Login do SIS: had

Re: Uvod do Unixu Libor 27. 6. 2012

Příspěvekod pizet (zabudol som svoje heslo) » 7. 7. 2012 18:46

mathemage píše:
Ale puvodne prislo 8 lidi, 1 odesel uz po 15 min - velika skoda, to by Libor tak rychle neskoroval :twisted:


Pokial viem, tak prislo povodne 10 ludi a odisli 3ja.
pizet (zabudol som svoje heslo)
 


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