Class: Inspec::Resources::Host

Inherits:
Object
  • Object
show all
Defined in:
lib/inspec/resources/host.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hostname, params = {}) ⇒ Host

Returns a new instance of Host.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/inspec/resources/host.rb', line 47

def initialize(hostname, params = {})
  @hostname = hostname
  @port = params[:port]

  if params[:proto]
    Inspec.deprecate(:host_resource_proto_usage, "The `host` resource `proto` resource parameter is deprecated. Please use `protocol`.")
    @protocol = params[:proto]
  else
    @protocol = params.fetch(:protocol, "icmp")
  end

  @host_provider = nil
  if inspec.os.linux?
    @host_provider = LinuxHostProvider.new(inspec)
  elsif inspec.os.windows?
    return skip_resource "Invalid protocol: only `tcp` and `icmp` protocols are support for the `host` resource on your OS." unless
      %w{icmp tcp}.include?(@protocol)

    @host_provider = WindowsHostProvider.new(inspec)
  elsif inspec.os.darwin?
    @host_provider = DarwinHostProvider.new(inspec)
  else
    return skip_resource "The `host` resource is not supported on your OS yet."
  end

  missing_requirements = @host_provider.missing_requirements(protocol)
  unless missing_requirements.empty?
    skip_resource "The following requirements are not met for this resource: " \
      "#{missing_requirements.join(", ")}"
  end
end

Instance Attribute Details

#hostnameObject (readonly)

Returns the value of attribute hostname.



45
46
47
# File 'lib/inspec/resources/host.rb', line 45

def hostname
  @hostname
end

#portObject (readonly)

Returns the value of attribute port.



45
46
47
# File 'lib/inspec/resources/host.rb', line 45

def port
  @port
end

#protocolObject (readonly)

Returns the value of attribute protocol.



45
46
47
# File 'lib/inspec/resources/host.rb', line 45

def protocol
  @protocol
end

Instance Method Details

#connectionObject



103
104
105
# File 'lib/inspec/resources/host.rb', line 103

def connection
  ping[:connection]
end

#ipaddressObject

returns all A records of the IP address, will return an array



112
113
114
# File 'lib/inspec/resources/host.rb', line 112

def ipaddress
  resolve.nil? || resolve.empty? ? nil : resolve
end

#ipv4_addressObject

returns an array of the ipv4 addresses



117
118
119
# File 'lib/inspec/resources/host.rb', line 117

def ipv4_address
  ipaddress.select { |ip| ip.match(Resolv::IPv4::Regex) }
end

#ipv6_addressObject

returns an array of the ipv6 addresses



122
123
124
# File 'lib/inspec/resources/host.rb', line 122

def ipv6_address
  ipaddress.select { |ip| ip.match(Resolv::IPv6::Regex) }
end

#protoObject



79
80
81
82
# File 'lib/inspec/resources/host.rb', line 79

def proto
  Inspec.deprecate(:host_resource_proto_usage, "The host resource `proto` method is deprecated. Please use `protocol`.")
  protocol
end

#reachable?Boolean

Returns:

  • (Boolean)


90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/inspec/resources/host.rb', line 90

def reachable?
  # ping checks do not require port or protocol
  return ping.fetch(:success, false) if protocol == "icmp"

  # if either port or protocol are specified but not both, we cannot proceed.
  if port.nil? || protocol.nil?
    raise "Protocol required with port. Use `host` resource with host('#{hostname}', port: 1234, proto: 'tcp') parameters." if port.nil? || protocol.nil?
  end

  # perform the protocol-specific reachability test
  ping.fetch(:success, false)
end

#resolvable?(type = nil) ⇒ Boolean

if we get the IP address, the host is resolvable

Returns:

  • (Boolean)


85
86
87
88
# File 'lib/inspec/resources/host.rb', line 85

def resolvable?(type = nil)
  warn "The `host` resource ignores #{type} parameters. Continue to resolve host." unless type.nil?
  resolve.nil? || resolve.empty? ? false : true
end

#resource_idObject



133
134
135
# File 'lib/inspec/resources/host.rb', line 133

def resource_id
  port ? "#{hostname}-#{port}-#{protocol}" : hostname
end

#socketObject



107
108
109
# File 'lib/inspec/resources/host.rb', line 107

def socket
  ping[:socket]
end

#to_sObject



126
127
128
129
130
131
# File 'lib/inspec/resources/host.rb', line 126

def to_s
  resource_name = "Host #{hostname}"
  resource_name += " port #{port} proto #{protocol}" if port

  resource_name
end