Class: Bones::RPC::Address
- Inherits:
-
Object
- Object
- Bones::RPC::Address
- Defined in:
- lib/bones/rpc/address.rb
Overview
Encapsulates behaviour around addresses and resolving dns.
Instance Attribute Summary collapse
-
#host ⇒ String
The host name.
-
#ip ⇒ String
The ip address.
-
#original ⇒ String
The original host name.
- #path ⇒ Object readonly
- #port ⇒ Object
-
#resolved ⇒ String
(also: #to_s)
The full resolved address.
Instance Method Summary collapse
-
#initialize(address, port = nil) ⇒ Address
constructor
Instantiate the new address.
- #inspect ⇒ Object
- #ipv4? ⇒ Boolean
- #ipv6? ⇒ Boolean
-
#resolve(node) ⇒ String
Resolve the address for the provided node.
- #resolve! ⇒ Object
- #unix? ⇒ Boolean
- #valid? ⇒ Boolean (also: #connectable?)
- #valid_ip? ⇒ Boolean
- #valid_port? ⇒ Boolean
Constructor Details
#initialize(address, port = nil) ⇒ Address
Instantiate the new address.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/bones/rpc/address.rb', line 32 def initialize(address, port = nil) if address.is_a?(Bones::RPC::Address) @host = address.host @ip = address.ip @original = address.original @port = address.port @path = address.path return end if port.nil? @original = address else @original = "#{address}:#{port}" end end |
Instance Attribute Details
#host ⇒ String
Returns The host name.
22 23 24 |
# File 'lib/bones/rpc/address.rb', line 22 def host @host end |
#ip ⇒ String
Returns The ip address.
22 |
# File 'lib/bones/rpc/address.rb', line 22 attr_reader :host, :ip, :original, :path, :port |
#original ⇒ String
Returns The original host name.
22 |
# File 'lib/bones/rpc/address.rb', line 22 attr_reader :host, :ip, :original, :path, :port |
#path ⇒ Object (readonly)
22 23 24 |
# File 'lib/bones/rpc/address.rb', line 22 def path @path end |
#port ⇒ Object
22 |
# File 'lib/bones/rpc/address.rb', line 22 attr_reader :host, :ip, :original, :path, :port |
#resolved ⇒ String Also known as: to_s
Returns The full resolved address.
22 |
# File 'lib/bones/rpc/address.rb', line 22 attr_reader :host, :ip, :original, :path, :port |
Instance Method Details
#inspect ⇒ Object
49 50 51 |
# File 'lib/bones/rpc/address.rb', line 49 def inspect "<#{self.class} \"#{to_s}\">" end |
#ipv4? ⇒ Boolean
53 54 55 |
# File 'lib/bones/rpc/address.rb', line 53 def ipv4? ip.is_a?(Resolv::IPv4) end |
#ipv6? ⇒ Boolean
57 58 59 |
# File 'lib/bones/rpc/address.rb', line 57 def ipv6? ip.is_a?(Resolv::IPv6) end |
#resolve(node) ⇒ String
Resolve the address for the provided node. If the address cannot be resolved the node will be flagged as down.
103 104 105 106 107 108 109 110 111 |
# File 'lib/bones/rpc/address.rb', line 103 def resolve(node) begin resolve! unless valid? valid? rescue Resolv::ResolvError, SocketError => e node.instrument(Node::WARN, prefix: " BONES-RPC:", message: "Could not resolve IP or UNIX path for: #{original}") node.down and false end end |
#resolve! ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/bones/rpc/address.rb', line 113 def resolve! address = @original host = nil path = nil if address.is_a?(String) && port.nil? if !!(address =~ /\Aunix:/) # UNIX path = address.gsub(/\Aunix:/, '') elsif !!(address =~ /\A\[.+\]\:\d+\z/) # IPv6 host, port = address.split(']:') host.gsub!(/\A\[/, '') else # IPv4 (hopefully) host, port = address.split(':') end end if path # Ensure path is valid @path = ::Socket.unpack_sockaddr_un(::Socket.pack_sockaddr_un(path)) return elsif port.nil? raise ArgumentError, "wrong number of arguments (1 for 2)" else @host = host || address @port = port.to_i end # Is it an IPv4 address? if !!(Resolv::IPv4::Regex =~ @host) @ip = Resolv::IPv4.create(@host) end # Guess it's not IPv4! Is it IPv6? unless @ip if !!(Resolv::IPv6::Regex =~ @host) @original = "[#{@host}]:#{@port}" @ip = Resolv::IPv6.create(@host) end end # Guess it's not an IP address, so let's try DNS unless @ip addrs = Array(::Bones::RPC::DNSResolver.new.resolve(@host)) raise Resolv::ResolvError, "DNS result has no information for #{@host}" if addrs.empty? # Pseudorandom round-robin DNS support :/ @ip = addrs[rand(addrs.size)] end if !valid_ip? raise ArgumentError, "unsupported address class: #{@ip.class}" end end |
#unix? ⇒ Boolean
75 76 77 |
# File 'lib/bones/rpc/address.rb', line 75 def unix? path.is_a?(String) end |
#valid? ⇒ Boolean Also known as: connectable?
79 80 81 |
# File 'lib/bones/rpc/address.rb', line 79 def valid? unix? or (valid_ip? and valid_port?) end |
#valid_ip? ⇒ Boolean
84 85 86 |
# File 'lib/bones/rpc/address.rb', line 84 def valid_ip? ipv4? or ipv6? end |
#valid_port? ⇒ Boolean
88 89 90 |
# File 'lib/bones/rpc/address.rb', line 88 def valid_port? !port.nil? && port != 0 end |