ronin-support 0.1.0.pre1

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 (127) hide show
  1. data/.document +4 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +1 -0
  4. data/COPYING.txt +504 -0
  5. data/ChangeLog.md +4 -0
  6. data/Gemfile +23 -0
  7. data/README.md +98 -0
  8. data/Rakefile +29 -0
  9. data/gemspec.yml +20 -0
  10. data/lib/ronin/extensions.rb +28 -0
  11. data/lib/ronin/extensions/file.rb +63 -0
  12. data/lib/ronin/extensions/ip_addr.rb +220 -0
  13. data/lib/ronin/extensions/kernel.rb +45 -0
  14. data/lib/ronin/extensions/meta.rb +22 -0
  15. data/lib/ronin/extensions/meta/object.rb +24 -0
  16. data/lib/ronin/extensions/string.rb +200 -0
  17. data/lib/ronin/formatting.rb +26 -0
  18. data/lib/ronin/formatting/binary.rb +22 -0
  19. data/lib/ronin/formatting/digest.rb +22 -0
  20. data/lib/ronin/formatting/extensions.rb +25 -0
  21. data/lib/ronin/formatting/extensions/binary.rb +24 -0
  22. data/lib/ronin/formatting/extensions/binary/file.rb +35 -0
  23. data/lib/ronin/formatting/extensions/binary/integer.rb +147 -0
  24. data/lib/ronin/formatting/extensions/binary/string.rb +363 -0
  25. data/lib/ronin/formatting/extensions/digest.rb +23 -0
  26. data/lib/ronin/formatting/extensions/digest/file.rb +117 -0
  27. data/lib/ronin/formatting/extensions/digest/string.rb +80 -0
  28. data/lib/ronin/formatting/extensions/http.rb +23 -0
  29. data/lib/ronin/formatting/extensions/http/integer.rb +57 -0
  30. data/lib/ronin/formatting/extensions/http/string.rb +102 -0
  31. data/lib/ronin/formatting/extensions/text.rb +23 -0
  32. data/lib/ronin/formatting/extensions/text/array.rb +125 -0
  33. data/lib/ronin/formatting/extensions/text/string.rb +206 -0
  34. data/lib/ronin/formatting/http.rb +22 -0
  35. data/lib/ronin/formatting/text.rb +22 -0
  36. data/lib/ronin/network.rb +29 -0
  37. data/lib/ronin/network/esmtp.rb +22 -0
  38. data/lib/ronin/network/extensions.rb +29 -0
  39. data/lib/ronin/network/extensions/esmtp.rb +22 -0
  40. data/lib/ronin/network/extensions/esmtp/net.rb +100 -0
  41. data/lib/ronin/network/extensions/http.rb +22 -0
  42. data/lib/ronin/network/extensions/http/net.rb +661 -0
  43. data/lib/ronin/network/extensions/imap.rb +22 -0
  44. data/lib/ronin/network/extensions/imap/net.rb +124 -0
  45. data/lib/ronin/network/extensions/pop3.rb +22 -0
  46. data/lib/ronin/network/extensions/pop3/net.rb +92 -0
  47. data/lib/ronin/network/extensions/smtp.rb +22 -0
  48. data/lib/ronin/network/extensions/smtp/net.rb +110 -0
  49. data/lib/ronin/network/extensions/ssl.rb +22 -0
  50. data/lib/ronin/network/extensions/ssl/net.rb +147 -0
  51. data/lib/ronin/network/extensions/tcp.rb +22 -0
  52. data/lib/ronin/network/extensions/tcp/net.rb +304 -0
  53. data/lib/ronin/network/extensions/telnet.rb +22 -0
  54. data/lib/ronin/network/extensions/telnet/net.rb +156 -0
  55. data/lib/ronin/network/extensions/udp.rb +22 -0
  56. data/lib/ronin/network/extensions/udp/net.rb +226 -0
  57. data/lib/ronin/network/http.rb +24 -0
  58. data/lib/ronin/network/http/exceptions.rb +22 -0
  59. data/lib/ronin/network/http/exceptions/unknown_request.rb +29 -0
  60. data/lib/ronin/network/http/http.rb +290 -0
  61. data/lib/ronin/network/http/proxy.rb +307 -0
  62. data/lib/ronin/network/imap.rb +49 -0
  63. data/lib/ronin/network/network.rb +41 -0
  64. data/lib/ronin/network/pop3.rb +49 -0
  65. data/lib/ronin/network/smtp.rb +24 -0
  66. data/lib/ronin/network/smtp/email.rb +143 -0
  67. data/lib/ronin/network/smtp/smtp.rb +68 -0
  68. data/lib/ronin/network/ssl.rb +47 -0
  69. data/lib/ronin/network/tcp.rb +22 -0
  70. data/lib/ronin/network/telnet.rb +109 -0
  71. data/lib/ronin/network/udp.rb +22 -0
  72. data/lib/ronin/path.rb +132 -0
  73. data/lib/ronin/support.rb +28 -0
  74. data/lib/ronin/support/inflector.rb +40 -0
  75. data/lib/ronin/support/version.rb +27 -0
  76. data/lib/ronin/templates.rb +23 -0
  77. data/lib/ronin/templates/erb.rb +75 -0
  78. data/lib/ronin/templates/template.rb +161 -0
  79. data/ronin-support.gemspec +10 -0
  80. data/spec/extensions/file_spec.rb +24 -0
  81. data/spec/extensions/ip_addr_spec.rb +171 -0
  82. data/spec/extensions/kernel_spec.rb +30 -0
  83. data/spec/extensions/string_spec.rb +177 -0
  84. data/spec/formatting/binary/helpers/hexdumps.rb +16 -0
  85. data/spec/formatting/binary/helpers/hexdumps/ascii.bin +0 -0
  86. data/spec/formatting/binary/helpers/hexdumps/hexdump_decimal_shorts.txt +17 -0
  87. data/spec/formatting/binary/helpers/hexdumps/hexdump_hex_bytes.txt +17 -0
  88. data/spec/formatting/binary/helpers/hexdumps/hexdump_hex_shorts.txt +17 -0
  89. data/spec/formatting/binary/helpers/hexdumps/hexdump_octal_bytes.txt +17 -0
  90. data/spec/formatting/binary/helpers/hexdumps/hexdump_octal_shorts.txt +17 -0
  91. data/spec/formatting/binary/helpers/hexdumps/hexdump_repeated.txt +6 -0
  92. data/spec/formatting/binary/helpers/hexdumps/od_decimal_bytes.txt +17 -0
  93. data/spec/formatting/binary/helpers/hexdumps/od_decimal_ints.txt +17 -0
  94. data/spec/formatting/binary/helpers/hexdumps/od_decimal_quads.txt +17 -0
  95. data/spec/formatting/binary/helpers/hexdumps/od_decimal_shorts.txt +17 -0
  96. data/spec/formatting/binary/helpers/hexdumps/od_hex_bytes.txt +17 -0
  97. data/spec/formatting/binary/helpers/hexdumps/od_hex_ints.txt +17 -0
  98. data/spec/formatting/binary/helpers/hexdumps/od_hex_quads.txt +17 -0
  99. data/spec/formatting/binary/helpers/hexdumps/od_hex_shorts.txt +17 -0
  100. data/spec/formatting/binary/helpers/hexdumps/od_octal_bytes.txt +17 -0
  101. data/spec/formatting/binary/helpers/hexdumps/od_octal_ints.txt +17 -0
  102. data/spec/formatting/binary/helpers/hexdumps/od_octal_quads.txt +17 -0
  103. data/spec/formatting/binary/helpers/hexdumps/od_octal_shorts.txt +17 -0
  104. data/spec/formatting/binary/helpers/hexdumps/od_repeated.txt +6 -0
  105. data/spec/formatting/binary/helpers/hexdumps/repeated.bin +1 -0
  106. data/spec/formatting/binary/integer_spec.rb +140 -0
  107. data/spec/formatting/binary/string_spec.rb +306 -0
  108. data/spec/formatting/digest/string_spec.rb +82 -0
  109. data/spec/formatting/http/integer_spec.rb +42 -0
  110. data/spec/formatting/http/string_spec.rb +76 -0
  111. data/spec/formatting/text/array_spec.rb +105 -0
  112. data/spec/formatting/text/string_spec.rb +180 -0
  113. data/spec/network/http/http_spec.rb +280 -0
  114. data/spec/network/http/proxy_spec.rb +150 -0
  115. data/spec/network/network_spec.rb +8 -0
  116. data/spec/network/ssl_spec.rb +14 -0
  117. data/spec/path_spec.rb +84 -0
  118. data/spec/spec_helper.rb +4 -0
  119. data/spec/support_spec.rb +8 -0
  120. data/spec/templates/classes/example_erb.rb +11 -0
  121. data/spec/templates/classes/example_template.rb +35 -0
  122. data/spec/templates/erb_spec.rb +21 -0
  123. data/spec/templates/helpers/data.rb +9 -0
  124. data/spec/templates/helpers/data/includes/_relative.erb +1 -0
  125. data/spec/templates/helpers/data/templates/example.erb +1 -0
  126. data/spec/templates/template_spec.rb +54 -0
  127. metadata +286 -0
