☰ menu
Pavel Satrapa

15  Gopher server

Na přelomu osmdesátých a devadesátých let se s poměrně malým odstupem zrodily dvě nové informační služby. Obě sledovaly stejný cíl – zpřístupnit informace v Internetu uživatelsky příjemnou formou. Aby se lidé nemuseli mnoho učit, jen si spustili odpovídající program a ten pak intuitivně používali.

První ze zmíněných služeb – říkejme jim vznešeně služby nové generace – byl Gopher. Jeho základem je nabídka čili menu. Uživatel nastartuje klienta, spojí se serverem a obdrží menu. Vybere si z něj položku a dostane jiné menu. Nebo také text či binární soubor, který bude uložen na jeho disk. Veškerá obsluha spočívá v mačkání kurzorových kláves, [Enter] a [Esc]. Tímto způsobem se lze pohybovat celým Internetem, protože jednotlivé položky v menu mohou vést k informacím z různých serverů.

Myšlenka Gopheru se ukázala být velmi zdařilou a služba si rychle získala značnou popularitu. Servery rostly jako houby po dešti a tzv. Gopher prostor se utěšeně zvětšoval. A potom přišel World-Wide Web a všechno převálcoval. Nabídl v podstatě totéž, ovšem nebyl svázán jednotnou šablonou menu. Zde se odkazy vkládají přímo do dokumentu, což poskytuje autorům podstatně větší volnost.

Gopher v porovnání s WWW dopadne asi stejně jako Concorde proti Boeing 747. Je rychlejší, ale méně přizpůsobivý, není tak pohodlný, nemá bar a dokonce ani kino. Celkově lze říci, že Gopher v soutěži zmíněných dvou nových služeb jednoznačně prohrál a dnes jej lze považovat za slepou větev vývoje.

V současném Internetu tato služba ještě stále má své místo, nelze však očekávat, že by se v budoucnu příliš rozvíjela. Spíše naopak. WWW mánie se projevuje minimálním zájmem programátorů o vývoj Gopher serverů či klientů. I my budeme věnovat této službě menší prostor, než její konkurentce.

15.1  Jak pracuje Gopher

bezstavový protokol Nejprve se podívejme, co je pod kapotou. Gopher protokol, definovaný v RFC 1436, je bezstavový. To znamená, že klient se serverem neudržují trvalé spojení. Položení dotazu a odpověď na něj představuje ucelenou transakci. Přijde-li vzápětí další dotaz od téhož klienta, server si jej nedává do žádné souvislosti s dotazem předchozím. Tato vlastnost protokolu má několik důsledků:

  • Je robustní. Mezi dvěma dotazy mohl být server restartován, nějakou dobu nemusel být vůbec dostupný, mohl uplynout týden, mohly se zkrátka dít strašné věci.

  • Je snadno implementovatelný. Server si nemusí pamatovat spoustu věcí a nehrozí nebezpečí, že něco zapomene nebo poplete.

  • Šetří kapacity serveru. Udržování spojení (jak to dělá např. FTP) s řadou klientů pochopitelně konzumuje prostředky serveru. V případě Gopheru tato režie odpadá.

  • Plýtvá přenosovou kapacitou. Dotaz musí obsahovat kompletní informaci o tom, co vlastně klient chce. Není možné například zkracovat cesty k souborům s využitím aktuálního adresáře, protože žádný aktuální adresář zde neexistuje (to je klasický příklad kontextové informace). Navíc se pro každý dotaz navazuje nové spojení.

Plýtvání přenosovou kapacitou ve skutečnosti není tak hrozné. Navázání a ukončení spojení představuje dohromady výměnu pěti kratičkých datagramů. Délka dotazu také není katastrofální. O to se zasloužil především pevně daný a poměrně jednoduchý formát dotazu i odpovědi na něj.

typy informací V Gopheru se také poprvé objevila myšlenka, aby server oznamoval klientovi typ nabízené informace. Řekli jsme, že základní organizační jednotkou v Gopheru je menu. Když jej server odesílá klientovi, uvede pro každý řádek následující údaje:

«typ» «jméno» «selektor» «server» «port»

Každá položka menu je v datech reprezentována jedním řádkem, jednotlivé údaje jsou navzájem oddělovány tabelátory. Jediné «jméno» je určeno uživateli. Jedná se o název položky, který má klient zobrazit. Za ním následují tři údaje, které klient použije k získání dat, když uživatel tuto položku zvolí. «server» a «port» říkají, který Gopher server má být kontaktován. «selektor» pak identifikuje data v rámci tohoto serveru – když mu klient sdělí selektor, dostane kýženou informaci.

Úplně první však na řádku stojí «typ» dat. Podle konvencí Gopheru je vyjádřen jedním písmenem nebo číslicí. Informuje klienta, jakého druhu jsou data, ke kterým vede tato položka. Dostupné typy najdete v tabulce 15.1. Vidíte, že některé z nich umožňují odkazy na informace, dostupné odlišnými protokoly (Telnet, CSO).

0   textový soubor
1 adresář (menu)
2 PH (CSO) telefonní seznam
4 hqx soubor pro Macintosh
7 vyhledávání
8 Telnet seance
9 binární soubor
s zvuk
h WWW stránka (HTML soubor)

