Newer
Older
Digital_Repository / Repositories / statistics / scripts / fix-countries_src.php
<?php

/*
	Scan through the entire stats database and update all country details.
	This is ONLY intended to be run ONCE, and only if you have a database
	that clearly contains inaccurate country data.
	
	This is definitely NOT intended to be run on a regular basis, as IP
	ranges may change over time, and this will overwrite any existing
	country data.
	
	Run this to clean up the existing data, then leave things running as
	normal, download the latest country database from MaxMind once per
	month.
*/

include("geoip.inc");

$gi = geoip_open("##GEOIP_DATABASE##",GEOIP_STANDARD);

// eprintstats db
$sqlserver = 'localhost';
$sqluser = 'eprintstatspriv';
$sqlpass = 'AuldGrizzel';
$sqldatabase = 'eprintstats';

/*
IP address ranges for your local Intranet(s). You can have multiple
ranges of IP addresses, each with a different "country name", so that
they will appear as separate entries in the by country stats pages. Note
that all sets are assigned the country code "T5", so they will all use
the flag icon for your local installation. If this isn't what you want,
you'll have to hack this yourself :)
*/
$local_IPs = array(
	'Repository Admin' => array(
		ip2long('139.80.75.110'),  // Nigel @ Uni
		ip2long('60.234.209.74'),  // Nigel @ home
		ip2long('139.80.92.138'),  // Monica & Jeremy
		ip2long('139.80.92.151'),  //   @ Uni
		ip2long('203.89.162.155'), // Monica @ home
		ip2long('139.80.81.50'),   // eprints.otago.ac.nz
	),
	'Otago Intranet' => array(
		array(
			'lower' => ip2long('139.80.0.0'),
			'upper' => ip2long('139.80.127.255'),
		),
	),
);

###########################################
##
## No configuration required below here.
##
###########################################

$connect = mysql_connect ($sqlserver,$sqluser,$sqlpass);
$db = mysql_select_db($sqldatabase,$connect) or die("Could not connect");

$query = "select id, ip, country_code from view";
$result = mysql_query($query, $connect);
while ($row = mysql_fetch_assoc($result))
{
	$id = $row['id'];
	$ip = $row['ip'];
	$stored_country = $row['country_code'];
	$ip_long = ip2long($ip);

	/* 
		Determine country code and name.
		Check whether the IP number falls into any of the local
		intranet ranges. If so, then use that.
	*/
	$ip_long = ip2long($ip);
	$found_country = FALSE;
	foreach ($local_IPs as $name => $addresses)
	{
		foreach ($addresses as $ip_range)
		{
			if (is_array($ip_range)) // check against lower/upper bounds
			{
				$found_country = (($ip_long >= $ip_range['lower']) 
					&& ($ip_long <= $ip_range['upper']));
				break;
			}
			else if (is_long($ip_range)) // data type sanity check
			{
				$found_country = ($ip_long == $ip_range);
				break;
			}
			else // something is seriously broken, ignore this entry
			{
				print "Unsupported data type " . gettype($ip_range) .
					" (value " . $ip_range .
					") in \$local_IPs (expected long).\n";
				continue; 
			}
		}
		
		if ($found_country)
		{
			$country_code = 'T5';
			$country_name = $name;
			break;
		}
	}
	
	// Otherwise, fall back to GeoIP.
	if (!$found_country)
	{
		$country_code = geoip_country_code_by_addr($gi, $ip);
		$country_name = geoip_country_name_by_addr($gi, $ip);
	}
	// end NJS 2005-12-16

	// Only update the row if its country has changed.
	if ($stored_country != $country_code)
	{
		$update = "update view set country_code='" . $country_code . "', country_name='" . $country_name . "' where id=" . $id;
		$result2 = mysql_query($update, $connect);
	}
}

	/*
		Keep track of where we are. Should avoid duplication of results
		if the script is run more than once on the same log file
	*/

$query = "INSERT into lastproc (lastproc) values('".$request_date."')";
$result = mysql_query($query,$connect);

#print "Records counted: $counter\n";
#print "Last count: $request_date\n";
mysql_close($connect);

?>