Structuur van computer programma's II\\ Opgave project ``httpstats''

Structuur van computer programma's II
Opgave project ``httpstats''

Dirk Vermeir
Departement Informatica
Faculteit Wetenschappen
Vrije Universiteit Brussel

November 2000

Contents

1  Inleiding: httpstats
2  Achtergrond
    2.1  Domeinnamen en domeinadressen
    2.2  Het input bestand
3  Opgave: httpstats
4  Functionele eisen
    4.1  Soorten en vorm van rapporten
    4.2  Het configuratiebestand
5  Niet-functionele eisen
6  Ontwerp hints
7  Vragen
8  Indienen

1  Inleiding: httpstats

(Deze tekst is ook beschikbaar als een postscript bestand stru2-2000.ps. dat bvb. op wendy kan afgedrukt worden).

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.

2  Achtergrond

2.1  Domeinnamen en domeinadressen

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.

2.2  Het input bestand

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

Figure 1: Voorbeeld lijnen in apache logbestand

Een lijn bestaat dus uit een aantal velden gescheiden door spaties. De betekenis van de velden is als volgt:

  1. De naam of het adres van de machine van waaruit het verzoek werd gestuurd. Sommige lijnen zullen hier een domainadres bevatten.
  2. Een niet ingevulde veld (-).
  3. Een niet ingevulde veld (-).
  4. Het tijdstip van het verzoek, tussen vierkante haken ([]).
  5. Het verzoek zelf, omringd door accenten ("). Dit verzoek bestaat zelf weer uit een aantal delen, gescheiden door spaties:

    1. Het ``werkwoord'': GET, PUT, HEAD.
    2. Een padnaam, evt. gevolgd door formuliergegevens na een vraagteken.
    3. Een aanduiding van het protocol (typisch HTTP/1.0 of HTTP/1.1).

  6. Een code die het resultaat geeft. De mogelijke codes zijn beschreven in tabel 1.
  7. Het aantal bytes dat werd teruggestuurd naar de aanvrager.

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

Table 1: Http resultaatcodes

Meer informatie over het http protocol kan gevonden worden op http://www.w3.org/Protocols/rfc1945/rfc1945.

3  Opgave: httpstats

Maak een programma ``httpstats'' dat voldoet aan de onderstaande functionele3 en niet-functionele4 eisen (``requirements'').

4  Functionele eisen

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

Figure 2: Default configuratiebestand

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.

4.1  Soorten en vorm van rapporten

Een rapport wordt gekenmerkt door

Elke lijn in een rapport geeft het totaal aantal verzoeken voor een bepaalde categorie. Zo'n lijn bestaat uit 3 delen, gescheiden door ``tab'' (\t) tekens:

  1. Het niveau (een positief getal)
  2. De categorie, de vorm hiervan hangt af van het criterium:

  3. Het aantal verzoeken in de categorie.

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

Table 3: Een ``pad'' rapport met bereik 1-3

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

Table 4: Een ``naam'' rapport met bereik 1-2

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

Table 5: Een ``tijdstip'' rapport met bereik 2

4.2  Het configuratiebestand

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
;

Table 6: syntax van het configuratiebestand

De betekenis van de diverse lijnen in een configuratiebestand is als volgt:

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

Figure 3: Voorbeel configuratiebestand

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:

5  Niet-functionele eisen

  1. Het programma moet volledig en uitsluitend in C++ geschreven worden.
  2. Het programma moet gebaseerd zijn op een object-georienteerd ontwerp. Functies die langer zijn dan 30 lijnen zullen met argwaan worden bekeken.
  3. Het ontwerp moet rekening houden met eventuele toekomstige uitbreidingen zoals:

    Het ontwerp moet zodanig zijn dat zulke uitbreidingen zonder grote wijzigingen aan bestaande code kunnen uitgevoerd worden.

  4. Het programma moet correct werken op wendy.
  5. Enkel de C++ (of C) standaard library mag gebruikt worden.
  6. Eigen implementaties van containers zijn niet toegestaan, enkel standaard library containers zoals map, set, vector, mogen gebruikt worden.
  7. Het gebruik van expliciete pointers zal, waar mogelijk, vermeden worden.
  8. De source (C++) bestanden dienen de suffix ``.cc'', ``.C'' of ``.cpp'' te gebruiken. De ``header files'' met declaraties dienen de suffix ``.h'' te gebruiken.
  9. Alle source bestanden, samen met een ``Makefile'', dienen zich in een directory ``structuur2/project2000'' te bevinden. De volgende reeks van bevelen zal resulteren in een correct uitvoerbaar programma ``httpstats'' in dit directory:
    	make clean
    	rm -f httpstats *.o
    	make httpstats
    	
  10. Eventuele hulpbestanden mogen enkel in het werkdirectory (waar het programma wordt uitgevoerd) worden aangemaakt.

6  Ontwerp hints

  1. De source voor een nuttige klasse Date is beschikbaar in de bestanden date.h, date.C, getdate.h en getdate.c (dit laatste bestand bevat C broncode en wordt best met gcc gecompileerd). Een Makefile en een test programma tdate.C is ook beschikbaar.

    	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.

  2. Het programma moet robust zijn. Dit wil zeggen dat het ook een redelijke actie moet ondernemen indien de input extreem (bvb. een leeg input bestand) of foutief is (bvb. een niet bestaand input bestand, een fout in het configuratiebestand).

7  Vragen

8  Indienen

De uiterste indiendatum (de source code en Makefile wordt automatisch opgehaald uit het directory $HOME/structuur2/project2000, zie punt 9 in sectie 5) is 31 maart 2001, 23:00.

Footnotes:

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.


File translated from TEX by TTH, version 2.32.
On 24 Jan 2001, 11:46.