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
|