1*00b67f09SDavid van Moolenbroek /* $NetBSD: geoip.c,v 1.1.1.3 2014/12/10 03:34:24 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2013, 2014 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek *
6*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek *
10*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek */
18*00b67f09SDavid van Moolenbroek
19*00b67f09SDavid van Moolenbroek /*! \file */
20*00b67f09SDavid van Moolenbroek
21*00b67f09SDavid van Moolenbroek #include <config.h>
22*00b67f09SDavid van Moolenbroek
23*00b67f09SDavid van Moolenbroek #include <isc/util.h>
24*00b67f09SDavid van Moolenbroek
25*00b67f09SDavid van Moolenbroek #include <named/log.h>
26*00b67f09SDavid van Moolenbroek #include <named/geoip.h>
27*00b67f09SDavid van Moolenbroek
28*00b67f09SDavid van Moolenbroek #include <dns/geoip.h>
29*00b67f09SDavid van Moolenbroek
30*00b67f09SDavid van Moolenbroek #ifdef HAVE_GEOIP
31*00b67f09SDavid van Moolenbroek static dns_geoip_databases_t geoip_table = {
32*00b67f09SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
33*00b67f09SDavid van Moolenbroek };
34*00b67f09SDavid van Moolenbroek
35*00b67f09SDavid van Moolenbroek static void
init_geoip_db(GeoIP ** dbp,GeoIPDBTypes edition,GeoIPDBTypes fallback,GeoIPOptions method,const char * name)36*00b67f09SDavid van Moolenbroek init_geoip_db(GeoIP **dbp, GeoIPDBTypes edition, GeoIPDBTypes fallback,
37*00b67f09SDavid van Moolenbroek GeoIPOptions method, const char *name)
38*00b67f09SDavid van Moolenbroek {
39*00b67f09SDavid van Moolenbroek char *info;
40*00b67f09SDavid van Moolenbroek GeoIP *db;
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek REQUIRE(dbp != NULL);
43*00b67f09SDavid van Moolenbroek
44*00b67f09SDavid van Moolenbroek db = *dbp;
45*00b67f09SDavid van Moolenbroek
46*00b67f09SDavid van Moolenbroek if (db != NULL) {
47*00b67f09SDavid van Moolenbroek GeoIP_delete(db);
48*00b67f09SDavid van Moolenbroek db = *dbp = NULL;
49*00b67f09SDavid van Moolenbroek }
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek if (! GeoIP_db_avail(edition)) {
52*00b67f09SDavid van Moolenbroek isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
53*00b67f09SDavid van Moolenbroek NS_LOGMODULE_SERVER, ISC_LOG_INFO,
54*00b67f09SDavid van Moolenbroek "GeoIP %s (type %d) DB not available", name, edition);
55*00b67f09SDavid van Moolenbroek goto fail;
56*00b67f09SDavid van Moolenbroek }
57*00b67f09SDavid van Moolenbroek
58*00b67f09SDavid van Moolenbroek isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
59*00b67f09SDavid van Moolenbroek NS_LOGMODULE_SERVER, ISC_LOG_INFO,
60*00b67f09SDavid van Moolenbroek "initializing GeoIP %s (type %d) DB", name, edition);
61*00b67f09SDavid van Moolenbroek
62*00b67f09SDavid van Moolenbroek db = GeoIP_open_type(edition, method);
63*00b67f09SDavid van Moolenbroek if (db == NULL) {
64*00b67f09SDavid van Moolenbroek isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
65*00b67f09SDavid van Moolenbroek NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
66*00b67f09SDavid van Moolenbroek "failed to initialize GeoIP %s (type %d) DB%s",
67*00b67f09SDavid van Moolenbroek name, edition, fallback == 0
68*00b67f09SDavid van Moolenbroek ? "geoip matches using this database will fail" : "");
69*00b67f09SDavid van Moolenbroek goto fail;
70*00b67f09SDavid van Moolenbroek }
71*00b67f09SDavid van Moolenbroek
72*00b67f09SDavid van Moolenbroek info = GeoIP_database_info(db);
73*00b67f09SDavid van Moolenbroek if (info != NULL)
74*00b67f09SDavid van Moolenbroek isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
75*00b67f09SDavid van Moolenbroek NS_LOGMODULE_SERVER, ISC_LOG_INFO,
76*00b67f09SDavid van Moolenbroek "%s", info);
77*00b67f09SDavid van Moolenbroek
78*00b67f09SDavid van Moolenbroek *dbp = db;
79*00b67f09SDavid van Moolenbroek return;
80*00b67f09SDavid van Moolenbroek fail:
81*00b67f09SDavid van Moolenbroek if (fallback != 0)
82*00b67f09SDavid van Moolenbroek init_geoip_db(dbp, fallback, 0, method, name);
83*00b67f09SDavid van Moolenbroek
84*00b67f09SDavid van Moolenbroek }
85*00b67f09SDavid van Moolenbroek #endif /* HAVE_GEOIP */
86*00b67f09SDavid van Moolenbroek
87*00b67f09SDavid van Moolenbroek void
ns_geoip_init(void)88*00b67f09SDavid van Moolenbroek ns_geoip_init(void) {
89*00b67f09SDavid van Moolenbroek #ifndef HAVE_GEOIP
90*00b67f09SDavid van Moolenbroek return;
91*00b67f09SDavid van Moolenbroek #else
92*00b67f09SDavid van Moolenbroek GeoIP_cleanup();
93*00b67f09SDavid van Moolenbroek if (ns_g_geoip == NULL)
94*00b67f09SDavid van Moolenbroek ns_g_geoip = &geoip_table;
95*00b67f09SDavid van Moolenbroek #endif
96*00b67f09SDavid van Moolenbroek }
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek void
ns_geoip_load(char * dir)99*00b67f09SDavid van Moolenbroek ns_geoip_load(char *dir) {
100*00b67f09SDavid van Moolenbroek #ifndef HAVE_GEOIP
101*00b67f09SDavid van Moolenbroek
102*00b67f09SDavid van Moolenbroek UNUSED(dir);
103*00b67f09SDavid van Moolenbroek
104*00b67f09SDavid van Moolenbroek return;
105*00b67f09SDavid van Moolenbroek #else
106*00b67f09SDavid van Moolenbroek GeoIPOptions method;
107*00b67f09SDavid van Moolenbroek
108*00b67f09SDavid van Moolenbroek #ifdef _WIN32
109*00b67f09SDavid van Moolenbroek method = GEOIP_STANDARD;
110*00b67f09SDavid van Moolenbroek #else
111*00b67f09SDavid van Moolenbroek method = GEOIP_MMAP_CACHE;
112*00b67f09SDavid van Moolenbroek #endif
113*00b67f09SDavid van Moolenbroek
114*00b67f09SDavid van Moolenbroek ns_geoip_init();
115*00b67f09SDavid van Moolenbroek if (dir != NULL) {
116*00b67f09SDavid van Moolenbroek isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
117*00b67f09SDavid van Moolenbroek NS_LOGMODULE_SERVER, ISC_LOG_INFO,
118*00b67f09SDavid van Moolenbroek "using \"%s\" as GeoIP directory", dir);
119*00b67f09SDavid van Moolenbroek GeoIP_setup_custom_directory(dir);
120*00b67f09SDavid van Moolenbroek }
121*00b67f09SDavid van Moolenbroek
122*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->country_v4, GEOIP_COUNTRY_EDITION, 0,
123*00b67f09SDavid van Moolenbroek method, "Country (IPv4)");
124*00b67f09SDavid van Moolenbroek #ifdef HAVE_GEOIP_V6
125*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->country_v6, GEOIP_COUNTRY_EDITION_V6, 0,
126*00b67f09SDavid van Moolenbroek method, "Country (IPv6)");
127*00b67f09SDavid van Moolenbroek #endif
128*00b67f09SDavid van Moolenbroek
129*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->city_v4, GEOIP_CITY_EDITION_REV1,
130*00b67f09SDavid van Moolenbroek GEOIP_CITY_EDITION_REV0, method, "City (IPv4)");
131*00b67f09SDavid van Moolenbroek #if defined(HAVE_GEOIP_V6) && defined(HAVE_GEOIP_CITY_V6)
132*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->city_v6, GEOIP_CITY_EDITION_REV1_V6,
133*00b67f09SDavid van Moolenbroek GEOIP_CITY_EDITION_REV0_V6, method, "City (IPv6)");
134*00b67f09SDavid van Moolenbroek #endif
135*00b67f09SDavid van Moolenbroek
136*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->region, GEOIP_REGION_EDITION_REV1,
137*00b67f09SDavid van Moolenbroek GEOIP_REGION_EDITION_REV0, method, "Region");
138*00b67f09SDavid van Moolenbroek
139*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->isp, GEOIP_ISP_EDITION, 0,
140*00b67f09SDavid van Moolenbroek method, "ISP");
141*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->org, GEOIP_ORG_EDITION, 0,
142*00b67f09SDavid van Moolenbroek method, "Org");
143*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->as, GEOIP_ASNUM_EDITION, 0,
144*00b67f09SDavid van Moolenbroek method, "AS");
145*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->domain, GEOIP_DOMAIN_EDITION, 0,
146*00b67f09SDavid van Moolenbroek method, "Domain");
147*00b67f09SDavid van Moolenbroek init_geoip_db(&ns_g_geoip->netspeed, GEOIP_NETSPEED_EDITION, 0,
148*00b67f09SDavid van Moolenbroek method, "NetSpeed");
149*00b67f09SDavid van Moolenbroek #endif /* HAVE_GEOIP */
150*00b67f09SDavid van Moolenbroek }
151