Add analytics
[bus.git] / busui / owa / modules / base / classes / hostip.php
blob:a/busui/owa/modules/base/classes/hostip.php -> blob:b/busui/owa/modules/base/classes/hostip.php
  <?php
   
  //
  // Open Web Analytics - An Open Source Web Analytics Framework
  //
  // Copyright 2006 Peter Adams. All rights reserved.
  //
  // Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  //
  // $Id$
  //
  require_once(OWA_BASE_DIR.'/owa_location.php');
   
  if (!class_exists('owa_http')) {
  //owa_coreAPI::debug('owa_http already defined');
  require_once(OWA_BASE_DIR.'/owa_httpRequest.php');
  }
   
  /**
  * Geolocation plugin for Hostip.info web service
  *
  * See http://www.hostip.info/use.html for API documentation
  *
  * @author Peter Adams <peter@openwebanalytics.com>
  * @copyright Copyright &copy; 2006 Peter Adams <peter@openwebanalytics.com>
  * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0
  * @category owa
  * @package owa
  * @version $Revision$
  * @since owa 1.0.0
  */
  class owa_hostip extends owa_location {
   
  /**
  * URL template for REST based web service
  *
  * @var unknown_type
  */
  var $ws_url = "http://api.hostip.info/get_html.php?ip=%s&position=true";
   
  /**
  * Constructor
  *
  * @return owa_hostip
  */
  function __construct() {
   
  return parent::__construct();
  }
   
  /**
  * Fetches the location from the hostip.info web service
  *
  * @param string $ip
  */
  function get_location($location_map) {
   
  $city = '';
  $state = '';
  $country = '';
  $country_code = '';
  $latitude = '';
  $longitude = '';
   
  // check to see if ip is in map
  if ( array_key_exists('ip_address',$location_map)
  && ! empty( $location_map['ip_address'] )
  && empty( $location_map['country'] ) ) {
   
  // check to see if ip is valid and not a private address
  if ( filter_var( $location_map['ip_address'],
  FILTER_VALIDATE_IP,
  FILTER_FLAG_IPV4 |
  FILTER_FLAG_NO_PRIV_RANGE ) ) {
   
  // create crawler
  $crawler = new owa_http;
  $crawler->read_timeout = owa_coreAPI::getSetting('base','ws_timeout');
  // hit web service
  $crawler->fetch(sprintf($this->ws_url, $location_map['ip_address']));
  owa_coreAPI::debug(sprintf("HostIp web service response code: %s", $crawler->crawler->response_code));
  $location = $crawler->crawler->results;
  // replace delimiter
  $location = str_replace("\n", "|", $location);
  // convert string to array
  $loc_array = explode("|", $location);
  $result = array();
  // convert array to multi dimensional array
  foreach ($loc_array as $k => $v) {
   
  if (!empty($v)) {
  list($name, $value) = explode(":", $v, 2);
  $result[$name] = $value;
  }
  }
   
  // parse the city line of response
  if ( isset( $result['City'] ) && ! empty( $result['City'] ) ) {
  // lowercase
  $result['City'] = strtolower($result['City']);
  // explode into array
  $city_array = explode(',', $result['City']);
  // city name is always first
  $city = $city_array[0];
  // if there is a second element then it's a state
  if (isset($city_array[1])) {
  $state = $city_array[1];
  }
  }
   
  // parse country line of response
  if ( isset( $result['Country'] ) && ! empty( $result['Country'] ) ) {
  //lowercase
  $result['Country'] = strtolower( $result['Country'] );
  // set country
  $country_parts = explode('(', trim( $result['Country'] ) );
  $country = $country_parts[0];
  // if there is a second element then it's a country code.
  if ( isset($country_parts[1] ) ) {
  $country_code = substr($country_code,0,-1);
  }
  // debug
  owa_coreAPI::debug('Parse of Hostip country string: '.$result['Country'].' c: '. $country.' cc: '.$country_code);
   
  }
   
  // set latitude
  if ( isset( $result['Latitude'] ) && ! empty( $result['Latitude'] ) ) {
  $latitude = $result['Latitude'];
  }
  // set longitude
  if ( isset( $result['Longitude'] ) && ! empty( $result['Longitude'] ) ) {
  $longitude = $result['Longitude'];
  }
  }
   
  // fail safe checks for empty, unknown or private adddress labels
  // check to make sure values are not "private address" contain "unknown" or "xx"
  if ( empty($city) || strpos( $city, 'private' ) || strpos( $city, 'unknown') ) {
   
  $city = '(not set)';
  }
  // check state
  if ( empty($state) || strpos( $state, 'private' ) || strpos( $state, 'unknown') ) {
   
  $state = '(not set)';
  }
  // check country
  if ( empty( $country )
  || strpos( $country, 'unknown' )
  || strpos( $country, 'private' )
  ) {
  $country = '(not set)';
  }
  // check country code
  if ( empty( $country_code )
  || strpos( $country_code, 'xx' )
  || strpos( $country_code, 'unknown' )
  || strpos( $country_code, 'private' )
  ) {
  $country_code = '(not set)';
  }
   
  $location_map['city'] = strtolower(trim($city));
  $location_map['state'] = strtolower(trim($state));
  $location_map['country'] = strtolower(trim($country));
  $location_map['country_code'] = strtoupper(trim($country_code));
  $location_map['latitude'] = trim($latitude);
  $location_map['longitude'] = trim($longitude);
   
  // log headers if status is not a 200
  if ( isset( $crawler->response_code ) && ! strpos( $crawler->response_code, '200' ) ) {
  owa_coreAPI::debug(sprintf("HostIp web service response headers: %s", print_r($crawler->crawler->headers, true)));
  }
  }
   
  return $location_map;
  }
  }
   
  ?>