summaryrefslogtreecommitdiffstats
path: root/lib/blink/objects/process.rb
blob: e2e5722fc8c14687fbf37973ce75e1130d145781 (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
#!/usr/local/bin/ruby -w

require 'blink/operation'
require 'blink/operation/processes'

# DISABLED
# I'm only working on services, not processes, right now

module Blink
    class Attribute
        class ProcessRunning < Attribute
            def retrieve
                running = 0
                regex = Regexp.new(@params[:pattern])
                begin
                    # this ps is only tested on Solaris
                    # XXX yeah, this definitely needs to be fixed...
                    %x{ps -ef -U #{@params[:user]}}.split("\n").each { |process|
                        if regex.match(process)
                            running += 1
                        end
                    }
                rescue
                    # this isn't correct, but what the hell
                    Blink::Message.new(
                        :level => :error,
                        :source => self.object,
                        :message => "Failed to run ps"
                    )
                end

                self.state = running
                Blink.debug "there are #{running} #{self.object} processes for start"
            end

            def <=>(other)
                self.state < 1
            end

            def fix
                require 'etc'
                # ruby is really cool
                uid = 0
                if @params[:user].is_a? Integer
                    uid = @params[:user]
                else
                    uid = Etc.getpwnam(@params[:user]).uid
                end
                Kernel.fork {
                    Process.uid = uid
                    Process.euid = uid
                    string = @params[:binary] + (@params[:arguments] || "")
                    Blink::Message.new(
                        :level => :notice,
                        :source => self.object,
                        :message => "starting"
                    )
                    Kernel.exec(string)
                }
            end
        end
    end
	class Objects
		class BProcess < Objects
			attr_reader :stat, :path
			@params = [:start, :stop, :user, :pattern, :binary, :arguments]
            @name = :process

			@namevar = :pattern

			Blink::Relation.new(self, Blink::Operation::Start, {
				:user => :user,
				:pattern => :pattern,
				:binary => :binary,
				:arguments => :arguments
			})

			Blink::Relation.new(self, Blink::Operation::Stop, {
				:user => :user,
				:pattern => :pattern
			})

		end # Blink::Objects::BProcess
	end # Blink::Objects

end