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.
Files changed (8) hide show
  1. data/README +166 -446
  2. data/lib/cidr.rb +132 -241
  3. data/lib/eui.rb +6 -40
  4. data/lib/methods.rb +28 -99
  5. data/lib/tree.rb +23 -144
  6. data/tests/cidr_test.rb +28 -17
  7. data/tests/tree_test.rb +2 -1
  8. metadata +4 -4
@@ -27,8 +27,8 @@ class CIDR
27
27
  # Hash of custom tags. Should be in the format tag => value.
28
28
  #
29
29
  # Example:
30
- # cidr4.tag['test'] = 'modified cidr4 tag'
31
- # puts cidr4.tag['test'] --> modified cidr4 tag
30
+ # cidr4.tag[:name] = 'IPv4 CIDR'
31
+ # puts cidr4.tag[:name]
32
32
  #
33
33
  def tag=(new_tag)
34
34
  if (!new_tag.kind_of? Hash)
@@ -37,35 +37,30 @@ class CIDR
37
37
  @tag = new_tag
38
38
  end
39
39
 
40
- #======================================#
41
- #
42
- #======================================#
43
-
44
-
45
40
  #==============================================================================#
46
41
  # initialize()
47
42
  #==============================================================================#
48
43
 
49
44
  # - Arguments:
50
- # * CIDR address as a string, or a Hash with the following fields:
51
- # - :CIDR -- IP address in CIDR notation - String (optional)
52
- # - :Netmask -- IP Netmask - String or Integer (optional)
45
+ # * CIDR address as a String, or a Hash with the following fields:
46
+ # - :CIDR -- CIDR address, single IP, or IP and Netmask in extended format - String (optional)
53
47
  # - :PackedIP -- Integer representation of an IP address (optional)
54
48
  # - :PackedNetmask -- Integer representation of an IP Netmask (optional)
55
49
  # - :Version -- IP version - Integer (optional)
56
50
  # - :Tag -- Custom descriptor tag - Hash, tag => value. (optional)
57
51
  #
58
52
  # - Notes:
59
- # * At a minimum, either :CIDR or PackedIP must be provided.
60
- # * Netmask defaults to /32 or /128 if not provided.
61
- # * :PackedIP takes precedence over :CIDR
62
- # * :PackedNetmask always takes precedence over any other provided netmasks.
63
- # * Netmask within :CIDR takes precedence over :Netmask.
53
+ # * At a minimum, either :CIDR or :PackedIP must be provided.
54
+ # * CIDR formatted netmasks take precedence over extended formatted ones.
55
+ # * CIDR address defaults to a host network (/32 or /128) if netmask not provided.
56
+ # * :PackedIP takes precedence over IP given within :CIDR.
57
+ # * :PackedNetmask takes precedence over netmask given within :CIDR.
64
58
  # * Version will be auto-detected if not specified
65
59
  #
66
60
  # Examples:
67
61
  # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
68
62
  # cidr4 = IPAdmin::CIDR.new(:CIDR => '192.168.1.1/24')
63
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1 255.255.255.0')
69
64
  # cidr4_2 = IPAdmin::CIDR.new(:PackedIP => 0x0a010001,
70
65
  # :PackedNetmask => 0xffffff00
71
66
  # :Version => 4)
@@ -75,6 +70,7 @@ class CIDR
75
70
  #
76
71
  def initialize(options)
77
72
  @tag = {}
73
+
78
74
  if (!options.kind_of?(Hash) && !options.kind_of?(String))
79
75
  raise ArgumentError, "Expected Hash or String, but #{options.class} provided."
80
76
  end
@@ -82,8 +78,9 @@ class CIDR
82
78
  if (options.kind_of? String)
83
79
  cidr = options
84
80
  end
85
-
81
+
86
82
  if (options.kind_of? Hash)
83
+ # packed_ip takes precedence over cidr
87
84
  if (options.has_key?(:PackedIP))
88
85
  packed_ip = options[:PackedIP]
89
86
  raise ArgumentError, "Expected Integer, but #{packed_ip.class} " +
@@ -100,11 +97,6 @@ class CIDR
100
97
  packed_netmask = options[:PackedNetmask]
101
98
  raise ArgumentError, "Expected Integer, but #{packed_netmask.class} " +
102
99
  "provided for option :PackedNetmask." if (!packed_netmask.kind_of?(Integer))
