class God::Conditions::SocketResponding

Condition Symbol :socket_running Type: Poll

Trigger when a TCP or UNIX socket is running or not

Parameters Required

+family+ is the family of socket: either 'tcp' or 'unix'
--one of port or path--
+port+ is the port (required if +family+ is 'tcp')
+path+ is the path (required if +family+ is 'unix')

Optional

+responding+ is the boolean specifying whether you want to trigger if the socket is responding (true)
             or if it is not responding (false) (default false)

Examples

Trigger if the TCP socket on port 80 is not responding or the connection is refused

on.condition(:socket_responding) do |c|

c.family = 'tcp'
c.port = '80'

end

Trigger if the socket is not responding or the connection is refused (use alternate compact socket interface)

on.condition(:socket_responding) do |c|

c.socket = 'tcp:80'

end

Trigger if the socket is responding

on.condition(:socket_responding) do |c|

c.socket = 'tcp:80'
c.responding = true

end

Trigger if the socket is not responding or the connection is refused 5 times in a row

on.condition(:socket_responding) do |c|

c.socket = 'tcp:80'
c.times = 5

end

Trigger if the Unix socket on path ‘/tmp/sock’ is not responding or non-existent

on.condition(:socket_responding) do |c|

c.family = 'unix'
c.port = '/tmp/sock'

end

Attributes

addr[RW]
family[RW]
path[RW]
port[RW]
responding[RW]
times[RW]

Public Instance Methods

prepare() click to toggle source
# File lib/god/conditions/socket_responding.rb, line 74
def prepare
  if self.times.kind_of?(Integer)
    self.times = [self.times, self.times]
  end

  @timeline = Timeline.new(self.times[1])
  @history = Timeline.new(self.times[1])
end
reset() click to toggle source
# File lib/god/conditions/socket_responding.rb, line 83
def reset
  @timeline.clear
  @history.clear
end
socket=(s) click to toggle source
# File lib/god/conditions/socket_responding.rb, line 88
def socket=(s)
  components = s.split(':')
  if components.size == 3
    @family,@addr,@port = components
    @port = @port.to_i
  elsif components[0] =~ /^tcp$/
    @family = components[0]
    @port = components[1].to_i
  elsif components[0] =~ /^unix$/
    @family = components[0]
    @path = components[1]
  end
end
test() click to toggle source
# File lib/god/conditions/socket_responding.rb, line 114
def test
  self.info = []
  if self.family == 'tcp'
    begin
      s = TCPSocket.new(self.addr, self.port)
    rescue SystemCallError
    end
    status = self.responding == !s.nil?
  elsif self.family == 'unix'
    begin
      s = UNIXSocket.new(self.path)
    rescue SystemCallError
    end
    status = self.responding == !s.nil?
  else
    status = false
  end
  @timeline.push(status)
  history = "[" + @timeline.map {|t| t ? '*' : ''}.join(',') + "]"
  if @timeline.select { |x| x }.size >= self.times.first
    self.info = "socket out of bounds #{history}"
    return true
  else
    return false
  end
end
valid?() click to toggle source
# File lib/god/conditions/socket_responding.rb, line 102
def valid?
  valid = true
  if self.family == 'tcp' and @port == 0
    valid &= complain("Attribute 'port' must be specified for tcp sockets", self)
  end
  if self.family == 'unix' and self.path.nil?
    valid &= complain("Attribute 'path' must be specified for unix sockets", self)
  end
  valid = false unless %w{tcp unix}.member?(self.family)
  valid
end

Public Class Methods

new() click to toggle source
# File lib/god/conditions/socket_responding.rb, line 61
def initialize
  super
  # default to tcp on the localhost
  self.family = 'tcp'
  self.addr = '127.0.0.1'
  # Set these to nil/0 values
  self.port = 0
  self.path = nil
  self.responding = false

  self.times = [1, 1]
end