Tabulka 15.1: Typy informací pro gopher

Na základě počátečních zkušeností se službou Gopher byl učiněn pokus o jisté její vylepšení a rozšíření sortimentu nabízených služeb. Vznikl protokol Gopher+, jeho většímu rozšíření však zabránil nástup WWW.

Všechny rozhodující a atraktivní vlastnosti Gopheru má i World-Wide Web. Tam je však najdete ve vyzrálejší a dotaženější podobě. Trojice «server», «port» a «selektor» se proměnila v URL. Jednopísmenný typ souboru byl nahrazen MIME klasifikací. Uniformní menu ustoupilo hypertextovému dokumentu.

Zkrátka Gopher byl jakýsi první, ne zcela nepovedený, leč nakonec neúspěšný pokus o WWW. Čest jeho památce.

15.2  Instalace serveru

Pro operační systém Unix existuje několik nezávislých implementací Gopher serverů. Dvě nejznámější jsou klasická distribuce z University of Minnesota (což je kolébka této služby) a server gn, který pracuje „pod obojí“. Má v sobě integrován server pro Gopher i WWW. To sice zní lákavě, přílišného rozšíření se však nedočkal. Ani my se mu nebudeme věnovat. Ostatně základní filosofií Unixu je místo univerzálních oblud používat kombinace jednoduchých efektivních nástrojů. Proto se přidržíme mateřské distribuce z Minnesoty. Obsahuje kromě serveru i klienta, pracujícího v textovém režimu.

Naše dilema však není u konce, protože existují dvě základní verze těchto programů. Zatímco verze 1 používá původní Gopher protokol, verze 2 je založena na Gopher+. Zdálo by se, že volba je jasná – buďme progresivní! Jenže starší verze má na své straně některé dosti závažné výhody. Především pro ni byla vyřešena podpora češtiny. Přesněji řečeno podpora různých kódů češtiny. Server dokáže změnit kód českých znaků v dokumentu podle požadavků uživatele.

Tato vlastnost je velmi atraktivní. Jelikož Gopher považujeme za mrtvého brouka a žádnou velkou revoluci v oblasti Gopher+ neočekáváme, rozhodli jsme se do naší distribuce zařadit Gopher démon verze 1.13 s úpravami Milana Sovy a Petra Koláře. První se týká právě češtiny, druhá ve spolupráci s dříve popsaným programem Index Master (viz 14.1) poskytuje podrobnější informace o souborech v adresářích. Z verze 2.24 jsme převzali jen klienta.

Před instalací musíte zvolit režim, ve kterém hodláte server provozovat. Na výběr máte obvyklé alternativy: trvalý běh nebo využití inetd. Jelikož neočekáváme příliš intenzivní využívání této služby, dovolíme si spíše doporučit druhou cestu.

start Startovací příkaz démona, který je v obou variantách stejný, má následující tvar:

gopherdvolby»] «adresář» «port»

«volby» ovlivňují činnost serveru. Na rozdíl od běžné praxe nemají alternativy v příkazech konfiguračního souboru a proto se jim budeme věnovat podrobněji. Tabulka 15.2 uvádí jejich stručný přehled. V následujícím textu budeme komentovat většinu z nich. Zejména doporučujeme vaší pozornosti volbu -I, která určuje režim práce gopherd. Je-li startován prostřednictvím inetd, musí být tato volba součástí příkazového řádku. Naopak při trvalém běhu programu nesmí být použita.

-I   spuštěn z inetd
-o «soubor» cesta ke konfiguračnímu «souboru»
-u «uživatel» spustit server s přístupovými právy «uživatele»
-U «uživatel» jako -u, ale «uživatel» zadán číslem, nikoli jménem
-c neměnit kořen systému souborů
-l «soubor» bude zapisovat protokol o své činnosti do «souboru»
-C nebude vytvářet soubory .cache v adresářích
-L «zátěž» dosáhne-li zatížení systému uvedené hodnoty, začne odmítat další klienty
-D vydává ladící informace

Tabulka 15.2: Volby programu gopherd

«adresář» určuje, kde bude kořenový adresář stromu nabízených informací. Jestliže váš server kontaktuje nějaký klient a zadá prázdný selektor, obdrží obsah tohoto adresáře. Aby se zabránilo v přístupu k informacím z jiných oblastí systému souborů, server po svém startu přesune kořen (chroot) do tohoto adresáře1.

Jestliže si změnu kořene nepřejete, zadejte serveru volbu -c. Autoři doporučují používat tuto volbu velmi opatrně a rozhodně neponechat v takovém případě démonovi přístupová práva superuživatele root. K tomu účelu slouží volby -u a -U. Jejich prostřednictvím lze stanovit uživatele, kterému bude běžící gopherd patřit a podle kterého se tudíž budou určovat přístupová práva. Vhodným kandidátem je anonymní uživatel ftp. Jelikož budeme prostřednictvím Gopheru zpřístupňovat náš FTP archiv, máme zaručeno, že uživatelé této služby budou mít stejná přístupová práva jako anonymní uživatelé FTP.