103
-
104
- elsif (options.has_key?(:Netmask))
105
- netmask = options[:Netmask]
106
- raise ArgumentError, "Expected String or Integer, but #{netmask.class} " +
107
- "provided for option :Netmask." if (!netmask.kind_of?(String) && !netmask.kind_of?(Integer))
108
100
  end
109
101
 
110
102
  if (options.has_key?(:Version))
@@ -123,20 +115,28 @@ class CIDR
123
115
  end
124
116
 
125
117
 
126
- if (packed_ip)
127
- if (packed_ip < 2**32)
128
- @version = 4 if (!@version)
129
- @netmask = 2**32-1 if (!netmask && !packed_netmask)
130
- else
131
- @version = 6 if (!@version)
132
- @netmask = 2**128-1 if (!netmask && !packed_netmask)
118
+ if (packed_ip)
119
+ # attempt to determine version if not provided
120
+ if (!@version)
121
+ if (packed_ip < 2**32)
122
+ @version = 4
123
+ else
124
+ @version = 6
125
+ end
133
126
  end
134
127
 
135
128
  # validate & store packed_ip
136
129
  IPAdmin.validate_ip_addr(:IP => packed_ip, :Version => @version)
137
130
  @ip = packed_ip
138
131
 
139
- else
132
+ else
133
+ netmask = nil
134
+
135
+ # if extended netmask provided. should only apply to ipv4
136
+ if (cidr =~ /.+\s+.+/ )
137
+ cidr,netmask = cidr.split(' ')
138
+ end
139
+
140
140
  # determine version if not set
141
141
  if (!@version)
142
142
  if (cidr =~ /\./ && cidr !~ /:/)
@@ -144,37 +144,26 @@ class CIDR
144
144
  elsif (cidr =~ /:/)
145
145
  @version = 6
146
146
  end
