Class: Exec

Inherits:
Oxidized::Hook show all
Includes:
Process
Defined in:
lib/oxidized/hook/exec.rb

Instance Attribute Summary

Attributes inherited from Oxidized::Hook

#cfg

Instance Method Summary collapse

Methods inherited from Oxidized::Hook

#log

Constructor Details

#initializeExec

Returns a new instance of Exec.



4
5
6
7
8
# File 'lib/oxidized/hook/exec.rb', line 4

def initialize
  super
  @timeout = 60
  @async = false
end

Instance Method Details

#make_env(ctx) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/oxidized/hook/exec.rb', line 63

def make_env ctx
  env = {
    "OX_EVENT" => ctx.event.to_s
  }
  if ctx.node
    env.merge!(
      "OX_NODE_NAME" => ctx.node.name.to_s,
      "OX_NODE_FROM" => ctx.node.from.to_s,
      "OX_NODE_MSG" => ctx.node.msg.to_s,
      "OX_NODE_GROUP" => ctx.node.group.to_s,
      "OX_EVENT" => ctx.event.to_s,
    )
  end
  if ctx.job
    env.merge!(
      "OX_JOB_STATUS" => ctx.job.status.to_s,
      "OX_JOB_TIME" => ctx.job.time.to_s,
    )
  end
  env
end

#run_cmd!(env) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/oxidized/hook/exec.rb', line 45

def run_cmd! env
  pid, status = nil, nil
  Timeout.timeout(@timeout) do
    pid = spawn env, @cmd , :unsetenv_others => true
    pid, status = wait2 pid
    unless status.exitstatus.zero?
      msg = "#{@cmd.inspect} failed with exit value #{status.exitstatus}"
      log msg, :error
      raise msg
    end
  end
rescue TimeoutError
  kill "TERM", pid
  msg = "#{@cmd} timed out"
  log msg, :error
  raise TimeoutError, msg
end

#run_hook(ctx) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/oxidized/hook/exec.rb', line 32

def run_hook ctx
  env = make_env ctx
  log "Execute: #{@cmd.inspect}", :debug
  th = Thread.new do
    begin
      run_cmd! env
    rescue => e
      raise e unless @async
    end
  end
  th.join unless @async
end

#validate_cfg!Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/oxidized/hook/exec.rb', line 10

def validate_cfg!
  # Syntax check
  if cfg.has_key? "timeout"
    @timeout = cfg.timeout
    raise "invalid timeout value" unless @timeout.is_a?(Integer) &&
                                         @timeout > 0
  end

  if cfg.has_key? "async"
    @async = !!cfg.async
  end

  if cfg.has_key? "cmd"
    @cmd = cfg.cmd
    raise "invalid cmd value" unless @cmd.is_a?(String) || @cmd.is_a?(Array)
  end

rescue RuntimeError => e
  raise ArgumentError,
    "#{self.class.name}: configuration invalid: #{e.message}"
end