- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 07/98

Chyby uživatelů patří uživatelům

Milan Šorm, 9. července 1998

Umožnil jsem tak jako mnohý správce uživatelům vytvářet vlastní webové stránky a zveřejňovat je běžnou konvencí. Rovněž jsem jim dovolil psát si vlastní CGI skripty. A to s sebou nese jeden zásadní problém.

Chyby CGI skriptů jsou standardně zapisovány do chybového výstupu Apache, resp. celý chybový výstup (STDERR) je připojen do tohoto souboru s identifikací skriptu a času vzniku problému.

Jenže chyba v uživatelském skriptu zajímá především uživatele, který skript vytváří. Nehledě k tomu, že se potom na partition, na které se ukládají systémové logy, objevují záznamy uživatelů a oni mají teoreticky možnost tuto partition zahltit.

Existuje více řešení tohoto problému. Základním řešením, které řeší informovanost uživatele i zatěžování centrální logů, je nesystémové užívání přesměrování chybového vstupu někam jinam samotným tvůrcem CGI skriptu. Např. v Perlu se naskýtají pěkné možnosti při užití CGI::Carp či Tie::STDERR|. Proč je toto řešení nesystémové? Protože ponecháváme na vůli tvůrce, jestli toto využívá.

Jiné řešení, které řeší jen informovanost uživatelů, spočívá v jednorázové kontrole chybového logu Apache např. večer. Nalezené chyby uživatelů jsou jim potom nějakým způsobem předány (zaslány mailem, připojeny do souboru chyb apod.). Ani toto řešení není ideální, i když jej lze kombinovat s promazáváním logu příp. zkrácením doby kontroly např. na jedinou minutu.

Za nejlepší variantu považuji možnost nasadit na chybový výstup Apache průběžný filtr. Já nejsem Apachem nucen psán všechny chyby do souboru, ale mohu si je nechat posílat do filtru, který bude tyto chyby procházet a rozesílat příslušným uživatelům či zapisovat do systémového logu.

Jak se to provede? Do řádku ErrorLog v souboru httpd.conf se místo jména souboru uvede |/usr/sbin/analerrorlog. To je samozřejmě kolonová konvence (trubková zní lépe ;-) následovaná jménem filtru. Filtr bude spuštěn jen jedenkrát (při startu Apache) a po celou dobu běhu jsou mu na standardní vstup předávány údaje, které by chodily do error_logu.

Toto je např. standardní jednořádkový chybový výpis při neexistenci stránky:

[Wed Jul 8 18:48:20 1998] access to\
/www/htdocs/plan.htm failed for \
infra.euroseek.net, reason: File does not exist

Toto se uloží v hlavním error_logu, kterým se probírá náš webmaster.

A teď komplexnější ukázka z uživatelských CGI skriptů, když nastane chyba:

Illegal division by zero at\
 /home/popelnik/html/perl/passwd.pl line 35.
[Tue Jul 7 07:47:53 1998] access to\
 /~popelnik/passwd.cgi failed for \
mensa.physics.muni.cz, reason:\
 Premature end of script headers

Toto se uloží k uživateli do jeho error_log souboru.

Bohužel řádek, který označuje, ve kterém skriptu k chybě došlo, přijde vždy až jako poslední. Proto je nutné si zapamatovat všechny procházející řádky až po řádek začínající hranatou závorkou (např. v souboru). Z hranaté závorky lze již snadno rozpoznat, komu skript patří (za znakem následuje login uživatele) a je možné mu příslušná data zaslat (mailem, uložením do nějakého souboru v jeho home adresáři apod.). Pokud se nenajde uživatel, komu by chyba patřila, může se uložit do původního chybového souboru.

Filtr navíc může převádět Redirect údaje a Alias údaje zpět na původní majitele (pokud máte např. konvenci s plnými jmény uživatelů namísto s loginy) či ignorovat některé chyby (typicky věci obsahující řetězce "send body", "lingering close", "lost connection", "connection reset by peer", "fixed spelling" či jména robotů - vyhledávačů.

Vhodným jazykem pro napsání filtru je např. Perl. Průběžně lze chyby místo v souboru zachycovat v paměti (pole) a na závěr vyklopit např. přes sendmail uživateli do pošty. A to se potom chybující uživatel nad svým CGI skriptem rychle zamyslí.

Samozřejmě lze stejný způsob aplikovat i na soubor přístupů (access_log) a zaznamenávat si transakce, ale to lepší řešit dávkově a data dávkově přenášet do grafů. Alespoň si to tak myslím já. *


- předchozí článek - následující článek - obsah - úvodní stránka -