147
- end
148
-
149
- # get ip/netmask
150
- if (cidr =~ /\//) # if netmask part of cidr
147
+ end
148
+
149
+ # if ipv6 and extended netmask was provided, then raise exception
150
+ raise ArgumentError, "Garbage provided at end of IPv6 address." if (@version == 6 && netmask)
151
+
152
+ # if netmask part of cidr, then over-ride any provided extended netmask.
153
+ if (cidr =~ /\//)
151
154
  ip,netmask = cidr.split(/\//)
152
- raise ArgumentError, ":CIDR is improperly formatted." if (!ip || !netmask)
153
- elsif (@version == 4)
154
- ip = cidr
155
- @netmask = 2**32-1 if (!netmask && !packed_netmask)
156
- elsif (@version == 6)
155
+ if (!ip || !netmask)
156
+ raise ArgumentError, "CIDR address is improperly formatted. Missing netmask after '/' character."
157
+ end
158
+ else
157
159
  ip = cidr
158
- @netmask = 2**128-1 if (!netmask && !packed_netmask)
159
160
  end
160
-
161
- # pack ip
162
- @ip = IPAdmin.pack_ip_addr(:IP => ip, :Version => @version)
163
161
 
162
+ # pack ip
163
+ @ip = IPAdmin.pack_ip_addr(:IP => ip, :Version => @version)
164
164
  end
165
165
 
166
166
 
167
- # validate & store netmask || packed_netmask if needed
168
- if (!@netmask)
169
- if (packed_netmask)
170
- IPAdmin.validate_ip_netmask(:Netmask => packed_netmask, :Packed => true, :Version => @version)
171
- @netmask = packed_netmask
172
- else
173
- IPAdmin.validate_ip_netmask(:Netmask => netmask, :Version => @version)
174
- @netmask = IPAdmin.pack_ip_netmask(:Netmask => netmask, :Version => @version)
175
- end
176
- end
177
-
178
167
  # set vars based on version
179
168
  if (@version == 4)
180
169
  @max_bits = 32
@@ -184,17 +173,26 @@ class CIDR
184
173
  @all_f = 2**@max_bits - 1
185
174
  end
186
175
 
187
- # get @network & @hostmask
176
+ # if no netmask or packed_netmask, then set as /32 or /128.
177
+ # else validate. packed_netmask takes precedence over netmask
178
+ if (!netmask && !packed_netmask)
179
+ @netmask = @all_f
180
+ else
181
+ if (packed_netmask)
182
+ IPAdmin.validate_ip_netmask(:Netmask => packed_netmask, :Packed => true, :Version => @version)
183
+ @netmask = packed_netmask
184
+ else
185
+ IPAdmin.validate_ip_netmask(:Netmask => netmask, :Version => @version)
186
+ @netmask = IPAdmin.pack_ip_netmask(:Netmask => netmask, :Version => @version)
187
+ end
188
+ end
189
+
190
+ # set @network & @hostmask
188
191
  @network = (@ip & @netmask)
189
192
  @hostmask = @netmask ^ @all_f
190
193
 
191
194
  end
192
195
 
193
- #======================================#
194
- #
195
- #======================================#
196
-
197
-
198
196
  #==============================================================================#
199
197
  # arpa()
200
198
  #==============================================================================#
@@ -210,7 +208,10 @@ class CIDR
210
208
  # * String
211
209
  #
212
210
  # Examples:
213
- # arpa = cidr4.arpa()
211
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
212
+ # cidr6 = IPAdmin::CIDR.new(:CIDR => 'fec0::/64')
213
+ # puts "arpa for #{cidr4.desc()} is #{cidr4.arpa}"
214
+ # puts "arpa for #{cidr6.desc(:Short => true)} is #{cidr6.arpa}"
214
215
  #
215
216
  def arpa()
216
217
 
@@ -254,11 +255,6 @@ class CIDR
254
255
  return(arpa)
255
256
  end
256
257
 
257
- #======================================#
258
- #
259
- #======================================#
260
-
261
-
262
258
  #==============================================================================#
263
259
  # bits()
264
260
  #==============================================================================#
@@ -272,32 +268,34 @@ class CIDR
272
268
  # * Integer.
273
269
  #
274
270
  # Examples:
275
- # puts cidr4.bits()
271
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
272
+ # cidr6 = IPAdmin::CIDR.new(:CIDR => 'fec0::/64')
273
+ # puts "cidr4 netmask in bits #{cidr4.bits()}"
274
+ # puts "cidr6 netmask in bits #{cidr6.bits()}"
276
275
  #
277
276
  def bits()
278
277
  return(IPAdmin.unpack_ip_netmask(:Integer => @netmask))
279
278
  end
280
279
 
281
- #======================================#
282
- #
283
- #======================================#
284
-
285
-
286
280
  #==============================================================================#
287
281
  # contains?()
288
282
  #==============================================================================#
289
283
 
290
284
  # Determines if this CIDR contains (is supernet of)
291
- # the provided CIDR addresss or IPAdmin::CIDR object.
285
+ # the provided CIDR address or IPAdmin::CIDR object.
292
286
  #
293
287
  # - Arguments:
294
- # * CIDR addresss or IPAdmin::CIDR object
288
+ # * CIDR address or IPAdmin::CIDR object
295
289
  #
296
290
  # - Returns:
297
291
  # * true or false
298
292
  #
299
293
  # Examples:
300
- # contains? = cidr4.contains('192.168.1.32/27')
294
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
295
+ # cidr6 = IPAdmin::CIDR.new('fec0::/64')
296
+ # cidr6_2 = IPAdmin::CIDR.new('fec0::/96')
297
+ # puts "#{cidr4.desc} contains 192.168.1.2" if ( cidr4.contains?('192.168.1.2') )
298
+ # puts "#{cidr6.desc} contains #{cidr6_2.desc(:Short => true)}" if ( cidr6.contains?(cidr6_2) )
301
299
  #
302
300
  def contains?(cidr)
303
301
  is_contained = false
@@ -335,11 +333,6 @@ class CIDR
335
333
  return(is_contained)
336
334
  end
337
335
 
338
- #======================================#
339
- #
340
- #======================================#
341
-
342
-
343
336
  #==============================================================================#
344
337
  # desc()
345
338
  #==============================================================================#
@@ -352,11 +345,15 @@ class CIDR
352
345
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
353
346
  #
354
347
  # - Returns:
355
- # * CIDR address as a String
348
+ # * String
356
349
  #
357
350
  # Examples:
358
- # puts cidr4.desc()
351
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
352
+ # cidr6 = IPAdmin::CIDR.new('fec0::/64')
359
353
  # puts cidr4.desc(:IP => true)
354
+ # puts "cidr4 description #{cidr4.desc()}"
355
+ # puts "cidr6 description #{cidr6.desc()}"
356
+ # puts "cidr6 short-hand description #{cidr6.desc(:Short => true)}"
360
357
  #
361
358
  def desc(options=nil)
362
359
  short = false
@@ -387,30 +384,29 @@ class CIDR
387
384
  return("#{ip}/#{mask}")
388
385
  end
389
386
 
390
- #======================================#
391
- #
392
- #======================================#
393
-
394
-
395
387
  #==============================================================================#
396
388
  # enumerate()
397
389
  #==============================================================================#
398
390
 
399
391
  # Provide all IP addresses contained within the IP space of this CIDR.
400
- # (warning: this can be quite large for big blocks)
401
392
  #
402
393
  # - Arguments:
403
394
  # * Optional Hash with the following fields:
404
- # - :Bitstep -- enumerate in X sized steps 0 - Integer (optional)
395
+ # - :Bitstep -- enumerate in X sized steps - Integer (optional)
405
396
  # - :Limit -- limit returned list to X number of items - Integer (optional)
406
397
  # - :Objectify -- if true, return IPAdmin::CIDR objects (optional)
407
398
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
408
399
  #
409
400
  # - Returns:
410
- # * Array of IP address Strings or IPAdmin::CIDR objects
401
+ # * Array of Strings, or Array of IPAdmin::CIDR objects
411
402
  #
412
403
  # Examples:
413
- # ip_list = cidr4.enumerate(:Bitstep => 2, :Limit => 2)
404
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
405
+ # cidr6 = IPAdmin::CIDR.new('fec0::/64')
406
+ # puts "first 4 cidr4 addresses (bitstep 32)"
407
+ # cidr4.enumerate(:Limit => 4, :Bitstep => 32).each {|x| puts " #{x}"}
408
+ # puts "first 4 cidr6 addresses (bitstep 32)"
409
+ # cidr6.enumerate(:Limit => 4, :Bitstep => 32, :Objectify => true).each {|x| puts " #{x.desc}"}
414
410
  #
415
411
  def enumerate(options=nil)
416
412
  bitstep = 1
@@ -463,11 +459,6 @@ class CIDR
463
459
  return(list)
464
460
  end
465
461
 
466
- #======================================#
467
- #
468
- #======================================#
469
-
470
-
471
462
  #==============================================================================#
472
463
  # fill_in()
473
464
  #==============================================================================#
@@ -476,14 +467,14 @@ class CIDR
476
467
  # holes (missing subnets) filled in.
477
468
  #
478
469
  # - Arguments:
479
- # * Array of CIDR addresses or IPAdmin::CIDR objects,
470
+ # * Array of CIDR addresses, Array of IPAdmin::CIDR objects,
480
471
  # or a Hash with the following fields:
481
472
  # - :List -- Array of CIDR addresses or IPAdmin::CIDR objects
482
473
  # - :Objectify -- if true, return IPAdmin::CIDR objects (optional)
483
474
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
484
475
  #
485
476
  # - Returns:
486
- # * Array of CIDR address Strings or IPAdmin::CIDR objects
477
+ # * Array of CIDR Strings or Array of IPAdmin::CIDR objects
487
478
  #
488
479
  # Examples:
489
480
  # subnets = cidr4.fill_in(['192.168.1.0/27','192.168.1.64/26','192.168.1.128/25'])
@@ -584,11 +575,6 @@ class CIDR
584
575
  end
585
576
  end
586
577
 
587
- #======================================#
588
- #
589
- #======================================#
590
-
591
-
592
578
  #==============================================================================#
593
579
  # hostmask_ext()
594
580
  #==============================================================================#
@@ -614,11 +600,6 @@ class CIDR
614
600
  return(hostmask)
615
601
  end
616
602
 
617
- #======================================#
618
- #
619
- #======================================#
620
-
621
-
622
603
  #==============================================================================#
623
604
  # ip()
624
605
  #==============================================================================#
@@ -631,10 +612,11 @@ class CIDR
631
612
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
632
613
  #
633
614
  # - Returns:
634
- # * IP address String or IPAdmin::CIDR object.
615
+ # * String or IPAdmin::CIDR object.
635
616
  #
636
617
  # Examples:
637
618
  # puts cidr4.ip()
619
+ # puts cidr4.ip(:Objectify => true).desc
638
620
  #
639
621
  def ip(options=nil)
640
622
  objectify = false
@@ -667,11 +649,6 @@ class CIDR
667
649
  return(ip)
668
650
  end
669
651
 
670
- #======================================#
671
- #
672
- #======================================#
673
-
674
-
675
652
  #==============================================================================#
676
653
  # last()
677
654
  #==============================================================================#
@@ -684,7 +661,7 @@ class CIDR
684
661
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
685
662
  #
686
663
  # - Returns:
687
- # * IP address String or IPAdmin::CIDR object.
664
+ # * String or IPAdmin::CIDR object.
688
665
  #
689
666
  # - Notes:
690
667
  # * The broadcast() method is aliased to this method, and thus works for
@@ -727,11 +704,6 @@ class CIDR
727
704
 
728
705
  alias :broadcast :last
729
706
 
730
- #======================================#
731
- #
732
- #======================================#
733
-
734
-
735
707
  #==============================================================================#
736
708
  # multicast_mac()
737
709
  #==============================================================================#
@@ -740,17 +712,17 @@ class CIDR
740
712
  # and ff00::/8 for IPv6), return its ethernet MAC address (EUI-48) mapping.
741
713
  #
742
714
  # - Arguments:
743
- # * Optional hash with the following fields:
715
+ # * Optional Hash with the following fields:
744
716
  # - :Objectify -- if true, return EUI objects (optional)
745
717
  #
746
718
  # - Returns:
747
- # * IPAdmin::EUI48 object
719
+ # * String or IPAdmin::EUI48 object
748
720
  #
749
721
  # - Note:
750
722
  # * MAC address is based on original IP address passed during initialization.
751
723
  #
752
724
  # Examples:
753
- # mcast = IPAdmin::CIDR.new(:CIDR => '224.0.0.6')
725
+ # mcast = IPAdmin::CIDR.new('224.0.0.6')
754
726
  # puts mcast.multicast_mac.address
755
727
  #
756
728
  def multicast_mac(options=nil)
@@ -790,16 +762,11 @@ class CIDR
790
762
  return(eui)
791
763
  end
792
764
 
793
- #======================================#
794
- #
795
- #======================================#
796
-
797
-
798
765
  #==============================================================================#
799
766
  # netmask()
800
767
  #==============================================================================#
801
768
 
802
- # Provide netmask in CIDR format.
769
+ # Provide netmask in CIDR format (/yy).
803
770
  #
804
771
  # - Arguments:
805
772
  # * none
@@ -815,11 +782,6 @@ class CIDR
815
782
  return("/#{bits}")
816
783
  end
817
784
 
818
- #======================================#
819
- #
820
- #======================================#
821
-
822
-
823
785
  #==============================================================================#
824
786
  # netmask_ext()
825
787
  #==============================================================================#
@@ -846,11 +808,6 @@ class CIDR
846
808
  return(netmask)
847
809
  end
848
810
 
849
- #======================================#
850
- #
851
- #======================================#
852
-
853
-
854
811
  #==============================================================================#
855
812
  # network()
856
813
  #==============================================================================#
@@ -863,7 +820,7 @@ class CIDR
863
820
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
864
821
  #
865
822
  # - Returns:
866
- # * CIDR address String or IPAdmin::CIDR object.
823
+ # * String or IPAdmin::CIDR object.
867
824
  #
868
825
  # Examples:
869
826
  # puts cidr4.network()
@@ -901,11 +858,6 @@ class CIDR
901
858
  alias :base :network
902
859
  alias :first :network
903
860
 
904
- #======================================#
905
- #
906
- #======================================#
907
-
908
-
909
861
  #==============================================================================#
910
862
  # next_ip()
911
863
  #==============================================================================#
@@ -920,10 +872,13 @@ class CIDR
920
872
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
921
873
  #
922
874
  # - Returns:
923
- # * IP address String or IPAdmin::CIDR object.
875
+ # * String or IPAdmin::CIDR object.
924
876
  #
925
877
  # Examples:
926
- # puts cidr4.next_ip()
878
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
879
+ # cidr6 = IPAdmin::CIDR.new('fec0::/64')
880
+ # puts "cidr4 next subnet #{cidr4.next_subnet()}"
881
+ # puts "cidr6 next subnet #{cidr6.next_subnet(:Short => true)}"
927
882
  #
928
883
  def next_ip(options=nil)
929
884
  bitstep = 1
@@ -966,11 +921,6 @@ class CIDR
966
921
  return(next_ip)
967
922
  end
968
923
 
969
- #======================================#
970
- #
971
- #======================================#
972
-
973
-
974
924
  #==============================================================================#
975
925
  # next_subnet()
976
926
  #==============================================================================#
@@ -985,10 +935,13 @@ class CIDR
985
935
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
986
936
  #
987
937
  # - Returns:
988
- # * CIDR address String or IPAdmin::CIDR object.
938
+ # * String or IPAdmin::CIDR object.
989
939
  #
990
940
  # Examples:
991
- # puts cidr4.next_subnet()
941
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
942
+ # cidr6 = IPAdmin::CIDR.new('fec0::/64')
943
+ # puts "cidr4 next subnet #{cidr4.next_subnet()}"
944
+ # puts "cidr6 next subnet #{cidr6.next_subnet(:Short => true)}"
992
945
  #
993
946
  def next_subnet(options=nil)
994
947
  bitstep = 1
@@ -1020,24 +973,20 @@ class CIDR
1020
973
  if (next_sub > @all_f)
1021
974
  raise "Returned subnet is out of bounds for IPv#{@version}."
1022
975
  end
1023
-
1024
- netmask = self.bits
976
+
1025
977
  if (!objectify)
1026
978
  next_sub = IPAdmin.unpack_ip_addr(:Integer => next_sub, :Version => @version)
1027
979
  next_sub = IPAdmin.shorten(next_sub) if (short && @version == 6)
1028
- next_sub = next_sub << "/" << netmask.to_s
980
+ next_sub = next_sub << "/" << self.bits.to_s
1029
981
  else
1030
- next_sub = IPAdmin::CIDR.new(:PackedIP => next_sub, :Netmask => netmask, :Version => @version)
982
+ next_sub = IPAdmin::CIDR.new(:PackedIP => next_sub,
983
+ :PackedNetmask => self.packed_netmask,
984
+ :Version => @version)
1031
985
  end
1032
986
 
1033
987
  return(next_sub)
1034
988
  end
1035
989
 
1036
- #======================================#
1037
- #
1038
- #======================================#
1039
-
1040
-
1041
990
  #==============================================================================#
1042
991
  # nth()
1043
992
  #==============================================================================#
@@ -1051,9 +1000,10 @@ class CIDR
1051
1000
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
1052
1001
  #
1053
1002
  # - Returns:
1054
- # * IP address String or IPAdmin::CIDR object.
1003
+ # * String or IPAdmin::CIDR object.
1055
1004
  #
1056
1005
  # Examples:
1006
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
1057
1007
  # puts cidr4.nth(1)
1058
1008
  # puts cidr4.nth(:Index => 1, :Objectify => true)
1059
1009
  #
@@ -1099,16 +1049,11 @@ class CIDR
1099
1049
  return(my_ip)
1100
1050
  end
1101
1051
 
1102
- #======================================#
1103
- #
1104
- #======================================#
1105
-
1106
-
1107
1052
  #==============================================================================#
1108
1053
  # packed_hostmask()
1109
1054
  #==============================================================================#
1110
1055
 
1111
- # Provide an integer representation of the Hostmask of this object.
1056
+ # Provide an Integer representation of the Hostmask of this object.
1112
1057
  #
1113
1058
  # - Arguments:
1114
1059
  # * none
@@ -1123,16 +1068,11 @@ class CIDR
1123
1068
  return(@hostmask)
1124
1069
  end
1125
1070
 
1126
- #======================================#
1127
- #
1128
- #======================================#
1129
-
1130
-
1131
1071
  #==============================================================================#
1132
1072
  # packed_ip()
1133
1073
  #==============================================================================#
1134
1074
 
1135
- # Provide an integer representation of the IP address of this object.
1075
+ # Provide an Integer representation of the IP address of this object.
1136
1076
  #
1137
1077
  # - Arguments:
1138
1078
  # * none
@@ -1147,16 +1087,11 @@ class CIDR
1147
1087
  return(@ip)
1148
1088
  end
1149
1089
 
1150
- #======================================#
1151
- #
1152
- #======================================#
1153
-
1154
-
1155
1090
  #==============================================================================#
1156
1091
  # packed_netmask()
1157
1092
  #==============================================================================#
1158
1093
 
1159
- # Provide an integer representation of the Netmask of this object.
1094
+ # Provide an Integer representation of the Netmask of this object.
1160
1095
  #
1161
1096
  # - Arguments:
1162
1097
  # * none
@@ -1171,16 +1106,11 @@ class CIDR
1171
1106
  return(@netmask)
1172
1107
  end
1173
1108
 
1174
- #======================================#
1175
- #
1176
- #======================================#
1177
-
1178
-
1179
1109
  #==============================================================================#
1180
1110
  # packed_network()
1181
1111
  #==============================================================================#
1182
1112
 
1183
- # Provide an integer representation of the Network address of this object.
1113
+ # Provide an Integer representation of the Network address of this object.
1184
1114
  #
1185
1115
  # - Arguments:
1186
1116
  # * none
@@ -1195,11 +1125,6 @@ class CIDR
1195
1125
  return(@network)
1196
1126
  end
1197
1127
 
1198
- #======================================#
1199
- #
1200
- #======================================#
1201
-
1202
-
1203
1128
  #==============================================================================#
1204
1129
  # range()
1205
1130
  #==============================================================================#
@@ -1215,9 +1140,10 @@ class CIDR
1215
1140
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
1216
1141
  #
1217
1142
  # - Returns:
1218
- # * Array IP address Strings or IPAdmin::CIDR objects
1143
+ # * Array of Strings, or Array of IPAdmin::CIDR objects
1219
1144
  #
1220
1145
  # Examples:
1146
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
1221
1147
  # list = cidr4.range([0,1])
1222
1148
  # list = cidr4.range(:Indexes => [0,1], :Objectify => true)
1223
1149
  #
@@ -1283,11 +1209,6 @@ class CIDR
1283
1209
  return(list)
1284
1210
  end
1285
1211
 
1286
- #======================================#
1287
- #
1288
- #======================================#
1289
-
1290
-
1291
1212
  #==============================================================================#
1292
1213
  # remainder()
1293
1214
  #==============================================================================#
@@ -1298,13 +1219,13 @@ class CIDR
1298
1219
  # and 192.168.0.128/25 will be returned as the remainders.
1299
1220
  #
1300
1221
  # - Arguments:
1301
- # * CIDR address or IPAdmin::CIDR object, or a Hash with the following fields:
1222
+ # * CIDR address, IPAdmin::CIDR object, or a Hash with the following fields:
1302
1223
  # - :Exclude -- CIDR address or IPAdmin::CIDR object.
1303
1224
  # - :Objectify -- if true, return IPAdmin::CIDR objects (optional)
1304
1225
  # - :Short -- if true, return IPv6 addresses in short-hand notation (optional)
1305
1226
  #
1306
1227
  # - Returns:
1307
- # * Array of CIDR address Strings or IPAdmin::CIDR objects
1228
+ # * Array of Strings, or Array of IPAdmin::CIDR objects
1308
1229
  #
1309
1230
  #
1310
1231
  # Examples:
@@ -1381,7 +1302,7 @@ class CIDR
1381
1302
  new_subnets.unshift("#{non_match}/#{new_mask}")
1382
1303
  else
1383
1304
  new_subnets.unshift(IPAdmin::CIDR.new(:PackedIP => non_match,
1384
- :Netmask => new_mask,
1305
+ :PackedNetmask => IPAdmin.pack_ip_netmask(new_mask),
1385
1306
  :Version => @version))
1386
1307
  end
1387
1308
 
@@ -1393,11 +1314,6 @@ class CIDR
1393
1314
  return(new_subnets)
1394
1315
  end
1395
1316
 
1396
- #======================================#
1397
- #
1398
- #======================================#
1399
-
1400
-
1401
1317
  #==============================================================================#
1402
1318
  # resize()
1403
1319
  #==============================================================================#
@@ -1413,6 +1329,7 @@ class CIDR
1413
1329
  # * IPAdmin::CIDR object
1414
1330
  #
1415
1331
  # Examples:
1332
+ # cidr4 = IPAdmin::CIDR.new('192.168.1.1/24')
1416
1333
  # new_cidr = cidr4.resize(23)
1417
1334
  # new_cidr = cidr4.resize(:Netmask => 23)
1418
1335
  # puts new_cidr.desc
@@ -1438,11 +1355,6 @@ class CIDR
1438
1355
  return(cidr)
1439
1356
  end
1440
1357
 
1441
- #======================================#
1442
- #
1443
- #======================================#
1444
-
1445
-
1446
1358
  #==============================================================================#
1447
1359
  # resize!()
1448
1360
  #==============================================================================#
@@ -1459,10 +1371,6 @@ class CIDR
1459
1371
  # - Notes:
1460
1372
  # * If CIDR is resized such that the original IP is no longer contained within,
1461
1373
  # then that IP will be reset to the base network address.
1462
- #
1463
- # Examples:
1464
- # cidr4.resize!(23)
1465
- # puts cidr4.desc
1466
1374
  #
1467
1375
  def resize!(options)
1468
1376
  if (options.kind_of?(Hash))
@@ -1492,11 +1400,6 @@ class CIDR
1492
1400
  return(true)
1493
1401
  end
1494
1402
 
1495
- #======================================#
1496
- #
1497
- #======================================#
1498
-
1499
-
1500
1403
  #==============================================================================#
1501
1404
  # size()
1502
1405
  #==============================================================================#
@@ -1516,11 +1419,6 @@ class CIDR
1516
1419
  return(@hostmask + 1)
1517
1420
  end
1518
1421
 
1519
- #======================================#
1520
- #
1521
- #======================================#
1522
-
1523
-
1524
1422
  #==============================================================================#
1525
1423
  # subnet()
1526
1424
  #==============================================================================#
@@ -1530,12 +1428,12 @@ class CIDR
1530
1428
  # * By providing the number of IP addresses needed in the new subnets in :IPCount
1531
1429
  #
1532
1430
  # If :Mincount is not provided, then the CIDR will be fully subnetted. Otherwise,
1533
- # if provided then :Mincount number of subnets of requested size will be returned and
1431
+ # :Mincount number of subnets of the requested size will be returned and
1534
1432
  # the remainder of the subnets will be summarized as much as possible. If neither :Subnet
1535
1433
  # or :IPCount is provided, then the current CIDR will be split in half.
1536
1434
  #
1537
1435
  # - Arguments:
1538
- # * Optional hash with the following fields:
1436
+ # * Optional Hash with the following fields:
1539
1437
  # - :IPCount -- Minimum number of IP's that new subnets should contain - Integer (optional)
1540
1438
  # - :MinCount -- Minimum number of X sized subnets to return - Integer (optional)
1541
1439
  # - :Objectify -- if true, return IPAdmin::CIDR objects (optional)
@@ -1543,14 +1441,16 @@ class CIDR
1543
1441
  # - :Subnet -- Netmask (in bits) of new subnets - Integer (optional)
1544
1442
  #
1545
1443
  # - Returns:
1546
- # * Array of CIDR address Strings or IPAdmin::CIDR objects
1444
+ # * Array of Strings, or Array of IPAdmin::CIDR objects
1547
1445
  #
1548
1446
  # - Notes:
1549
1447
  # * :Subnet always takes precedence over :IPCount.
1550
1448
  #
1551
1449
  # Examples:
1552
- # cidr_list = cidr4.subnet(:Subnet => 28, :MinCount => 3)
1553
- # cidr_list = cidr4.subnet(:IPCount => 19)
1450
+ # cidr_list = cidr4.subnet(:Subnet => 28, :MinCount => 3).each {|x| puts " #{x}"}
1451
+ # cidr_list = cidr4.subnet(:IPCount => 19).each {|x| puts " #{x}"}
1452
+ # cidr4.subnet(:Subnet => 28).each {|x| puts " #{x}"} "
1453
+ # cidr6.subnet(:Subnet => 67, :MinCount => 4, :Short => true).each {|x| puts " #{x}"}
1554
1454
  #
1555
1455
  def subnet(options=nil)
1556
1456
  my_network = self.packed_network
@@ -1647,7 +1547,7 @@ class CIDR
1647
1547
  new_subnets.push("#{next_network}/#{next_supernet_bits}")
1648
1548
  else
1649
1549
  new_subnets.push(IPAdmin::CIDR.new(:PackedIP => next_supernet_ip,
1650
- :Netmask =>next_supernet_bits,
1550
+ :PackedNetmask => IPAdmin.pack_ip_netmask(next_supernet_bits),
1651
1551
  :Version => @version))
1652
1552
  end
1653
1553
 
@@ -1659,10 +1559,6 @@ class CIDR
1659
1559
  return(new_subnets)
1660
1560
  end
1661
1561
 
1662
- #======================================#
1663
- #
1664
- #======================================#
1665
-
1666
1562
 
1667
1563
  # PRIVATE INSTANCE METHODS
1668
1564
  private
@@ -1713,12 +1609,7 @@ private
1713
1609
  return(list)
1714
1610
  end
1715
1611
 
1716
- #======================================#
1717
- #
1718
- #======================================#
1719
-
1720
-
1721
- end
1612
+ end # end class CIDR
1722
1613
 
1723
1614
  end # module IPAdmin
1724
1615
  __END__