- <?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);
-
- ?>
-