Table of Contents

Laboratorul 05. Servicii web

Init

În procesul de boot, după ce kernel-ul s-a inițializat, trebuie pornit ansamblul de procese ce vor rula în user-space pe parcursul sesiunii curente. Pentru a realiza acest lucru, kernel-ul va porni daemon-ul init. În cazul în care kernel-ul nu reușeste sa pornească acest proces, se va produce ceea ce se cheamă “kernel panic”.

Init este primul proces pornit, rulează în user-space, are în mod normal PID-ul 1, va fi părintele tuturor celorlalte procese și va adopta orice proces orfan. Pentru a evita posibile accidente, init este implementat astfel încât sa ignore majoritatea semnalelor, chiar și pe cele trimise de procese rulate cu privilegii. Singurele semnale pe care acest proces le tratează sunt cele pentru care există handlere instalate explicit. Există totuși distribuții ce conțin astfel de handlere pentru a implementa comportamente asemănătoare cu halt sau shutdown atunci când init primește SIGTERM.

Odată ce a fost pornit procesul init, acesta are rolul ca mai departe să pornească restul proceselor din sesiune. De-a lungul timpului au existat diverse implementări ale acestei operații. Cea mai simplă abordare este cea folosită pe sistemele BSD. Acestea apelează un script ce se află în /etc/rc și conține lista programelor ce trebuiesc pornite. Init nu face altceva decât să ruleze acest script. Alte implementări se bazează pe evenimente asincrone (precum Upstart) sau daemoni specializați meniți să înglobeze și să înlocuiască init-ul clasic și script-urile necesare acestuia (systemd).

CGI

Serviciul pe care îl vom pune la dispoziţie pe RaspberryPi in acest laborator este un server web. Serverul web poate genera dinamic pagini. Rădăcina server-ului este /var/www/. Aceasta se realizează prin execuţia de scripturi aflate în directorul cgi-bin din rădăcina serverului, folosindu-se o metodă standard numită Common Gateway Interface. CGI presupune execuţia unui script specificat în cererea HTTP (identificat ca orice alt fişier de pe server), care poate primi parametri dintr-un formular web pe stdin şi prin variabilele de mediu, respectiv poate genera pagini dinamice scriind pe stdout.

Exemplu:

În directorul cgi­-bin din root-ul serverului web creăm un fişier executabil numit 1.sh. Conținutul acestui fișier este de forma:

1.sh
#!/bin/sh
echo "Content--­type: text/html"
echo ""
echo "<HTML><HEAD><TITLE>Sample CGI Output</TITLE></HEAD>"
echo "<BODY><p>"
echo ­-n "Generated "
date
echo "</p><pre>"
env
echo "</pre>"
echo "</BODY></HTML>"

Pentu executare, în browser se scrie http://<ip>/cgi­-bin/1.sh .

Metoda CGI permite execuţia oricărui script pe server, putându-se astfel efectua orice operaţie. În mod normal s-ar restricţiona accesul la sistem spre exemplu rulând serverul web sub un utilizator fără privilegii.

Exemplu de cod HTML:

<form method="post" action="/cgi-bin/on.sh">
<input type="submit" name="on" value="LED On" />
</form>

Chiar dacă scripturile nu generează ieşire, browserul le va interpreta ca downloaduri goale, pentru că a emis o cerere şi aşteaptă un fişier ca răspuns, mecanismul CGI se desfăşoară doar pe server, fără ştirea sau interesul browserului. Trebuie ca ele să trimită un răspuns de tip redirect la pagina iniţială pentru a obţine o interfaţă rezonabilă. Aceasta se face adăugând în scripturi următorul cod:

echo "HTTP/1.0 302 OK"
echo "Location: /"
echo

Header-ul de tip Location specifică unde anume să fie redirectat browser-ul. Spre exemplu, dacă aveţi o pagină numită my_index.html unde vreţi ca utilizatorul să fie redirectat, atunci header-ul va fi: “Location: /my_index.html”

Exerciții

  • Toate exercițiile se vor rezolva în mașina virtuală QEMU.
  • Pentru acest laborator este nevoie să porniți QEMU cu parametri de rețea de bridge. De asemenea, este necesar să puteți să dați ping între mașina host și mașina target/QEMU.

0. Bash - Creați un script bash în mașina virtuală QEMU care să afișeze data curentă. Acesta trebuie să poată fi executat din orice locație. Hint: /usr/bin/

1. HTTP - Ne propunem în cadrul laboratorului să instalăm un server web pe mașina emulată de Raspberry Pi în QEMU. Instalați pachetele lighttpd si php5-cgi în QEMU. Dacă nu aveți conexiune la exterior, puteți descărca o imagine care conține aceste pachete de aici. Validați funcționalitatea server-ului web.

2. CGI - Creaţi în index.html (în rădăcina ierarhiei web) un formular web cu metoda POST, conţinând un buton de tip submit. Butonul va trebui să execute un script aflat în directorul /var/www/cgi-bin/, care la rândul lui va apela scriptul creat la exercițiul 0. Scopul este ca la apăsarea butonului să se afișeze data curentă.

3. PHP - Afișați într-o pagină web informații de sistem folosind modulul de PHP.

Puteți verifica dacă modulul de PHP este activat cu:

phpinfo.php
<?php
phpinfo();
?>

Daca aveti eroare 403, trebuie sa rulati lighty-enable-mod fastcgi si sa verificati ca pachetul php-cgi instalat. Verificati si ca lighttpd a fost auto configurat corect, si daca nu, modificati configuratia conform: https://www.cyberciti.biz/tips/lighttpd-php-fastcgi-configuration.html.

Daca aveti eroare 500, verificati ca nu rulati din folderul cgi-bin.

Resurse