summaryrefslogtreecommitdiffstats
path: root/ext/nagios/check_puppet.rb
blob: b65ede33a3b3bc2b31608ab81f2f717553a628bf (plain)
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
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env ruby

require 'optparse'
require 'sys/proctable'
include Sys

class CheckPuppet

  VERSION = '0.1'
  script_name = File.basename($0)

  # default options
  OPTIONS = {
     :statefile   => "/var/puppet/state/state.yaml",
     :process     => "puppetd",
     :interval    => 30,
  }

  o = OptionParser.new do |o|    
    o.set_summary_indent('  ')
    o.banner =    "Usage: #{script_name} [OPTIONS]"
    o.define_head "The check_puppet Nagios plug-in checks that specified " +
                  "Puppet process is running and the state file is no " +
                  "older than specified interval."
    o.separator   ""
    o.separator   "Mandatory arguments to long options are mandatory for " +
                  "short options too."
  
    o.on("-s", "--statefile=statefile", String, "The state file",
         "Default: #{OPTIONS[:statefile]}") { |OPTIONS[:statefile]| }
    o.on("-p", "--process=processname", String, "The process to check",
         "Default: #{OPTIONS[:process]}")   { |OPTIONS[:process]| }
    o.on("-i", "--interval=value", Integer, 
         "Default: #{OPTIONS[:interval]} minutes")  { |OPTIONS[:interval]| }
     
    o.separator ""
    o.on_tail("-h", "--help", "Show this help message.") do 
      puts o
      exit  
    end
  
    o.parse!(ARGV)
   end

  def check_proc

    unless ProcTable.ps.find { |p| p.name == OPTIONS[:process]}
      @proc = 2
    else
      @proc = 0 
    end
  
  end

  def check_state

    # Set variables
    curt = Time.now
    intv = OPTIONS[:interval] * 60

    # Check file time
    begin
      @modt = File.mtime("#{OPTIONS[:statefile]}")
    rescue
      @file = 3
    end
 
    diff = (curt - @modt).to_i

    if diff > intv
      @file = 2
    else
      @file = 0
    end

  end

  def output_status
   
    case @file
    when 0
      state = "state file status okay updated on " + @modt.strftime("%m/%d/%Y at %H:%M:%S")
    when 2
      state = "state fille is not up to date and is older than #{OPTIONS[:interval]} minutes"
    when 3
      state = "state file status unknown"
    end

    case @proc
    when 0
      process = "process #{OPTIONS[:process]} is running"
    when 2
      process = "process #{OPTIONS[:process]} is not running" 
    end

    case @proc or @file
    when 0
      status = "OK"
      exitcode = 0
    when 2
      status = "CRITICAL"
      exitcode = 2
    when 3
      status = "UNKNOWN"
      exitcide = 3
    end

    puts "PUPPET " + status + ": " + process + ", " + state
    exit(exitcode)
 end
end

cp = CheckPuppet.new
cp.check_proc
cp.check_state
cp.output_status