freyr 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|