summaryrefslogtreecommitdiffstats
path: root/ext/nagios/check_puppet.rb
blob: c569566ad9dbf7b4b41788b0da15c73eaf4507ae (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/lib/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