initial commit
This commit is contained in:
commit
0b75130361
BIN
GeoLiteCity.dat
Normal file
BIN
GeoLiteCity.dat
Normal file
Binary file not shown.
164
index.php
Normal file
164
index.php
Normal file
@ -0,0 +1,164 @@
|
||||
<?php
|
||||
$servers = array();
|
||||
$servers[] = array(
|
||||
'name'=>'D-L-K Networks GameServer',
|
||||
'host'=>'game.d-l-k.net',
|
||||
'port'=>'30000',
|
||||
'site'=>'',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'GameBoom\'s MineTest server MT1',
|
||||
'host'=>'mt1.gameboom.net',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=2592',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'glomie\'s server',
|
||||
'host'=>'94.23.33.108',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=2111',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Minetest.Ru main server',
|
||||
'host'=>'minetest.ru',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.ru/',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'[Wazu] Clan Server 0.4.1',
|
||||
'host'=>'wazuclan.com',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://www.wazuclan.com',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Jordach\'s Pixel Art',
|
||||
'host'=>'redcrab.suret.net',
|
||||
'port'=>'30402',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=1867',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Redcrab\'s Minetest Server 0.3.1',
|
||||
'host'=>'redcrab.suret.net',
|
||||
'port'=>'30031',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=1380',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Redcrab\'s server : for serious builder',
|
||||
'host'=>'redcrab.suret.net',
|
||||
'port'=>'30401',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=1705',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Mrtux\'s Minetest server',
|
||||
'host'=>'50.112.56.189',
|
||||
'port'=>'30001',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=2653',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'M13\'s 0.4.3 Server',
|
||||
'host'=>'m13.sytes.net',
|
||||
'port'=>'30000',
|
||||
'site'=>'',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Calinou\'s Server',
|
||||
'host'=>'calin.sytes.net',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=3102',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Redcrab\'s server 0.4 dev20120106-1',
|
||||
'host'=>'redcrab.suret.net',
|
||||
'port'=>'30401',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=606',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'CoRNeTNoTe\'S SeRVeR [SkyBlock][Australia]',
|
||||
'host'=>'cornernote.servegame.com',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=3154',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Free Build',
|
||||
'host'=>'199.119.227.56',
|
||||
'port'=>'30000',
|
||||
'site'=>'',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Menche\'s Server',
|
||||
'host'=>'menche.servegame.com',
|
||||
'port'=>'30001',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=2124',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Globis server',
|
||||
'host'=>'176.31.175.144',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=2111',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'Zenoheld the Backstab server',
|
||||
'host'=>'minetest.freedns.in',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://minetest.net/forum/viewtopic.php?id=796',
|
||||
);
|
||||
$servers[] = array(
|
||||
'name'=>'freebuild',
|
||||
'host'=>'thelunarrepublic.cu.cc',
|
||||
'port'=>'30000',
|
||||
'site'=>'http://thelunarrepublic.site90.net/',
|
||||
);
|
||||
include("maxmind/geoipcity.inc");
|
||||
include("maxmind/geoipregionvars.php");
|
||||
$gi = geoip_open("GeoLiteCity.dat",GEOIP_STANDARD);
|
||||
?><!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
|
||||
<style type="text/css">
|
||||
html { height: 100% }
|
||||
body { height: 100%; margin: 0; padding: 0 }
|
||||
#map_canvas { height: 100% }
|
||||
</style>
|
||||
<script type="text/javascript"
|
||||
src="http://maps.googleapis.com/maps/api/js?key=AIzaSyA6aXUYnpxJTCdvHwVRK24Sc-fx28Z4gXc&sensor=false">
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
function initialize() {
|
||||
var myLatlng = new google.maps.LatLng(-25.363882,131.044922);
|
||||
var mapOptions = {
|
||||
zoom: 3,
|
||||
center: myLatlng,
|
||||
mapTypeId: google.maps.MapTypeId.ROADMAP
|
||||
}
|
||||
var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
|
||||
var infowindow = new google.maps.InfoWindow();
|
||||
|
||||
<?php
|
||||
foreach ($servers as $k=>$server) {
|
||||
$record = geoip_record_by_addr($gi,gethostbyname($server['host']));
|
||||
if ($record) {
|
||||
?>
|
||||
var marker_<?php echo $k; ?> = new google.maps.Marker({
|
||||
position: new google.maps.LatLng(<?php echo $record->latitude; ?>,<?php echo $record->longitude; ?>),
|
||||
title: '<?php echo addslashes($server['name']); ?>',
|
||||
map: map
|
||||
});
|
||||
google.maps.event.addListener(marker_<?php echo $k; ?>, 'click', function() {
|
||||
infowindow.setContent('<strong><a href="<?php echo $server['site']; ?>"><?php echo addslashes($server['name']); ?></a></strong><br/><?php echo $server['host']; ?>:<?php echo $server['port']; ?>');
|
||||
infowindow.open(map, marker_<?php echo $k; ?>);
|
||||
});
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="initialize()">
|
||||
<div id="map_canvas" style="width:100%; height:100%"></div>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
geoip_close($gi);
|
||||
?>
|
98
maxmind/ChangeLog
Normal file
98
maxmind/ChangeLog
Normal file
@ -0,0 +1,98 @@
|
||||
1.11
|
||||
* Update Time Zones ( Boris Zentner )
|
||||
* Update FIPS codes ( Boris Zentner )
|
||||
1.10 2012-03-26
|
||||
* Update time zones and country codes ( Boris Zentner )
|
||||
* Add example for netspeedcell databases. ( Boris Zentner )
|
||||
1.9 2011-08-23
|
||||
* Add new datatypes
|
||||
GEOIP_COUNTRY_EDITION_V6, GEOIP_CITY_EDITION_REV1_V6
|
||||
GEOIP_CITY_EDITION_REV0_V6, GEOIP_NETSPEED_EDITION_REV1,
|
||||
GEOIP_NETSPEED_EDITION_REV1_V6, GEOIP_ASNUM_EDITION_V6,
|
||||
GEOIP_ORG_EDITION_V6, GEOIP_DOMAIN_EDITION_V6,
|
||||
GEOIP_ISP_EDITION_V6 ( Boris Zentner )
|
||||
* Add new functions
|
||||
geoip_country_id_by_name_v6
|
||||
geoip_country_code_by_name_v6
|
||||
geoip_country_name_by_name_v6
|
||||
geoip_country_id_by_addr_v6
|
||||
geoip_country_code_by_addr_v6
|
||||
geoip_country_name_by_addr_v6
|
||||
geoip_name_by_addr_v6
|
||||
GeoIP_record_by_addr_v6 ( Boris Zentner )
|
||||
* Add new examples sample-v6.php, sample_city-v6.php and
|
||||
sample_asn-v6.php ( Boris Zentner )
|
||||
* Replace ereg with substr ( Boris Zentner )
|
||||
* replace split by explode ( Boris Zentner )
|
||||
* Add all missing timezones ( Boris Zentner )
|
||||
* Fix some 3letter codes ( Boris Zentner )
|
||||
* Fix some continent codes ( Boris Zentner )
|
||||
* Update FIPS codes 20100810 ( Boris Zentner )
|
||||
* Add new database types GEOIP_LOCATIONA_EDITION, GEOIP_DOMAIN_EDITION
|
||||
and GEOIP_ACCURACYRADIUS_EDITION ( Boris Zentner )
|
||||
* Workaround php's broken usage of mb_substr instead of substr with
|
||||
mbstring.func_overload and mbstring.internal_encoding ( Boris Zentner )
|
||||
* Change Turkey's continent code from AS to EU ( Boris Zentner )
|
||||
* Update FIPS codes 20090723 ( Boris Zentner )
|
||||
1.8 2009-04-02
|
||||
* Add continent_code to the city record. See: sample_city.php ( Boris Zentner )
|
||||
* Update FIPS codes 20090401 ( Boris Zentner )
|
||||
* Fixed spelling of Kazakhstan, was Kazakstan
|
||||
* Fix TN FIPS codes and add two new TH79 and TH80 ( Boris Zentner )
|
||||
* Fix geoip_country_code_by_addr when used with a city database for unknown or private records ( cpw )
|
||||
* Update timezone.php
|
||||
* Sync geoipregionvars.php with fips codes from Jan, 14th 2009 ( Boris Zentner )
|
||||
* use metro_code in sample_city.php ( Boris Zentner )
|
||||
* replace the depreciated dma_code field with metro_code ( Boris Zentner )
|
||||
* remove wrong but unreferenced Singapur SG fips regions codes ( Boris Zentner )
|
||||
* update regions ( geoipregionvars.php ) ( Boris Zentner )
|
||||
* Die when the database file is not found or readable ( Boris Zentner )
|
||||
|
||||
1.7 2008-1-8
|
||||
* Added BL/Saint Barthelemy, MF/Saint Martin (ISO-3166-1 additions)
|
||||
* fixed bug with newlines in Country Name
|
||||
* replaced $s_array[size] with $s_array['size'] (Daniel Horchner)
|
||||
* Fix bug where PHP API didn't work with new edition of GeoIP ISP
|
||||
|
||||
1.6 2007-1-10
|
||||
* Added AX/Aland Islands, GG/Guernsey, IM/Isle of Man, JE/Jersey (ISO-3166-1 changes)
|
||||
* Replaced CS/Serbia and Montenegro with RS/Serbia, removed ZR/Zaire, added ME/Montenegro
|
||||
* geoip_country_(code|name)_by_addr now work against Geo(IP|Lite) City (Frank Mather)
|
||||
* Added code to lookup zoneinfo timezone given country and region (Frank Mather)
|
||||
* TP/East Timor changed to TL/Timor-Leste, reflecting changes in ISO-3166
|
||||
|
||||
1.5 2005-11-1
|
||||
* Added Shared Memory support for GeoIP City (Frank Mather)
|
||||
* Replaced Yugoslavia with Serbia and Montenegro
|
||||
* Removed global declaration for $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES,
|
||||
and $GEOIP_COUNTRY_CODES3
|
||||
|
||||
1.4 2005-01-13 Andrew Hill, Awarez Ltd. (http://www.awarez.net)
|
||||
* Formatted file according to PEAR library standards.
|
||||
* Moved $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES,
|
||||
* $GEOIP_COUNTRY_CODES3 and $GEOIP_COUNTRY_NAMES into the
|
||||
* GeoIP class, so that library will still work even when
|
||||
* not included in the $GLOBAL context.
|
||||
|
||||
* Updated geoip_country_code_by_addr to work with PHP5 (Eric of Host Ultra)
|
||||
* Replaced bit operators (| and &) with logical operators (|| and &&)
|
||||
* Defined GEOIP_ISP_EDITION
|
||||
|
||||
1.3 2004-8-4
|
||||
* Changed license from GPL to LGPL so code can be included in PEAR
|
||||
* added global definitions to prevent undefined variables error when including from function (Cédric Dufour)
|
||||
* Updated country names
|
||||
* Added support for GeoIP City, version 1 with DMA and Area codes
|
||||
|
||||
1.2 2003-10-28
|
||||
* Added support for Shared Memory (Jason Priebe)
|
||||
* Added support for Distributed queries
|
||||
* Added support for GeoIP Region, version 1
|
||||
* Added Anonymous Proxy and Satellite Provider code/labels
|
||||
* Changed Taiwan, Province of China to Taiwan
|
||||
|
||||
1.1 2003-01-15
|
||||
* Added support for GeoIP Region and GeoIP City
|
||||
|
||||
1.0 2002-11-21
|
||||
* Initial checkin to CVS
|
43
maxmind/README
Normal file
43
maxmind/README
Normal file
@ -0,0 +1,43 @@
|
||||
Requirements
|
||||
|
||||
None (only the 'GeoIP.dat' file is needed). To download a free GeoIP Standard Country
|
||||
database, go to
|
||||
http://maxmind.com/download/geoip/database/
|
||||
|
||||
Install
|
||||
|
||||
Just place the 'geoip.inc' file somewhere according to the 'include_path' directive of
|
||||
your 'php.ini' file, or just place it in the same directory as your PHP scripts.
|
||||
|
||||
Usage
|
||||
|
||||
Gets country name by hostname :
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);
|
||||
|
||||
echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" .
|
||||
geoip_country_name_by_addr($gi, "24.24.24.24") . "\n";
|
||||
echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
|
||||
geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
Memory Caching:
|
||||
To enable memory caching, pass GEOIP_SHARED_MEMORY or
|
||||
GEOIP_MEMORY_CACHE to the second argument of geoip_open
|
||||
|
||||
For GEOIP_SHARED_MEMORY, requires php >= 4.0.4,
|
||||
and --enable-shmop passed at configure time, see
|
||||
http://us2.php.net/manual/en/ref.shmop.php
|
||||
In addition, you should call geoip_load_shared_mem
|
||||
before calling geoip_open. See sample_city.php for an
|
||||
example of shared memory caching.
|
||||
|
||||
Working with PHP5.
|
||||
geoip_country_code_by_addr should work
|
||||
with PHP. For help with the other
|
||||
routines, please contact support@maxmind.com
|
||||
|
||||
Thanks to Jim Winstead.
|
80
maxmind/admin/generate_geoipregionvars.php
Normal file
80
maxmind/admin/generate_geoipregionvars.php
Normal file
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
# Copyright 2003 Maxmind LLC All Rights Reserved
|
||||
print "\$iso = array(\n";
|
||||
$iso = get_iso_3166_2_subcountry_codes();
|
||||
$keys = array_keys($iso);
|
||||
$values = array_values($iso);
|
||||
for ($a0 = 0;$a0 < sizeof($keys);$a0++){
|
||||
print "\"" . $keys[$a0] . "\" => array(\n";
|
||||
$keys2 = array_keys($values[$a0]);
|
||||
$values2 = array_values($values[$a0]);
|
||||
for ($a1 = 0;$a1 < sizeof($keys2);$a1++){
|
||||
print "\"" . $keys2[$a1] . "\" => \"" . $values2[$a1] . "\"";
|
||||
if ($a1 < sizeof($keys2)-1){print ",\n";}
|
||||
}
|
||||
if ($a0 < sizeof($keys)-1){
|
||||
print "),\n";}
|
||||
else{
|
||||
print ")\n";}
|
||||
}
|
||||
print "\$fips = array(\n";
|
||||
$fips = get_fips_10_4_subcountry_codes();
|
||||
$keys = array_keys($fips);
|
||||
$values = array_values($fips);
|
||||
for ($a0 = 0;$a0 < sizeof($keys);$a0++){
|
||||
print "\"" . $keys[$a0] . "\" => array(\n";
|
||||
$keys2 = array_keys($values[$a0]);
|
||||
$values2 = array_values($values[$a0]);
|
||||
for ($a1 = 0;$a1 < sizeof($keys2);$a1++){
|
||||
#setsubstr($value2[$a1],strlen($value2[$a1])-1,1,",");
|
||||
print "\"" . $keys2[$a1] . "\" => \"" . $values2[$a1] . "\"";
|
||||
if ($a1 < sizeof($keys2)-1){print ",\n";}
|
||||
}
|
||||
if ($a0 < sizeof($keys)-1){
|
||||
print "),\n";}
|
||||
else{
|
||||
print ")\n";}
|
||||
}
|
||||
print ");\n";
|
||||
function get_iso_3166_2_subcountry_codes(){
|
||||
$f = fopen("../iso3166_2","r");
|
||||
$str = fgets($f,4096);
|
||||
while (!feof($f)){
|
||||
$str = fgets($f,4096);
|
||||
$substrs = explode(",",$str);
|
||||
list($country,$region,$name) = $substrs;
|
||||
if (count($substrs) > 3){
|
||||
for ($a0 = 3;$a0 < count($substrs);$a0++){
|
||||
$name = $name .",". $substrs[$a0];
|
||||
}
|
||||
}
|
||||
if ($name){
|
||||
$name = substr($name,1,strlen($name)-3);
|
||||
$a[$country][$region] = $name;}
|
||||
}
|
||||
fclose($f);
|
||||
return $a;
|
||||
}
|
||||
|
||||
function get_fips_10_4_subcountry_codes(){
|
||||
$f = fopen("../fips10_4","r");
|
||||
$str = fgets($f,4096);
|
||||
while (!feof($f)){
|
||||
$str = fgets($f,4096);
|
||||
$substrs = explode(",",$str);
|
||||
list($country,$region,$name) = $substrs;
|
||||
if (count($substrs) > 3){
|
||||
for ($a0 = 3;$a0 < count($substrs);$a0++){
|
||||
$name = $name .",". $substrs[$a0];
|
||||
}
|
||||
}
|
||||
if ($name){
|
||||
$name = substr($name,1,strlen($name)-3);
|
||||
$a[$country][$region] = $name;}
|
||||
}
|
||||
fclose($f);
|
||||
return $a;
|
||||
}
|
||||
|
||||
?>
|
67
maxmind/benchmark.php
Normal file
67
maxmind/benchmark.php
Normal file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
set_time_limit('300');
|
||||
|
||||
include("geoip.inc");
|
||||
include("geoipcity.inc");
|
||||
define("GEOIP_COUNTRY_DATABASE",0);
|
||||
define("GEOIP_REGION_DATABASE",1);
|
||||
define("GEOIP_CITY_DATABASE",2);
|
||||
|
||||
class mainappc{
|
||||
var $dbfilename = array("/usr/local/share/GeoIP/GeoIP.dat","/usr/local/share/GeoIP/GeoIPRegion.dat","/usr/local/share/GeoIP/GeoIPCity.dat");
|
||||
function randomipaddress(){
|
||||
$result = "";
|
||||
for ($a = 0;$a < 4;$a++){
|
||||
if ($a > 0){$result = $result . ".";}
|
||||
$a2 = rand(1, 254);
|
||||
$result = $result . $a2;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
function ftime(){
|
||||
$a = gettimeofday();
|
||||
return $a[sec] + ($a[usec]*0.000001);
|
||||
}
|
||||
function testgeoipdatabase($type,$flags,$msg,$numlookups){
|
||||
$gi = geoip_open($this->dbfilename[$type],$flags);
|
||||
if ($gi == null){
|
||||
print "error: " . $this->dbfilename[$type] . " does not exist\n" ;
|
||||
return;
|
||||
}
|
||||
$t1 = $this->ftime();
|
||||
$i4 = 0;
|
||||
for ($i2 = 0;$i2 < $numlookups;$i2++){
|
||||
switch ($type) {
|
||||
case GEOIP_COUNTRY_DATABASE:
|
||||
geoip_country_code_by_addr($gi,$this->randomipaddress());
|
||||
break;
|
||||
case GEOIP_REGION_DATABASE:
|
||||
geoip_region_by_addr($gi,$this->randomipaddress());
|
||||
break;
|
||||
case GEOIP_CITY_DATABASE:
|
||||
GeoIP_record_by_addr($gi,$this->randomipaddress());
|
||||
break;
|
||||
}
|
||||
}
|
||||
$t2 = $this->ftime();
|
||||
$t3 = $t2-$t1;
|
||||
print $msg . "\n";
|
||||
print $numlookups . " lookups made in " . $t3 . " seconds \n";
|
||||
geoip_close($gi);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$mainapp = new mainappc();
|
||||
|
||||
|
||||
$mainapp->testgeoipdatabase(GEOIP_COUNTRY_DATABASE,GEOIP_STANDARD,"Geoip Country ",10000);
|
||||
$mainapp->testgeoipdatabase(GEOIP_COUNTRY_DATABASE,GEOIP_MEMORY_CACHE,"Geoip Country with memory cache",10000);
|
||||
$mainapp->testgeoipdatabase(GEOIP_REGION_DATABASE,GEOIP_STANDARD,"Geoip Region ",10000);
|
||||
$mainapp->testgeoipdatabase(GEOIP_REGION_DATABASE,GEOIP_MEMORY_CACHE,"Geoip Region with memory cache",10000);
|
||||
$mainapp->testgeoipdatabase(GEOIP_CITY_DATABASE,GEOIP_STANDARD,"Geoip City ",10000);
|
||||
$mainapp->testgeoipdatabase(GEOIP_CITY_DATABASE,GEOIP_MEMORY_CACHE,"Geoip City with memory cache",10000);
|
||||
|
||||
?>
|
713
maxmind/geoip.inc
Normal file
713
maxmind/geoip.inc
Normal file
@ -0,0 +1,713 @@
|
||||
<?php
|
||||
|
||||
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
|
||||
/* geoip.inc
|
||||
*
|
||||
* Copyright (C) 2007 MaxMind LLC
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
define("GEOIP_COUNTRY_BEGIN", 16776960);
|
||||
define("GEOIP_STATE_BEGIN_REV0", 16700000);
|
||||
define("GEOIP_STATE_BEGIN_REV1", 16000000);
|
||||
define("GEOIP_STANDARD", 0);
|
||||
define("GEOIP_MEMORY_CACHE", 1);
|
||||
define("GEOIP_SHARED_MEMORY", 2);
|
||||
define("STRUCTURE_INFO_MAX_SIZE", 20);
|
||||
define("DATABASE_INFO_MAX_SIZE", 100);
|
||||
define("GEOIP_COUNTRY_EDITION", 106);
|
||||
define("GEOIP_PROXY_EDITION", 8);
|
||||
define("GEOIP_ASNUM_EDITION", 9);
|
||||
define("GEOIP_NETSPEED_EDITION", 10);
|
||||
define("GEOIP_REGION_EDITION_REV0", 112);
|
||||
define("GEOIP_REGION_EDITION_REV1", 3);
|
||||
define("GEOIP_CITY_EDITION_REV0", 111);
|
||||
define("GEOIP_CITY_EDITION_REV1", 2);
|
||||
define("GEOIP_ORG_EDITION", 110);
|
||||
define("GEOIP_ISP_EDITION", 4);
|
||||
define("SEGMENT_RECORD_LENGTH", 3);
|
||||
define("STANDARD_RECORD_LENGTH", 3);
|
||||
define("ORG_RECORD_LENGTH", 4);
|
||||
define("MAX_RECORD_LENGTH", 4);
|
||||
define("MAX_ORG_RECORD_LENGTH", 300);
|
||||
define("GEOIP_SHM_KEY", 0x4f415401);
|
||||
define("US_OFFSET", 1);
|
||||
define("CANADA_OFFSET", 677);
|
||||
define("WORLD_OFFSET", 1353);
|
||||
define("FIPS_RANGE", 360);
|
||||
define("GEOIP_UNKNOWN_SPEED", 0);
|
||||
define("GEOIP_DIALUP_SPEED", 1);
|
||||
define("GEOIP_CABLEDSL_SPEED", 2);
|
||||
define("GEOIP_CORPORATE_SPEED", 3);
|
||||
define("GEOIP_DOMAIN_EDITION", 11);
|
||||
define("GEOIP_COUNTRY_EDITION_V6", 12);
|
||||
define("GEOIP_LOCATIONA_EDITION", 13);
|
||||
define("GEOIP_ACCURACYRADIUS_EDITION", 14);
|
||||
define("GEOIP_CITYCOMBINED_EDITION", 15);
|
||||
define("GEOIP_CITY_EDITION_REV1_V6", 30);
|
||||
define("GEOIP_CITY_EDITION_REV0_V6",31);
|
||||
define("GEOIP_NETSPEED_EDITION_REV1",32);
|
||||
define("GEOIP_NETSPEED_EDITION_REV1_V6",33);
|
||||
define("GEOIP_USERTYPE_EDITION",28);
|
||||
define("GEOIP_USERTYPE_EDITION_V6",29);
|
||||
define("GEOIP_ASNUM_EDITION_V6",21);
|
||||
define("GEOIP_ISP_EDITION_V6",22);
|
||||
define("GEOIP_ORG_EDITION_V6",23);
|
||||
define("GEOIP_DOMAIN_EDITION_V6",24);
|
||||
|
||||
define("CITYCOMBINED_FIXED_RECORD", 7 );
|
||||
|
||||
class GeoIP {
|
||||
var $flags;
|
||||
var $filehandle;
|
||||
var $memory_buffer;
|
||||
var $databaseType;
|
||||
var $databaseSegments;
|
||||
var $record_length;
|
||||
var $shmid;
|
||||
var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
|
||||
"" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
|
||||
"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "CW" => 10, "AO" => 11,
|
||||
"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
|
||||
"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
|
||||
"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
|
||||
"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
|
||||
"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
|
||||
"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
|
||||
"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
|
||||
"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
|
||||
"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
|
||||
"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
|
||||
"FM" => 72, "FO" => 73, "FR" => 74, "SX" => 75, "GA" => 76, "GB" => 77,
|
||||
"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
|
||||
"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
|
||||
"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
|
||||
"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
|
||||
"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
|
||||
"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
|
||||
"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
|
||||
"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
|
||||
"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
|
||||
"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
|
||||
"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
|
||||
"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
|
||||
"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
|
||||
"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
|
||||
"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
|
||||
"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
|
||||
"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
|
||||
"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
|
||||
"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
|
||||
"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
|
||||
"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
|
||||
"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
|
||||
"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
|
||||
"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
|
||||
"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
|
||||
"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
|
||||
"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
|
||||
"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
|
||||
"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
|
||||
"MF" => 252, "BQ" => 253,
|
||||
);
|
||||
var $GEOIP_COUNTRY_CODES = array(
|
||||
"","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW",
|
||||
"AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
|
||||
"BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
|
||||
"BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
|
||||
"CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
|
||||
"CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
|
||||
"DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
|
||||
"FK","FM","FO","FR","SX","GA","GB","GD","GE","GF",
|
||||
"GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
|
||||
"GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
|
||||
"IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
|
||||
"JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
|
||||
"KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
|
||||
"LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
|
||||
"MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
|
||||
"MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
|
||||
"NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
|
||||
"PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
|
||||
"PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
|
||||
"SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
|
||||
"SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
|
||||
"TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
|
||||
"TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
|
||||
"VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
|
||||
"ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
|
||||
"BL","MF", "BQ");
|
||||
var $GEOIP_COUNTRY_CODES3 = array(
|
||||
"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW",
|
||||
"AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
|
||||
"BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
|
||||
"BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD",
|
||||
"CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
|
||||
"CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
|
||||
"DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
|
||||
"FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF",
|
||||
"GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM",
|
||||
"GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN",
|
||||
"IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR",
|
||||
"JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
|
||||
"CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
|
||||
"LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
|
||||
"MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
|
||||
"MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
|
||||
"NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
|
||||
"PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
|
||||
"PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
|
||||
"SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
|
||||
"SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA",
|
||||
"TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
|
||||
"TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN",
|
||||
"VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF",
|
||||
"ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
|
||||
"BLM","MAF", "BES"
|
||||
);
|
||||
var $GEOIP_COUNTRY_NAMES = array(
|
||||
"","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Curacao",
|
||||
"Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
|
||||
"Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia",
|
||||
"Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
|
||||
"Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica",
|
||||
"Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic",
|
||||
"Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji",
|
||||
"Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana",
|
||||
"Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala",
|
||||
"Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia",
|
||||
"Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan",
|
||||
"Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
|
||||
"Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
|
||||
"Luxembourg","Latvia","Libya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali",
|
||||
"Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives",
|
||||
"Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
|
||||
"Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia",
|
||||
"Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau",
|
||||
"Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan",
|
||||
"Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname",
|
||||
"Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand",
|
||||
"Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan",
|
||||
"Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela",
|
||||
"Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa",
|
||||
"Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
|
||||
"Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"
|
||||
);
|
||||
|
||||
var $GEOIP_CONTINENT_CODES = array(
|
||||
"--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA",
|
||||
"AF","AN","SA","OC","EU","OC","NA","AS","EU","NA",
|
||||
"AS","EU","AF","EU","AS","AF","AF","NA","AS","SA",
|
||||
"SA","NA","AS","AN","AF","EU","NA","NA","AS","AF",
|
||||
"AF","AF","EU","AF","OC","SA","AF","AS","SA","NA",
|
||||
"NA","AF","AS","AS","EU","EU","AF","EU","NA","NA",
|
||||
"AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
|
||||
"SA","OC","EU","EU","NA","AF","EU","NA","AS","SA",
|
||||
"AF","EU","NA","AF","AF","NA","AF","EU","AN","NA",
|
||||
"OC","AF","SA","AS","AN","NA","EU","NA","EU","AS",
|
||||
"EU","AS","AS","AS","AS","AS","EU","EU","NA","AS",
|
||||
"AS","AF","AS","AS","OC","AF","NA","AS","AS","AS",
|
||||
"NA","AS","AS","AS","NA","EU","AS","AF","AF","EU",
|
||||
"EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
|
||||
"AS","AS","AS","OC","NA","AF","NA","EU","AF","AS",
|
||||
"AF","NA","AS","AF","AF","OC","AF","OC","AF","NA",
|
||||
"EU","EU","AS","OC","OC","OC","AS","NA","SA","OC",
|
||||
"OC","AS","AS","EU","NA","OC","NA","AS","EU","OC",
|
||||
"SA","AS","AF","EU","EU","AF","AS","OC","AF","AF",
|
||||
"EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
|
||||
"SA","AF","NA","AS","AF","NA","AF","AN","AF","AS",
|
||||
"AS","OC","AS","AF","OC","AS","EU","NA","OC","AS",
|
||||
"AF","EU","AF","OC","NA","SA","AS","EU","NA","SA",
|
||||
"NA","NA","AS","OC","OC","OC","AS","AF","EU","AF",
|
||||
"AF","EU","AF","--","--","--","EU","EU","EU","EU",
|
||||
"NA","NA","NA"
|
||||
);
|
||||
|
||||
}
|
||||
function geoip_load_shared_mem ($file) {
|
||||
|
||||
$fp = fopen($file, "rb");
|
||||
if (!$fp) {
|
||||
print "error opening $file: $php_errormsg\n";
|
||||
exit;
|
||||
}
|
||||
$s_array = fstat($fp);
|
||||
$size = $s_array['size'];
|
||||
if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
|
||||
shmop_delete ($shmid);
|
||||
shmop_close ($shmid);
|
||||
}
|
||||
$shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
|
||||
shmop_write ($shmid, fread($fp, $size), 0);
|
||||
shmop_close ($shmid);
|
||||
}
|
||||
|
||||
function _setup_segments($gi){
|
||||
$gi->databaseType = GEOIP_COUNTRY_EDITION;
|
||||
$gi->record_length = STANDARD_RECORD_LENGTH;
|
||||
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
||||
$offset = @shmop_size ($gi->shmid) - 3;
|
||||
for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
|
||||
$delim = @shmop_read ($gi->shmid, $offset, 3);
|
||||
$offset += 3;
|
||||
if ($delim == (chr(255).chr(255).chr(255))) {
|
||||
$gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
|
||||
$offset++;
|
||||
|
||||
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
|
||||
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
|
||||
} else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
|
||||
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
|
||||
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
|
||||
($gi->databaseType == GEOIP_CITY_EDITION_REV1)
|
||||
|| ($gi->databaseType == GEOIP_ORG_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ORG_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
|
||||
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
|
||||
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
|
||||
|| ($gi->databaseType == GEOIP_ASNUM_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
|
||||
$gi->databaseSegments = 0;
|
||||
$buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
|
||||
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
|
||||
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
||||
}
|
||||
if (($gi->databaseType == GEOIP_ORG_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ORG_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
|
||||
$gi->record_length = ORG_RECORD_LENGTH;
|
||||
}
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
$offset -= 4;
|
||||
}
|
||||
}
|
||||
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
|
||||
($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
|
||||
($gi->databaseType == GEOIP_PROXY_EDITION)||
|
||||
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
|
||||
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
|
||||
}
|
||||
} else {
|
||||
$filepos = ftell($gi->filehandle);
|
||||
fseek($gi->filehandle, -3, SEEK_END);
|
||||
for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
|
||||
$delim = fread($gi->filehandle,3);
|
||||
if ($delim == (chr(255).chr(255).chr(255))){
|
||||
$gi->databaseType = ord(fread($gi->filehandle,1));
|
||||
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
|
||||
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
|
||||
}
|
||||
else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
|
||||
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
|
||||
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
|
||||
|| ($gi->databaseType == GEOIP_ORG_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ORG_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
|
||||
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
|
||||
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
|
||||
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
|
||||
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
|
||||
|| ($gi->databaseType == GEOIP_ASNUM_EDITION)
|
||||
|| ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
|
||||
$gi->databaseSegments = 0;
|
||||
$buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
|
||||
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
|
||||
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
||||
}
|
||||
if ( ( $gi->databaseType == GEOIP_ORG_EDITION )
|
||||
|| ( $gi->databaseType == GEOIP_DOMAIN_EDITION )
|
||||
|| ( $gi->databaseType == GEOIP_ISP_EDITION )
|
||||
|| ( $gi->databaseType == GEOIP_ORG_EDITION_V6 )
|
||||
|| ( $gi->databaseType == GEOIP_DOMAIN_EDITION_V6 )
|
||||
|| ( $gi->databaseType == GEOIP_ISP_EDITION_V6 )) {
|
||||
$gi->record_length = ORG_RECORD_LENGTH;
|
||||
}
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
fseek($gi->filehandle, -4, SEEK_CUR);
|
||||
}
|
||||
}
|
||||
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
|
||||
($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
|
||||
($gi->databaseType == GEOIP_PROXY_EDITION)||
|
||||
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
|
||||
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
|
||||
}
|
||||
fseek($gi->filehandle,$filepos,SEEK_SET);
|
||||
}
|
||||
return $gi;
|
||||
}
|
||||
|
||||
function geoip_open($filename, $flags) {
|
||||
$gi = new GeoIP;
|
||||
$gi->flags = $flags;
|
||||
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
||||
$gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
|
||||
} else {
|
||||
$gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
|
||||
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
||||
$s_array = fstat($gi->filehandle);
|
||||
$gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
|
||||
}
|
||||
}
|
||||
|
||||
$gi = _setup_segments($gi);
|
||||
return $gi;
|
||||
}
|
||||
|
||||
function geoip_close($gi) {
|
||||
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return fclose($gi->filehandle);
|
||||
}
|
||||
|
||||
function geoip_country_id_by_name_v6($gi, $name) {
|
||||
$rec = dns_get_record($name, DNS_AAAA);
|
||||
if ( !$rec ) {
|
||||
return false;
|
||||
}
|
||||
$addr = $rec[0]["ipv6"];
|
||||
if (!$addr || $addr == $name) {
|
||||
return false;
|
||||
}
|
||||
return geoip_country_id_by_addr_v6($gi, $addr);
|
||||
}
|
||||
|
||||
function geoip_country_id_by_name($gi, $name) {
|
||||
$addr = gethostbyname($name);
|
||||
if (!$addr || $addr == $name) {
|
||||
return false;
|
||||
}
|
||||
return geoip_country_id_by_addr($gi, $addr);
|
||||
}
|
||||
|
||||
function geoip_country_code_by_name_v6($gi, $name) {
|
||||
$country_id = geoip_country_id_by_name_v6($gi,$name);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_code_by_name($gi, $name) {
|
||||
$country_id = geoip_country_id_by_name($gi,$name);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_name_by_name_v6($gi, $name) {
|
||||
$country_id = geoip_country_id_by_name_v6($gi,$name);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_name_by_name($gi, $name) {
|
||||
$country_id = geoip_country_id_by_name($gi,$name);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_id_by_addr_v6($gi, $addr) {
|
||||
$ipnum = inet_pton($addr);
|
||||
return _geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
|
||||
}
|
||||
|
||||
function geoip_country_id_by_addr($gi, $addr) {
|
||||
$ipnum = ip2long($addr);
|
||||
return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
|
||||
}
|
||||
|
||||
function geoip_country_code_by_addr_v6($gi, $addr) {
|
||||
$country_id = geoip_country_id_by_addr_v6($gi,$addr);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_code_by_addr($gi, $addr) {
|
||||
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
|
||||
$record = geoip_record_by_addr($gi,$addr);
|
||||
if ( $record !== false ) {
|
||||
return $record->country_code;
|
||||
}
|
||||
} else {
|
||||
$country_id = geoip_country_id_by_addr($gi,$addr);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_name_by_addr_v6($gi, $addr) {
|
||||
$country_id = geoip_country_id_by_addr_v6($gi,$addr);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function geoip_country_name_by_addr($gi, $addr) {
|
||||
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
|
||||
$record = geoip_record_by_addr($gi,$addr);
|
||||
return $record->country_name;
|
||||
} else {
|
||||
$country_id = geoip_country_id_by_addr($gi,$addr);
|
||||
if ($country_id !== false) {
|
||||
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function _geoip_seek_country_v6($gi, $ipnum) {
|
||||
|
||||
# arrays from unpack start with offset 1
|
||||
# yet another php mystery. array_merge work around
|
||||
# this broken behaviour
|
||||
$v6vec = array_merge(unpack( "C16", $ipnum));
|
||||
|
||||
$offset = 0;
|
||||
for ($depth = 127; $depth >= 0; --$depth) {
|
||||
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
||||
// workaround php's broken substr, strpos, etc handling with
|
||||
// mbstring.func_overload and mbstring.internal_encoding
|
||||
$enc = mb_internal_encoding();
|
||||
mb_internal_encoding('ISO-8859-1');
|
||||
|
||||
$buf = substr($gi->memory_buffer,
|
||||
2 * $gi->record_length * $offset,
|
||||
2 * $gi->record_length);
|
||||
|
||||
mb_internal_encoding($enc);
|
||||
} elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
|
||||
$buf = @shmop_read ($gi->shmid,
|
||||
2 * $gi->record_length * $offset,
|
||||
2 * $gi->record_length );
|
||||
} else {
|
||||
fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
|
||||
or die("fseek failed");
|
||||
$buf = fread($gi->filehandle, 2 * $gi->record_length);
|
||||
}
|
||||
$x = array(0,0);
|
||||
for ($i = 0; $i < 2; ++$i) {
|
||||
for ($j = 0; $j < $gi->record_length; ++$j) {
|
||||
$x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
|
||||
}
|
||||
}
|
||||
|
||||
$bnum = 127 - $depth;
|
||||
$idx = $bnum >> 3;
|
||||
$b_mask = 1 << ( $bnum & 7 ^ 7 );
|
||||
if (($v6vec[$idx] & $b_mask) > 0) {
|
||||
if ($x[1] >= $gi->databaseSegments) {
|
||||
return $x[1];
|
||||
}
|
||||
$offset = $x[1];
|
||||
} else {
|
||||
if ($x[0] >= $gi->databaseSegments) {
|
||||
return $x[0];
|
||||
}
|
||||
$offset = $x[0];
|
||||
}
|
||||
}
|
||||
trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
function _geoip_seek_country($gi, $ipnum) {
|
||||
$offset = 0;
|
||||
for ($depth = 31; $depth >= 0; --$depth) {
|
||||
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
||||
// workaround php's broken substr, strpos, etc handling with
|
||||
// mbstring.func_overload and mbstring.internal_encoding
|
||||
$enc = mb_internal_encoding();
|
||||
mb_internal_encoding('ISO-8859-1');
|
||||
|
||||
$buf = substr($gi->memory_buffer,
|
||||
2 * $gi->record_length * $offset,
|
||||
2 * $gi->record_length);
|
||||
|
||||
mb_internal_encoding($enc);
|
||||
} elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
|
||||
$buf = @shmop_read ($gi->shmid,
|
||||
2 * $gi->record_length * $offset,
|
||||
2 * $gi->record_length );
|
||||
} else {
|
||||
fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
|
||||
or die("fseek failed");
|
||||
$buf = fread($gi->filehandle, 2 * $gi->record_length);
|
||||
}
|
||||
$x = array(0,0);
|
||||
for ($i = 0; $i < 2; ++$i) {
|
||||
for ($j = 0; $j < $gi->record_length; ++$j) {
|
||||
$x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
|
||||
}
|
||||
}
|
||||
if ($ipnum & (1 << $depth)) {
|
||||
if ($x[1] >= $gi->databaseSegments) {
|
||||
return $x[1];
|
||||
}
|
||||
$offset = $x[1];
|
||||
} else {
|
||||
if ($x[0] >= $gi->databaseSegments) {
|
||||
return $x[0];
|
||||
}
|
||||
$offset = $x[0];
|
||||
}
|
||||
}
|
||||
trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
function _common_get_org($gi, $seek_org){
|
||||
$record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
|
||||
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
||||
$org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
|
||||
} else {
|
||||
fseek($gi->filehandle, $record_pointer, SEEK_SET);
|
||||
$org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
|
||||
}
|
||||
// workaround php's broken substr, strpos, etc handling with
|
||||
// mbstring.func_overload and mbstring.internal_encoding
|
||||
$enc = mb_internal_encoding();
|
||||
mb_internal_encoding('ISO-8859-1');
|
||||
$org_buf = substr($org_buf, 0, strpos($org_buf, "\0"));
|
||||
mb_internal_encoding($enc);
|
||||
return $org_buf;
|
||||
}
|
||||
|
||||
function _get_org_v6($gi,$ipnum){
|
||||
$seek_org = _geoip_seek_country_v6($gi,$ipnum);
|
||||
if ($seek_org == $gi->databaseSegments) {
|
||||
return NULL;
|
||||
}
|
||||
return _common_get_org($gi, $seek_org);
|
||||
}
|
||||
|
||||
function _get_org($gi,$ipnum){
|
||||
$seek_org = _geoip_seek_country($gi,$ipnum);
|
||||
if ($seek_org == $gi->databaseSegments) {
|
||||
return NULL;
|
||||
}
|
||||
return _common_get_org($gi, $seek_org);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function geoip_name_by_addr_v6 ($gi,$addr) {
|
||||
if ($addr == NULL) {
|
||||
return 0;
|
||||
}
|
||||
$ipnum = inet_pton($addr);
|
||||
return _get_org_v6($gi, $ipnum);
|
||||
}
|
||||
|
||||
function geoip_name_by_addr ($gi,$addr) {
|
||||
if ($addr == NULL) {
|
||||
return 0;
|
||||
}
|
||||
$ipnum = ip2long($addr);
|
||||
return _get_org($gi, $ipnum);
|
||||
}
|
||||
|
||||
function geoip_org_by_addr ($gi,$addr) {
|
||||
return geoip_name_by_addr($gi, $addr);
|
||||
}
|
||||
|
||||
function _get_region($gi,$ipnum){
|
||||
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
|
||||
$seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
|
||||
if ($seek_region >= 1000){
|
||||
$country_code = "US";
|
||||
$region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
|
||||
} else {
|
||||
$country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
|
||||
$region = "";
|
||||
}
|
||||
return array ($country_code,$region);
|
||||
} else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
|
||||
$seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
|
||||
//print $seek_region;
|
||||
if ($seek_region < US_OFFSET){
|
||||
$country_code = "";
|
||||
$region = "";
|
||||
} else if ($seek_region < CANADA_OFFSET) {
|
||||
$country_code = "US";
|
||||
$region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
|
||||
} else if ($seek_region < WORLD_OFFSET) {
|
||||
$country_code = "CA";
|
||||
$region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
|
||||
} else {
|
||||
$country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
|
||||
$region = "";
|
||||
}
|
||||
return array ($country_code,$region);
|
||||
}
|
||||
}
|
||||
|
||||
function geoip_region_by_addr ($gi,$addr) {
|
||||
if ($addr == NULL) {
|
||||
return 0;
|
||||
}
|
||||
$ipnum = ip2long($addr);
|
||||
return _get_region($gi, $ipnum);
|
||||
}
|
||||
|
||||
function getdnsattributes ($l,$ip){
|
||||
$r = new Net_DNS_Resolver();
|
||||
$r->nameservers = array("ws1.maxmind.com");
|
||||
$p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
|
||||
$str = is_object($p->answer[0])?$p->answer[0]->string():'';
|
||||
$str = substr( $str, 1, -1 );
|
||||
return $str;
|
||||
}
|
||||
|
||||
?>
|
237
maxmind/geoipcity.inc
Normal file
237
maxmind/geoipcity.inc
Normal file
@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
/* geoipcity.inc
|
||||
*
|
||||
* Copyright (C) 2004 Maxmind LLC
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Changelog:
|
||||
*
|
||||
* 2005-01-13 Andrew Hill, Awarez Ltd. (http://www.awarez.net)
|
||||
* Formatted file according to PEAR library standards.
|
||||
* Changed inclusion of geoip.inc file to require_once, so that
|
||||
* this library can be used in the same script as geoip.inc.
|
||||
*/
|
||||
|
||||
define("FULL_RECORD_LENGTH",50);
|
||||
|
||||
require_once 'geoip.inc';
|
||||
require_once 'geoipregionvars.php';
|
||||
|
||||
class geoiprecord {
|
||||
var $country_code;
|
||||
var $country_code3;
|
||||
var $country_name;
|
||||
var $region;
|
||||
var $city;
|
||||
var $postal_code;
|
||||
var $latitude;
|
||||
var $longitude;
|
||||
var $area_code;
|
||||
var $dma_code; # metro and dma code are the same. use metro_code
|
||||
var $metro_code;
|
||||
var $continent_code;
|
||||
}
|
||||
|
||||
class geoipdnsrecord {
|
||||
var $country_code;
|
||||
var $country_code3;
|
||||
var $country_name;
|
||||
var $region;
|
||||
var $regionname;
|
||||
var $city;
|
||||
var $postal_code;
|
||||
var $latitude;
|
||||
var $longitude;
|
||||
var $areacode;
|
||||
var $dmacode;
|
||||
var $isp;
|
||||
var $org;
|
||||
var $metrocode;
|
||||
}
|
||||
|
||||
function getrecordwithdnsservice($str){
|
||||
$record = new geoipdnsrecord;
|
||||
$keyvalue = explode(";",$str);
|
||||
foreach ($keyvalue as $keyvalue2){
|
||||
list($key,$value) = explode("=",$keyvalue2);
|
||||
if ($key == "co"){
|
||||
$record->country_code = $value;
|
||||
}
|
||||
if ($key == "ci"){
|
||||
$record->city = $value;
|
||||
}
|
||||
if ($key == "re"){
|
||||
$record->region = $value;
|
||||
}
|
||||
if ($key == "ac"){
|
||||
$record->areacode = $value;
|
||||
}
|
||||
if ($key == "dm" || $key == "me" ){
|
||||
$record->dmacode = $value;
|
||||
$record->metrocode = $value;
|
||||
}
|
||||
if ($key == "is"){
|
||||
$record->isp = $value;
|
||||
}
|
||||
if ($key == "or"){
|
||||
$record->org = $value;
|
||||
}
|
||||
if ($key == "zi"){
|
||||
$record->postal_code = $value;
|
||||
}
|
||||
if ($key == "la"){
|
||||
$record->latitude = $value;
|
||||
}
|
||||
if ($key == "lo"){
|
||||
$record->longitude = $value;
|
||||
}
|
||||
}
|
||||
$number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code];
|
||||
$record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number];
|
||||
$record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number];
|
||||
if ($record->region != "") {
|
||||
if (($record->country_code == "US") || ($record->country_code == "CA")){
|
||||
$record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region];
|
||||
} else {
|
||||
$record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region];
|
||||
}
|
||||
}
|
||||
return $record;
|
||||
}
|
||||
|
||||
|
||||
function _get_record_v6($gi,$ipnum){
|
||||
$seek_country = _geoip_seek_country_v6($gi,$ipnum);
|
||||
if ($seek_country == $gi->databaseSegments) {
|
||||
return NULL;
|
||||
}
|
||||
return _common_get_record($gi, $seek_country);
|
||||
}
|
||||
|
||||
function _common_get_record($gi, $seek_country){
|
||||
// workaround php's broken substr, strpos, etc handling with
|
||||
// mbstring.func_overload and mbstring.internal_encoding
|
||||
$enc = mb_internal_encoding();
|
||||
mb_internal_encoding('ISO-8859-1');
|
||||
|
||||
$record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments;
|
||||
|
||||
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
||||
$record_buf = substr($gi->memory_buffer,$record_pointer,FULL_RECORD_LENGTH);
|
||||
} elseif ($gi->flags & GEOIP_SHARED_MEMORY){
|
||||
$record_buf = @shmop_read($gi->shmid,$record_pointer,FULL_RECORD_LENGTH);
|
||||
} else {
|
||||
fseek($gi->filehandle, $record_pointer, SEEK_SET);
|
||||
$record_buf = fread($gi->filehandle,FULL_RECORD_LENGTH);
|
||||
}
|
||||
$record = new geoiprecord;
|
||||
$record_buf_pos = 0;
|
||||
$char = ord(substr($record_buf,$record_buf_pos,1));
|
||||
$record->country_code = $gi->GEOIP_COUNTRY_CODES[$char];
|
||||
$record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char];
|
||||
$record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char];
|
||||
$record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char];
|
||||
$record_buf_pos++;
|
||||
$str_length = 0;
|
||||
// Get region
|
||||
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
|
||||
while ($char != 0){
|
||||
$str_length++;
|
||||
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
|
||||
}
|
||||
if ($str_length > 0){
|
||||
$record->region = substr($record_buf,$record_buf_pos,$str_length);
|
||||
}
|
||||
$record_buf_pos += $str_length + 1;
|
||||
$str_length = 0;
|
||||
// Get city
|
||||
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
|
||||
while ($char != 0){
|
||||
$str_length++;
|
||||
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
|
||||
}
|
||||
if ($str_length > 0){
|
||||
$record->city = substr($record_buf,$record_buf_pos,$str_length);
|
||||
}
|
||||
$record_buf_pos += $str_length + 1;
|
||||
$str_length = 0;
|
||||
// Get postal code
|
||||
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
|
||||
while ($char != 0){
|
||||
$str_length++;
|
||||
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
|
||||
}
|
||||
if ($str_length > 0){
|
||||
$record->postal_code = substr($record_buf,$record_buf_pos,$str_length);
|
||||
}
|
||||
$record_buf_pos += $str_length + 1;
|
||||
$str_length = 0;
|
||||
// Get latitude and longitude
|
||||
$latitude = 0;
|
||||
$longitude = 0;
|
||||
for ($j = 0;$j < 3; ++$j){
|
||||
$char = ord(substr($record_buf,$record_buf_pos++,1));
|
||||
$latitude += ($char << ($j * 8));
|
||||
}
|
||||
$record->latitude = ($latitude/10000) - 180;
|
||||
for ($j = 0;$j < 3; ++$j){
|
||||
$char = ord(substr($record_buf,$record_buf_pos++,1));
|
||||
$longitude += ($char << ($j * 8));
|
||||
}
|
||||
$record->longitude = ($longitude/10000) - 180;
|
||||
if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType){
|
||||
$metroarea_combo = 0;
|
||||
if ($record->country_code == "US"){
|
||||
for ($j = 0;$j < 3;++$j){
|
||||
$char = ord(substr($record_buf,$record_buf_pos++,1));
|
||||
$metroarea_combo += ($char << ($j * 8));
|
||||
}
|
||||
$record->metro_code = $record->dma_code = floor($metroarea_combo/1000);
|
||||
$record->area_code = $metroarea_combo%1000;
|
||||
}
|
||||
}
|
||||
mb_internal_encoding($enc);
|
||||
return $record;
|
||||
}
|
||||
|
||||
function GeoIP_record_by_addr_v6 ($gi,$addr){
|
||||
if ($addr == NULL){
|
||||
return 0;
|
||||
}
|
||||
$ipnum = inet_pton($addr);
|
||||
return _get_record_v6($gi, $ipnum);
|
||||
}
|
||||
|
||||
function _get_record($gi,$ipnum){
|
||||
$seek_country = _geoip_seek_country($gi,$ipnum);
|
||||
if ($seek_country == $gi->databaseSegments) {
|
||||
return NULL;
|
||||
}
|
||||
return _common_get_record($gi, $seek_country);
|
||||
}
|
||||
|
||||
function GeoIP_record_by_addr ($gi,$addr){
|
||||
if ($addr == NULL){
|
||||
return 0;
|
||||
}
|
||||
$ipnum = ip2long($addr);
|
||||
return _get_record($gi, $ipnum);
|
||||
}
|
||||
|
||||
?>
|
4192
maxmind/geoipregionvars.php
Normal file
4192
maxmind/geoipregionvars.php
Normal file
File diff suppressed because it is too large
Load Diff
32
maxmind/sample-v6.php
Normal file
32
maxmind/sample-v6.php
Normal file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country by IP Address
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
// Uncomment if querying against GeoIP/Lite City.
|
||||
// include("geoipcity.inc");
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIPv6.dat",GEOIP_STANDARD);
|
||||
|
||||
echo geoip_country_code_by_addr_v6($gi, "::24.24.24.24") . "\t" .
|
||||
geoip_country_name_by_addr_v6($gi, "::24.24.24.24") . "\n";
|
||||
echo geoip_country_code_by_addr_v6($gi, "::80.24.24.24") . "\t" .
|
||||
geoip_country_name_by_addr_v6($gi, "::80.24.24.24") . "\n";
|
||||
|
||||
echo geoip_country_code_by_addr_v6($gi, "2001:4860:0:1001::68") . "\t" .
|
||||
geoip_country_name_by_addr_v6($gi, "2001:4860:0:1001::68") . "\n";
|
||||
|
||||
echo geoip_country_code_by_addr_v6($gi, "2001:67c:26c::") . "\t" .
|
||||
geoip_country_name_by_addr_v6($gi, "2001:67c:26c::") . "\n";
|
||||
|
||||
echo geoip_country_code_by_addr_v6($gi, "2001:67c:3a0:ffff:ffff:ffff:ffff:ffff") . "\t" .
|
||||
geoip_country_name_by_addr_v6($gi, "2001:67c:3a0:ffff:ffff:ffff:ffff:ffff") . "\n";
|
||||
|
||||
echo geoip_country_code_by_name_v6($gi, "ipv6.google.com") . "\t" .
|
||||
geoip_country_name_by_name_v6($gi, "ipv6.google.com") . "\n";
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
20
maxmind/sample.php
Normal file
20
maxmind/sample.php
Normal file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country by IP Address
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
// Uncomment if querying against GeoIP/Lite City.
|
||||
// include("geoipcity.inc");
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);
|
||||
|
||||
echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" .
|
||||
geoip_country_name_by_addr($gi, "24.24.24.24") . "\n";
|
||||
echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
|
||||
geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
18
maxmind/sample_asn-v6.php
Normal file
18
maxmind/sample_asn-v6.php
Normal file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country and region by IP Address
|
||||
// It is designed to work with GeoIP Organization or GeoIP ISP available from MaxMind
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
$giasn = geoip_open("/usr/local/share/GeoIP/GeoIPASNumv6.dat",GEOIP_STANDARD);
|
||||
|
||||
$ip = '2001:4860:0:1001::68';
|
||||
$asn = geoip_name_by_addr_v6($giasn,$ip);
|
||||
print "$ip has asn " . $asn . "\n";
|
||||
|
||||
geoip_close($giasn);
|
||||
|
||||
?>
|
||||
|
33
maxmind/sample_city-v6.php
Normal file
33
maxmind/sample_city-v6.php
Normal file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country, region, city,
|
||||
// postal code, latitude, and longitude by IP Address.
|
||||
// It is designed to work with GeoIP/GeoLite City
|
||||
|
||||
// Note that you must download the New Format of GeoIP City (GEO-133).
|
||||
// The old format (GEO-132) will not work.
|
||||
|
||||
include("geoipcity.inc");
|
||||
include("geoipregionvars.php");
|
||||
|
||||
// uncomment for Shared Memory support
|
||||
// geoip_load_shared_mem("/usr/local/share/GeoIP/GeoIPCity.dat");
|
||||
// $gi = geoip_open("/usr/local/share/GeoIP/GeoIPCity.dat",GEOIP_SHARED_MEMORY);
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoLiteCityv6.dat",GEOIP_STANDARD);
|
||||
|
||||
$record = geoip_record_by_addr_v6($gi,"::24.24.24.24");
|
||||
print $record->country_code . " " . $record->country_code3 . " " . $record->country_name . "\n";
|
||||
print $record->region . " " . $GEOIP_REGION_NAME[$record->country_code][$record->region] . "\n";
|
||||
print $record->city . "\n";
|
||||
print $record->postal_code . "\n";
|
||||
print $record->latitude . "\n";
|
||||
print $record->longitude . "\n";
|
||||
print $record->metro_code . "\n";
|
||||
print $record->area_code . "\n";
|
||||
print $record->continent_code . "\n";
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
33
maxmind/sample_city.php
Normal file
33
maxmind/sample_city.php
Normal file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country, region, city,
|
||||
// postal code, latitude, and longitude by IP Address.
|
||||
// It is designed to work with GeoIP/GeoLite City
|
||||
|
||||
// Note that you must download the New Format of GeoIP City (GEO-133).
|
||||
// The old format (GEO-132) will not work.
|
||||
|
||||
include("geoipcity.inc");
|
||||
include("geoipregionvars.php");
|
||||
|
||||
// uncomment for Shared Memory support
|
||||
// geoip_load_shared_mem("/usr/local/share/GeoIP/GeoIPCity.dat");
|
||||
// $gi = geoip_open("/usr/local/share/GeoIP/GeoIPCity.dat",GEOIP_SHARED_MEMORY);
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIPCity.dat",GEOIP_STANDARD);
|
||||
|
||||
$record = geoip_record_by_addr($gi,"24.24.24.24");
|
||||
print $record->country_code . " " . $record->country_code3 . " " . $record->country_name . "\n";
|
||||
print $record->region . " " . $GEOIP_REGION_NAME[$record->country_code][$record->region] . "\n";
|
||||
print $record->city . "\n";
|
||||
print $record->postal_code . "\n";
|
||||
print $record->latitude . "\n";
|
||||
print $record->longitude . "\n";
|
||||
print $record->metro_code . "\n";
|
||||
print $record->area_code . "\n";
|
||||
print $record->continent_code . "\n";
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
31
maxmind/sample_distributed.php
Normal file
31
maxmind/sample_distributed.php
Normal file
@ -0,0 +1,31 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
include("geoipcity.inc");
|
||||
include("Net/DNS.php");
|
||||
|
||||
# replace LICENSE_KEY_HERE with your license key
|
||||
$l = "LICENSE_KEY_HERE";
|
||||
$ip = "24.24.24.24";
|
||||
|
||||
if ($l == "LICENSE_KEY_HERE") {
|
||||
print "Error, must edit sample_distributed.php to replace LICENSE_KEY_HERE\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$str = getdnsattributes($l,$ip);
|
||||
$r = getrecordwithdnsservice($str);
|
||||
print "country code: " . $r->country_code . "\n";
|
||||
print "country code3: " . $r->country_code3 . "\n";
|
||||
print "country name: " . $r->country_name . "\n";
|
||||
print "city: " . $r->city . "\n";
|
||||
print "region: " . $r->region . "\n";
|
||||
print "region name: " . $r->regionname . "\n";
|
||||
print "postal_code: " . $r->postal_code . "\n";
|
||||
print "latitude: " . $r->latitude . "\n";
|
||||
print "longitude: " . $r->longitude . "\n";
|
||||
print "area code: " . $r->areacode . "\n";
|
||||
print "dma code: " . $r->dmacode . "\n";
|
||||
print "isp: " . $r->isp . "\n";
|
||||
print "org: " . $r->org . "\n";
|
||||
?>
|
23
maxmind/sample_netspeed.php
Normal file
23
maxmind/sample_netspeed.php
Normal file
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIPNetSpeed.dat",GEOIP_STANDARD);
|
||||
|
||||
$netspeed = geoip_country_id_by_addr($gi,"24.24.24.24");
|
||||
|
||||
//print $n . "\n";
|
||||
if ($netspeed == GEOIP_UNKNOWN_SPEED){
|
||||
print "Unknown\n";
|
||||
}else if ($netspeed == GEOIP_DIALUP_SPEED){
|
||||
print "Dailup\n";
|
||||
}else if ($netspeed == GEOIP_CABLEDSL_SPEED){
|
||||
print "Cable/DSL\n";
|
||||
}else if ($netspeed == GEOIP_CORPORATE_SPEED){
|
||||
print "Corporate\n";
|
||||
}
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
14
maxmind/sample_netspeedcell.php
Normal file
14
maxmind/sample_netspeedcell.php
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIPNetSpeedCell.dat",GEOIP_STANDARD);
|
||||
|
||||
$netspeed = geoip_name_by_addr($gi,"24.24.24.24");
|
||||
|
||||
print $netspeed . "\n";
|
||||
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
23
maxmind/sample_org.php
Normal file
23
maxmind/sample_org.php
Normal file
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country and region by IP Address
|
||||
// It is designed to work with GeoIP Organization or GeoIP ISP available from MaxMind
|
||||
|
||||
include("geoip.inc");
|
||||
|
||||
$giorg = geoip_open("/usr/local/share/GeoIP/GeoIPOrg.dat",GEOIP_STANDARD);
|
||||
|
||||
$org = geoip_org_by_addr($giorg,"80.24.24.24");
|
||||
print "80.24.24.24 belongs to " . $org . "\n";
|
||||
|
||||
$giisp = geoip_open("/usr/local/share/GeoIP/GeoIPISP.dat",GEOIP_STANDARD);
|
||||
|
||||
$isp = geoip_org_by_addr($giisp,"80.24.24.24");
|
||||
print "80.24.24.24 has isp " . $isp . "\n";
|
||||
|
||||
geoip_close($giorg);
|
||||
geoip_close($giisp);
|
||||
|
||||
?>
|
||||
|
20
maxmind/sample_region.php
Normal file
20
maxmind/sample_region.php
Normal file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// This code demonstrates how to lookup the country and region by IP Address
|
||||
// It is designed to work with GeoIP Region available from MaxMind
|
||||
|
||||
include("geoip.inc");
|
||||
include("geoipregionvars.php");
|
||||
|
||||
$gi = geoip_open("/usr/local/share/GeoIP/GeoIPRegion.dat",GEOIP_STANDARD);
|
||||
|
||||
list ($countrycode,$region) = geoip_region_by_addr($gi,"24.24.24.24");
|
||||
print $countrycode . " " . $region . " " . $GEOIP_REGION_NAME[$countrycode][$region] . "\n";
|
||||
list ($countrycode,$region) = geoip_region_by_addr($gi,"80.24.24.24");
|
||||
print $countrycode . " " . $region . " " . $GEOIP_REGION_NAME[$countrycode][$region] . "\n";
|
||||
list ($countrycode,$region) = geoip_region_by_addr($gi,"199.243.137.184");
|
||||
print $countrycode . " " . $region . " " . $GEOIP_REGION_NAME[$countrycode][$region] . "\n";
|
||||
geoip_close($gi);
|
||||
|
||||
?>
|
48
maxmind/timezone/make_time_zone_php_code.pl
Normal file
48
maxmind/timezone/make_time_zone_php_code.pl
Normal file
@ -0,0 +1,48 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
|
||||
my $old_country;
|
||||
my $old_region;
|
||||
|
||||
# Obtain timezone.txt from http://www.maxmind.com/timezone.txt
|
||||
open(FILE,"timezone.txt");
|
||||
my $str = <FILE>;
|
||||
print "<?php \n";
|
||||
print "function get_time_zone(\$country,\$region) {\n";
|
||||
print " switch (\$country) { \n";
|
||||
|
||||
while ($str = <FILE>) {
|
||||
$str =~ s!\s*$!!;
|
||||
my ($country,$region,$timezone) = split("\t",$str);
|
||||
#print $country . "," . $region . "," . $timezone . "\n";
|
||||
if ($country ne $old_country) {
|
||||
if ($old_region ne "") {
|
||||
print " } \n";
|
||||
print " break;\n";
|
||||
}
|
||||
print "case " . qq(") . $country . qq(") . ":\n";
|
||||
if ($region ne "") {
|
||||
print " switch (\$region) { \n";
|
||||
}
|
||||
}
|
||||
if ($region ne "") {
|
||||
print " case " . qq(") . $region . qq(") . ":\n ";
|
||||
}
|
||||
print qq( \$timezone = ") . $timezone . qq(") . ";\n";
|
||||
if ($region ne "") {
|
||||
print " break;\n";
|
||||
} else {
|
||||
print " break;\n";
|
||||
}
|
||||
$old_country = $country;
|
||||
$old_region = $region;
|
||||
}
|
||||
print " } \n";
|
||||
print " return \$timezone; \n";
|
||||
|
||||
print "} \n";
|
||||
|
||||
print "?> \n";
|
||||
|
||||
close(FILE);
|
5
maxmind/timezone/test_timezone.php
Normal file
5
maxmind/timezone/test_timezone.php
Normal file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
require("timezone.php");
|
||||
print get_time_zone("US","WV");
|
||||
?>
|
2271
maxmind/timezone/timezone.php
Normal file
2271
maxmind/timezone/timezone.php
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user