3 require_once 'Pman/Roo.php';
5 class Pman_Core_Import_Core_geoip extends Pman_Roo
7 static $cli_desc = "Insert the geoip database";
9 static $cli_opts = array();
11 var $id_mapping = array();
15 $ff = HTML_FlexyFramework::get();
19 HTML_FlexyFramework::ensureSingle(__FILE__, $this);
31 PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
33 $location = '/tmp/GeoLite2-City-Locations.csv';
34 $block = '/tmp/GeoLite2-City-Blocks.csv';
36 if(!file_exists($location) || !file_exists($block)){
37 $this->jerr('GeoLite2-City-Locations.csv OR GeoLite2-City-Blocks.csv does not exists?!');
39 $this->log(pow(2, 1));
40 $this->log(pow(2, 2));
41 $this->log(pow(2, 20));
43 // $this->insertLocation($location);
45 $this->insertBlock($block);
48 function insertLocation($csv)
50 ini_set("auto_detect_line_endings", true);
52 $fh = fopen($csv, 'r');
54 $this->jerr("invalid location file");
58 'GEONAME_ID', 'CONTINENT_CODE', 'CONTINENT_NAME',
59 'COUNTRY_ISO_CODE', 'COUNTRY_NAME', 'SUBDIVISION_ISO_CODE',
60 'SUBDIVISION_NAME', 'CITY_NAME', 'METRO_CODE',
66 while(false !== ($n = fgetcsv($fh,10000, ',', '"'))) {
67 if(!array_filter($n)){ // empty row
74 $cols[] = strtoupper(trim($k));
81 if (!in_array($r,$cols)) {
91 foreach($cols as $i=>$k) {
92 $row[$k] = trim($n[$i]);
95 $this->processLocation($row);
100 function insertBlock($csv)
102 ini_set("auto_detect_line_endings", true);
104 $fh = fopen($csv, 'r');
106 $this->jerr("invalid location file");
110 'NETWORK_START_IP', 'NETWORK_MASK_LENGTH', 'GEONAME_ID',
111 'REGISTERED_COUNTRY_GEONAME_ID', 'REPRESENTED_COUNTRY_GEONAME_ID', 'POSTAL_CODE',
112 'LATITUDE', 'LONGITUDE', 'IS_ANONYMOUS_PROXY',
113 'IS_SATELLITE_PROVIDER'
118 while(false !== ($n = fgetcsv($fh,10000, ',', '"'))) {
119 if(!array_filter($n)){ // empty row
126 $cols[] = strtoupper(trim($k));
132 foreach($req as $r) {
133 if (!in_array($r,$cols)) {
143 foreach($cols as $i=>$k) {
144 $row[$k] = trim($n[$i]);
147 $this->processBlock($row);
154 function processLocation($row)
156 $continent = $this->processContinent($row['CONTINENT_CODE'], $row['CONTINENT_NAME']);
158 $country = $this->processCountry($row['COUNTRY_ISO_CODE'], $row['COUNTRY_NAME'], $continent);
160 $division = $this->processDivision($row['SUBDIVISION_ISO_CODE'], $row['SUBDIVISION_NAME']);
162 $city = $this->processCity($row['CITY_NAME'], $row['METRO_CODE'], $row['TIME_ZONE'], $country, $division);
164 if(!empty($city) && !empty($city->id)){
165 $this->id_mapping[$row['GEONAME_ID']] = $city->id;
169 function processContinent($code, $name)
175 $continent = DB_DataObject::factory('core_geoip_continent');
176 if(!$continent->get('code', $code)){
177 $continent->setFrom(array(
179 'name' => (!empty($name)) ? $name : $code
182 $continent->insert();
188 function processCountry($code, $name, $continent)
194 $country = DB_DataObject::factory('core_geoip_country');
195 if(!$country->get('code', $code)){
196 $country->setFrom(array(
198 'name' => (!empty($name)) ? $name : $code,
199 'continent_id' => (!empty($continent) && !empty($continent->id)) ? $continent->id : 0
208 function processDivision($code, $name)
214 $division = DB_DataObject::factory('core_geoip_division');
215 if(!$division->get('code', $code)){
216 $division->setFrom(array(
218 'name' => (!empty($name)) ? $name : $code
227 function processCity($name, $metro_code, $time_zone, $country, $division)
233 $city = DB_DataObject::factory('core_geoip_city');
235 if($city->get('name', $name)){
239 $city->setFrom(array(
241 'metro_code' => $metro_code,
242 'time_zone' => $time_zone,
243 'country_id' => (!empty($country) && !empty($country->id)) ? $country->id : 0,
244 'division_id' => (!empty($division) && !empty($division->id)) ? $division->id : 0
253 function processBlock($row)
255 $network_mapping = DB_DataObject::factory('core_geoip_network_mapping');
257 $start_ip = array_pop(explode(":", $row['NETWORK_START_IP']));
259 $network_mapping->setFrom(array(