Open Source im professionellen Einsatz

Splash

Listing 4 zeigt schließlich das Hauptprogramm »splash«. Es definiert zunächst in Zeile 7 die Test-URL, die das Skript einholt, um festzustellen, ob der Internetzugang bereits offen ist. Die Google-Seite eignet sich dazu hervorragend, da sie leichtgewichtig und mit hoher Wahrscheinlichkeit in einem funktionierenden Internet verfügbar ist.

Listing 4:
»splash«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use SplashJumper;
04 use WWW::Mechanize;
05 use Log::Log4perl qw(:easy);
06
07 my $url = "http://www.google.com";
08
09 Log::Log4perl->easy_init($DEBUG);
10
11 my $sj = SplashJumper->new();
12
13 my @ways = ();
14
15 for my $plugin ( $sj->plugins() ) {
16
17   if( ! $plugin->can("register") ) {
18     ERROR "$plugin can't do register()";
19     next;
20   }
21
22   my($algo, $order) = $plugin->register();
23
24   push @ways, [$algo, $plugin, $order];
25 }
26
27   # sort by plugin priority
28 @ways = sort { $a->[2] <=> $b->[2] } @ways;
29
30 my $mech = WWW::Mechanize->new();
31 $mech->timeout(5);
32
33   # wait until network is up
34 {
35   INFO "Trying $url";
36   eval { $mech->get( $url ); };
37   if($@) {
38     INFO "Connection down, retrying";
39     sleep 5;
40     redo;
41   }
42 }
43
44   # try to get past splash page
45 for my $ways ( @ways ) {
46
47   my $current_url =
48     $mech->response->request->uri;
49
50   if( $current_url eq $url ) {
51       INFO "Link is up.";
52       last;
53   } else {
54       INFO "Link still down";
55   }
56
57   my($algo, $plugin, $order) = @$ways;
58
59   eval {
60     INFO "Processing splash page ",
61          "$current_url with algo $algo";
62     $plugin->process( $mech );
63   };
64
65   if($@) {
66     ERROR "Algo $algo failed ($@)";
67   } else {
68     INFO "Plugin $algo succeeded";
69   }
70 }

Zeile 9 initialisiert das Log4perl-Framework mit dem Level »DEBUG«, damit der User detaillierte Informationen darüber erhält, welches Plugin gerade läuft und auf welche Links er klickt. Ein neu angelegtes Objekt der Basisklasse »SplashJumper« verfügt dank des dort eingebundenen Moduls Module::Pluggable über eine Methode »plugins()«, die eine Liste aller im Unterverzeichnis »Plugin« eingestellten Plugins zurückliefert.

Zeile 17 prüft, ob jedes Plugin tatsächlich vorschriftsgemäß eine Methode namens »register()« anbietet, und überspringt mangelhaft implementierte Plugins mit einer Fehlermeldung. Ordnungsgemäße Plugins geben in Zeile 22 ihre Taktik in »$algo« und die gewünschte numerische Priorität in der Variablen »$order« zurück. Das Skript verpackt die gefundenen Daten in einem Array und schiebt eine Referenz darauf an das Ende des Array »@ways«. Zeile 28 sortiert dessen Elemente dann numerisch nach dem »order«-Feld, sodass ein Plugin mit Priorität 10 auch bestimmt vor einem Plugin mit der Priorität 50 läuft.

Der Browser-Simulator vom Typ WWW:: Mechanize setzt seinen Timeout in Zeile 31 auf 5 Sekunden, sodass die Schleife ab Zeile 33 jeweils nur 5 Sekunden in der »get()«-Methode hängt, bevor sie aufgibt und 5 Sekunden schläft, bevor sie erneut probiert den Google-Server zu kontaktieren. Am Ende des Blocks, den Perl mit »redo« wiederholt, funktioniert zumindest das lokale Wifi-Netz und der Client bekam eine gültige IP-Adresse zugewiesen. Doch der Wifi-Provider leitet Requests an »www.google.com« eventuell noch zu einem internen Server weiter, der die Splash-Page produziert.

Unermüdlich

Diese Seite versucht die For-Schleife ab Zeile 45 mit den verschiedenen Plugins zu überwinden. Sobald die URL des letzten Request gleich der Test-URL ist (also kein Redirect zur Splash-Page mehr stattfindet), erkennt Zeile 51, dass die Splash-Page überwunden und die Internetverbindung offen ist.

Ist dies noch nicht der Fall, ruft Zeile 62 die Methode »process()« des nächsten Plugin auf, gemäß den vorher definierten Prioritäten. Der Eval-Block ab Zeile 59 fängt im Plugin auftretende Fehler ab, Zeile 65 prüft die Variable »$@«, um festzustellen, ob etwas vorgefallen ist.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook