Httpstats is een programma dat gebruikt kan worden om rapporten te genereren over het gebruik van een web server zoals apache
Zo'n rapport bestaat uit een tabel waarbij elke lijn het aantal verzoeken (``hits'') geeft die aan bepaalde voorwaarden voldoen.
De input van httpstats is een access_log bestand (in het default formaat), zoals gegenereerd door de apache web server1. Elke lijn in dit bestand komt overeen met één verzoek (``hit'').
Httpstats biedt de mogelijkheid om enkel te rapporteren over de verzoeken die aan bepaalde voorwaarden voldoen. Bvb. is het mogelijk om een rapport te maken over alle verzoeken die komen vanuit een bepaald (deel) domein.
Anderzijds zijn ook verschillende rapporten mogelijk die de verzoeken groeperen volgens een of ander criterium. Bijvoorbeeld kunnen verzoeken gegroepeerd worden volgens het gevraagde pad.
Elke machine op het internet heeft een ip adres2. Zo'n adres is een getal van 32 bits dat meestal voorgesteld wordt als een string van de vorm
n.n.n.n
Waarbij elke n een byte voorsteld.
Bijvoorbeeld is het ip adres van de tinf2 machine 134.184.65.2.
Omdat ip adressen niet echt handig zijn voor gebruik door mensen worden zij dikwijls geassocieerd met een meer leesbare naam van de vorm
machine-naam.domein-naam
Waarbij domein-naam zelf weer bestaat uit een aantal strings, gescheiden door punten.
De volledige naam van de machine met domeinadress 134.184.65.2 is bijvoorbeeld tinf2.vub.ac.be. Hier is be de naam van een ``top'' domein (``België'') ac.be een ``deeldomein'' van be (dat alle machines in academische instellingen in België bevat) en vub.ac.be dat deel van ac.be dat de machines op de VUB omvat.
De associatie tussen domeinadressen en domeinnamen wordt bijgehouden door zgn. DNS (``domain name service'') servers die vanuit elke machine kunnen geraadpleegd worden. Dit laatste kan gebeuren door middel van een functie zoals gethostbyname of door een interactief programma zoals nslookup.
Het bestand dat de informatie over gedane verzoeken bevat is een tekstbestand dat uitsluitend lijnen bevat zoals geïllustreerd in figuur 1. Elke lijn komt overeen met een verzoek voor een pagina op de website.
igwe.vub.ac.be - - [12/Feb/2000:13:18:49 +0100] "GET /images/openssl_ics.gif HTTP/1.0" 200 2063
134.184.65.2 - - [01/Nov/2000:15:42:44 +0100] "GET /ssl/kiesoos.cgi?rolnr=58769&stjcode=5L10021 HTTP/1.0" 302 300
Een lijn bestaat dus uit een aantal velden gescheiden door spaties. De betekenis van de velden is als volgt:
200 | ok |
201 | created |
202 | accepted |
203 | partial |
301 | moved |
302 | found |
303 | method |
304 | no change |
400 | bad request |
401 | unauthorized |
402 | payment required |
403 | forbidden |
404 | not found |
500 | internal error |
501 | not implemented |
Meer informatie over het http protocol kan gevonden worden op http://www.w3.org/Protocols/rfc1945/rfc1945.
Maak een programma ``httpstats'' dat voldoet aan de onderstaande functionele3 en niet-functionele4 eisen (``requirements'').
Het programma kan op de volgende manier opgeroepen worden
httpstats input [configuratie]
Hier is input de naam van een input bestand zoals beschreven in sectie 2.2. Het tweede (optionele) argument configuratie is de naam van een bestand dat de volgende specificaties bevat:
De inhoud van een configuratiebestand wordt beschreven in sectie 4.2. Indien de configuratie parameter ontbreekt zal het programma werken met een default configuratie die beschreven wordt in figuur 2.
# default httpstats format |
format path 1-4 |
select path / |
exclude path /robots.txt |
Het rapport zelf wordt op de standaard ouput geschreven. Eventuele boodschappen i.v.m. het verloop van de bewerkingen worden op standaard error geschreven.
Op die manier zal bvb. een aanroep
httpstats /usr/local/apache/logs/access_log > rapport.txt
Het rapport aanmaken in het bestand rapport.txt terwijl eventuele ander boodschappen iv.m. de vordering van de bewerkingen op het scherm zullen verschijnen.
Een rapport wordt gekenmerkt door
De betekenis van een niveau hangt af van het criterium:
Elk verzoek van een machine met een naam waarvan de meest rechtse componenten overeenkomen met een ``naam'' categorie behoort tot die categorie.
Elk verzoek waarvoor de padnaam van de vorm
categorie
of
categorie/rest
is behoort tot deze ``pad'' categorie.
niveau | betekenis | voorstelling categorie |
1 | jaar | 2000 |
2 | maand | 2000-11 |
4 | dag | 2000-11-10 |
5 | uur | 2000-11-10 09:00 |
Een niveau 2 zal hier dus een categorie maken voor elke maand waarin zich verzoeken hebben voorgedaan.
Elk verzoek waarvan het tijdstip valt binnen de periode geassocieerd met een ``tijd'' categorie behoort tot die categorie.
/public_html/~dvermeir
een categorie van niveau 2.
De lijnen zijn zo geordend dat een categorie steeds gevolgd wordt door deelcategorieën met hogere niveaus. Binnen één niveau worden de categorieën gesorteerd op hun voorstelling.
Tabel 3 toont een rapport volgens het criterium ``pad'' met een bereik van 1-3.
1 | /project | 80 |
2 | /project/a | 50 |
3 | /project/a/b | 10 |
3 | /project/a/c | 40 |
2 | /project/a2 | 30 |
3 | /project/a2/x | 10 |
3 | /project/a2/y | 20 |
1 | /game | 500 |
Tabel 4 toont een rapport volgens het criterium ``naam'' met een bereik van 1-2.
1 | be | 80 |
2 | ac.be | 50 |
2 | mil.be | 30 |
1 | edu | 300 |
2 | stanford.edu | 30 |
2 | ucsd.edu | 270 |
Tabel 5 toont een rapport volgens het criterium ``tijd'' met een bereik van 2.
2 | 2000-01 | 80 |
2 | 2000-02 | 50 |
2 | 2000-03 | 30 |
2 | 2000-04 | 300 |
2 | 2000-05 | 300 |
2 | 2000-06 | 300 |
2 | 2000-07 | 300 |
2 | 2000-08 | 300 |
2 | 2000-09 | 300 |
2 | 2000-10 | 300 |
2 | 2000-11 | 300 |
Het configuratiebestand is een tekstbestand dat het formaat van het rapport en de verzameling verzoeken waarmee rekening moet worden gehouden definieert.
De syntax van de inhoud van het bestand is weergegeven als een grammatica in tabel 6.
Normaal gedrukte woorden zijn niet-terminale symbolen. Andere symbolen zijn terminaal:
``White space'' (' ', '\t') tekens kunnen willekeurig voorkomen tussen ``tokens''.
configuratie | = | lijn '\n' |
| | ||
; | ||
lijn | = | format criterium levels |
| | select criterium patroon | |
| | exclude criterium patroon | |
| | '#' commentaar | |
; | ||
criterium | = | path |
| | date | |
| | domain | |
; | ||
levels | = | |
| | n levels | |
| | n '-' n levels | |
; | ||
patroon | = | '/' |
| | '/' string path-string | |
| | domain-name | |
| | date-string | |
; | ||
path-string | = | '/' string path-string |
| | ||
; | ||
domain-name | = | string '.' string '.' string '.' string |
| | string '.' string '.' string | |
| | string '.' string | |
| | string | |
; | ||
date-string | = | dddd |
| | dddd '-' dd | |
| | dddd '-' dd '-' dd | |
| | dddd '-' dd '-' dd dd ':' dd | |
; |
De betekenis van de diverse lijnen in een configuratiebestand is als volgt:
exclude path /robots.txt
er voor zorgen dat verzoeken van robots niet worden geteld.
Een verzoek wordt dus geteld als het aan alle select patronen en geen enkel exclude patroon voldoet.
Figuur 3 bevat een voorbeeld configuratiebestand dat een rapport genereert voor alle verzoeken voor ``home'' bestanden van gebruikers in het jaar 2000.
# example httpstats configuration file |
# the following line selects all user directories |
# note that the pattern matches e.g. /~dvermeir, /~slist etc. |
select path /~ |
format path 1 2 |
exclude path /robots.txt |
select date 2000 |
Natuurlijk is niet elk syntactisch correcte configuratie ook zinvol. Het programma moet zulke semantische fouten opsporen en passend rapporteren (op cerr).
Semantische fouten zijn bijvoorbeeld:
Ook het totaal aantal bytes per categorie vermelden in het rapport.
Verschillende rapporten (gespecifieerd in één enkel configuratiebestand) produceren in één uitvoering (alle rapporten na elkaar op standaard output).
Het ontwerp moet zodanig zijn dat zulke uitbreidingen zonder grote wijzigingen aan bestaande code kunnen uitgevoerd worden.
make clean rm -f httpstats *.o make httpstats
tinf2> tdate "23 Jan 2001 13:11:25" Tue Jan 23 13:11:25 MET 2001 Tue Jan 23 12:11:25 MET 2001
Merk op dat het gebruikte formaat in het bovenstaande bevel niet volledig overeenstemt met het formaat gebruikt in access_log.
1 Het formaat van een access_log bestand is aanpasbaar, de opgave moet enkel werken met het ``default'' beschreven formaat.
2 Dit adres hoeft niet steeds hetzelde te zijn
3 Functionele eisen leggen vast wat het programma moet doen.
4 Niet-functionele eisen leggen vast aan welke andere voorwaarden het programma moet voldoen, bvb. onder welk operating system het moet werken, welke programmeertalen of bibliotheken mogen gebruikt worden, etc.
5 Voor zover er machinenamen in die topdomeinen voorkomen in de input.