wmap 2.5.8 → 2.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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