-
Notifications
You must be signed in to change notification settings - Fork 141
/
filter_geoip.js
148 lines (143 loc) · 4.74 KB
/
filter_geoip.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
var base_filter = require('../lib/base_filter'),
cache_helper = require('../lib/cache_helper'),
util = require('util'),
logger = require('log4node');
function FilterGeoip() {
base_filter.BaseFilter.call(this);
this.mergeConfig(cache_helper.config());
this.mergeConfig({
name: 'Geoip',
optional_params: ['country_field', 'region_field', 'city_field', 'lonlat_field', 'maxmind_dir'],
host_field: 'field',
default_values: {
'country_field': '__default__',
'region_field': '__default__',
'city_field': '__default__',
'lonlat_field': '__default__',
'asn_field': '__default__',
},
start_hook: this.start,
});
}
util.inherits(FilterGeoip, base_filter.BaseFilter);
FilterGeoip.prototype.start = function(callback) {
var maxmind;
var geoip;
if (process.env.MAXMIND_DB_DIR) {
this.maxmind_dir = process.env.MAXMIND_DB_DIR;
}
if (this.maxmind_dir) {
maxmind = require('maxmind');
logger.info('Initializing geoip filter from directory', this.maxmind_dir);
maxmind.init(['GeoIPCity.dat', 'GeoIPASNum.dat'].map(function(x) {
return this.maxmind_dir + '/' + x;
}.bind(this)), {checkForUpdates: true});
}
else {
geoip = require('geoip-lite');
geoip.startWatchingDataUpdate();
}
if (this.country_field === '__default__') {
this.country_field = this.field + '_geo_country';
}
if (this.region_field === '__default__') {
this.region_field = this.field + '_geo_region';
}
if (this.city_field === '__default__') {
this.city_field = this.field + '_geo_city';
}
if (this.lonlat_field === '__default__') {
this.lonlat_field = this.field + '_geo_lonlat';
}
if (this.asn_field === '__default__') {
this.asn_field = this.field + '_geo_asn';
}
logger.info('Initialized geoip filter, ip field', this.field);
logger.info('Initialized geoip filter, country field', this.country_field);
logger.info('Initialized geoip filter, region field', this.region_field);
logger.info('Initialized geoip filter, city field', this.city_field);
logger.info('Initialized geoip filter, latlon field', this.lonlat_field);
logger.info('Initialized geoip filter, asn field', this.asn_field);
this.cache_miss = function(key, callback) {
var geo;
if (this.maxmind_dir) {
var r = maxmind.getLocation(key);
if (r) {
geo = {
country: r.countryCode,
region: r.region,
city: r.city,
asn: maxmind.getAsn(key),
};
if (r.latitude && r.longitude) {
geo.ll = [Number((r.latitude).toFixed(4)), Number((r.longitude).toFixed(4))];
}
}
}
else {
geo = geoip.lookup(key);
}
callback(undefined, geo);
}.bind(this);
callback();
};
FilterGeoip.prototype.process = function(data) {
var ip = data[this.field];
if (ip &&
ip !== '-' &&
ip.indexOf('10.') !== 0 &&
ip.indexOf('192.168.') !== 0 &&
ip.indexOf('172.16') !== 0 &&
ip.indexOf('172.17') !== 0 &&
ip.indexOf('172.18') !== 0 &&
ip.indexOf('172.19') !== 0 &&
ip.indexOf('172.20') !== 0 &&
ip.indexOf('172.21') !== 0 &&
ip.indexOf('172.22') !== 0 &&
ip.indexOf('172.23') !== 0 &&
ip.indexOf('172.24') !== 0 &&
ip.indexOf('172.25') !== 0 &&
ip.indexOf('172.26') !== 0 &&
ip.indexOf('172.27') !== 0 &&
ip.indexOf('172.28') !== 0 &&
ip.indexOf('172.29') !== 0 &&
ip.indexOf('172.30') !== 0 &&
ip.indexOf('172.31') !== 0 &&
ip.indexOf('127.0.0.1') !== 0
) {
this.cache(ip, function(err, geo) {
if (err) {
logger.info('Unable to geoip lookup', ip, ':', err);
}
else if (geo) {
if (this.country_field !== 'none' && geo.country && geo.country !== '') {
logger.debug('Storing country for ip ' + ip, geo.country);
data[this.country_field] = geo.country;
}
if (this.region_field !== 'none' && geo.region && geo.region !== '') {
logger.debug('Storing region for ip ' + ip, geo.region);
data[this.region_field] = geo.region;
}
if (this.city_field !== 'none' && geo.city && geo.city !== '') {
logger.debug('Storing city for ip ' + ip, geo.city);
data[this.city_field] = geo.city;
}
if (this.asn_field !== 'none' && geo.asn && geo.asn !== '') {
logger.debug('Storing asn for ip ' + ip, geo.asn);
data[this.asn_field] = geo.asn;
}
if (this.lonlat_field !== 'none' && geo.ll) {
logger.debug('Storing latlon for ip ' + ip, geo.ll[0] + ',' + geo.ll[1]);
data[this.lonlat_field] = [geo.ll[1], geo.ll[0]];
}
}
else {
logger.info('Unable to geoip lookup', ip);
}
}.bind(this));
}
return data;
};
exports.create = function() {
return new FilterGeoip();
};