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)
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
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.