wmap 2.5.8 → 2.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/wmap/cidr_tracker.rb +152 -185
- data/version.txt +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 940635362c6d612134a052e37c5bbcd49ad7a8bb801b5a767ea4a59d141740ee
|
4
|
+
data.tar.gz: 3538d199e5fe4c9fad108a87a96d002ca76e290a42bda9714e0d655ac7d9ef80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c458e2c002a4aea5552cb2698c6776adab599aca664aa8f750b9fd42a9920634489e138c589dd58d9cb2924b2920cd5c0daf0731285ecb58fcb0bae45dfae8aa
|
7
|
+
data.tar.gz: c07aa8ccd2f405535eeb48f675b76690bba42d3c5f2d7649b7170df873ab421f38532651c45bc09967bd3a761a87639cc5f1fb64cd189afead956f946376c27e
|
data/lib/wmap/cidr_tracker.rb
CHANGED
@@ -18,195 +18,173 @@ class Wmap::CidrTracker
|
|
18
18
|
@verbose=params.fetch(:verbose, false)
|
19
19
|
@data_dir=params.fetch(:data_dir, File.dirname(__FILE__)+'/../../data/')
|
20
20
|
Dir.mkdir(@data_dir) unless Dir.exist?(@data_dir)
|
21
|
-
@
|
22
|
-
@
|
23
|
-
@
|
24
|
-
@known_cidr_blks_asce_index=[]
|
25
|
-
File.write(@file_cidr_seeds, "") unless File.exist?(@file_cidr_seeds)
|
26
|
-
load_cidr_blks_from_file(@file_cidr_seeds)
|
21
|
+
@cidr_seeds=params.fetch(:cidr_seeds, @data_dir + 'cidrs')
|
22
|
+
File.write(@cidr_seeds, "") unless File.exist?(@cidr_seeds)
|
23
|
+
load_cidr_blks_from_file(@cidr_seeds)
|
27
24
|
end
|
28
25
|
|
29
26
|
# Main worker method to retrieve known network information for a host / ip
|
30
27
|
def cidr_worker (host)
|
31
28
|
puts "Starting tracking of known CIDR information for host: #{host}" if @verbose
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
return nil
|
49
|
-
end
|
29
|
+
host=host.strip.downcase
|
30
|
+
ip=host_2_ip(host)
|
31
|
+
cidr=cidr_lookup(ip)
|
32
|
+
ref=get_cidr_ref(cidr)
|
33
|
+
netname=get_cidr_netname(cidr)
|
34
|
+
# save the data
|
35
|
+
tracker=Hash.new
|
36
|
+
tracker['host']=host
|
37
|
+
tracker['ip']=ip
|
38
|
+
tracker['cidr']=cidr
|
39
|
+
tracker['ref']=ref
|
40
|
+
tracker['netname']=netname
|
41
|
+
return tracker
|
42
|
+
rescue => ee
|
43
|
+
puts "Exception on method #{__method__} for host #{host}: #{ee}" # if @verbose
|
44
|
+
return nil
|
50
45
|
end
|
51
46
|
alias_method :track, :cidr_worker
|
52
47
|
|
53
48
|
# 'setter' to load the known CIDR blocks into an instance variable @known_cidr_blks
|
54
|
-
def load_cidr_blks_from_file
|
49
|
+
def load_cidr_blks_from_file(file_cidrs=@cidr_seeds)
|
55
50
|
puts "Load the known CIDR seed file: #{file_cidrs}" if @verbose
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
67
|
-
f.close
|
68
|
-
# Sort the blocks in order once for better performance. Update 10/29/2018 to support Netaddr 2.x syntax
|
69
|
-
#@known_cidr_blks_desc_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>true)
|
70
|
-
#@known_cidr_blks_asce_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>false)
|
71
|
-
@known_cidr_blks_asce_index=@known_cidr_blks.keys.sort
|
72
|
-
@known_cidr_blks_desc_index=@known_cidr_blks_asce_index.reverse
|
73
|
-
rescue => ee
|
74
|
-
puts "Exception on method #{__method__}: #{ee}" # if @verbose
|
51
|
+
f=File.open(file_cidrs, 'r')
|
52
|
+
f.each do |line|
|
53
|
+
entry=line.chomp.split(',')
|
54
|
+
next unless is_cidr?(entry[0])
|
55
|
+
puts "Loading: #{entry[0]}" if @verbose
|
56
|
+
key=entry[0].strip
|
57
|
+
@known_cidr_blks = Hash.new unless @known_cidr_blks
|
58
|
+
@known_cidr_blks[key] = Hash.new if not @known_cidr_blks.key?(key)
|
59
|
+
@known_cidr_blks[key]['ref']=entry[1].nil? ? nil : entry[1].strip
|
60
|
+
@known_cidr_blks[key]['netname']=entry[2].nil? ? nil : entry[2].strip
|
75
61
|
end
|
62
|
+
f.close
|
63
|
+
# Sort the blocks in order once for better performance. Update 10/29/2018 to support Netaddr 2.x syntax
|
64
|
+
#@known_cidr_blks_desc_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>true)
|
65
|
+
#@known_cidr_blks_asce_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>false)
|
66
|
+
@known_cidr_blks_asce_index=@known_cidr_blks.keys.sort
|
67
|
+
@known_cidr_blks_desc_index=@known_cidr_blks_asce_index.reverse
|
68
|
+
#rescue => ee
|
69
|
+
# puts "Exception on method #{__method__}: #{ee}" # if @verbose
|
76
70
|
end
|
77
71
|
|
78
72
|
# 'setter' to add an entry to CIDR store @known_cidr_blks
|
79
73
|
def add (cidr,ref=nil,netname=nil)
|
80
74
|
puts "Load the entry into the CIDR store: #{cidr}"
|
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
|
-
# puts "Exception on method #{__method__}: #{ee}" # if @verbose
|
108
|
-
#end
|
75
|
+
raise "Unknown CIDR format: #{cidr}" unless is_cidr?(cidr)
|
76
|
+
# Obtain the 'ref' and 'netname' value automatically in case not passed as method parameters
|
77
|
+
if ref.nil? or netname.nil?
|
78
|
+
whois = Wmap::Whois.new
|
79
|
+
# Note 11/1/2014: Use IP instead of the CIDR to perform the query, as the current ruby-whois query does not support CIDR as query input
|
80
|
+
ip=cidr.split("/")[0]
|
81
|
+
ref=whois.get_net_desc(ip)
|
82
|
+
netname=whois.get_netname(ip)
|
83
|
+
whois=nil
|
84
|
+
end
|
85
|
+
if @known_cidr_blks.key?(cidr)
|
86
|
+
puts "Skip! Entry is already exist: #{cidr}"
|
87
|
+
return nil
|
88
|
+
else
|
89
|
+
@known_cidr_blks[cidr] = Hash.new
|
90
|
+
@known_cidr_blks[cidr]['ref']=ref
|
91
|
+
@known_cidr_blks[cidr]['netname']=netname
|
92
|
+
puts "Entry loaded!"
|
93
|
+
end
|
94
|
+
# Re-sort the blocks in order for better performance
|
95
|
+
#@known_cidr_blks_desc_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>true)
|
96
|
+
#@known_cidr_blks_asce_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>false)
|
97
|
+
@known_cidr_blks_asce_index=@known_cidr_blks.keys.sort
|
98
|
+
@known_cidr_blks_desc_index=@known_cidr_blks_asce_index.reverse
|
99
|
+
#rescue => ee
|
100
|
+
# puts "Exception on method #{__method__}: #{ee}" # if @verbose
|
109
101
|
end
|
110
102
|
|
111
103
|
# 'setter' to remove an entry to CIDR store @known_cidr_blks
|
112
104
|
def delete (cidr,ref=nil,netname=nil)
|
113
105
|
puts "Remove the entry from the CIDR store: #{cidr}"
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
raise "Unknown CIDR entry: #{cidr}"
|
123
|
-
end
|
124
|
-
# Re-sort the blocks in order for better performance
|
125
|
-
#@known_cidr_blks_desc_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>true)
|
126
|
-
#@known_cidr_blks_asce_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>false)
|
127
|
-
@known_cidr_blks_asce_index=@known_cidr_blks.keys.sort
|
128
|
-
@known_cidr_blks_desc_index=@known_cidr_blks_asce_index.reverse
|
129
|
-
rescue => ee
|
130
|
-
puts "Exception on method #{__method__}: #{ee}" # if @verbose
|
106
|
+
#cidr.strip!
|
107
|
+
raise "Unknown CIDR format: #{cidr}" unless is_cidr?(cidr)
|
108
|
+
if @known_cidr_blks.key?(cidr)
|
109
|
+
puts "Deleting ..."
|
110
|
+
@known_cidr_blks.delete(cidr)
|
111
|
+
puts "Entry cleared!"
|
112
|
+
else
|
113
|
+
raise "Unknown CIDR entry: #{cidr}"
|
131
114
|
end
|
115
|
+
# Re-sort the blocks in order for better performance
|
116
|
+
#@known_cidr_blks_desc_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>true)
|
117
|
+
#@known_cidr_blks_asce_index=NetAddr.sort(@known_cidr_blks.keys, :Desc=>false)
|
118
|
+
@known_cidr_blks_asce_index=@known_cidr_blks.keys.sort
|
119
|
+
@known_cidr_blks_desc_index=@known_cidr_blks_asce_index.reverse
|
120
|
+
rescue => ee
|
121
|
+
puts "Exception on method #{__method__}: #{ee}" # if @verbose
|
132
122
|
end
|
133
123
|
alias_method :del, :delete
|
134
124
|
|
135
125
|
# Count numbers of CIDR object entries in the CIDR cache table
|
136
126
|
def count
|
137
127
|
puts "Counting number of entries in the CIDR cache table ..." if @verbose
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
cnt=cnt+1
|
143
|
-
end
|
128
|
+
cnt=0
|
129
|
+
@known_cidr_blks.keys.map do |key|
|
130
|
+
if is_cidr?(key)
|
131
|
+
cnt=cnt+1
|
144
132
|
end
|
145
|
-
puts "Current number of CIDR object entries: #{cnt}" if @verbose
|
146
|
-
return cnt
|
147
|
-
rescue => ee
|
148
|
-
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
149
133
|
end
|
134
|
+
puts "Current number of CIDR object entries: #{cnt}" if @verbose
|
135
|
+
return cnt
|
136
|
+
rescue => ee
|
137
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
150
138
|
end
|
151
139
|
|
152
140
|
# Count numbers of IPs within the trusted CIDR objects
|
153
141
|
def counts
|
154
142
|
puts "Counting number of IPs within the CIDR store:" if @verbose
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
cnt=cnt+size(key)
|
159
|
-
end
|
160
|
-
puts "Total number of trusted IPs: #{cnt}" if @verbose
|
161
|
-
return cnt
|
162
|
-
rescue => ee
|
163
|
-
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
143
|
+
cnt=0
|
144
|
+
@known_cidr_blks.keys.map do |key|
|
145
|
+
cnt=cnt+size(key)
|
164
146
|
end
|
147
|
+
puts "Total number of trusted IPs: #{cnt}" if @verbose
|
148
|
+
return cnt
|
149
|
+
rescue => ee
|
150
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
165
151
|
end
|
166
152
|
|
167
153
|
# Check if the specific IP within the range of a list of known CIDR blocks
|
168
154
|
def ip_trusted? (ip)
|
169
155
|
puts "Check if the IP within the range of the known CIDR blocks: #{ip}" if @verbose
|
170
156
|
known = false
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
break if known
|
181
|
-
end
|
182
|
-
rescue => ee
|
183
|
-
if @verbose
|
184
|
-
puts "Exception on method #{__method__}: #{ee}"
|
185
|
-
end
|
186
|
-
return false
|
157
|
+
return false if @known_cidr_blks==nil
|
158
|
+
first_octet_ip = ip.split('.').first.to_i
|
159
|
+
@known_cidr_blks_desc_index.each do |line|
|
160
|
+
first_octet_blk = line.split('.').first.to_i
|
161
|
+
next if first_octet_blk > first_octet_ip
|
162
|
+
puts "line: #{line}" if @verbose
|
163
|
+
cidr4 = NetAddr::CIDR.create(line)
|
164
|
+
known = cidr4.contains?(ip+'/32')
|
165
|
+
break if known
|
187
166
|
end
|
188
|
-
|
167
|
+
rescue => ee
|
168
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
169
|
+
return false
|
189
170
|
end
|
190
171
|
alias_method :is_trusted?, :ip_trusted?
|
191
172
|
|
192
173
|
# Return the matching CIDR block for a ip
|
193
174
|
def cidr_lookup (ip)
|
194
175
|
puts "Lookup the CIDR name from the known CIDR list for the IP: #{ip}" if @verbose
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
return line if known
|
205
|
-
end
|
206
|
-
rescue => ee
|
207
|
-
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
208
|
-
return nil
|
176
|
+
return nil if @known_cidr_blks==nil
|
177
|
+
puts "CIDR Lookup: #{ip} ..." if @verbose
|
178
|
+
@known_cidr_blks_desc_index.each do |line|
|
179
|
+
first_octet_ip = ip.split('.').first.to_i
|
180
|
+
first_octet_blk = line.split('.').first.to_i
|
181
|
+
next if first_octet_blk > first_octet_ip
|
182
|
+
cidr4 = NetAddr::CIDR.create(line)
|
183
|
+
known = cidr4.contains?(ip+'/32')
|
184
|
+
return line if known
|
209
185
|
end
|
186
|
+
rescue => ee
|
187
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
210
188
|
return nil
|
211
189
|
end
|
212
190
|
alias_method :lookup, :cidr_lookup
|
@@ -218,15 +196,12 @@ class Wmap::CidrTracker
|
|
218
196
|
known=false
|
219
197
|
cidr=cidr.strip unless cidr.nil?
|
220
198
|
cidr=cidr+"/32" if is_ip?(cidr)
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
return false
|
228
|
-
end
|
229
|
-
return known
|
199
|
+
raise "Invalid CIDR format: #{cidr}" unless is_cidr?(cidr)
|
200
|
+
return false if @known_cidr_blks==nil
|
201
|
+
return true if @known_cidr_blks.key?(cidr)
|
202
|
+
rescue => ee
|
203
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
204
|
+
return false
|
230
205
|
end
|
231
206
|
alias_method :is_known?, :cidr_known?
|
232
207
|
|
@@ -236,33 +211,28 @@ class Wmap::CidrTracker
|
|
236
211
|
trusted=false
|
237
212
|
cidr=cidr.strip unless cidr.nil?
|
238
213
|
cidr=cidr+"/32" if is_ip?(cidr)
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
return true if cidr4.contains?(cidr)
|
246
|
-
end
|
247
|
-
rescue => ee
|
248
|
-
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
249
|
-
return false
|
214
|
+
raise "Invalid CIDR format: #{cidr}" unless is_cidr?(cidr)
|
215
|
+
return false if @known_cidr_blks==nil
|
216
|
+
return true if @known_cidr_blks.key?(cidr)
|
217
|
+
@known_cidr_blks_asce_index.each do |line|
|
218
|
+
cidr4 = NetAddr::CIDR.create(line)
|
219
|
+
return true if cidr4.contains?(cidr)
|
250
220
|
end
|
251
|
-
|
221
|
+
rescue => ee
|
222
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
223
|
+
return false
|
252
224
|
end
|
253
225
|
alias_method :is_trusted?, :cidr_trusted?
|
254
226
|
|
255
227
|
# NetAddr wrapper to determine number of IPs within the CIDR object.
|
256
228
|
def size (cidr)
|
257
229
|
puts "Determine the size of CIDR object: #{cidr}" if @verbose
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
return nil
|
265
|
-
end
|
230
|
+
raise "Invalid CIDR format: #{cidr}" unless is_cidr?(cidr)
|
231
|
+
obj = NetAddr::CIDR.create(cidr)
|
232
|
+
return obj.size.to_i
|
233
|
+
rescue => ee
|
234
|
+
puts "Exception on method #{__method__}: #{ee}" if @verbose
|
235
|
+
return nil
|
266
236
|
end
|
267
237
|
|
268
238
|
# Retrieve the CIDR reference text for tracking purpose, if it's a known CIDR entry
|
@@ -282,23 +252,21 @@ class Wmap::CidrTracker
|
|
282
252
|
end
|
283
253
|
|
284
254
|
# Save the current cidr hash table into a file
|
285
|
-
def save_cidrs_to_file!(file_cidrs=@
|
255
|
+
def save_cidrs_to_file!(file_cidrs=@cidr_seeds)
|
286
256
|
puts "Saving the current cidrs cache table from memory to file: #{file_cidrs} ..." if @verbose
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
# puts "Exception on method #{__method__}: #{ee}" if @verbose
|
301
|
-
#end
|
257
|
+
timestamp=Time.now
|
258
|
+
f=File.open(file_cidrs, 'w')
|
259
|
+
f.write "# Local cidrs file created by Wmap::CidrTracker.save method at: #{timestamp}\n"
|
260
|
+
f.write "Network CIDR, CIDR RIPE Reference Text, CIDR NETNAME\n"
|
261
|
+
@known_cidr_blks_asce_index.map do |key|
|
262
|
+
ref=get_cidr_ref(key)
|
263
|
+
netname=get_cidr_netname(key)
|
264
|
+
f.write "#{key},#{ref},#{netname}\n"
|
265
|
+
end
|
266
|
+
f.close
|
267
|
+
puts "CIDR cache table is successfully saved: #{file_cidrs}"
|
268
|
+
#rescue => ee
|
269
|
+
# puts "Exception on method #{__method__}: #{ee}" if @verbose
|
302
270
|
end
|
303
271
|
alias_method :save!, :save_cidrs_to_file!
|
304
272
|
|
@@ -330,6 +298,5 @@ class Wmap::CidrTracker
|
|
330
298
|
end
|
331
299
|
alias_method :print, :print_known_cidr_blks_asce
|
332
300
|
|
333
|
-
private :load_cidr_blks_from_file
|
334
301
|
|
335
302
|
end
|
data/version.txt
CHANGED