freyr 0.3.0 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/freyr.gemspec +4 -4
- data/lib/freyr/cli/helpers.rb +17 -3
- data/lib/freyr/cli/launching.rb +12 -29
- data/lib/freyr/cli.rb +0 -5
- data/lib/freyr/command.rb +12 -11
- data/lib/freyr/service.rb +22 -3
- data/lib/freyr/service_group.rb +68 -0
- data/lib/freyr/service_info.rb +6 -1
- data/lib/freyr.rb +1 -1
- metadata +7 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/freyr.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{freyr}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tal Atlas"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-09}
|
13
13
|
s.default_executable = %q{freyr}
|
14
14
|
s.description = %q{Define all services you need to run and this will launch,daemonize,and monitor them for you.}
|
15
15
|
s.email = %q{me@tal.by}
|
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
|
|
37
37
|
"lib/freyr/command.rb",
|
38
38
|
"lib/freyr/pinger.rb",
|
39
39
|
"lib/freyr/service.rb",
|
40
|
+
"lib/freyr/service_group.rb",
|
40
41
|
"lib/freyr/service_info.rb",
|
41
42
|
"spec/freyr_spec.rb",
|
42
43
|
"spec/spec.opts",
|
@@ -44,7 +45,7 @@ Gem::Specification.new do |s|
|
|
44
45
|
]
|
45
46
|
s.homepage = %q{http://github.com/Talby/freyr}
|
46
47
|
s.require_paths = ["lib"]
|
47
|
-
s.rubygems_version = %q{1.
|
48
|
+
s.rubygems_version = %q{1.5.0}
|
48
49
|
s.summary = %q{Service manager and runner}
|
49
50
|
s.test_files = [
|
50
51
|
"spec/freyr_spec.rb",
|
@@ -52,7 +53,6 @@ Gem::Specification.new do |s|
|
|
52
53
|
]
|
53
54
|
|
54
55
|
if s.respond_to? :specification_version then
|
55
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
56
56
|
s.specification_version = 3
|
57
57
|
|
58
58
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
data/lib/freyr/cli/helpers.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
module Freyr
|
2
2
|
class CLI < Thor
|
3
3
|
|
4
|
+
def initialize(*)
|
5
|
+
super
|
6
|
+
get_services
|
7
|
+
end
|
8
|
+
|
4
9
|
private
|
5
10
|
# Ugh, this is ugly, colorizing stuff is rough
|
6
11
|
def list_all_services(args={})
|
@@ -87,13 +92,22 @@ module Freyr
|
|
87
92
|
end
|
88
93
|
|
89
94
|
def get_from_name name
|
90
|
-
|
95
|
+
group = ServiceGroup.new
|
96
|
+
|
97
|
+
unless name
|
98
|
+
s = Service.s.find {|svc| svc.dir == Dir.pwd}
|
99
|
+
return group << s if s
|
100
|
+
end
|
91
101
|
|
92
102
|
if options.namespace && s = Service["#{options.namespace}:#{name}"].first
|
93
|
-
|
103
|
+
group << s # only pickng one because if it's namespaced it's not a group
|
94
104
|
else
|
95
|
-
Service[name]
|
105
|
+
Service[name].each do |s|
|
106
|
+
group << s
|
107
|
+
end
|
96
108
|
end
|
109
|
+
|
110
|
+
group
|
97
111
|
end
|
98
112
|
|
99
113
|
def get_services
|
data/lib/freyr/cli/launching.rb
CHANGED
@@ -9,20 +9,14 @@ module Freyr
|
|
9
9
|
names = services.collect {|s| s.name}
|
10
10
|
say "Starting the " << set_color(names.join(', '), :blue) << ' services'
|
11
11
|
|
12
|
-
changed_names = services.
|
13
|
-
begin
|
14
|
-
pid = s.start!
|
15
|
-
s.name if pid
|
16
|
-
rescue AdminRequired
|
17
|
-
say "Please run in sudo to launch #{s.name}.", :red
|
18
|
-
nil
|
19
|
-
end
|
20
|
-
end.compact
|
12
|
+
changed_names = services.run
|
21
13
|
|
22
14
|
list_all_services(:highlight_state => changed_names).each {|l| say(l)}
|
23
15
|
else
|
24
16
|
say "Can't find the #{name} service", :red
|
25
17
|
end
|
18
|
+
rescue AdminRequired
|
19
|
+
say "Please run in sudo to launch #{name}.", :red
|
26
20
|
end
|
27
21
|
|
28
22
|
desc 'stop [SERVICE=dirname]', 'Stop particular service'
|
@@ -31,43 +25,32 @@ module Freyr
|
|
31
25
|
if !services.empty?
|
32
26
|
names = services.collect {|s| s.name}
|
33
27
|
say "Stopping the " << set_color(names.join(', '), :blue) << ' services'
|
34
|
-
changed_names = services.collect {|s| s.name if s.alive?}.compact
|
35
28
|
|
36
|
-
services.
|
37
|
-
begin
|
38
|
-
s.stop!
|
39
|
-
rescue AdminRequired
|
40
|
-
say "Please run in sudo to stop #{s.name}.", :red
|
41
|
-
end
|
42
|
-
end
|
29
|
+
changed_names = services.stop
|
43
30
|
|
44
31
|
list_all_services(:highlight_state => changed_names).each {|l| say(l)}
|
45
32
|
else
|
46
33
|
say "Can't find the #{name} service", :red
|
47
|
-
end
|
34
|
+
end
|
35
|
+
rescue AdminRequired
|
36
|
+
say "Please run in sudo to stop #{name}.", :red
|
48
37
|
end
|
49
38
|
|
50
39
|
desc 'restart [SERVICE=dirname]', 'restart particular service'
|
51
40
|
def restart(name=nil)
|
52
41
|
services = get_from_name(name)
|
53
42
|
if !services.empty?
|
54
|
-
|
55
|
-
say "Restarting the " << set_color(names.join(', '), :blue) << ' services'
|
43
|
+
say "Restarting the " << set_color(services.collect {|s| s.name}.join(', '), :blue) << ' services'
|
56
44
|
|
57
|
-
services.
|
58
|
-
begin
|
59
|
-
s.restart!
|
60
|
-
rescue AdminRequired
|
61
|
-
say "Please run in sudo to launch #{s.name}.", :red
|
62
|
-
name.delete(s.name)
|
63
|
-
nil
|
64
|
-
end
|
65
|
-
end
|
45
|
+
names = services.restart
|
66
46
|
|
67
47
|
list_all_services(:highlight_state => names).each {|l| say(l)}
|
68
48
|
else
|
69
49
|
say "Can't find the #{name} service", :red
|
70
50
|
end
|
51
|
+
|
52
|
+
rescue AdminRequired
|
53
|
+
say "Please run in sudo to launch #{name}.", :red
|
71
54
|
end
|
72
55
|
|
73
56
|
end
|
data/lib/freyr/cli.rb
CHANGED
@@ -7,11 +7,6 @@ module Freyr
|
|
7
7
|
class CLI < Thor
|
8
8
|
include Thor::Actions
|
9
9
|
|
10
|
-
def initialize(*)
|
11
|
-
super
|
12
|
-
get_services
|
13
|
-
end
|
14
|
-
|
15
10
|
default_task :list
|
16
11
|
class_option :'config-file', :desc => 'config file to use', :type => :string
|
17
12
|
class_option :'ignore-local', :desc => "don't use the local Freyrfile or .freyrrc", :type => :boolean, :default => false
|
data/lib/freyr/command.rb
CHANGED
@@ -75,8 +75,7 @@ module Freyr
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def delete_if_dead
|
78
|
-
|
79
|
-
File.delete(pid_file) unless alive?
|
78
|
+
!alive?
|
80
79
|
end
|
81
80
|
|
82
81
|
def save
|
@@ -145,7 +144,7 @@ module Freyr
|
|
145
144
|
puts 'x',"Couldn't reach #{name} service"
|
146
145
|
end
|
147
146
|
else
|
148
|
-
puts 'x'
|
147
|
+
puts 'x', "Service died durring launch"
|
149
148
|
end
|
150
149
|
end
|
151
150
|
|
@@ -224,22 +223,24 @@ module Freyr
|
|
224
223
|
|
225
224
|
def spawn(command)
|
226
225
|
fork do
|
227
|
-
|
228
|
-
|
229
|
-
|
226
|
+
File.umask self.umask if self.umask
|
227
|
+
uid_num = Etc.getpwnam(self.uid).uid if uid
|
228
|
+
gid_num = Etc.getgrnam(self.gid).gid if gid
|
230
229
|
|
231
|
-
|
230
|
+
::Dir.chroot(self.chroot) if self.chroot
|
232
231
|
::Process.setsid
|
233
|
-
|
234
|
-
|
235
|
-
|
232
|
+
::Process.groups = [gid_num] if self.gid
|
233
|
+
::Process::Sys.setgid(gid_num) if self.gid
|
234
|
+
::Process::Sys.setuid(uid_num) if self.uid
|
236
235
|
chdir
|
237
236
|
$0 = "freyr - #{name} (#{command})"
|
238
237
|
STDIN.reopen "/dev/null"
|
239
238
|
if log_cmd
|
240
239
|
STDOUT.reopen IO.popen(log_cmd, "a")
|
241
|
-
elsif log
|
240
|
+
elsif log && service.write_log?
|
242
241
|
STDOUT.reopen log, "a"
|
242
|
+
else
|
243
|
+
STDOUT.reopen "/dev/null"
|
243
244
|
end
|
244
245
|
if err_log_cmd
|
245
246
|
STDERR.reopen IO.popen(err_log_cmd, "a")
|
data/lib/freyr/service.rb
CHANGED
@@ -17,7 +17,11 @@ module Freyr
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def log
|
20
|
-
@service_info.log || File.join(command.file_dir,"#{name}.log")
|
20
|
+
@service_info.read_log || @service_info.log || File.join(command.file_dir,"#{name}.log")
|
21
|
+
end
|
22
|
+
|
23
|
+
def write_log?
|
24
|
+
@service_info.log && !@service_info.read_log
|
21
25
|
end
|
22
26
|
|
23
27
|
def start!
|
@@ -51,6 +55,7 @@ module Freyr
|
|
51
55
|
|
52
56
|
def tail!(size = 600, follow = true)
|
53
57
|
f = follow ? 'f' : ''
|
58
|
+
Dir.chdir dir
|
54
59
|
exec("tail -#{size}#{f} #{log}")
|
55
60
|
end
|
56
61
|
|
@@ -96,12 +101,26 @@ module Freyr
|
|
96
101
|
@all_services += services
|
97
102
|
end
|
98
103
|
|
104
|
+
def alive?(name)
|
105
|
+
!!self[name].find do |ser|
|
106
|
+
ser.alive?
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
99
110
|
def [](name)
|
111
|
+
group = ServiceGroup.new
|
112
|
+
|
100
113
|
if ser = s.find {|sr| sr.matches?(name)}
|
101
|
-
|
114
|
+
group << ser
|
102
115
|
else
|
103
|
-
s.
|
116
|
+
s.each do |sr|
|
117
|
+
if sr.is_group?(name)
|
118
|
+
group << sr
|
119
|
+
end
|
120
|
+
end
|
104
121
|
end
|
122
|
+
|
123
|
+
group
|
105
124
|
end
|
106
125
|
|
107
126
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Freyr
|
2
|
+
class ServiceGroup < Array
|
3
|
+
|
4
|
+
def initialize(*args)
|
5
|
+
super(*args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def find_by_name(n)
|
9
|
+
find {|s| s.name == n}
|
10
|
+
end
|
11
|
+
|
12
|
+
# Take care this can make a stack overflow
|
13
|
+
def run
|
14
|
+
return [] if empty?
|
15
|
+
|
16
|
+
needs_to_run = ServiceGroup.new
|
17
|
+
|
18
|
+
kill = false
|
19
|
+
names = []
|
20
|
+
|
21
|
+
each do |svc|
|
22
|
+
|
23
|
+
unless svc.dependencies.empty?
|
24
|
+
if n = svc.dependencies.find {|s| !Service.alive?(s)}
|
25
|
+
if find_by_name(n)
|
26
|
+
needs_to_run << svc
|
27
|
+
elsif s = Service[n].first
|
28
|
+
needs_to_run << s
|
29
|
+
needs_to_run << svc
|
30
|
+
else
|
31
|
+
puts "Can't run #{svc.name} because dependency #{n} cannot be found"
|
32
|
+
kill = true
|
33
|
+
end
|
34
|
+
|
35
|
+
next
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
pid = svc.start!
|
40
|
+
names << svc.name if pid
|
41
|
+
end
|
42
|
+
|
43
|
+
names += needs_to_run.run unless kill
|
44
|
+
names
|
45
|
+
end
|
46
|
+
|
47
|
+
def stop
|
48
|
+
changed_names = collect {|s| s.name if s.alive?}.compact
|
49
|
+
each do |svc|
|
50
|
+
svc.stop!
|
51
|
+
end
|
52
|
+
|
53
|
+
changed_names
|
54
|
+
end
|
55
|
+
|
56
|
+
def restart
|
57
|
+
names = collect {|s| s.name}
|
58
|
+
|
59
|
+
each do |s|
|
60
|
+
s.restart!
|
61
|
+
names.delete(s.name)
|
62
|
+
end
|
63
|
+
|
64
|
+
names
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
data/lib/freyr/service_info.rb
CHANGED
@@ -4,11 +4,12 @@ module Freyr
|
|
4
4
|
|
5
5
|
ATTRS = [:name,:dir,:log_cmd,:log,:err_log_cmd,:err_log,:umask,
|
6
6
|
:uid,:gid,:chroot,:proc_match,:restart,:stop,:stop_sig,
|
7
|
-
:restart_sig,:sudo,:groups,:ping,:also]
|
7
|
+
:restart_sig,:sudo,:groups,:ping,:also,:dependencies,:read_log]
|
8
8
|
|
9
9
|
def initialize(name=nil, args={}, &block)
|
10
10
|
@groups = []
|
11
11
|
@also = []
|
12
|
+
@dependencies = []
|
12
13
|
if name.is_a?(Hash)
|
13
14
|
@name = name.keys.first
|
14
15
|
@groups << name[@name]
|
@@ -27,6 +28,10 @@ module Freyr
|
|
27
28
|
@groups |= val
|
28
29
|
end
|
29
30
|
|
31
|
+
def requires *val
|
32
|
+
@dependencies |= val
|
33
|
+
end
|
34
|
+
|
30
35
|
def also_as(*val)
|
31
36
|
@also |= val
|
32
37
|
end
|
data/lib/freyr.rb
CHANGED
@@ -4,6 +4,6 @@ module Freyr
|
|
4
4
|
VERSION = File.open(File.expand_path(File.dirname(__FILE__)+'/../VERSION')).read
|
5
5
|
end
|
6
6
|
|
7
|
-
%w{service_info service command pinger}.each do |f|
|
7
|
+
%w{service_info service_group service command pinger}.each do |f|
|
8
8
|
require File.expand_path(File.dirname(__FILE__)+"/freyr/#{f}.rb")
|
9
9
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: freyr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 2
|
10
|
+
version: 0.3.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tal Atlas
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-09 00:00:00 -04:00
|
19
19
|
default_executable: freyr
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/freyr/command.rb
|
92
92
|
- lib/freyr/pinger.rb
|
93
93
|
- lib/freyr/service.rb
|
94
|
+
- lib/freyr/service_group.rb
|
94
95
|
- lib/freyr/service_info.rb
|
95
96
|
- spec/freyr_spec.rb
|
96
97
|
- spec/spec.opts
|
@@ -125,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
126
|
requirements: []
|
126
127
|
|
127
128
|
rubyforge_project:
|
128
|
-
rubygems_version: 1.
|
129
|
+
rubygems_version: 1.5.0
|
129
130
|
signing_key:
|
130
131
|
specification_version: 3
|
131
132
|
summary: Service manager and runner
|