Make your own IP world map!

Shotokan - sabato 3 Agosto

Oggi giornata malinconica:
mi sono ricordato di un progetto che scrissi tempo addietro, per creare una ‘mappa degli ip terrestri’.
Ho deciso di riprendere in mano il progetto per puro divertimento, posto qui una guida su come farlo su qualsiasi PC linux (nel mio caso, una derivata di Debian)

Cominciamo.

Scaricate le api PHP di maxmind, ed estraetele in una cartella a piacere:

wget https://codeload.github.com/maxmind/geoip-api-php/zip/master
unzip geoip*.zip

E spostatevi nella directory creata.

Scaricate il database GeoLiteCity ed estraetelo nella stessa directory:

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz

Installate php5-cli & php5-gd

sudo apt-get install php5-cli php5-gd

Create un file ZH_analyzer.php con questo contenuto:

#!/usr/bin/php -q
<?php

include("geoipcity.inc");
include("geoipregionvars.php");

$gi = geoip_open("GeoLiteCity.dat",GEOIP_STANDARD);

$last = "";
$threads = $argv[1];

$thid = $argv[2];
$space = "";

for ($x = 0; $x < $thid; $x++)
        $space = $space."\t";

for ($x = 1; $x < 255; $x++){
        fwrite(STDERR, "\r".$space.$x."/255");
        for ($y = $thid; $y < 255; $y+=$threads){
                for ($z = 0; $z < 255; $z++){
                        //echo "".$x.".".$y.".".$z.".0\n";
                        $record = geoip_record_by_addr($gi,$x.".".$y.".".$z.".0");
                        if(is_object($record))
                                $actual = (float)($record->latitude)." ".(float)($record->longitude);
                        if (is_object($record)&&$actual != $last){
                                echo $actual."\n";
                                $last = $actual;
                        }
                }
        }
}

Create un file ZH_runner.sh con questo contenuto:

#!/bin/bash
cores=`nproc`;
echo $cores detected, running $cores threads.;
echo "!!!DON'T ^C!!!";
x=0
while [[ $x < $cores ]]
do
        taskset -c $x php ZH_analyzer.php $cores $x >coords${x}.txt&
        x=$[ $x + 1 ];
done;

sleep 5;

x=0;
while [[ $x < $cores ]]
do
        if ! fuser -s coords${x}.txt
        then
                x=$[ $x + 1];
        else
                sleep 1;
        fi;
done;
cat coords* > result.txt
echo -e "\nAll done!";

…e dategli i permessi d’esecuzione:

chmod +x ZH_runner.sh

 Creiamo i file di coordinate.

Eseguite il file ZH_runner.sh creato in precedenza

./ZH_runner.sh

Ed attendete che tutti i contatori arrivino a 255/255 (vi apparira’ “All done!”)

Spostatevi in un’altra cartella (per comodita’!) “portandovi dietro” soltanto il file result.txt.

Create nella nuova cartella un file world.php con il seguente contenuto (modificate tomul a piacere):

<?php
function getmicrotime( ){
        list( $usec, $sec) = explode( " ", microtime( ));
        return ( ( float)$usec + ( float)$sec);
}
$stime=getmicrotime();
$tomul=16;
//--don't edit below!!
$lat=85*$tomul;
$lon=180*$tomul;
$image=imagecreatetruecolor($lon*2,$lat*2);
$lime=imagecolorallocate($image,0,255,0);
$redT=imagecolorallocatealpha($image,0,0,255,126);
$fp=fopen("result.txt","r");
$x=0;
while($res=fgets($fp)){
        $res=explode(" ",$res);
        $res[0]*=$tomul;
        $res[1]*=$tomul;
        $res[0]=$lat-(int)$res[0];
        $res[1]=(int)$res[1]+$lon;
        //if($x!=0)imageline($image,$pres[0],$pres[1],$res[1],$res[0],$redT);
        imagesetpixel($image,$res[1],$res[0],$lime);
        $pres[0]=$res[1];
        $pres[1]=$res[0];
        $x++;
        }
fclose($fp);
header("Content-type: image/png");
$ttime=substr(getmicrotime()-$stime,0,5);
$string="Code & design by Shotokan. Data loaded in $ttime seconds: $x at a rate of: ".($x/$ttime)." data for second.";
imagestring($image,2,$lon*2-(strlen($string)*6),($lat*2)-14,$string,$lime);
imagepng($image);
imagedestroy($image);
?>

..ed eseguitelo redirectando l’output in un file.png:

php world.php > file.png

& enjoy the result.

world

Theme made by Koala