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…
- Jak nadać odpowiednie uprawnienia, gdy nobody nie wystarcza?
- Jak uniknąć uruchamiania przez niepowołane osoby?
- Co zrobić gdy program w połowie wykonywania będzie musiał zadać dodatkowe pytania?
- Co jeśli będzie wykonywać się parę minut?
- No i jeszcze ta nieszczęsna zmienna QUERY_STRING, sama się nie obsłuży…
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.
Red 00:19
Prześlij komentarz