DSIW

Alles was interessant ist... (Linux, Programmierung, Datenschutz, Medien, uvm.)

Ruby-Skript: Server-Statistik aus Firefox-Lesezeichen

| Comments

Dieses Skript ist eine Erweiterung von diesem Skript nutzt die Lesezeichen vom Firefox. Diese kann man im JSON-Format exportieren, indem Firefox > Lesezeichen > Alle Lesezeichen anzeigen > Importieren und Sichern > Sichern... aufgerufen wird. Aus allen Lesezeichen werden Anfragen an den Server gestellt. Dieser schickt in der Antwort den eingesetzten Server-Typ mit. Alle Typen werden aufgenommen und gezählt.

Am Ende bekommt man so eine Übersicht über die eingesetzten Server der eigenen Lesezeichen.

Gems

  • curb wird genutzt, um die HTTP-Header-Anfragen mittels Curl durchzuführen.
  • http_headers parst den Header, der mittels Curb empfangen wurde.

Installation

$ gem install curb http_headers $ wget https://raw.github.com/gist/2253541/6d60762a76d17f520b825e4cd875c31cf3767390/count_server.rb $ chmod +x count_server.rb

Beispiel

$ ./count_server.rb bookmarks-2012-03-31.json

Skript

Methoden-Beschreibung

  • parse_json parst die angegebene JSON-Datei zu einem JSON-Objekt.

  • get_server_uri_json sucht rekursiv im JSON-Objekt nach URIs, die das HTTP-Protokoll nutzen. Es werden nur die Domains aufgenommen. Zudem werden auch alle gleichen URIs gelöscht. Das ist dann nötig, wenn man mehrere Links zu gleichen Domains gespeichert hat.

Beispiel: http://blog.dsiw-it.de/me/ wird zu http://blog.dsiw-it.de

  • fetch_uris setzt die Anfragen an die Server der URIs ab und speichert die Antwort in einem Hash ab. Dabei werden Weiterleitungen verfolgt.

  • filter_headers filtert aus allen Antworten nur den Header heraus, sodass der Body verworfen wird. Wirklich Speichersparsam ist das nicht, mir ist aber keine bessere Möglichkeit eingefallen.

  • get_server_types filtert aus den Headern die eigentlichen Server-Bezeichnungen raus und nutzt filter_version.

  • filter_version filtert die Versionsnummern der Bezeichnungen heraus. Ich habe festgestellt, dass diese immer nach einem / folgen. Also die Bezeichnungen dieses Schema haben: Serverbezeichnung/Version_und_andere_Informationen.

  • add_server fügt einen neuen Servertyp mit der Anzahl 1 hinzu, wenn dieser noch nicht im Hash enthalten ist, ansonsten wird die Anzahl des Typs inkrementiert (+1).

  • reverse_sorted sortiert die Serveranzahl absteigend, sodass der meist genutzte Server ganz oben auf der Liste steht.

Ausgabe

Ausgabe (get_servers_output.log) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Get headers of 969 server. Please wait...
674 : apache
123 : nginx
 52 : microsoft-iis
 18 : nv
 16 : lighttpd
 15 : apache-coyote
  6 : cloudflare-nginx
  6 : gse
  5 : zope
  5 : litespeed
  4 : httpd
  4 : google frontend
  4 : gws
  3 : server.archlinux.de
  3 : server
  3 : ibm_http_server
  2 : nginx
  2 : codesite_static_content
  2 : yts
  2 : cherrypy
  2 : gunicorn
[...]

Number of URIs:    969
Number of servers: 979
Number of no information: 0 (0.0%)
./get_servers.rb bookmarks-2012-03-17.json  6,71s user 2,57s system 0% cpu 23:37,76 total

Anmerkung: Dadurch, dass ich sehr Open-Source interessiert bin, kann es die Zahlen beeinflussen. Entsprechend wird der Apache in Gegensatz zum Microsoft IIS sehr oft genutzt.

Leider brauchte das Skript für diese Anzahl an Servern lange 23 Minuten (siehe letzte Zeile).
Wie man in der Funktion fetch_uris erkennen kann, habe ich dort ein paar Zeilen auskommentiert. Wenn diese wieder von Ruby interpretiert werden, dann würden die Anfragen von Curb parallel verlaufen. Die Laufzeit fiel damit auf ungefähr eine Minute. Leider wurden dabei viele leere Antworten in die Liste aufgenommen. Bei dieser Anzahl der Server waren es 700 Anfragen mit keiner Information. Mit zunehmender Anzahl der parallelen Anfragen, wuchs die Anzahl der leeren Antworten exponentiell.
Ich habe mich an dieses Beispiel vom Gem gehalten.

Ich freue mich auf Verbesserungsvorschläge!

Wie schaut bei euch die Server-Verteilung aus?

Comments