Changeset 169fd56


Ignore:
Timestamp:
Mar 27, 2016 12:55:28 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
e69f39f6
Parents:
97a6cbd
Message:

Transport:
Include Maxmind geoip-api-java library v1.3.1 (LGPL v2.1)
Use Maxmind database for geoip lookup if it exists
Debian:
Don't bundle geoip.txt and geoipv6.dat.gz, depend on geoip-database instead

Files:
7 added
5 edited

Legend:

Unmodified
Added
Removed
  • LICENSE.txt

    r97a6cbd r169fd56  
    103103   http://creativecommons.org/licenses/by-sa/3.0/
    104104   This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/
     105
     106   GeoIP API 1.3.1:
     107   See licenses/LICENSE-LGPLv2.1.txt
    105108
    106109
  • build.xml

    r97a6cbd r169fd56  
    700700            <group title="Core SDK (i2p.jar)" packages="net.i2p:net.i2p.*:net.i2p.client:net.i2p.client.*:net.i2p.internal:net.i2p.internal.*:freenet.support.CPUInformation:org.bouncycastle.oldcrypto:org.bouncycastle.oldcrypto.*:gnu.crypto.*:gnu.getopt:gnu.gettext:com.nettgryppa.security:net.metanotion:net.metanotion.*:org.apache.http.conn.ssl:org.apache.http.conn.util:org.apache.http.util" />
    701701            <group title="Streaming Library" packages="net.i2p.client.streaming:net.i2p.client.streaming.impl" />
    702             <group title="Router" packages="net.i2p.router:net.i2p.router.*:net.i2p.data.i2np:net.i2p.data.router:org.cybergarage:org.cybergarage.*:org.freenetproject:org.xlattice.crypto.filters" />
     702            <group title="Router" packages="net.i2p.router:net.i2p.router.*:net.i2p.data.i2np:net.i2p.data.router:org.cybergarage:org.cybergarage.*:org.freenetproject:org.xlattice.crypto.filters:com.maxmind.geoip" />
    703703            <group title="Router Console" packages="net.i2p.router.web:net.i2p.router.update:net.i2p.router.news" />
    704704            <!-- apps and bridges starting here, alphabetical please -->
     
    14791479    </target>
    14801480
    1481     <!-- GeoIP files and flag icons -->
     1481    <!-- GeoIP files -->
    14821482    <target name="prepgeoupdate">
    1483         <copy file="installer/resources/geoip.txt" todir="pkg-temp/geoip/" />
    1484         <copy file="installer/resources/geoipv6.dat.gz" todir="pkg-temp/geoip/" />
     1483        <copy todir="pkg-temp/geoip/" >
     1484            <!-- We use a fileset here so it doesn't fail if the files don't exist.
     1485                 As of 0.9.26, the files are not included in Debian/Ubuntu builds. -->
     1486            <fileset dir="installer/resources" includes="geoip.txt geoipv6.dat.gz" />
     1487        </copy>
    14851488        <copy file="installer/resources/countries.txt" todir="pkg-temp/geoip/" />
    14861489        <copy file="installer/resources/continents.txt" todir="pkg-temp/geoip/" />
     
    19871990                <exclude name="debian/**"/>
    19881991                <exclude name="**/*.sh"/>
     1992                <exclude name="installer/resources/geoip.txt"/>
     1993                <exclude name="installer/resources/geoipv6.dat.gz"/>
    19891994            </tarfileset>
    19901995            <tarfileset dir="../i2p-${Extended.Version}" prefix="/i2p-${Extended.Version}" filemode="755">
  • debian/control

    r97a6cbd r169fd56  
    7171Priority: optional
    7272Depends: ${misc:Depends}, ${java:Depends}, ${shlibs:Depends},
    73  openjdk-8-jre-headless | openjdk-7-jre-headless | default-jre-headless | java8-runtime-headless | java7-runtime-headless, libecj-java
     73 openjdk-8-jre-headless | openjdk-7-jre-headless | default-jre-headless | java8-runtime-headless | java7-runtime-headless,
     74 libecj-java,
     75 geoip-database
    7476Replaces: i2p ( << 0.8.6-5)
    7577Breaks: i2p (<< 0.8.6-5)
  • debian/repack.sh

    r97a6cbd r169fd56  
    2929bzcat "$tarball" | tar --wildcards --delete '*/installer/lib/*' \
    3030                        --delete '*/Slackware/*' \
     31                        --delete '*/installer/resources/geoip.txt' \
     32                        --delete '*/installer/resources/geoipv6.dat.gz' \
    3133                        --delete '*/debian/*' > "$tdir/${fname}"
    3234
  • router/java/src/net/i2p/router/transport/GeoIP.java

    r97a6cbd r169fd56  
    1717import java.util.concurrent.atomic.AtomicBoolean;
    1818
     19import com.maxmind.geoip.InvalidDatabaseException;
     20import com.maxmind.geoip.LookupService;
     21
    1922import net.i2p.I2PAppContext;
    2023import net.i2p.data.DataHelper;
     
    2528import net.i2p.util.ConcurrentHashSet;
    2629import net.i2p.util.Log;
     30import net.i2p.util.SystemVersion;
    2731
    2832/**
     
    5761    private int _lookupRunCount;
    5862   
     63    static final String PROP_GEOIP_ENABLED = "routerconsole.geoip.enable";
     64    public static final String PROP_GEOIP_DIR = "geoip.dir";
     65    public static final String GEOIP_DIR_DEFAULT = "geoip";
     66    static final String GEOIP_FILE_DEFAULT = "geoip.txt";
     67    static final String COUNTRY_FILE_DEFAULT = "countries.txt";
     68    public static final String PROP_IP_COUNTRY = "i2np.lastCountry";
     69    public static final String PROP_DEBIAN_GEOIP = "geoip.dat";
     70    public static final String PROP_DEBIAN_GEOIPV6 = "geoip.v6.dat";
     71    private static final String DEBIAN_GEOIP_FILE = "/usr/share/GeoIP/GeoIP.dat";
     72    private static final String DEBIAN_GEOIPV6_FILE = "/usr/share/GeoIP/GeoIPv6.dat";
     73    private static final boolean ENABLE_DEBIAN = !SystemVersion.isWindows();
     74    /** maxmind API */
     75    private static final String UNKNOWN_COUNTRY_CODE = "--";
     76
    5977    /**
    6078     *  @param context RouterContext in production, I2PAppContext for testing only
     
    7290        readCountryFile();
    7391    }
    74    
    75     static final String PROP_GEOIP_ENABLED = "routerconsole.geoip.enable";
    76     public static final String PROP_GEOIP_DIR = "geoip.dir";
    77     public static final String GEOIP_DIR_DEFAULT = "geoip";
    78     static final String GEOIP_FILE_DEFAULT = "geoip.txt";
    79     static final String COUNTRY_FILE_DEFAULT = "countries.txt";
    80     public static final String PROP_IP_COUNTRY = "i2np.lastCountry";
    8192
    8293    /**
     
    146157                if (search.length > 0) {
    147158                    Arrays.sort(search);
    148                     String[] countries = readGeoIPFile(search);
    149                     for (int i = 0; i < countries.length; i++) {
    150                         if (countries[i] != null)
    151                             _IPToCountry.put(search[i], countries[i]);
    152                         else
    153                             _notFound.add(search[i]);
     159                    File f = new File(_context.getProperty(PROP_DEBIAN_GEOIP, DEBIAN_GEOIP_FILE));
     160                    if (ENABLE_DEBIAN && f.exists()) {
     161                        // Maxmind database
     162                        LookupService ls = null;
     163                        try {
     164                            ls = new LookupService(f, LookupService.GEOIP_STANDARD);
     165                            for (int i = 0; i < search.length; i++) {
     166                                long ip = search[i].longValue();
     167                                // returns upper case or "--"
     168                                String uc = ls.getCountry(ip).getCode();
     169                                if (!uc.equals(UNKNOWN_COUNTRY_CODE)) {
     170                                    String cached = _codeCache.get(uc.toLowerCase(Locale.US));
     171                                    _IPToCountry.put(search[i], cached);
     172                                } else {
     173                                    _notFound.add(search[i]);
     174                                }
     175                            }
     176                        } catch (IOException ioe) {
     177                            _log.error("GeoIP failure", ioe);
     178                        } catch (InvalidDatabaseException ide) {
     179                            _log.error("GeoIP failure", ide);
     180                        } finally {
     181                            if (ls != null) ls.close();
     182                        }
     183                    } else {
     184                        // Tor-style database
     185                        String[] countries = readGeoIPFile(search);
     186                        for (int i = 0; i < countries.length; i++) {
     187                            if (countries[i] != null)
     188                                _IPToCountry.put(search[i], countries[i]);
     189                            else
     190                                _notFound.add(search[i]);
     191                        }
    154192                    }
    155193                }
     
    159197                if (search.length > 0) {
    160198                    Arrays.sort(search);
    161                     String[] countries = GeoIPv6.readGeoIPFile(_context, search, _codeCache);
    162                     for (int i = 0; i < countries.length; i++) {
    163                         if (countries[i] != null)
    164                             _IPToCountry.put(search[i], countries[i]);
    165                         else
    166                             _notFound.add(search[i]);
     199                    File f = new File(_context.getProperty(PROP_DEBIAN_GEOIPV6, DEBIAN_GEOIPV6_FILE));
     200                    if (ENABLE_DEBIAN && f.exists()) {
     201                        // Maxmind database
     202                        LookupService ls = null;
     203                        try {
     204                            ls = new LookupService(f, LookupService.GEOIP_STANDARD);
     205                            for (int i = 0; i < search.length; i++) {
     206                                long ip = search[i].longValue();
     207                                String ipv6 = toV6(ip);
     208                                // returns upper case or "--"
     209                                String uc = ls.getCountryV6(ipv6).getCode();
     210                                if (!uc.equals(UNKNOWN_COUNTRY_CODE)) {
     211                                    String cached = _codeCache.get(uc.toLowerCase(Locale.US));
     212                                    _IPToCountry.put(search[i], cached);
     213                                } else {
     214                                    _notFound.add(search[i]);
     215                                }
     216                            }
     217                        } catch (IOException ioe) {
     218                            _log.error("GeoIP failure", ioe);
     219                        } catch (InvalidDatabaseException ide) {
     220                            _log.error("GeoIP failure", ide);
     221                        } finally {
     222                            if (ls != null) ls.close();
     223                        }
     224                    } else {
     225                        // Tor-style database
     226                        String[] countries = GeoIPv6.readGeoIPFile(_context, search, _codeCache);
     227                        for (int i = 0; i < countries.length; i++) {
     228                            if (countries[i] != null)
     229                                _IPToCountry.put(search[i], countries[i]);
     230                            else
     231                                _notFound.add(search[i]);
     232                        }
    167233                    }
    168234                }
     
    406472
    407473    /**
     474     * @return e.g. aabb:ccdd:eeff:1122::
     475     * @since 0.9.26 for maxmind
     476     */
     477    private static String toV6(long ip) {
     478        StringBuilder buf = new StringBuilder(21);
     479        for (int i = 0; i < 4; i++) {
     480            buf.append(Long.toHexString((ip >> ((3-i)*16)) & 0xffff));
     481            buf.append(':');
     482        }
     483        buf.append(':');
     484        return buf.toString();
     485    }
     486
     487    /**
    408488     * Get the country for a country code
    409489     * @param code two-letter lower case code
Note: See TracChangeset for help on using the changeset viewer.