/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.monitor;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geotools.util.logging.Logging;
import com.maxmind.geoip.Location;
import com.maxmind.geoip.LookupService;
public class GeoIPPostProcessor implements RequestPostProcessor {
static Logger LOGGER = Logging.getLogger("org.geoserver.montior");
/**
* cached geoip lookup service
*/
static LookupService geoIPLookup;
//TODO: cache by IP address
GeoServerResourceLoader loader;
AtomicBoolean warned = new AtomicBoolean(false);
public GeoIPPostProcessor(GeoServerResourceLoader loader) {
this.loader = loader;
}
public void run(RequestData data, HttpServletRequest request, HttpServletResponse response) {
if (data.getRemoteAddr() == null) {
LOGGER.info("Request data did not contain ip address. Unable to perform GeoIP lookup.");
return;
}
if (geoIPLookup == null) {
synchronized (this) {
if (geoIPLookup == null) {
geoIPLookup = lookupGeoIPDatabase();
}
}
}
if (geoIPLookup == null) {
return;
}
Location loc = geoIPLookup.getLocation(data.getRemoteAddr());
if (loc == null) {
LOGGER.fine("Unable to obtain location for " + data.getRemoteAddr());
return;
}
data.setRemoteCountry(loc.countryName);
data.setRemoteCity(loc.city);
data.setRemoteLat(loc.latitude);
data.setRemoteLon(loc.longitude);
}
LookupService lookupGeoIPDatabase() {
try {
File f = loader.find("monitoring", "GeoLiteCity.dat");
if (f != null) {
return new LookupService(f);
}
if (!warned.get()) {
warned.set(true);
String path =
new File(loader.getBaseDirectory(), "monitoring/GeoLiteCity.dat").getAbsolutePath();
LOGGER.warning("GeoIP database " + path + " is not available. " +
"Please install the file to enable GeoIP lookups.");
}
return null;
}
catch (IOException e) {
LOGGER.log(Level.WARNING, "Error occured looking up GeoIP database", e);
return null;
}
}
}