data/ChangeLog.md ADDED
@@ -0,0 +1,4 @@
1
+ ## 0.1.0 / 2010-01-01
2
+
3
+ * Initial release.
4
+
data/Gemfile ADDED
@@ -0,0 +1,23 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ platforms :jruby do
6
+ gem 'jruby-openssl', '~> 0.7.0'
7
+ end
8
+
9
+ group :development do
10
+ gem 'rake', '~> 0.8.7'
11
+
12
+ platforms :jruby do
13
+ gem 'bluecloth', '>= 2.0.0'
14
+ end
15
+
16
+ platforms :ruby do
17
+ gem 'rdiscount', '~> 1.6.3'
18
+ end
19
+
20
+ gem 'ore-core', '~> 0.1.0'
21
+ gem 'ore-tasks', '~> 0.2.0'
22
+ gem 'rspec', '~> 2.0.0'
23
+ end
data/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # Ronin Support
2
+
3
+ * [Source](http://github.com/ronin-ruby/ronin-support)
4
+ * [Issues](http://github.com/ronin-ruby/ronin-support/issues)
5
+ * [Documentation](http://rubydoc.info/github/ronin-ruby/ronin-support/frames)
6
+ * [Mailing List](http://groups.google.com/group/ronin-ruby)
7
+ * irc.freenode.net #ronin
8
+
9
+ ## Description
10
+
11
+ Ronin Support is a support library for Ronin. Ronin Support contains many of
12
+ the convenience methods used by Ronin and additional libraries.
13
+
14
+ Ronin is a Ruby platform for exploit development and security research.
15
+ Ronin allows for the rapid development and distribution of code, exploits
16
+ or payloads over many common Source-Code-Management (SCM) systems.
17
+
18
+ ### Ruby
19
+
20
+ Ronin's Ruby environment allows security researchers to leverage Ruby with
21
+ ease. The Ruby environment contains a multitude of convenience methods
22
+ for working with data in Ruby, a Ruby Object Database, a customized Ruby
23
+ Console and an extendable command-line interface.
24
+
25
+ ### Extend
26
+
27
+ Ronin's more specialized features are provided by additional Ronin
28
+ libraries, which users can choose to install. These libraries can allow
29
+ one to write and run Exploits and Payloads, scan for PHP vulnerabilities,
30
+ perform Google Dorks or run 3rd party scanners.
31
+
32
+ ### Publish
33
+
34
+ Ronin allows users to publish and share code, exploits, payloads or other
35
+ data via Overlays. Overlays are directories of code and data that can be
36
+ hosted on any SVN, Hg, Git or Rsync server. Ronin makes it easy to create,
37
+ install or update Overlays.
38
+
39
+ ## Features
40
+
41
+ * Provides convenience methods for:
42
+ * Formatting data:
43
+ * Binary
44
+ * Text
45
+ * HTTP
46
+ * URIs
47
+ * Generating random text.
48
+ * Networking:
49
+ * TCP
50
+ * UDP
51
+ * SMTP / ESMTP
52
+ * POP3
53
+ * Imap
54
+ * Telnet
55
+ * HTTP / HTTPS
56
+ * Enumerating IP ranges:
57
+ * IPv4 / IPv6 addresses.
58
+ * CIDR / globbed ranges.
59
+ * (Un-)Hexdumping data.
60
+ * Handling exceptions.
61
+
62
+ ## Examples
63
+
64
+ For examples of the convenience methods provided by ronin-support,
65
+ please see [Everyday Ronin](http://ronin-ruby.github.com/resources/everyday_ronin.html).
66
+
67
+ ## Requirements
68
+
69
+ * [Ruby](http://www.ruby-lang.org/) >= 1.8.7
70
+ * [chars](http://github.com/postmodern/chars) ~> 0.1.2
71
+ * [data_paths](http://github.com/postmodern/data_paths) ~> 0.2.0
72
+ * [uri-query_params](http://github.com/postmodern/uri-query_params) ~> 0.5.0
73
+
74
+ ## Install
75
+
76
+ $ sudo gem install ronin-support
77
+
78
+ ## License
79
+
80
+ Ronin Support - A support library for Ronin.
81
+
82
+ Copyright (c) 2010 Hal Brodigan (postmodern.mod3 at gmail.com)
83
+
84
+ This library is free software; you can redistribute it and/or
85
+ modify it under the terms of the GNU Lesser General Public
86
+ License as published by the Free Software Foundation; either
87
+ version 2.1 of the License, or (at your option) any later version.
88
+
89
+ This library is distributed in the hope that it will be useful,
90
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
91
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
92
+ Lesser General Public License for more details.
93
+
94
+ You should have received a copy of the GNU Lesser General Public
95
+ License along with this library; if not, write to the Free Software
96
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
97
+ Boston, MA 02110-1301 USA
98
+
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+
3
+ begin
4
+ require 'bundler'
5
+ rescue LoadError => e
6
+ STDERR.puts e.message
7
+ STDERR.puts "Run `gem install bundler` to install Bundler."
8
+ exit e.status_code
9
+ end
10
+
11
+ begin
12
+ Bundler.setup(:development)
13
+ rescue Bundler::BundlerError => e
14
+ STDERR.puts e.message
15
+ STDERR.puts "Run `bundle install` to install missing gems"
16
+ exit e.status_code
17
+ end
18
+
19
+ require 'rake'
20
+
21
+ require 'ore/tasks'
22
+ Ore::Tasks.new
23
+
24
+ require 'rspec/core/rake_task'
25
+ RSpec::Core::RakeTask.new
26
+ task :default => :spec
27
+
28
+ require 'yard'
29
+ YARD::Rake::YardocTask.new
data/gemspec.yml ADDED
@@ -0,0 +1,20 @@
1
+ name: ronin-support
2
+ summary: A support library for Ronin.
3
+ description:
4
+ Ronin Support is a support library for Ronin. Ronin Support contains many
5
+ of the convenience methods used by Ronin and additional libraries.
6
+
7
+ license: LGPL-2.1
8
+ authors: Postmodern
9
+ email: postmodern.mod3@gmail.com
10
+ homepage: http://github.com/ronin-ruby/ronin-support
11
+ has_yard: true
12
+
13
+ dependencies:
14
+ chars: ~> 0.2.0
15
+ uri-query_params: ~> 0.5.2
16
+ data_paths: ~> 0.2.1
17
+
18
+ development_dependencies:
19
+ bundler: ~> 1.0.0
20
+ yard: ~> 0.6.1
@@ -0,0 +1,28 @@
1
+ #
2
+ # Ronin - A Ruby platform for exploit development and security research.
3
+ #
4
+ # Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # This library is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU Lesser General Public
8
+ # License as published by the Free Software Foundation; either
9
+ # version 2.1 of the License, or (at your option) any later version.
10
+ #
11
+ # This library is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ # Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public
17
+ # License along with this library; if not, write to the Free Software
18
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
+ # Boston, MA 02110-1301 USA
20
+ #
21
+
22
+ require 'ronin/extensions/meta'
23
+ require 'ronin/extensions/string'
24
+ require 'ronin/extensions/file'
25
+ require 'ronin/extensions/ip_addr'
26
+ require 'ronin/extensions/kernel'
27
+
28
+ require 'uri/query_params'
@@ -0,0 +1,63 @@
1
+ #
2
+ # Ronin - A Ruby platform for exploit development and security research.
3
+ #
4
+ # Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # This library is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU Lesser General Public
8
+ # License as published by the Free Software Foundation; either
9
+ # version 2.1 of the License, or (at your option) any later version.
10
+ #
11
+ # This library is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ # Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public
17
+ # License along with this library; if not, write to the Free Software
18
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
+ # Boston, MA 02110-1301 USA
20
+ #
21
+
22
+ class File
23
+
24
+ #
25
+ # Writes the given data to a specified path.
26
+ #
27
+ # @param [String] path
28
+ # The path of the file to write to.
29
+ #
30
+ # @param [String] data
31
+ # The data to write to the file.
32
+ #
33
+ # @return [nil]
34
+ #
35
+ def File.write(path,data)
36
+ File.open(path,'w') { |file| file.write(data) }
37
+ end
38
+
39
+ #
40
+ # Escapes a path.
41
+ #
42
+ # @param [String] path
43
+ # Unescaped path.
44
+ #
45
+ # @return [String]
46
+ # The escaped path.
47
+ #
48
+ def File.escape_path(path)
49
+ path = path.to_s
50
+
51
+ # remove any \0 characters first
52
+ path.gsub!("\0",'')
53
+
54
+ # remove any home-dir expansions
55
+ path.gsub!("~","\\~")
56
+
57
+ path = File.expand_path(File.join('/',path))
58
+
59
+ # remove the leading slash
60
+ return path[1..-1]
61
+ end
62
+
63
+ end
@@ -0,0 +1,220 @@
1
+ #
2
+ # Ronin - A Ruby platform for exploit development and security research.
3
+ #
4
+ # Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # This library is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU Lesser General Public
8
+ # License as published by the Free Software Foundation; either
9
+ # version 2.1 of the License, or (at your option) any later version.
10
+ #
11
+ # This library is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ # Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public
17
+ # License along with this library; if not, write to the Free Software
18
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
+ # Boston, MA 02110-1301 USA
20
+ #
21
+
22
+ require 'ipaddr'
23
+ require 'resolv'
24
+ require 'strscan'
25
+
26
+ class IPAddr
27
+
28
+ include Enumerable
29
+
30
+ # A regular expression for matching IPv4 Addresses.
31
+ IPV4_REGEXP = /[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}/
32
+
33
+ # A regular expression for matching IPv6 Addresses.
34
+ IPV6_REGEXP = /:(:[0-9a-f]{1,4}){1,7}|([0-9a-f]{1,4}::?){1,7}[0-9a-f]{1,4}(:#{IPV4_REGEXP})?/
35
+
36
+ # A regular expression for matching IP Addresses.
37
+ REGEXP = /#{IPV4_REGEXP}|#{IPV6_REGEXP}/
38
+
39
+ #
40
+ # Extracts IP Addresses from text.
41
+ #
42
+ # @param [String] text
43
+ # The text to scan for IP Addresses.
44
+ #
45
+ # @param [Symbol] version
46
+ # The version of IP Address to scan for (`:ipv4` or `:ipv6`).
47
+ #
48
+ # @yield [ip]
49
+ # The given block will be passed each extracted IP Address.
50
+ #
51
+ # @yieldparam [String] ip
52
+ # An IP Address from the text.
53
+ #
54
+ # @return [Array<String>]
55
+ # The IP Addresses found in the text.
56
+ #
57
+ def IPAddr.extract(text,version=nil,&block)
58
+ regexp = case version
59
+ when :ipv4
60
+ IPV4_REGEXP
61
+ when :ipv6
62
+ IPV6_REGEXP
63
+ else
64
+ REGEXP
65
+ end
66
+
67
+ parser = StringScanner.new(text)
68
+
69
+ if block_given?
70
+ yield parser.matched while parser.skip_until(regexp)
71
+ return nil
72
+ else
73
+ ips = []
74
+
75
+ ips << parser.matched while parser.skip_until(regexp)
76
+ return ips
77
+ end
78
+ end
79
+
80
+ #
81
+ # Iterates over each IP address within the IP Address range. Supports
82
+ # both IPv4 and IPv6 address ranges.
83
+ #
84
+ # @param [String] cidr_or_glob
85
+ # The IP address range to iterate over.
86
+ # May be in standard CIDR notation or globbed format.
87
+ #
88
+ # @yield [ip]
89
+ # The block which will be passed each IP address contained within the
90
+ # IP address range.
91
+ #
92
+ # @yieldparam [String] ip
93
+ # An IP address within the IP address range.
94
+ #
95
+ # @return [nil]
96
+ #
97
+ # @example Enumerate through a CIDR range
98
+ # IPAddr.each('10.1.1.1/24') do |ip|
99
+ # puts ip
100
+ # end
101
+ #
102
+ # @example Enumerate through a globbed IP range
103
+ # IPAddr.each('10.1.1-5.*') do |ip|
104
+ # puts ip
105
+ # end
106
+ #
107
+ # @example Enumerate through a globbed IPv6 range
108
+ # IPAddr.each('::ff::02-0a::c3') do |ip|
109
+ # puts ip
110
+ # end
111
+ #
112
+ def IPAddr.each(cidr_or_glob,&block)
113
+ unless (cidr_or_glob.include?('*') || cidr_or_glob.include?('-'))
114
+ return IPAddr.new(cidr_or_glob).each(&block)
115
+ end
116
+
117
+ return enum_for(:each,cidr_or_glob) unless block
118
+
119
+ if cidr_or_glob.include?('::')
120
+ prefix = if cidr_or_glob[0,2] == '::'
121
+ '::'
122
+ else
123
+ ''
124
+ end
125
+
126
+ separator = '::'
127
+ base = 16
128
+
129
+ format = lambda { |address|
130
+ prefix + address.map { |i| '%.2x' % i }.join('::')
131
+ }
132
+ else
133
+ separator = '.'
134
+ base = 10
135
+
136
+ format = lambda { |address| address.join('.') }
137
+ end
138
+
139
+ # split the address
140
+ ranges = cidr_or_glob.split(separator)
141
+
142
+ # map the components of the address to numeric ranges
143
+ ranges.map! do |segment|
144
+ if segment == '*'
145
+ (1..254)
146
+ elsif segment.include?('-')
147
+ start, stop = segment.split('-',2).map { |i| i.to_i(base) }
148
+
149
+ (start..stop)
150
+ elsif !(segment.empty?)
151
+ segment.to_i(base)
152
+ end
153
+ end
154
+ ranges.compact!
155
+
156
+ expand_range = lambda { |address,remaining|
157
+ if remaining.empty?
158
+ block.call(format.call(address))
159
+ else
160
+ n = remaining.first
161
+ remaining = remaining[1..-1]
162
+
163
+ if n.kind_of?(Range)
164
+ n.each { |i| expand_range.call(address + [i], remaining) }
165
+ else
166
+ expand_range.call(address + [n], remaining)
167
+ end
168
+ end
169
+ }
170
+
171
+ expand_range.call([], ranges)
172
+ return nil
173
+ end
174
+
175
+ #
176
+ # Resolves the host-names for the IP address.
177
+ #
178
+ # @return [Array<String>]
179
+ # The host-names for the IP address.
180
+ #
181
+ def lookup
182
+ Resolv.getnames(self.to_s)
183
+ end
184
+
185
+ #
186
+ # Iterates over each IP address that is included in the addresses
187
+ # netmask. Supports both IPv4 and IPv6 addresses.
188
+ #
189
+ # @yield [ip]
190
+ # The block which will be passed every IP address covered be the
191
+ # netmask of the IPAddr object.
192
+ #
193
+ # @yieldparam [String] ip
194
+ # An IP address.
195
+ #
196
+ # @example
197
+ # netblock = IPAddr.new('10.1.1.1/24')
198
+ #
199
+ # netblock.each do |ip|
200
+ # puts ip
201
+ # end
202
+ #
203
+ def each
204
+ return enum_for(:each) unless block_given?
205
+
206
+ case @family
207
+ when Socket::AF_INET
208
+ family_mask = IN4MASK
209
+ when Socket::AF_INET6
210
+ family_mask = IN6MASK
211
+ end
212
+
213
+ (0..((~@mask_addr) & family_mask)).each do |i|
214
+ yield _to_string(@addr | i)
215
+ end
216
+
217
+ return self
218
+ end
219
+
220
+ end