#!/usr/bin/perl -w
#
# Ben Hammersley ben@benhammersley.com
# Odszukuje pooenie geograficzne komputera z IP gocia 
# i sprawdza panujc tam pogod
#

use strict;
use CAIDA::NetGeoClient;
use Weather::Underground;
use Geography::Countries;

my $apachelogfile = "access_log";
my $numberoflines = 10;
my $lastdomain    = "";

# Otwarcie pliku dziennika.
open (LOG, "<$apachelogfile") or die $!;

# Wszystkie wiersze dziennika umieszczamy w tablicy, 
# ale w odwrotnej kolejnoci.
my @lines = reverse <LOG>;

# Otwieramy dokument HTML.
print "<h2>Skd pochodz moi ostatni gocie:</h2>\n<ul>\n";

# Przechodzimy wiersz po wierszu ustawiajc zmienne.
my $i; foreach my $line (@lines) {
    my ($domain,$rfc931,$authuser,$TimeDate,
        $Request,$Status,$Bytes,$Referrer,$Agent) =
        $line =~ /^(\S+) (\S+) (\S+) \[([^\]\[]+)\] \"([^"]*)\" (\S+) (\S+) \"?([^"]*)\"? \"([^"]*)\"/o;

    # Jeli ten rekord ju widzielimy, idziemy dalej.
    next if ($domain eq $lastdomain);

    # I teraz pora na dane geograficzne.
    my $geo     = CAIDA::NetGeoClient->new(  );
    my $record  = $geo->getRecord($domain);
    my $city    = ucfirst(lc($record->{CITY}));
    my $region  = "";

    # Sprawdzamy, czy cokolwiek zostao w ogle zwrcone.
    unless ($record->{COUNTRY}) { $lastdomain = $domain; next; }

    # Jeli miasto jest w USA, jako "regionu" uyjemy stanu.
    # Jeli nie, korzystamy z Geography::Countries do przeksztacenia
    # dwuliterowego kodu kraju na nazw (za t wskazwk dzikuj
    # Aaronowi Straupowi Cope.)
    if ($record->{COUNTRY} eq "US") {
        $region = ucfirst(lc($record->{STATE}));
    } else { $region = country($record->{COUNTRY}); }

    # Teraz pobieramy dane o pogodzie.
    my $place   = "$city, $region";
    my $weather = Weather::Underground->new(place => $place);
    my $data    = $weather->getweather(  );
    next unless $data; $data = $data->[0];

    # I pokazujemy wyniki w formie HTML.
    print " <li>$city, $region where it is $data->{conditions}.</li>\n";

    # Rejestrujemy nazw ostatniej domeny, aby unikn powtrze
    $lastdomain = $domain;

    # Sprawdzamy, czy nie przekroczylimy limitu; jeli tak, koniec.
    if ($i++ >= $numberoflines-1) { last; }
}

print "</ul>";