pozor! Chcete-li použít -c zároveň s -I, musí být ze záhadných důvodů volba -I uvedena jako první.

Posledním údajem příkazového řádku je «port», na kterém se má démon usadit. Standardním portem pro Gopher je 70 (přesněji TCP 70, protože je používán transportní protokol TCP). O změně uvažujte snad jen v případě, kdy chcete na jednom stroji provozovat více než jeden Gopher démon.

Program je schopen vést protokol o své činnosti. V něm jsou obsaženy informace o všech odpovědích serveru na dotazy klientů. Jeho jméno zadáte pomocí volby -l. Mějte na paměti, aby příslušný soubor měl přiřazeno právo zápisu pro uživatele, jehož práva gopherd používá. Pokud by se jmenoval gopher.log, měla by přístupová práva v našem případě vypadat takto:

--w-rw----  1  ftp  ftp  25691  Jul 3 12:58  gopher.log

Soubor je vlastněn anonymním uživatelem ftp, který smí pouze zapisovat. Skupina správců archivu ftp má právo zápisu i čtení, pro ostatní pak nezbylo nic. Jestliže server nemá právo zapisovat do souboru s protokolem o činnosti, odmítne nastartovat. Pokud volbu -l na příkazovém řádku neuvedete, gopherd si deníček nepovede.

Veškeré ostatní parametry, ovlivňující činnost serveru, se definují v konfiguračním souboru. Jeho jméno je dáno volbou -o. Pokud ji vynecháte, použije se implicitní jméno, dané při překladu serveru. V našem případě /net/gopher/etc/gopherd.conf. K podrobnostem o konfiguraci se dostaneme zanedlouho.


Příklad To byste neuhádli, na kterém počítači bude Firma provozovat Gopher server. Aby zpříjemnila život všem uživatelům, byl pro počítač brana.firma.cz zaveden alias gopher.firma.cz. Server na něm byl instalován prostřednictvím inetd. V /etc/services je proto obsažen řádek

gopher  70/tcp

a v /etc/inetd.conf (jelikož je příliš široký, rozdělili jsme jeho zápis do několika řádků, v souboru je však celý text uložen na jediném řádku)

gopher stream tcp nowait root /net/gopher/bin/gopherd gopherd -I -u ftp -l /var/adm/gopher.log -o /net/gopher/etc/gopherd.conf /net/ftp 70

Kořen datového prostoru Gopher serveru je v adresáři /net/ftp a je tudíž totožný s kořenem anonymního FTP serveru. Toto řešení jsme přijali, abychom mohli snadno prezentovat soubory z FTP archivu pomocí služby Gopher. Co a jak dál se dozvíte zanedlouho.


15.3  Běží Gopher?

klient Pro testování činnosti Gopher serveru jsou k dispozici dva nástroje. Tím obvyklým je samozřejmě Gopher klient, který se skrývá v programu s názvem gopher. Jako parametr mu zadejte jméno serveru, se kterým se má spojit. Testujete-li lokální server, směle můžete použít

gopher localhost

Místo localhost lze samozřejmě napsat jméno nebo IP adresu počítače. Měli byste dostat hlavní menu příslušného serveru. V našem případě by výsledkem měl být obsah adresáře /net/ftp, ovšem ne zcela kompletní. některé adresáře a soubory démon ignoruje.

Gopher klient je vhodným ověřovacím nástrojem, pokud funguje alespoň základ této služby. Jestliže je server schopen odeslat korektně formulované menu, klient je zobrazí. Zajímají-li vás detaily pro některou položku, najeďte na ni kurzorem a stiskněte klávesu [=]. Tímto způsobem lze pozorovat, zda menu obsahuje ty správné položky a zda jejich významy jsou takové, jaké jsme chtěli mít.

Telnet Pokud však server má problémy se zachováváním samotných základů Gopher protokolu, klient zpravidla mnoho informací neposkytne. Vypíše nějaké nedokončené nebo zkomolené menu, v horším případě pouze chybové hlášení, že se serverem není rozumná řeč. Pokud se chcete dozvědět, jak konkrétně vypadá odezva serveru a proč se s ní klient nedokáže vypořádat, musíte sáhnout po nástroji primitivnějším. Tím je – světe, div se – Telnet.

Navažte normální telnet spojení s Gopher serverem, tedy proti portu 70

telnet gopher.firma.cz 70

Neočekávejte žádnou uvítací salvu. Výsledkem bude prosté navázání spojení. Nyní server čeká, až od vás dostane selektor informace, kterou po něm požadujete. Jestliže vás zajímá kořenové menu, nechte selektor prostě prázdnou a stiskněte [Enter]. Jakmile odešlete selektor, měla by přijít od serveru reakce – buď odpovídající menu nebo soubor, podle toho, co jste svým selektorem požadovali.

Díky Telnetu máte před sebou syrový výsledek činnosti serveru. Vidíte, zda něco poslal a pokud ano, co to bylo. Máte-li alespoň základní znalosti Gopher protokolu, měli byste být schopni určit, zda je odpověď v pořádku. Pokud ne, snad z ní bude patrný alespoň náznak toho, kde se stala chyba.

15.4  Jak pracuje server

Východiskem pro server je samozřejmě selektor, který dostal od klienta. Promítne si ji do svého systému souborů (připomínáme, že jeho kořen může být posunut) a posoudí, k jakému druhu dat dotyčný selektor vede. Jedná-li se o soubor (textový, binární či jakýkoli jiný), prostě jej odešle klientovi. Daleko zajímavější situace nastane, pokud na konci selektoru najde adresář. V takovém případě z něj musí vyrobit menu.

konstrukce menu Ve světě Gopheru více méně platí rovnost „menu=adresář“. Server jej prohlédne a pro každý soubor či podadresář, který v něm najde, vytvoří jednu položku menu. Ta ponese uživatelské jméno shodné se jménem souboru (podadresáře). Typ se určí automaticky – adresář dostane typ 1, soubor bude podle své přípony klasifikován jako textový, binární a podobně. Server, port a selektor v položce se vyplní tak, aby při jejím odeslání klient získal dotyčnou informaci.

Následně server uspořádá položky v menu abecedně podle uživatelských jmen a výsledek zašle klientovi jako odpověď. Při instalaci serveru, jak byla popsána v předchozím příkladu, by uživatel jako kořenové menu serveru gopher.firma.cz dostal

bin
etc
pub

Když by si z něj vybral řekněme „pub“, odměnou by bylo menu, složené z názvů souborů a adresářů v datové části našeho archivu.

Ve skutečnosti by hlavní menu bylo o poznání chudší. V konfiguračním souboru lze totiž nastavit, že některé adresáře a soubory má server tajit. Podle implicitní konfigurace server nezobrazuje bin, core, dev, etc a usr. Vidíte sami, že se jedná o jména, označující zpravidla součásti systému, tedy záležitosti neveřejné a z pohledu uživatele Gopheru nezajímavé. Kromě toho jsou též přehlížena všechna skrytá jména, tedy dle konvencí Unixu jména začínající tečkou.

Použijeme-li popsaná pravidla na gopher.firma.cz, zbyde nám v hlavním menu pouhopouhý „pub“. Těžko si představit uživatele, který při shlédnutí takového kořenového menu zaryčí nadšením. Samozřejmě by bylo žádoucí, aby zde kromě odkazu na veřejný FTP archiv našel několik položek, představujících vaši instituci, její síťové služby a podobně. Nechceme však, aby odpovídající adresáře a texty strašily v kořeni FTP archivu. Proto použijeme odkazy.

odkazy Musíme přiznat, že jsme si před chvílí malinko zalhali. Soubory, jejichž jména začínají tečkou, nejsou pouze ignorovány. Ve skutečnosti do nich démon nahlíží, zda se náhodou nejedná o soubory s odkazy. Díky tomu lze do každého adresáře vložit skrytý soubor, který do menu přidá další položky. Ty nebudou nijak vázány na obsah zdejšího adresáře a mohou vést na zcela libovolné místo v Internetu. Ve skutečnosti může menu obsahovat takových souborů několik, ale doporučujeme používat standardně pouze jeden. Zvykněte si pojmenovávat jej jednotně v celém stromě. Autoři Gopheru doporučují .Link. My jsme si zvykli na .gopher a tohoto jména se budeme držet i zde. V principu vyhoví libovolné jméno, začínající tečkou.

Soubor s odkazy má pevně definovanou strukturu. Jednotlivé odkazy jsou reprezentovány skupinou atributů. Každý z nich je zapisován na samostatném řádku ve tvaru

«název»=«hodnota»

Odkazy jsou navzájem odděleny prázdnými řádky. Na jejich pořadí nezáleží – vše bude v závěru abecedně uspořádáno společně se soubory a adresáři.

Položka naštěstí nese pouhých šest atributů, jejichž názvy jsou vždy čtyřpísmenné. Name udává nadpis položky – tento text uvidí uživatel v menu. Type stanoví typ položky. Další tři údaje poslouží k jejímu získání. Host je název nebo IP adresa počítače, Port číslo portu, na kterém zde bydlí server, a Path selektor, který mu klient musí pošeptat do ouška. Pro získání těchto identifikačních informací je ideální právě klávesa [=], na niž Gopher klient reaguje zobrazením informací o položce. Je hodný a tak je zapisuje přesně ve tvaru, používaném v souborech s odkazy. Pokud položka pochází z téhož serveru, lze pro atributy Host a Port použít zkratku. Přiřaďte jim hodnotu +. Server ji automaticky nahradí jménem svého počítače a portem, na kterém sídlí.

Šestý atribut umožňuje zanášet nepravidelnosti do abecedního uspořádání. Zapisuje se jako Numb=«číslo» a udává pořadí, na kterém se má tato položka nacházet v menu. Specialitou Numb je, že se nesmí vyskytovat v definici položky jako poslední.

Ve skutečnosti server uspořádá menu následovně: Začne položkami, kterým bylo atributem Numb přiřazeno číslo. Jsou seřazeny vzestupně podle svých čísel. Teprve za nimi budou umístěny ostatní v abecedním pořadí.


Příklad Kdybychom chtěli do hlavního menu serveru gopher.firma.cz přidat odkaz na seznam všech známých Gopher serverů v ČR, vytvořili bychom v adresáři /net/ftp soubor .gopher s následujícím obsahem:

Name=Seznam domacich Gopher serveru
Numb=5
Type=1
Host=gopher.cesnet.cz
Port=70
Path=1/.gopherinfo/cz-gophers

Samozřejmě lze vytvořit adresář, který bude obsahovat jen soubor .gopher a vzniklé menu bude sestaveno výlučně z odkazů v něm obsažených. Typický představitel této kategorie je menu, obsahující odkazy na významné servery ve světě. Tato možnost se také používá, když potřebujete prezentovat informace, obsažené například v FTP archivu, ovšem v poněkud jiném uspořádání. Pak sestavíte strukturu adresářů, obsahujících pouze soubory .gopher. V nich budou obsaženy odkazy na soubory či adresáře FTP archivu.

Tip! My jsme si vytvořili konvenci vyhradit pro tyto účely v kořeni FTP archivu adresář .gopherinfo. Díky skrytému jménu příliš neruší uživatele ostatních služeb. Veškerá „čistá“ menu ukládáme do jeho podadresářů (viz například selektor seznamu domácích Gopher serverů v našem příkladu).

přejmenování položek V hlavním menu nám zbývá poslední strašák – jméno adresáře „pub“. S uživatelskou přívětivostí nemá mnoho společného, lepší by bylo něco jako „Náš FTP archiv“. To jsme schopni realizovat prostředky, které jsme zatím poznali, ovšem jen se zatnutými zuby. Dřevní možnost – přejmenovat pub na Nas FTP archiv2 – zavrhneme. Jednak je utrpení pracovat s takto pojmenovanými soubory, jednak bychom zmátli uživatele anonymního FTP, kteří by místo známého pub uviděli tuhle hrůzu.

Druhou alternativou by bylo přidat do konfigurace serveru, aby ignoroval též název pub a do .gopher pro kořenové menu přidat položku

Name=Nas FTP archiv
Type=1
Host=+
Port=+
Path=1/pub

To se však drbeme pravou rukou za levým uchem. Naštěstí se jedná o celkem standardní situaci a gopherd pro ni nabízí řešení. Chcete-li, aby se některý soubor či adresář objevil v menu pod jiným názvem, postupujte následovně:

  1. V adresáři, ve kterém je soubor (adresář) umístěn, vytvořte podadresář .cap – jméno je pevně dáno a musíte je dodržet.

  2. Pro každý soubor, který chcete v menu přejmenovat, založte v adresáři .cap stejnojmenný textový soubor. Jeho obsah bude obdobný obsahu souborů s odkazy. Tentokrát však má smysl používat jen atributy Name a Numb, kterými lze ovlivnit jméno a pořadí v menu. Ostatní atributy jsou vytvořeny automaticky tak, aby položka vedla k odpovídajícímu souboru (adresáři). Dovolíme si ještě jednou zdůraznit, že přiřazení informací v .cap k souboru se děje na základě shody jmen.


Příklad V našem případě bychom založili adresář /net/ftp/.cap a v něm vytvořili soubor pub s následujícím obsahem:

Name=Nas FTP archiv

Budeme-li předpokládat, že soubor /net/ftp/.gopher obsahuje text z předchozího příkladu, bude mít hlavní menu našeho serveru tuto podobu:

Seznam domacich FTP serveru
Nas FTP archiv

vyrovnávací soubor Nyní znáte veškerá pravidla, kterými se server řídí při sestavování menu v adresáři. Jistě uznáte, že jeho práce není lehká. Nedivme se proto, že si ji snaží usnadnit. Pokud mu to nezakážete volbou -C, uloží si výsledek svého snažení (čili sestavené menu) do adresáře pod názvem .cache. Když příště dostane selektor ke stejnému adresáři a najde v něm čerstvý soubor .cache, nebude se usilovat a prostě jej odešle klientovi. Pouze v případě, že .cache buď neexistuje nebo je příliš starý, sestaví menu ručně (a výsledek si opět poznamená).

Popsaná činnost serveru samozřejmě ušetří práci. Zejména u vysoce zatížených strojů se může projevit nezanedbatelným zrychlením doby odezvy. Má však jednu nepěknou vlastnost – zcela zlikviduje podporu češtiny. pro ni je potřeba, aby server vytvářel menu pro každého klienta nově a to v tom, kódování, které si poručil. Chcete-li používat češtinu, musíte volbou -C úsporný režim vypnout.

15.5  Jemnosti menu

Ačkoli jsme v předchozí části popsali poměrně zevrubně způsob sestavení menu, přece jen se nám podařilo některé rafinovanější obraty zatajit. Týkají se speciálního zpracování některých typů souborů a neobvykle formulovaných odkazů.

