ipadmin 0.4.0 → 0.4.1
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.
- data/README +166 -446
- data/lib/cidr.rb +132 -241
- data/lib/eui.rb +6 -40
- data/lib/methods.rb +28 -99
- data/lib/tree.rb +23 -144
- data/tests/cidr_test.rb +28 -17
- data/tests/tree_test.rb +2 -1
- metadata +4 -4
data/README
CHANGED
@@ -50,190 +50,6 @@
|
|
50
50
|
You can see how the CIDR object is based around the entire IP space
|
51
51
|
defined by the provided IP/Netmask pair, and not necessarily the individual
|
52
52
|
IP address itself.
|
53
|
-
|
54
|
-
|
55
|
-
====Examples:
|
56
|
-
|
57
|
-
#!/usr/bin/ruby
|
58
|
-
|
59
|
-
require 'rubygems'
|
60
|
-
require_gem 'ipadmin'
|
61
|
-
|
62
|
-
puts "IPAdmin::CIDR"
|
63
|
-
print "\n"
|
64
|
-
|
65
|
-
# new
|
66
|
-
cidr4 = IPAdmin::CIDR.new('192.168.1.0/24')
|
67
|
-
cidr4 = IPAdmin::CIDR.new(:CIDR => '192.168.1.1',
|
68
|
-
:Netmask => '255.255.255.0',
|
69
|
-
:Tag => {'test' => 'cidr4 tag'})
|
70
|
-
cidr6 = IPAdmin::CIDR.new('fec0::1/64')
|
71
|
-
|
72
|
-
cidr4_2 = IPAdmin::CIDR.new('192.168.1.0/26')
|
73
|
-
cidr6_2 = IPAdmin::CIDR.new('fec0::0/96')
|
74
|
-
|
75
|
-
# reader/writer
|
76
|
-
puts "reader/writer"
|
77
|
-
puts "cidr4 tag '#{cidr4.tag['test']}'"
|
78
|
-
cidr4.tag['test'] = 'modified cidr4 tag'
|
79
|
-
puts "updated cidr4 tag '#{cidr4.tag['test']}'"
|
80
|
-
puts "cidr4 version #{cidr4.version}"
|
81
|
-
puts "cidr6 version #{cidr6.version}"
|
82
|
-
print "\n"
|
83
|
-
|
84
|
-
# arpa
|
85
|
-
puts "arpa"
|
86
|
-
puts "arpa for #{cidr4.desc()} is #{cidr4.arpa}"
|
87
|
-
puts "arpa for #{cidr6.desc(:Short => true)} is #{cidr6.arpa}"
|
88
|
-
print "\n"
|
89
|
-
|
90
|
-
# bits
|
91
|
-
puts "bits"
|
92
|
-
puts "cidr4 netmask in bits #{cidr4.bits()}"
|
93
|
-
puts "cidr6 netmask in bits #{cidr6.bits()}"
|
94
|
-
print "\n"
|
95
|
-
|
96
|
-
# contains?
|
97
|
-
puts "contains"
|
98
|
-
puts "#{cidr4.desc} contains #{cidr4_2.desc}" if ( cidr4.contains?(cidr4_2) )
|
99
|
-
puts "#{cidr6.desc} contains #{cidr6_2.desc(:Short => true)}" if ( cidr6.contains?(cidr6_2) )
|
100
|
-
print "\n"
|
101
|
-
|
102
|
-
# desc
|
103
|
-
puts "desc"
|
104
|
-
puts "cidr4 description #{cidr4.desc()}"
|
105
|
-
puts "cidr6 description #{cidr6.desc()}"
|
106
|
-
puts "cidr6 short-hand description #{cidr6.desc(:Short => true)}"
|
107
|
-
print "\n"
|
108
|
-
|
109
|
-
# enumerate
|
110
|
-
puts "enumerate"
|
111
|
-
puts "first 4 cidr4 addresses (bitstep 32)"
|
112
|
-
cidr4.enumerate(:Limit => 4, :Bitstep => 32).each {|x| puts " #{x}"}
|
113
|
-
|
114
|
-
puts "first 4 cidr6 addresses (bitstep 32)"
|
115
|
-
cidr6.enumerate(:Limit => 4, :Bitstep => 32, :Objectify => true).each {|x| puts " #{x.desc}"}
|
116
|
-
print "\n"
|
117
|
-
|
118
|
-
# fill_in
|
119
|
-
puts "fill_in"
|
120
|
-
puts "#{cidr4.desc} filled-in is:"
|
121
|
-
cidr4.fill_in([cidr4_2]).each {|x| puts x}
|
122
|
-
print "\n"
|
123
|
-
|
124
|
-
# hostmask_ext
|
125
|
-
puts "hostmask_ext"
|
126
|
-
puts "cidr4 extended hostmask #{cidr4.hostmask_ext()}"
|
127
|
-
print "\n"
|
128
|
-
|
129
|
-
# ip
|
130
|
-
puts "ip"
|
131
|
-
puts "cidr4 ip #{cidr4.ip()}"
|
132
|
-
puts "cidr6 short-hand ip #{cidr6.ip(:Short => true)}"
|
133
|
-
print "\n"
|
134
|
-
|
135
|
-
# last
|
136
|
-
puts "last"
|
137
|
-
puts "cidr4 last ip #{cidr4.last()}"
|
138
|
-
puts "cidr6 last ip #{cidr6.last(:Short => true)}"
|
139
|
-
print "\n"
|
140
|
-
|
141
|
-
# multicast_mac
|
142
|
-
mcast = IPAdmin::CIDR.new('224.0.0.6')
|
143
|
-
mcast2 = IPAdmin::CIDR.new('ff00::abcd')
|
144
|
-
puts "multicast_mac"
|
145
|
-
puts "#{mcast.ip} multicast mac is #{mcast.multicast_mac()}"
|
146
|
-
puts "#{mcast2.ip} multicast mac is #{mcast2.multicast_mac()}"
|
147
|
-
print "\n"
|
148
|
-
|
149
|
-
# netmask
|
150
|
-
puts "netmask"
|
151
|
-
puts "cidr4 netmask in CIDR format #{cidr4.netmask()}"
|
152
|
-
puts "cidr6 netmask in CIDR format #{cidr6.netmask()}"
|
153
|
-
print "\n"
|
154
|
-
|
155
|
-
# netmask_ext
|
156
|
-
puts "netmask_ext"
|
157
|
-
puts "cidr4 extended netmask #{cidr4.netmask_ext()}"
|
158
|
-
print "\n"
|
159
|
-
|
160
|
-
# network
|
161
|
-
puts "network"
|
162
|
-
puts "cidr4 network address #{cidr4.network()}"
|
163
|
-
puts "cidr6 network address #{cidr6.network(:Short => true)}"
|
164
|
-
print "\n"
|
165
|
-
|
166
|
-
# next_ip
|
167
|
-
puts "next_ip"
|
168
|
-
puts "cidr4 next ip #{cidr4.next_ip()}"
|
169
|
-
puts "cidr6 next ip #{cidr6.next_ip(:Short => true)}"
|
170
|
-
print "\n"
|
171
|
-
|
172
|
-
# next_subnet
|
173
|
-
puts "next_subnet"
|
174
|
-
puts "cidr4 next subnet #{cidr4.next_subnet()}"
|
175
|
-
puts "cidr6 next subnet #{cidr6.next_subnet(:Short => true)}"
|
176
|
-
print "\n"
|
177
|
-
|
178
|
-
# nth
|
179
|
-
puts "nth"
|
180
|
-
puts "cidr4 1st ip is #{cidr4.nth(1)}"
|
181
|
-
puts "cidr6 1st ip is #{(cidr6.nth(:Index => 1, :Objectify => true)).base}"
|
182
|
-
print "\n"
|
183
|
-
|
184
|
-
# packed_hostmask
|
185
|
-
puts "packed_hostmask"
|
186
|
-
puts "cidr4 packed_hostmask is #{cidr4.packed_hostmask.to_s(16)}"
|
187
|
-
puts "cidr6 packed_hostmask is #{cidr6.packed_hostmask.to_s(16)}"
|
188
|
-
print "\n"
|
189
|
-
|
190
|
-
# packed_netmask
|
191
|
-
puts "packed_netmask"
|
192
|
-
puts "cidr4 packed_netmask is #{cidr4.packed_netmask.to_s(16)}"
|
193
|
-
puts "cidr6 packed_netmask is #{cidr6.packed_netmask.to_s(16)}"
|
194
|
-
print "\n"
|
195
|
-
|
196
|
-
# packed_network
|
197
|
-
puts "packed_network"
|
198
|
-
puts "cidr4 packed_network is #{cidr4.packed_network.to_s(16)}"
|
199
|
-
puts "cidr6 packed_network is #{cidr6.packed_network.to_s(16)}"
|
200
|
-
print "\n"
|
201
|
-
|
202
|
-
# range
|
203
|
-
puts "range"
|
204
|
-
cidr4.range(:Indexes => [20,0], :Bitstep => 5).each {|x| puts x}
|
205
|
-
cidr6.range(:Indexes => [20,0], :Bitstep => 5).each {|x| puts x}
|
206
|
-
print "\n"
|
207
|
-
|
208
|
-
# remainder
|
209
|
-
puts "remainder"
|
210
|
-
cidr4_2 = IPAdmin::CIDR.new('192.168.1.64/26')
|
211
|
-
puts "The remainder of #{cidr4.desc} after subtracting #{cidr4_2.desc} is:"
|
212
|
-
cidr4.remainder(cidr4_2).each {|x| puts x}
|
213
|
-
print "\n"
|
214
|
-
|
215
|
-
# resize!
|
216
|
-
puts "resize!"
|
217
|
-
cidr4.resize!(25)
|
218
|
-
cidr6.resize!(:Netmask => 65)
|
219
|
-
puts "cidr4 resized is #{cidr4.desc}"
|
220
|
-
puts "cidr6 resized is #{cidr6.desc}"
|
221
|
-
print "\n"
|
222
|
-
|
223
|
-
# size
|
224
|
-
puts "size"
|
225
|
-
puts "cidr4 size is #{cidr4.size()}"
|
226
|
-
puts "cidr6 size is #{cidr6.size()}"
|
227
|
-
print "\n"
|
228
|
-
|
229
|
-
# subnet
|
230
|
-
puts "subnet"
|
231
|
-
puts "#{cidr4.desc} subnetted into at least 3 /28 ranges"
|
232
|
-
cidr4.subnet(:Subnet => 28, :MinCount => 3).each {|x| puts " #{x}"}
|
233
|
-
|
234
|
-
puts "#{cidr6.desc(:Short => true)} subnetted into at least 4 /67 ranges"
|
235
|
-
cidr6.subnet(:Subnet => 67, :MinCount => 4, :Short => true).each {|x| puts " #{x}"}
|
236
|
-
|
237
53
|
|
238
54
|
|
239
55
|
|
@@ -254,49 +70,6 @@
|
|
254
70
|
Link Local addresses use MAC addresses for IP auto-assignment and multicast MAC addresses
|
255
71
|
are determined based on the multicast IP address.
|
256
72
|
|
257
|
-
====Examples:
|
258
|
-
|
259
|
-
#!/usr/bin/ruby
|
260
|
-
|
261
|
-
require 'rubygems'
|
262
|
-
require_gem 'ipadmin'
|
263
|
-
|
264
|
-
puts "IPAdmin::EUI"
|
265
|
-
print "\n"
|
266
|
-
|
267
|
-
eui1 = IPAdmin::EUI48.new('aa-bb-cc-dd-ee-ff')
|
268
|
-
eui2 = IPAdmin::EUI64.new('12-34-56-78-9a-bc-de-f0')
|
269
|
-
|
270
|
-
# oui
|
271
|
-
puts "oui"
|
272
|
-
puts "OUI 1 is #{eui1.oui}"
|
273
|
-
puts "OUI 2 is #{eui2.oui}"
|
274
|
-
print "\n"
|
275
|
-
|
276
|
-
# ei
|
277
|
-
puts "ei"
|
278
|
-
puts "EI 1 is #{eui1.ei}"
|
279
|
-
puts "EI 2 is #{eui2.ei}"
|
280
|
-
print "\n"
|
281
|
-
|
282
|
-
# address
|
283
|
-
puts "address"
|
284
|
-
puts "address 1 is #{eui1.address(:Delimiter => '.')}"
|
285
|
-
puts "address 2 is #{eui2.address(:Delimiter => '.')}"
|
286
|
-
print "\n"
|
287
|
-
|
288
|
-
# link local
|
289
|
-
puts "link local"
|
290
|
-
puts "IPv6 link local 1 is #{eui1.link_local(:Short => true)}"
|
291
|
-
puts "IPv6 link local 2 is #{eui2.link_local(:Short => true)}"
|
292
|
-
print "\n"
|
293
|
-
|
294
|
-
# type
|
295
|
-
puts "class"
|
296
|
-
puts "eui 1 is a #{eui1.class}"
|
297
|
-
puts "eui 2 is a #{eui2.class}"
|
298
|
-
|
299
|
-
|
300
73
|
|
301
74
|
|
302
75
|
=Tree
|
@@ -321,241 +94,188 @@
|
|
321
94
|
192.168.1.192/26
|
322
95
|
|
323
96
|
|
324
|
-
|
97
|
+
|
98
|
+
=Example Script
|
325
99
|
|
326
100
|
#!/usr/bin/ruby
|
327
101
|
|
102
|
+
# A script to parse static routes from a Cisco router.
|
103
|
+
# Performs the following tasks:
|
104
|
+
# - organizes statics by directly connected next-hop interface
|
105
|
+
# - corrects recursive static routes
|
106
|
+
# - reports statics with no directly connected next-hop
|
107
|
+
# - reports duplicate static routes
|
108
|
+
# - reports static routes that overlap directly connected interfaces
|
109
|
+
#
|
110
|
+
# Change the variable 'infile' to that of the name of the router configuration
|
111
|
+
# file that should be parsed.
|
112
|
+
|
328
113
|
require 'rubygems'
|
329
114
|
require_gem 'ipadmin'
|
330
|
-
|
331
|
-
puts "IPAdmin::Tree"
|
332
|
-
print "\n"
|
333
|
-
|
334
|
-
cidr4 = ['192.168.1.0/24','192.168.1.0/26','192.168.1.64/26',
|
335
|
-
'192.168.1.128/26','192.168.1.192/26','192.168.1.0/27',
|
336
|
-
'192.168.1.0/28','192.168.1.16/30','192.168.1.16/29',
|
337
|
-
'192.168.1.32/27','192.168.1.24/30','192.168.1.28/30',
|
338
|
-
'192.168.1.64/27','192.168.1.25']
|
339
|
-
|
340
|
-
cidr6 = ['fec0::/60','fec0::/66','fec0::4000:0:0:0/66',
|
341
|
-
'fec0::8000:0:0:0/66','fec0::c000:0:0:0/66','fec0::c000:0:0:0/67',
|
342
|
-
'fec0::/67','fec0::2000:0:0:0/67','fec0::8000:0:0:0/67','fec0::4000:0:0:0/69']
|
343
115
|
|
344
|
-
#
|
345
|
-
|
116
|
+
# change this variable to that of the router config file
|
117
|
+
infile = 'router_config.txt'
|
118
|
+
|
119
|
+
|
120
|
+
ip_interface_count = 0
|
121
|
+
static_route_count = 0
|
122
|
+
connected_routes = []
|
123
|
+
static_routes = []
|
124
|
+
statics = {}
|
125
|
+
grouped_routes = {}
|
126
|
+
duplicates = []
|
127
|
+
recursives = []
|
128
|
+
corrected_statics = []
|
129
|
+
overlapping_statics = []
|
130
|
+
|
131
|
+
|
132
|
+
# sort through router config. put connected ip interfaces into 'connected_routes'
|
133
|
+
# and static routes into 'statics'. Set aside duplicate static routes.
|
134
|
+
File.open(infile, 'r') do |file|
|
135
|
+
while line = file.gets
|
136
|
+
if (line =~/^interface .+/)
|
137
|
+
interface = line.chomp
|
138
|
+
elsif (line =~ /^\s*ip address/) # connected interface
|
139
|
+
ip_interface_count += 1
|
140
|
+
addr = line.split('ip address ').join # ['x.x.x.x y.y.y.y']
|
141
|
+
cidr = IPAdmin::CIDR.new(:CIDR => addr, :Tag => {:interface => interface})
|
142
|
+
connected_routes.push(cidr)
|
143
|
+
elsif (line =~/^ip route/) # static route
|
144
|
+
static_route_count += 1
|
145
|
+
elements = line.split(' ') # ['ip','route','x.x.x.x','y.y.y.y','x.x.x.x',]
|
146
|
+
ip = elements[2]
|
147
|
+
netmask = elements[3]
|
148
|
+
nexthop = elements[4]
|
149
|
+
|
150
|
+
# keep all but loopbacks, nulls, or defaults
|
151
|
+
if ( (nexthop !~ /Loopback/) && (nexthop !~ /Null/) && (ip != '0.0.0.0') )
|
152
|
+
nexthop_cidr = IPAdmin::CIDR.new(nexthop)
|
153
|
+
cidr = IPAdmin::CIDR.new(:CIDR => "#{ip} #{netmask}",
|
154
|
+
:Tag => {:route => line, :nexthop => nexthop_cidr})
|
155
|
+
|
156
|
+
if (!statics.has_key?(cidr.desc))
|
157
|
+
statics[cidr.desc] = cidr
|
158
|
+
else
|
159
|
+
msg = '! overlaps with - ' + statics[cidr.desc].tag[:route] + line + "!\n"
|
160
|
+
duplicates.push(msg)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
346
166
|
|
347
167
|
|
348
|
-
#
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
168
|
+
# look for statics that overlap with a connected interface, and
|
169
|
+
# group static routes with their next-hop interface.
|
170
|
+
statics.each_key do |desc|
|
171
|
+
cidr = statics[desc]
|
172
|
+
nexthop = cidr.tag[:nexthop]
|
173
|
+
route = cidr.tag[:route]
|
174
|
+
|
175
|
+
overlaps_with = nil
|
176
|
+
nexthop_int = nil
|
177
|
+
connected_routes.each do |interface|
|
178
|
+
if (interface.contains?(cidr)) # overlapping static
|
179
|
+
overlaps_with = interface
|
180
|
+
break
|
181
|
+
elsif (interface.contains?(nexthop)) # next-hop directly connected
|
182
|
+
nexthop_int = interface
|
183
|
+
break
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
if (nexthop_int)
|
188
|
+
key = "#{nexthop_int.tag[:interface]} -> #{nexthop_int.desc}"
|
189
|
+
if (grouped_routes.has_key?(key))
|
190
|
+
grouped_routes[key].push(route)
|
191
|
+
else
|
192
|
+
grouped_routes[key] = [route]
|
193
|
+
end
|
194
|
+
static_routes.push(cidr)
|
195
|
+
elsif (overlaps_with)
|
196
|
+
overlap = "! overlaps with: #{overlaps_with.tag[:interface]} -> #{overlaps_with.desc}"
|
197
|
+
overlap << "\n#{route}!\n"
|
198
|
+
overlapping_statics.push(overlap)
|
199
|
+
else
|
200
|
+
recursives.push(cidr)
|
201
|
+
end
|
353
202
|
end
|
354
|
-
|
355
|
-
|
356
|
-
|
203
|
+
|
204
|
+
|
205
|
+
# process recursive routes. update next-hop so that it points
|
206
|
+
# to next hop of a directly connected ip. remove any that do not point to a
|
207
|
+
# directly connected ip. We must continually cycle through the list, as the
|
208
|
+
# 'static_routes' tree is constantly updated. We do this until our list of
|
209
|
+
# recursive static routes stops getting any shorter
|
210
|
+
recursives_count = 0
|
211
|
+
until (recursives_count == recursives.length)
|
212
|
+
recursives_count = recursives.length
|
213
|
+
recursives.each do |cidr|
|
214
|
+
nexthop = cidr.tag[:nexthop]
|
215
|
+
route = cidr.tag[:route]
|
216
|
+
|
217
|
+
found = nil
|
218
|
+
static_routes.each do |static|
|
219
|
+
if (static.contains?(nexthop))
|
220
|
+
found = static
|
221
|
+
break
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
if (found)
|
226
|
+
updated = 'no ' + route
|
227
|
+
updated << "ip route #{cidr.network} #{cidr.netmask_ext} #{found.tag[:nexthop].ip}\n"
|
228
|
+
updated << "!\n"
|
229
|
+
corrected_statics.push(updated)
|
230
|
+
static_routes.push(cidr)
|
231
|
+
recursives.delete(cidr)
|
232
|
+
end
|
233
|
+
end
|
357
234
|
end
|
358
|
-
|
359
|
-
|
360
|
-
#
|
361
|
-
puts "
|
362
|
-
puts "
|
363
|
-
|
364
|
-
print "\n"
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
tree.children('192.168.1.0/24').each {|x| puts x.desc}
|
370
|
-
print "\n"
|
371
|
-
|
372
|
-
# delete!
|
373
|
-
puts "delete!"
|
374
|
-
puts "deleting 192.168.1.16/29"
|
375
|
-
tree.delete!('192.168.1.16/29')
|
376
|
-
print "\n"
|
377
|
-
|
378
|
-
# descendants
|
379
|
-
puts "descendants"
|
380
|
-
puts "descendants of 192.168.1.0/26 are..."
|
381
|
-
tree.descendants('192.168.1.0/26').each {|x| puts x.desc}
|
382
|
-
print "\n"
|
383
|
-
|
384
|
-
# dump
|
385
|
-
puts "dump"
|
386
|
-
puts "dumping & printing tree"
|
387
|
-
dumped = tree.dump()
|
388
|
-
dumped.each do |val|
|
389
|
-
cidr = val[:CIDR]
|
390
|
-
depth = val[:Depth]
|
391
|
-
if (depth > 0)
|
392
|
-
indent = " " * (depth*3)
|
393
|
-
puts indent << cidr.desc()
|
394
|
-
else
|
395
|
-
puts cidr.desc()
|
396
|
-
end
|
235
|
+
|
236
|
+
|
237
|
+
# print results.
|
238
|
+
puts "--- STATISTICS ---"
|
239
|
+
puts "#{ip_interface_count} Connected IP Interfaces\n#{static_route_count} IP Static Routes\n"
|
240
|
+
|
241
|
+
print "\n\n"
|
242
|
+
|
243
|
+
puts "--- OVERLAPPING STATIC ROUTES ---"
|
244
|
+
overlapping_statics.each do |overlap|
|
245
|
+
puts overlap
|
397
246
|
end
|
398
|
-
print "\n"
|
399
247
|
|
400
|
-
|
401
|
-
puts "exists?"
|
402
|
-
puts "192.168.1.32/27 is in the tree." if tree.exists?('192.168.1.32/27')
|
403
|
-
print "\n"
|
404
|
-
|
405
|
-
# fill_in
|
406
|
-
puts "fill_in!"
|
407
|
-
puts "filling in subnets of 192.168.1.64/26."
|
408
|
-
tree.fill_in!('192.168.1.64/26')
|
409
|
-
tree.children('192.168.1.64/26').each {|x| puts x.desc}
|
410
|
-
print "\n"
|
411
|
-
|
412
|
-
# find
|
413
|
-
puts "find"
|
414
|
-
puts "finding and setting a tag for 192.168.1.64/26..."
|
415
|
-
tree.find('192.168.1.64/26').tag[:test] = 'testing'
|
416
|
-
print "\n"
|
417
|
-
|
418
|
-
# find_space
|
419
|
-
puts "find_space"
|
420
|
-
puts "finding version 4 subnets with at least 16 ips..."
|
421
|
-
tree.find_space(:IPCount => 16, :Version => 4).each {|x| puts x.desc}
|
422
|
-
print "\n"
|
423
|
-
|
424
|
-
# longest_match
|
425
|
-
puts "longest_match"
|
426
|
-
puts "192.168.1.33 belongs in #{tree.longest_match('192.168.1.33').desc}"
|
427
|
-
print "\n"
|
428
|
-
|
429
|
-
# merge_subnets
|
430
|
-
puts "merge_subnets!"
|
431
|
-
puts "merging the subnets of 192.168.1.0/27"
|
432
|
-
tree.merge_subnets!('192.168.1.0/27')
|
433
|
-
puts tree.show
|
434
|
-
print "\n"
|
435
|
-
|
436
|
-
# prune
|
437
|
-
puts "prune!"
|
438
|
-
puts "pruning subnets of 192.168.1.0/27"
|
439
|
-
tree.prune!('192.168.1.0/27')
|
440
|
-
print "\n"
|
441
|
-
|
442
|
-
# remove
|
443
|
-
puts "remove!"
|
444
|
-
puts "removing fec0::c000:0:0:0/67, and all of its subnets"
|
445
|
-
tree.remove!('fec0::c000:0:0:0/67')
|
446
|
-
print "\n"
|
447
|
-
|
448
|
-
# resize
|
449
|
-
puts "resize!"
|
450
|
-
puts "resizing fec0::/60 into a /65"
|
451
|
-
tree.resize!('fec0::/60', 65)
|
452
|
-
print "\n"
|
453
|
-
|
454
|
-
# root
|
455
|
-
puts "root"
|
456
|
-
puts "root of 192.168.1.32/27 is #{tree.root('192.168.1.32/27').desc}"
|
457
|
-
print "\n"
|
458
|
-
|
459
|
-
# siblings
|
460
|
-
puts "siblings"
|
461
|
-
puts "siblings of 192.168.1.0/26 are..."
|
462
|
-
tree.siblings('192.168.1.0/26').each {|x| puts x.desc}
|
463
|
-
print "\n"
|
464
|
-
|
465
|
-
# supernets
|
466
|
-
puts "supernets"
|
467
|
-
puts "supernets of this tree are..."
|
468
|
-
tree.supernets.each {|x| puts x.desc}
|
469
|
-
print "\n"
|
470
|
-
|
471
|
-
# show
|
472
|
-
puts "show"
|
473
|
-
puts "showing tree..."
|
474
|
-
puts tree.show
|
475
|
-
|
248
|
+
print "\n\n"
|
476
249
|
|
250
|
+
puts "--- DUPLICATE STATIC ROUTES ---"
|
251
|
+
duplicates.each do |route|
|
252
|
+
puts route
|
253
|
+
end
|
477
254
|
|
478
|
-
|
255
|
+
print "\n\n"
|
479
256
|
|
480
|
-
|
481
|
-
|
482
|
-
|
257
|
+
puts "--- STATIC ROUTES WITH UPDATED NEXT-HOP ---"
|
258
|
+
corrected_statics.each do |route|
|
259
|
+
puts route
|
260
|
+
end
|
483
261
|
|
484
|
-
|
262
|
+
print "\n\n"
|
485
263
|
|
486
|
-
|
264
|
+
puts "--- STATIC ROUTES WITH UNKNOWN NEXT-HOP ---"
|
265
|
+
recursives.each do |cidr|
|
266
|
+
puts cidr.tag[:route]
|
267
|
+
end
|
487
268
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
puts "::ffff:10.1.0.1 is valid" if ( IPAdmin.validate_ip_addr('::ffff:10.1.0.1') )
|
499
|
-
print "\n"
|
500
|
-
|
501
|
-
# validate netmask
|
502
|
-
puts "validate netmask"
|
503
|
-
puts "255.255.255.0 is valid" if (IPAdmin.validate_ip_netmask('255.255.255.0') )
|
504
|
-
puts "/24 is valid" if ( IPAdmin.validate_ip_netmask('/24') )
|
505
|
-
puts "/64 is valid" if ( IPAdmin.validate_ip_netmask(:Netmask => 64, :Version => 6) )
|
506
|
-
|
507
|
-
cidr4_1 = IPAdmin::CIDR.new('192.168.1.0/24')
|
508
|
-
cidr4_2 = IPAdmin::CIDR.new('192.168.1.0/25')
|
509
|
-
cidr4_3 = IPAdmin::CIDR.new('192.168.1.50')
|
510
|
-
cidr6_1 = IPAdmin::CIDR.new('fec0::0/10')
|
511
|
-
cidr6_2 = IPAdmin::CIDR.new('fec0::0/64')
|
512
|
-
print "\n"
|
513
|
-
|
514
|
-
# compare
|
515
|
-
puts "compare"
|
516
|
-
comp1 = IPAdmin.compare(cidr4_1,cidr4_2)
|
517
|
-
comp2 = IPAdmin.compare(cidr6_1,cidr6_2)
|
518
|
-
puts "#{(comp1[0]).desc} is the supernet of #{(comp1[1]).desc}"
|
519
|
-
puts "#{(comp2[0]).desc} is the supernet of #{(comp2[1]).desc}"
|
520
|
-
|
521
|
-
cidr4_1 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/24')
|
522
|
-
cidr4_2 = IPAdmin::CIDR.new(:CIDR => '192.168.0.0/24')
|
523
|
-
cidr6_1 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/128')
|
524
|
-
cidr6_2 = IPAdmin::CIDR.new(:CIDR => 'fec0::1/128')
|
525
|
-
print "\n"
|
526
|
-
|
527
|
-
# merge
|
528
|
-
puts "merge"
|
529
|
-
puts "merging 192.168.1.0/27, 192.168.1.32/27, 192.168.1.64/26, and 192.168.1.128/25..."
|
530
|
-
IPAdmin.merge(['192.168.1.0/27','192.168.1.32/27','192.168.1.64/26','192.168.1.128/25']).each {|x| puts x}
|
531
|
-
print "\n"
|
532
|
-
|
533
|
-
# minimum_size
|
534
|
-
puts "minimum_size"
|
535
|
-
puts "The subnet size (in bits) for IPv4 that would fit 22 addresses is /#{IPAdmin.minimum_size(22)}"
|
536
|
-
print "\n"
|
537
|
-
|
538
|
-
# range
|
539
|
-
puts "range"
|
540
|
-
list = IPAdmin.range(:Boundaries => [cidr4_1,cidr4_3], :Bitstep => 20 )
|
541
|
-
puts "ip's between #{cidr4_1.base} and #{cidr4_3.base} (bitstep of 20)"
|
542
|
-
list.each do |x|
|
543
|
-
puts " #{x}"
|
269
|
+
print "\n\n"
|
270
|
+
|
271
|
+
puts "--- STATIC ROUTES GROUPED BY NEXT-HOP INTERFACE ---"
|
272
|
+
grouped_routes.each_key do |interface|
|
273
|
+
routes = grouped_routes[interface]
|
274
|
+
puts interface
|
275
|
+
routes.each do |route|
|
276
|
+
puts route
|
277
|
+
end
|
278
|
+
print "\n"
|
544
279
|
end
|
545
|
-
|
546
|
-
|
547
|
-
# sort
|
548
|
-
puts "sort"
|
549
|
-
puts " 192.168.1.0/24, 192.168.1.0/30, 192.168.2.0/32, 10.10.10.10 sorted are..."
|
550
|
-
IPAdmin.sort(['192.168.1.0/24','192.168.1.0/30','192.168.2.0/32','10.10.10.10']).each {|x| puts x}
|
551
|
-
print "\n"
|
552
|
-
|
553
|
-
# shorten
|
554
|
-
puts "shorten"
|
555
|
-
puts "shorthand notation for #{cidr6_1.network()} is #{IPAdmin.shorten(cidr6_1.network)}"
|
556
|
-
print "\n"
|
557
|
-
|
558
|
-
# unshorten
|
559
|
-
puts "unshorten"
|
560
|
-
puts "expanded notation for fec0:: is #{IPAdmin.unshorten('fec0::')}"
|
561
|
-
|
280
|
+
|
281
|
+
__END__
|