1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
module Specinfra
module Command
module Module
module Ss
def check_is_listening(port, options={})
if options[:local_address]
pattern = inaddr_any_to_asterisk(options[:local_address]).map { |l| " #{l}:#{port} " }
pattern = pattern.join('|')
else
pattern = ":#{port} "
end
"ss #{command_options(options[:protocol])} | grep -E -- #{escape(pattern)}"
end
private
# WORKAROUND:
# Older ss versions display "*" instead of "0.0.0.0".
# But serverspec validates IP address by `valid_ip_address?` method:
# https://github.com/serverspec/serverspec/blob/master/lib/serverspec/type/port.rb
def inaddr_any_to_asterisk(local_address)
if local_address == '0.0.0.0'
[ '\*' , '0\.0\.0\.0' ]
else
[ fix_format_if_ipv6(local_address) ]
end
end
def fix_format_if_ipv6(local_address)
if local_address =~ /.*:.*/
"\\[#{local_address}\\]"
else
local_address
end
end
def command_options(protocol)
case protocol.to_s
when 'tcp' then "-tnl4"
when 'tcp6' then "-tnl6"
when 'udp' then "-unl4"
when 'udp6' then "-unl6"
when '' then "-tunl"
else
raise ArgumentError, "Unknown protocol [#{protocol}]"
end
end
end
end
end
end
|