E-dopisy Jestliže gopherd zjistí, že některý ze souborů v adresáři je ve skutečnosti složkou s dopisy, zachází s ním inteligentním způsobem. V menu jej nabídne jako adresář (typ 1). Pokud jej uživatel zvolí a klient pak požaduje tento soubor, server jej prohlédne a jako odpověď pošle menu dopisů, uložených ve složce. Pro jména položek přitom použije texty z hlaviček Subject jednotlivých dopisů. Jestliže pak klient projeví zájem o některý z nich, server mu odešle patřičný dopis. Tímto způsobem lze snadno prezentovat v Gopheru archivy poštovních konferencí – stačí ukládat dopisy z korespondence do jedné poštovní složky a tu pak podstrčit serveru.

skripty Druhou zajímavostí je, pokud server narazí v adresáři na příkazový soubor (fajnšmekři říkají shell skript). V menu se objeví s typem 0 – textový soubor. Když o něj klient požádá, server spustí tento skript a jeho výsledek zašle jako odpověď na dotaz. To nám dává možnost generovat odpovědi „za chodu“ tak, aby odrážely současnou situaci. Lze například zaslat aktuální čas serveru nebo seznam momentálně pracujících uživatelů.

Nevýhodou je, že při tomto způsobu vyvolání nelze ovlivňovat parametry spouštěného programu. Má-li mít uživatel možnost zasáhnout do činnosti volaného, musíme sáhnout po typu 7, který byl původně určen pro vyhledávání v rejstřících a databázích. Při jeho zpracování klient standardně nabídne uživateli možnost zadat hledaný text a ten pak zařadí do svého dotazu. Zpracování položek typu 7 však není jednoduché. Vzhledem k nevalným perspektivám Gopheru se mu nebudeme věnovat podrobněji.

FTP Poslední zajímavou možností, o které se zmíníme, je odkaz na informace prostřednictvím anonymního FTP. Jestliže vytvoříte Path podle šablony

ftp:«adresa»@«cesta»

Chápe se jako odkaz na anonymní FTP server. Počítač, který má být kontaktován, je dán «adresou», «cesta» pak určuje umístění informace na něm. Pozor! Odkazujete-li se na adresář, musíte «cestu» zakončit znakem /. Vede-li odkaz k souboru, lomítkem naopak končit nesmí. Zároveň musíte odpovídajícím způsobem stanovit typ informace (hodnotu atributu Type) pro tento odkaz.

15.6  Konfigurační soubor

Podívejme se, jakým způsobem lze ovlivňovat činnost serveru. Konfigurační soubor (v našem případě /net/gopher/etc/gopherd.conf) je jako obvykle textový soubor, obsahující jednotlivé konfigurační příkazy. Dle běžných zvyklostí jsou ignorovány prázdné řádky a řádky začínající znakem #.

Konfigurační příkazy jsou umístěny na jednotlivých řádcích. Dodržují společný tvar

«jméno»: «hodnota»
K dispozici máte pět příkazů.

hostalias hostalias určuje jméno serveru. Kdykoli v odkazech přiřadíte atributu Host hodnotu +, server ji nahradí tímto jménem. Pokud má váš server přezdívku gopher.«doména», je vhodné použít toto jméno.

ignore ignore definuje jména, která bude gopherd přehlížet. Nejedná se však o ochranu proti přístupu. Dotyčná jména server nezařadí do menu. Pokud však klient požádá o dotyčné soubory, budou mu odeslány.

ext ext se používá k automatickému určování typů souborů. Jeho hodnota se skládá ze čtyř položek, oddělených mezerami. První je přípona souboru, pro kterou daný příkaz platí. Za ní následuje jednopísmenný typ, který má server souboru přiřadit. Třetí v pořadí je prefix, kterým má začínat selektor tohoto souboru (většinou se shoduje s typem). Konečně čtvrtá položka obsahuje typ pro Gopher+ a je serverem verze 1 nevyužita.

access Závěrečné dva příkazy slouží k řízení přístupu k serveru. Základem je access s hodnotou ve tvaru

«adresa» «seznam činností»

Na místě «adresy» může stát doménové jméno, IP adresa nebo slovo default, které popisuje implicitní chování. Nepoužívají se hvězdičky. Chcete-li zapsat adresu celé sítě nebo rozsáhlé domény, napište jen významnou část a zbytek vynechte. Seznam činností je složen ze slov read (právo číst, tedy získávat soubory), browse (právo prohlížet – získávat menu) a search (právo vyhledávat), navzájem oddělených čárkami. Před každé slovo lze vložit vykřičník, což znamená zákaz dotyčné činnosti. Pokud vykřičník chybí, je akce povolena.

pozor! Implicitní chování uveďte vždy jako první. Všechny ostatní příkazy access pak zdědí tyto implicitní hodnoty a stačí uvádět jen činnosti, ve kterých dochází ke změně.


Příklad Pokud bychom chtěli povolit lokálním uživatelům vše, uživatelům z ČR jen čtení a prohlížení a ostatním nic, použili bychom následující příkazy:

bummermsg:   Sorry, access not allowed.

access: default      !read,!browse,!search
access: 192.168.33.  read,browse,search
access: .cz          read,browse
# také bychom mohli použít plný tvar
# access: .cz        read,browse,!search

bummermsg Z příkladu jste jistě pochopili, že příkazem bummermsg se definuje zpráva pro klienty, kteří nejsou oprávněni provést požadovanou operaci.


Příklad Podívejme se na ukázku kompletního souboru gopherd.conf pro server gopher.firma.cz. Seznam definovaných přípon jsme zkrátili zhruba na čtvrtinu, aby výpis nebyl neúnosně dlouhý. Kompletní verzi souboru najdete v distribuci.

hostalias: gopher.firma.cz

ext: .hqx 4 0 HQX
ext: .gif I 9 image/gif
ext: .au s s audio/basic
ext: .html h GET /h WWW
ext: .gz 5 9 Gzip
ext: .tar.gz 5 9 TARGz
ext: .zip 5 9 PKzip
ext: .exe 5 9 PC_executable
ext: .ps 0 0 application/postscript

CharSet: keybcs2 keybcs2
CharSet: ISO-L2 ISOLatin2
CharSet: CP852 PCLatin2
CharSet: Sys7CZ MacSys7

ignore: lost+found
ignore: lib
ignore: bin
ignore: core
ignore: tmp
ignore: etc
ignore: usr
ignore: dev
ignore:  

bummermsg: Sorry, access denied.

access: default         browse,read,search

Příkaz bummermsg nemá samozřejmě žádný smysl, protože vše je povoleno. Kdybychom však v budoucnu na politice serveru něco změnili, máme jej připraven. O významu nestandardního CharSet se dočtete v následující části.


15.7  Gopher a čeština

Zmínili jsme se o možnosti automatické změny kódování českých dokumentů podle přání uživatele. Jak celá věc funguje? Dokumenty jsou na serveru uloženy v jednom určitém kódu. Určuje se při překladu démona gopherd a musí být jednotný pro všechny dokumenty a menu na serveru. My jsme zvolili ISO 8859-2 (ISO Latin 2).

Uživatel zpravidla jako jednu z položek hlavního menu dostane „Zvolte si kódování českých znaků“. Když ji vybere, obdrží nabídku dostupných kódů. Volbou jednoho z nich se ocitne zpět v hlavním menu, tentokrát však již se zapnutou kódovou konverzí. Tu si Gopher pamatuje a uplatňuje ji pro všechny textové soubory a všechna menu, dokud není v odkazu řečeno jinak. Dokonce je možné zachovávat zvolené kódování i při přeskoku na jiný server, který používá stejný systém.

fiktivní adresář Trik se zachováním zvoleného kódu je dosažen jistou změnou selektoru. Na její začátek se vloží jméno fiktivního adresáře, vyjadřující zvolené kódování. Místo původního souboru

0/pub/README

se náhle jakoby objeví souborů několik:

0/keybcs2/pub/README
0/ISO-L2/pub/README
0/CP852/pub/README
0/Sys7CZ/pub/README

Ve skutečnosti samozřejmě existuje dále jen jeden soubor /pub/README. Úvodní adresář v selektoru je smyšlený. Server podle něj vybere převodní tabulku a při hledání souboru na svém disku jej nebere v úvahu. V platnosti zůstává i původní selektor (bez kódového adresáře). V takovém případě bude soubor (menu) převeden do standardního ASCII, tedy odháčkován a odčárkován.

Názvy kódů jsou dány v konfiguračním souboru démona gopherd.conf. Jsou zapisovány pomocí příkazů

CharSet CharSet: «název kódu» «tabulka»

«název kódu» stanoví jméno fiktivního menu, které bude server pro daný kód používat. «tabulka» je identifikace konverzní tabulky, podle které má démon měnit kódy znaků.

pozor! Neměňte tuto část konfigurace. Síla řešení spočívá především v tom, že názvy kódů jsou jednotné. Díky tomu lze přecházet z jednoho serveru na druhý a zachovávat při tom zvolený kód.

Díky tomu, že kódový adresář selektor zahajuje, bude zachován ve veškerých automaticky generovaných položkách. Je-li selektor aktuálního adresáře 1/CP852/pub/ a v něm se nachází podadresář msdos, server stanoví jeho selektor prostým přidáním jména na konec původního – 1/CP852/pub/msdos/. Kódování tak zůstává zachováno.

odkazy V ručně vytvářených odkazech se o ně musíme postarat sami. Jestliže selektor zahájíte znakem „mínus“ (), server nepřidá na její začátek adresář, označující kódování. K ostatním selektorům bude zpředu přidán aktuální kódovací adresář. Jedinou výjimkou z tohoto pravidla je prázdný selektor (do hlavního menu), která vždy zůstane prázdná.


Příklad Uveďme si ukázku souboru .gopher, který obsahuje odkazy na tři externí servery. Ve všech případech vede odkaz do kořenového menu, avšak jen pro gopher.vslib.cz má být zachována informace o zvoleném kódu.

Name=Táta Gopher
Type=1
Host=boombox.micro.umn.edu
Port=70
Path=

Name=Technická univerzita v Liberci
Type=1
Host=gopher.vslib.cz
Port=70
Path=/

Name=České vysoké učení technické
Type=1
Host=gopher.cvut.cz
Port=70
Path=-/

Stejná pravidla samozřejmě platí pro odkazy v rámci téhož serveru (kdy je Host=+, Port=+). Dokud uživatel nezvolil žádný kód (převádí se do ASCII), přítomnost či nepřítomnost úvodní pomlčky se ve výsledném selektoru nijak neprojeví. Odlišnosti začínají až s výběrem kódu.

