<?php /* $Id$ */ namespace Mammut\Info\GeoIP; (defined('MAMMUT') && (basename(__FILE__) != basename($_SERVER['PHP_SELF']))) or die('ACCESS DENIED'); use \Mammut\Format\Validator\IP; /** * * @author Stefan Daurer <s.daurer@q-spot.org> * @package Mammut\Info */ class GeoIP extends \Mammut\StrictObject { private static $instance = false; private $mode = 0; const MODE_FILE = 0; const MODE_EXT = 1; const MODE_SQL = 2; public static function getInstance() { if(!is_object(self::$instance)) self::$instance = new GeoIP(); } private function __construct() { if(extension_loaded('geoip')) $this->mode = self::MODE_EXT; else $this->mode = self::MODE_FILE; } public function getCountry($ip) { if(!IP::isValidIP($ip)) throw new \InvalidArgumentException('$ip is not an valid ip string'); if($this->mode == self::MODE_EXT) { return geoip_country_code_by_name($ip); } } public function getRegistry($ip) { if(!\Mammut\Format\Validator\IP::isValidIPv4($ip)) { $regex = '/^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$/'; preg_match($regex, $ip, $match); // dated may 2008 switch((int) $match[1]) { case 0: return 'IANA'; // IANA - Local Identification RESERVED case 1: return 'IANA'; // IANA UNALLOCATED case 2: return 'IANA'; // IANA UNALLOCATED case 3: return 'GEC'; // General Electric Company LEGACY case 4: return 'L3C'; // Level 3 Communications, Inc. LEGACY case 5: return 'IANA'; // IANA UNALLOCATED case 6: return 'AISC'; // Army Information Systems Center LEGACY case 7: return 'ARIN'; // Administered by ARIN LEGACY case 8: return 'L3C'; // Level 3 Communications, Inc. LEGACY case 9: return 'IBM'; // IBM LEGACY case 10: return 'PRIV'; // IANA - Private Use RESERVED case 11: return 'DIIS'; // DoD Intel Information Systems LEGACY case 12: return 'ATNT'; // AT&T Bell Laboratories LEGACY case 13: return 'XC'; // Xerox Corporation LEGACY case 14: return 'IANA'; // IANA UNALLOCATED case 15: return 'HP'; // Hewlett-Packard Company LEGACY case 16: return 'DEC'; // Digital Equipment Corporation LEGACY case 17: return 'APPL'; // Apple Computer Inc. LEGACY case 18: return 'MIT'; // MIT LEGACY case 19: return 'FORD'; // Ford Motor Company LEGACY case 20: return 'CSC'; // Computer Sciences Corporation LEGACY case 21: return 'DDNRVN'; // DDN-RVN LEGACY case 22: return 'DISA'; // Defense Information Systems Agency LEGACY case 23: return 'IANA'; // IANA UNALLOCATED case 24: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 25: return 'UKMOD'; // UK Ministry of Defence LEGACY case 26: return 'DISA'; // Defense Information Systems Agency LEGACY case 27: return 'IANA'; // IANA UNALLOCATED case 28: return 'DSI-North'; // DSI-North LEGACY case 29: return 'DISA'; // Defense Information Systems Agency LEGACY case 30: return 'DISA'; // Defense Information Systems Agency LEGACY case 31: return 'IANA'; // IANA UNALLOCATED case 32: return 'ATNT'; // AT&T Global Network Services LEGACY case 33: return 'DLA Systems Automation Center'; // DLA Systems Automation Center LEGACY case 34: return 'Halliburton Company'; // Halliburton Company LEGACY case 35: return 'MERIT Computer Network'; // MERIT Computer Network LEGACY case 36: return 'IANA'; // IANA UNALLOCATED case 37: return 'IANA'; // IANA UNALLOCATED case 38: return 'Performance Systems International'; // Performance Systems International LEGACY case 39: return 'IANA'; // IANA UNALLOCATED case 40: return 'Eli Lily & Company'; // Eli Lily & Company LEGACY case 41: return 'AfriNIC'; // AfriNIC whois.afrinic.net ALLOCATED case 42: return 'IANA'; // IANA UNALLOCATED case 43: return 'Japan Inet'; // Japan Inet LEGACY case 44: return 'Amateur Radio Digital Communications'; // Amateur Radio Digital Communications LEGACY case 45: return 'Interop Show Network'; // Interop Show Network LEGACY case 46: return 'IANA'; // IANA UNALLOCATED case 47: return 'Bell-Northern Research'; // Bell-Northern Research LEGACY case 48: return 'Prudential Securities Inc.'; // Prudential Securities Inc. LEGACY case 49: return 'IANA'; // IANA UNALLOCATED case 50: return 'IANA'; // IANA UNALLOCATED case 51: return 'Deparment of Social Security of UK'; // Deparment of Social Security of UK LEGACY case 52: return 'E.I. duPont de Nemours and Co., Inc.'; // E.I. duPont de Nemours and Co., Inc. LEGACY case 53: return 'Cap Debis CCS'; // Cap Debis CCS LEGACY case 54: return 'Merck and Co., Inc.'; // Merck and Co., Inc. LEGACY case 55: return 'DoD Network Information Center'; // DoD Network Information Center LEGACY case 56: return 'US Postal Service'; // US Postal Service LEGACY case 57: return 'SITA'; // SITA LEGACY case 58: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 59: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 60: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 61: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 62: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 63: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 64: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 65: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 66: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 67: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 68: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 69: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 70: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 71: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 72: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 73: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 74: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 75: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 76: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 77: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 78: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 79: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 80: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 81: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 82: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 83: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 84: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 85: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 86: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 87: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 88: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 89: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 90: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 91: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 92: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 93: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 94: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 95: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 96: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 97: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 98: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 99: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 100: return 'IANA'; // IANA UNALLOCATED case 101: return 'IANA'; // IANA UNALLOCATED case 102: return 'IANA'; // IANA UNALLOCATED case 103: return 'IANA'; // IANA UNALLOCATED case 104: return 'IANA'; // IANA UNALLOCATED case 105: return 'IANA'; // IANA UNALLOCATED case 106: return 'IANA'; // IANA UNALLOCATED case 107: return 'IANA'; // IANA UNALLOCATED case 108: return 'IANA'; // IANA UNALLOCATED case 109: return 'IANA'; // IANA UNALLOCATED case 110: return 'IANA'; // IANA UNALLOCATED case 111: return 'IANA'; // IANA UNALLOCATED case 112: return 'IANA'; // IANA UNALLOCATED case 113: return 'IANA'; // IANA UNALLOCATED case 114: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 115: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 116: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 117: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 118: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 119: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 120: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 121: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 122: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 123: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 124: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 125: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 126: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 127: return 'LOOP'; // IANA - Loopback RESERVED [5] case 128: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 129: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 130: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 131: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 132: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 133: return 'APNIC'; // Administered by APNIC whois.apnic.net LEGACY case 134: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 135: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 136: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 137: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 138: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 139: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 140: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 141: return 'RIPE'; // Administered by RIPE NCC whois.ripe.net LEGACY case 142: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 143: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 144: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 145: return 'RIPE'; // Administered by RIPE NCC whois.ripe.net LEGACY case 146: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 147: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 148: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 149: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 150: return 'APNIC'; // Administered by APNIC whois.apnic.net LEGACY case 151: return 'RIPE'; // Administered by RIPE NCC whois.ripe.net LEGACY case 152: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 153: return 'APNIC'; // Administered by APNIC whois.apnic.net LEGACY case 154: return 'AFNIC'; // Administered by AfriNIC whois.afrinic.net LEGACY case 155: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 156: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 157: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 158: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 159: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 160: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 161: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 162: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 163: return 'APNIC'; // Administered by APNIC whois.apnic.net LEGACY case 164: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 165: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 166: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 167: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 168: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 169: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY [6] case 170: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY case 171: return 'APNIC'; // Administered by APNIC whois.apnic.net LEGACY case 172: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY [7] case 173: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 174: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 175: return 'IANA'; // IANA UNALLOCATED case 176: return 'IANA'; // IANA UNALLOCATED case 177: return 'IANA'; // IANA UNALLOCATED case 178: return 'IANA'; // IANA UNALLOCATED case 179: return 'IANA'; // IANA UNALLOCATED case 180: return 'IANA'; // IANA UNALLOCATED case 181: return 'IANA'; // IANA UNALLOCATED case 182: return 'IANA'; // IANA UNALLOCATED case 183: return 'IANA'; // IANA UNALLOCATED case 184: return 'IANA'; // IANA UNALLOCATED case 185: return 'IANA'; // IANA UNALLOCATED case 186: return 'LACNIC'; // LACNIC whois.lacnic.net ALLOCATED case 187: return 'LACNIC'; // LACNIC whois.lacnic.net ALLOCATED case 188: return 'RIPE'; // Administered by RIPE NCC whois.ripe.net LEGACY case 189: return 'LACNIC'; // LACNIC whois.lacnic.net ALLOCATED case 190: return 'LACNIC'; // LACNIC whois.lacnic.net ALLOCATED case 191: return 'LACNIC'; // Administered by LACNIC whois.lacnic.net LEGACY case 192: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY [8] case 193: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 194: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 195: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 196: return 'AFNIC'; // Administered by AfriNIC whois.afrinic.net LEGACY case 197: return 'IANA'; // IANA UNALLOCATED case 198: return 'ARIN'; // Administered by ARIN whois.arin.net LEGACY [9] case 199: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 200: return 'LACNIC'; // LACNIC whois.lacnic.net ALLOCATED case 201: return 'LACNIC'; // LACNIC whois.lacnic.net ALLOCATED case 202: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 203: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 204: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 205: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 206: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 207: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 208: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 209: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 210: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 211: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 212: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 213: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 214: return 'USDOD'; // US-DOD LEGACY case 215: return 'USDOD'; // US-DOD LEGACY case 216: return 'ARIN'; // ARIN whois.arin.net ALLOCATED case 217: return 'RIPE'; // RIPE NCC whois.ripe.net ALLOCATED case 218: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 219: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 220: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 221: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 222: return 'APNIC'; // APNIC whois.apnic.net ALLOCATED case 223: return 'IANA'; // IANA UNALLOCATED case 224: return 'MULTI'; // Multicast RESERVED [10] case 225: return 'MULTI'; // Multicast RESERVED [10] case 226: return 'MULTI'; // Multicast RESERVED [10] case 227: return 'MULTI'; // Multicast RESERVED [10] case 228: return 'MULTI'; // Multicast RESERVED [10] case 229: return 'MULTI'; // Multicast RESERVED [10] case 230: return 'MULTI'; // Multicast RESERVED [10] case 231: return 'MULTI'; // Multicast RESERVED [10] case 232: return 'MULTI'; // Multicast RESERVED [10] case 233: return 'MULTI'; // Multicast RESERVED [10] case 234: return 'MULTI'; // Multicast RESERVED [10] case 235: return 'MULTI'; // Multicast RESERVED [10] case 236: return 'MULTI'; // Multicast RESERVED [10] case 237: return 'MULTI'; // Multicast RESERVED [10] case 238: return 'MULTI'; // Multicast RESERVED [10] case 239: return 'MULTI'; // Multicast RESERVED [10] case 240: return 'RESVD'; // Future use RESERVED [11] case 241: return 'RESVD'; // Future use RESERVED [11] case 242: return 'RESVD'; // Future use RESERVED [11] case 243: return 'RESVD'; // Future use RESERVED [11] case 244: return 'RESVD'; // Future use RESERVED [11] case 245: return 'RESVD'; // Future use RESERVED [11] case 246: return 'RESVD'; // Future use RESERVED [11] case 247: return 'RESVD'; // Future use RESERVED [11] case 248: return 'RESVD'; // Future use RESERVED [11] case 249: return 'RESVD'; // Future use RESERVED [11] case 250: return 'RESVD'; // Future use RESERVED [11] case 251: return 'RESVD'; // Future use RESERVED [11] case 252: return 'RESVD'; // Future use RESERVED [11] case 253: return 'RESVD'; // Future use RESERVED [11] case 254: return 'RESVD'; // Future use RESERVED [11] case 255: return 'RESVD'; // Future use RESERVED [11] default: return false; // unknown, should not happen } } elseif(\Mammut\Format\Validator\IP::isValidIPv6($ip)) { return false; // not avaible } else throw new \InvalidArgumentException('$ip is not an valid ip string'); } }