CGI

sobota, 21 sierpnia 2010

Właśnie kompiluję Qt 4.7, ciekaw jestem tamtejszego silnika WebKit (już w wersji 2.0).

W międzyczasie zacząłem zastanawiać się jak mógł by wyglądać najprostszy serwer aplikacji na użytek skryptów w shellu?

W ramach wstępu

Shell jest idealnym środowiskiem do pośpiesznego projektowania aplikacji. Shell nie pretenduje do miana "ultranowoczesnego", nikt nie przykleja mu etykietek Professional, Advanced czy Enterprise. Mimo to integracja narzędzi jest czymś o czym użytkownicy innych środowisk mogą tylko marzyć, przetwarzanie równoległe jest w nim codziennością, systemy rozproszone powstają jakby mimochodem, a edycja pliku tekstowego zajmującego 60GB nie jest niczym przerażającym.

Jest tylko jeden mały mankament, zazwyczaj takie skrypty nie są zbyt komunikatywne

Niedawno (weby) napisałem że optymalnym interfejsem jest CGI, ale czy na pewno?

Założenia

Wydawało by się że to takie proste, powrzucać skrypty do katalogu cgi-bin i gotowe.

ale…

Cały problem w tym że piszę o istniejących skryptach. O rozwiązaniach ad hoc, nie będących efektem żadnego projektu. Wyrastają one jako rezultat bieżących potrzeb, niekiedy by ułatwić powtarzalne czynności, lub wyeliminować żmudną dłubaninę.

Może więc to wcale nie jest tak dobry pomysł?

Serwer HTTP

ale brnijmy dalej…

Z uprawnieniami można sobie poradzić. Wystarczy uruchomić własny serwer, zamiast polegać na tym „oficjalnym”. Istnieje wiele małych serwerów np thttpd, lub boa. Można też na poczekaniu napisać własny w ruby lub pythonie — co często jest najłatwiejsze.

Mozna też użyć Apache, co już raz pokazywałem przy innej okazji (Zdalna Instalacja).

weby.conf

Listen 127.0.0.1:8080
DocumentRoot app
ErrorLog err.log
PidFile weby.pid

LoadModule cgi_module /usr/lib/httpd/modules/mod_cgi.so

<Directory app>
 SetHandler cgi-script
</Directory>
httpd -X -d $PWD -f weby.conf

Wszystko w katalogu app, zostanie udostępnione na porcie 8080 jako skrypty CGI. Dostęp będą miały wyłącznie osoby zalogowane lokalnie, co może już być wystarczającym „zabezpieczeniem”. Skrypty będą wykonywać się na naszych uprawnieniach, więc większość problemów rozwiązana.

Przykład: app/hello

#!/bin/sh
echo Content-Type: text/plain
echo
echo HELLO

Interakcja z użytkownikiem, będzie niestety wymagała zakończenia skryptu. Tego raczej nie warto obchodzić, chociaż przychodzi mi do głowy rozwiązanie z użyciem socketów, pozwalające obejść i ten problem, ale czy naprawdę warto?

Największym problemem może być czas wykonywania i kontrola nad takimi zadaniami. Tu lepiej polegać na klasycznych rozwiązaniach (cron, at, screen).

Na koniec pozostaje kwestia rozszyfrowania parametrów zapytań. Używanie zmiennych $1, $2, $BLE, jest nieco łatwiejsze niż wyłuskiwanie wszystkiego z QUERY_STRING, no bo co znaczy ciąg "B%C5%81%C4%84D"?

…ale o tym już jutro.

Etykiety: ,

Red 00:19

Komentarze

Prześlij komentarz

Archiwum

Subskrybuj

RSS / Atom