#! /usr/bin/perl
#
use LWP::Simple;
use HTTP::Date;

$data_file = "ips.dat";
$xml_file = "ips.xml";
$min_time_between_queries = 3600;
$max_data_time = 86400;
$max_xml_time = 360;

$now = time();

open(IN, "$data_file");
while ($_ = <IN>) {
	chomp;
	($ip, $time, $query_time, $country, $city, $lat, $lon) = split /[\t|]/;
	$ip_time{$ip} = $time;
	$ip_query_time{$ip} = $query_time;
	$ip_country{$ip} = $country;
	$ip_city{$ip} = $city;
	$ip_lat{$ip} = $lat;
	$ip_lon{$ip} = $lon;
#	print "$ip\t"."$query_time\t".$ip_time{$ip}."\t".$ip_country{$ip}."\t".$ip_city{$ip}."\t".$ip_lat."\t".$ip_lon."\n";
}
close(IN);

#exit;

foreach $_ (`/usr/bin/tail -1000 /var/log/apache/access.log`) {
	chomp;
	if (/GET \/gallir\//) {
		@fields = split /[ \[]/;
		$str_date = $fields[3] . " " . $fields[4];
		$date = str2time($str_date);
		if ($now - $date > $max_xml_time) {
			next;
		}
		$ip_time{$fields[0]} = $date;
		$ip_time_last{$fields[0]} = $date;
		if (!$ip_query_time{$fields[0]}) {
			$ip_query_time{$fields[0]} = 1;
		}
	}
	#print "$fields[0]\n"
}

open(OUT, ">$data_file.tmp");
for $ip (keys ip_time) {
	if ( (!$ip_lat{$ip} =~ /[0-9]/ || !$ip_lon{$ip} =~ /[0-9]/) && 
		($now - $ip_query_time{$ip}) > $min_time_between_queries ) {
		$data=get("http://www.hostip.info/api/rough.html?ip=$ip&position=true");
		$query_time = time();
		@lines = split /[\n\f\r]/, $data;
		foreach $line (@lines) {
			($_, $value) = split(/:/, $line);
			$value =~ s/^ +//g; $value =~ s/ +$//g;
			if (/^Country/) {
				$ip_country{$ip} = $value;
			} elsif (/^City/) {
				$ip_city{$ip} = $value;
			} elsif (/^Latitude/) {
				$ip_lat{$ip} = $value;
				$ip_lat{$ip} =~ s/ //g;
			} elsif (/^Longitude/) {
				$ip_lon{$ip} = $value;
				$ip_lon{$ip} =~ s/ //g;
			}
		}
		print "$ip|$ip_time{$ip}|$query_time|$ip_country{$ip}|$ip_city{$ip}|$ip_lat{$ip}|$ip_lon{$ip}\n";
	}
	if (($now - $ip_time{$ip}) < $max_data_time ) {
		print OUT "$ip|$ip_time{$ip}|$query_time|$ip_country{$ip}|$ip_city{$ip}|$ip_lat{$ip}|$ip_lon{$ip}\n";
	}
	add_lat_lon(getkey($ip_lat{$ip}, $ip_lon{$ip}));
}

close(OUT);
rename "$data_file.tmp", $data_file;


open(OUT, ">$xml_file.tmp");
print OUT qq{<?xml version="1.0" encoding="ISO-8859-1"?><markers>\n};
for $ip (keys ip_time_last) {
	$key = getkey($ip_lat{$ip}, $ip_lon{$ip});
	if (($now - $ip_time{$ip}) < $max_xml_time && $ip_lat{$ip} =~ /[0-9]/ && $ip_lon{$ip} =~ /[0-9]/ &&
		!$seen{$key}) {
		$seen{$key} = 1;
		$count = get_lat_lon($key);
		print qq/<marker ip="$count" lat="$ip_lat{$ip}" lng="$ip_lon{$ip}" city="$ip_city{$ip}" country="$ip_country{$ip}"\/>\n/;
		print OUT qq/<marker ip="$count" lat="$ip_lat{$ip}" lng="$ip_lon{$ip}" city="$ip_city{$ip}" country="$ip_country{$ip}"\/>\n/;
	}
}
print OUT "</markers>\n";
close OUT;
rename "$xml_file.tmp", $xml_file;


sub add_lat_lon {
	local ($key);
	$key = shift;
	if (($now - $ip_time{$ip}) < $max_xml_time) {
		$latlon{$key}++;
	}
}

sub getkey {
        local ($lat, $lon, $key);
        $lat = shift;
        $lon = shift;

        $key = $lat."_".$lon;
	$key =~ s/ //g;
	return $key;
}

sub get_lat_lon {
	local ($key);
	$key = shift;
	return $latlon{$key};
}