Tip! U odkazů na zahraniční servery nebo na domácí, které neumí česky, musí být selektor prázdný nebo začínat pomlčkou. Jelikož sekce odkazů na zahraniční servery zpravidla mívá své samostatné menu, lze přidat pomlčku již k odkazu, otevírajícímu dané menu. Informace o zvoleném kódu se díky tomu ztratí již v okamžiku, kdy uživatel vstoupí do menu zahraničních serverů. Nemůže se vám pak stát, že u některého z nich na pomlčku zapomenete a výsledný odkaz bude nefunkční.

nabídka kódů Poslední otázkou je, jak vytvořit menu pro volbu kódu. Bývá zvykem, aby něm byly uvedeny názvy kódů a zároveň ukázka – řetězec, obsahující znaky s diakritickými znaménky, na kterém uživatel ihned uvidí, zda dotyčné kódování je pro něj to pravé. Vžila se věta „Žluťoučký kůň úpěl zběsilé ódy“, která obsahuje slušnou přehlídku českých znaků.

Při sestavování menu se však musíte vyhnout několika nástrahám. Především je třeba zabránit serveru, aby jakkoli zasahoval do kódování tohoto menu. Ukázkové řetězce jsou zde zapsány v původních kódech a je třeba je zachovat, aby měly nějakou vypovídací hodnotu. Proto musí selektor, kterým se odkážete na nabídku kódů (zpravidla z hlavního menu) začínat -1/ISO-L2 – ze selektoru je třeba odstranit informaci o aktuálním kódu a vnutit do ní název toho kódu, ve kterém jsou uloženy zdejší texty. Díky tomu server menu nezmění – má je předložit v tomtéž kódu, ve kterém je zapsáno.

Řekněme, že nabídka kódů bude uložena v adresáři .gopherinfo/code/. V hlavním menu by se měla objevit položka

Name=Zvolte kódování českých znaků
Type=1
Host=+
Port=+
Path=-1/ISO-L2/.gopherinfo/code

Do adresáře /net/ftp/.gopherinfo/code umístíme soubor .gopher, obsahující položky ve stylu

Name=PC latin 2
Type=1
Host=+
Port=+
Path=-1/CP852

Ostatní se liší jen nadpisem a identifikátorem kódu v Path. Všechny položky vedou do hlavního menu serveru, ovšem přeloženého do různých kódů.

podmíněné odkazy Poslední vymožeností, kterou česká adaptace serveru přináší, jsou podmíněné odkazy. Server je zahrne do menu, jen pokud uživatel zvolil daný kód. V definici položky je podmínka zapsána prostřednictvím atributu

Cond=«kód»

kde «kód» je název kódu. Je-li prázdný (je uvedeno jen Cond=), vyhoví mu překlad do ASCII – tedy žádný kód. Dotyčná položka bude zobrazena jen když je menu odesíláno v určeném «kódu». Když atribut Cond neuvedete, položka není vázána volbou kódu a objeví se vždy. To je samozřejmě nejčastější. Obdobně jako Numb „nesmí“ být atribut Cond posledním v položce.

Pomocí podmíněných odkazů lze realizovat například odkazy na služby, které sice jsou v češtině, avšak jejich kódování je řešeno jiným způsobem.


Příklad Představme si odkaz na českou WWW stránku (to se v Gopheru může – k tomu účelu slouží typ h), která však změnu kódování řeší poněkud jiným mechanismem. Je potřeba zavolat vždy odpovídající CGI skript (podrobněji viz část 16.5.4). Daná stránka by se mohla v menu vyskytovat jako skupina položek, z nichž díky podmínkám bude zobrazena vždy jen jedna:

Name=Klub "Včelka - přítel člověka"
Cond=
Type=h
Host=www.vcelka.cz
Port=80
Path=-h/cgi-bin/toASCII/vcelka.html

Name=Klub "Včelka - přítel člověka"
Cond=ISO-L2
...
Path=-h/cgi-bin/toISO-8859-2/vcelka.html

Name=Klub "Včelka - přítel člověka"
Cond=cp852
...
Path=-h/cgi-bin/toCP852/vcelka.html

Name=Klub "Včelka - přítel člověka"
Cond=keybcs2
...
Path=-h/cgi-bin/toKEYBCS2/vcelka.html

Name=Klub "Včelka - přítel člověka"
Cond=sys7CZ
...
Path=-h/cgi-bin/toMac/vcelka.html

Atributy Type, Host a Port, které jsou pro všechny položky stejné, jsme vynechali.


15.8  Další informace

Podrobnosti o Gopher protokolu se dočtete v RFC 1436 – The Internet Gopher Protocol (a distributed document search and retrieval protocol). Zde najdete i definice jednotlivých typů.

1 Obdobně se chová FTP démon pro anonymní uživatele.

2 Jména souborů mohou obsahovat mezery. Potom je však na příkazovém řádku musíte vždy uzavírat do apostrofů či uvozovek, aby byla pochopena jako jeden řetězec, nikoli skupina jmen jednotlivých souborů.