lib/ronin/network/udp.rb in ronin-support-0.3.0 vs lib/ronin/network/udp.rb in ronin-support-0.4.0.rc1
- old
+ new
@@ -15,6 +15,234 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
#
-require 'ronin/network/extensions/udp'
+require 'socket'
+
+module Ronin
+ module Network
+ #
+ # Provides helper methods for using the UDP protocol.
+ #
+ module UDP
+ #
+ # Creates a new UDPSocket object connected to a given host and port.
+ #
+ # @param [String] host
+ # The host to connect to.
+ #
+ # @param [Integer] port
+ # The port to connect to.
+ #
+ # @param [String] local_host (nil)
+ # The local host to bind to.
+ #
+ # @param [Integer] local_port (nil)
+ # The local port to bind to.
+ #
+ # @yield [socket]
+ # If a block is given, it will be passed the newly created socket.
+ #
+ # @yieldparam [UDPsocket] socket
+ # The newly created UDPSocket object.
+ #
+ # @return [UDPSocket]
+ # The newly created UDPSocket object.
+ #
+ # @example
+ # udp_connect('www.hackety.org',80)
+ # # => UDPSocket
+ #
+ # @example
+ # udp_connect('www.wired.com',80) do |sock|
+ # puts sock.readlines
+ # end
+ #
+ # @api public
+ #
+ def udp_connect(host,port,local_host=nil,local_port=nil)
+ host = host.to_s
+ local_host = if local_host
+ local_host.to_s
+ end
+
+ socket = UDPSocket.new
+ socket.bind(local_host,local_port) if (local_host && local_port)
+ socket.connect(host,port)
+
+ yield socket if block_given?
+ return socket
+ end
+
+ #
+ # Creates a new UDPSocket object, connected to a given host and port.
+ # The given data will then be written to the newly created UDPSocket.
+ #
+ # @param [String] data
+ # The data to send through the connection.
+ #
+ # @param [String] host
+ # The host to connect to.
+ #
+ # @param [Integer] port
+ # The port to connect to.
+ #
+ # @param [String] local_host (nil)
+ # The local host to bind to.
+ #
+ # @param [Integer] local_port (nil)
+ # The local port to bind to.
+ #
+ # @yield [socket]
+ # If a block is given, it will be passed the newly created socket.
+ #
+ # @yieldparam [UDPsocket] socket
+ # The newly created UDPSocket object.
+ #
+ # @return [UDPSocket]
+ # The newly created UDPSocket object.
+ #
+ # @api public
+ #
+ def udp_connect_and_send(data,host,port,local_host=nil,local_port=nil)
+ sock = udp_connect(host,port,local_host,local_port)
+ sock.write(data)
+
+ yield sock if block_given?
+ return sock
+ end
+
+ #
+ # Creates a new temporary UDPSocket object, connected to the given host
+ # and port.
+ #
+ # @param [String] host
+ # The host to connect to.
+ #
+ # @param [Integer] port
+ # The port to connect to.
+ #
+ # @param [String] local_host (nil)
+ # The local host to bind to.
+ #
+ # @param [Integer] local_port (nil)
+ # The local port to bind to.
+ #
+ # @yield [socket]
+ # If a block is given, it will be passed the newly created socket.
+ # After the block has returned, the socket will then be closed.
+ #
+ # @yieldparam [UDPsocket] socket
+ # The newly created UDPSocket object.
+ #
+ # @return [nil]
+ #
+ # @api public
+ #
+ def udp_session(host,port,local_host=nil,local_port=nil)
+ sock = udp_connect(host,port,local_host,local_port)
+
+ yield sock if block_given?
+
+ sock.close
+ return nil
+ end
+
+ #
+ # Reads the banner from the service running on the given host and port.
+ #
+ # @param [String] host
+ # The host to connect to.
+ #
+ # @param [Integer] port
+ # The port to connect to.
+ #
+ # @param [String] local_host (nil)
+ # The local host to bind to.
+ #
+ # @param [Integer] local_port (nil)
+ # The local port to bind to.
+ #
+ # @yield [banner]
+ # If a block is given, it will be passed the grabbed banner.
+ #
+ # @yieldparam [String] banner
+ # The grabbed banner.
+ #
+ # @return [String]
+ # The grabbed banner.
+ #
+ # @api public
+ #
+ def udp_banner(host,port,local_host=nil,local_port=nil)
+ banner = nil
+
+ udp_session(host,port,local_host,local_port) do |sock|
+ banner = sock.readline
+ end
+
+ yield banner if block_given?
+ return banner
+ end
+
+ #
+ # Creates a new UDPServer listening on a given host and port.
+ #
+ # @param [Integer] port
+ # The local port to listen on.
+ #
+ # @param [String] host ('0.0.0.0')
+ # The host to bind to.
+ #
+ # @return [UDPServer]
+ # The new UDP server.
+ #
+ # @example
+ # udp_server(1337)
+ #
+ # @api public
+ #
+ def udp_server(port,host='0.0.0.0')
+ host = host.to_s
+ server = UDPSocket.new
+
+ server.bind(host,port)
+
+ yield server if block_given?
+ return server
+ end
+
+ #
+ # Creates a new temporary UDPServer listening on a given host and port.
+ #
+ # @param [Integer] port
+ # The local port to bind to.
+ #
+ # @param [String] host ('0.0.0.0')
+ # The host to bind to.
+ #
+ # @yield [server]
+ # The block which will be called after the server has been created.
+ # After the block has finished, the server will be closed.
+ #
+ # @yieldparam [UDPServer] server
+ # The newly created UDP server.
+ #
+ # @return [nil]
+ #
+ # @example
+ # udp_server_session(1337) do |server|
+ # data, sender = server.recvfrom(1024)
+ # end
+ #
+ # @api public
+ #
+ def udp_server_session(port,host='0.0.0.0',&block)
+ server = udp_server(port,host,&block)
+
+ server.close()
+ return nil
+ end
+ end
+ end
+end