erlnixify 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/erlnixify/node.rb +66 -13
- data/lib/erlnixify/opts.rb +116 -23
- data/lib/erlnixify/settings.rb +3 -4
- data/lib/erlnixify/version.rb +1 -1
- data/lib/erlnixify.rb +26 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MzMyZjgxN2IxNDliNTAyOWY2MGI0MzQ5MzQyMDkzZTcyNTAwNDE4OQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTU4NDIzMDA0NDFmNGYzMGNhNTY1MmNlNmMzM2UwZWJmMjY0MTkxZQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
N2IxYTAxODg4YWM1MThiYWRjMTcwYzI4NzRkZGNjOTY3NDQ5Njk1ZjEyMGFm
|
10
|
+
ZDFkOGMzNjRlNDdlMzMwNGIzY2U0NTUzNTc5MDI1OTI1YWZlNjVjZTYxOWY3
|
11
|
+
ODIzODQ1ZTBkNTdkZmU1YWVjZGZlZjkyZmM4YzZhMTY4MzE0ODQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWMyNWY2ZWQ4MTNiMjMzMjgwMzU0ZGZlMzZkNjk1Yjk2NjI4OTBmZTVlMWFj
|
14
|
+
ODhlNWZiNGMwOTk2YTlhNDY1MTYwNzNiNmMzMTc2Y2I2MGZlYjg1MTU3ZWUw
|
15
|
+
NmY1OGRhMzVlNDdiMmFjNzY1NmIwOWMyODQ5NDcwMWQzNzU2ODU=
|
data/lib/erlnixify/node.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'logger'
|
2
|
+
require 'timeout'
|
2
3
|
require 'erlnixify/exceptions'
|
3
4
|
|
4
5
|
module Erlnixify
|
@@ -24,27 +25,52 @@ module Erlnixify
|
|
24
25
|
@log = Logger.new(STDOUT)
|
25
26
|
@log.level = Logger::DEBUG
|
26
27
|
|
28
|
+
end
|
29
|
+
|
30
|
+
def start
|
31
|
+
self.start_deamon
|
32
|
+
|
27
33
|
Signal.trap("TERM") do
|
28
|
-
|
34
|
+
# This is going to propagate to the running erlang
|
35
|
+
# node. Unfortunately, there is no way to stop that that I
|
36
|
+
# have found yet. Hopefully, in the near future we can resolve
|
37
|
+
# that.
|
29
38
|
raise NodeError, "SIGTERM recieved, shutting down"
|
30
39
|
end
|
31
40
|
|
32
41
|
Signal.trap("INT") do
|
33
|
-
|
42
|
+
# This is going to propagate to the running erlang
|
43
|
+
# node. Unfortunately, there is no way to stop that that I
|
44
|
+
# have found yet. Hopefully, in the near future we can resolve
|
45
|
+
# that.
|
34
46
|
raise NodeError, "SIGINT recieved, shutting down"
|
35
47
|
end
|
36
48
|
|
37
49
|
at_exit { self.external_kill }
|
50
|
+
|
51
|
+
@log.debug "waiting for #{@settings[:startuptimeout]} seconds for startup"
|
52
|
+
sleep @settings[:startuptimeout]
|
53
|
+
self.monitor
|
38
54
|
end
|
39
55
|
|
40
|
-
def
|
41
|
-
|
56
|
+
def start_deamon
|
57
|
+
begin
|
58
|
+
self.status
|
59
|
+
rescue NodeError => msg
|
60
|
+
return self.raw_start_deamon
|
61
|
+
end
|
62
|
+
raise NodeError, "Already started"
|
63
|
+
end
|
64
|
+
|
65
|
+
def raw_start_deamon
|
66
|
+
@log.debug "starting daemon"
|
42
67
|
env = {}
|
43
68
|
env["HOME"] = @settings[:home] if @settings[:home]
|
44
69
|
|
45
70
|
begin
|
46
71
|
@log.debug "spawning command '#{@command}' with #{env}"
|
47
72
|
@pid = Process.spawn(env, @command)
|
73
|
+
Process.detach @pid
|
48
74
|
rescue Errno::ENOENT
|
49
75
|
@log.debug "Invalid command provided, raising error"
|
50
76
|
raise NodeError, "Command does not exist"
|
@@ -52,7 +78,7 @@ module Erlnixify
|
|
52
78
|
|
53
79
|
@log.debug "waiting for #{@settings[:startuptimeout]} seconds for startup"
|
54
80
|
sleep @settings[:startuptimeout]
|
55
|
-
self.
|
81
|
+
self.status
|
56
82
|
end
|
57
83
|
|
58
84
|
def monitor
|
@@ -80,15 +106,27 @@ module Erlnixify
|
|
80
106
|
end
|
81
107
|
end
|
82
108
|
|
109
|
+
def status
|
110
|
+
begin
|
111
|
+
Timeout.timeout(@settings[:checktimeout]) do
|
112
|
+
self.raw_check
|
113
|
+
end
|
114
|
+
rescue Timeout::Error
|
115
|
+
self.halt_nicely
|
116
|
+
raise NodeError, "Check command timeout occurred"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
83
120
|
def raw_check
|
84
|
-
@log.debug "Checking the status of Pid #{@pid}"
|
85
121
|
@log.debug "#{@check_command} =~ #{@checkregex}"
|
86
122
|
result = `#{@check_command}`
|
87
|
-
@log.debug "
|
123
|
+
@log.debug "result #{result}"
|
88
124
|
if not (result =~ @checkregex)
|
89
|
-
@log.
|
125
|
+
@log.info "invalid state"
|
90
126
|
self.halt_nicely
|
91
127
|
raise NodeError, "Node check failed"
|
128
|
+
else
|
129
|
+
@log.info "running"
|
92
130
|
end
|
93
131
|
end
|
94
132
|
|
@@ -106,24 +144,39 @@ module Erlnixify
|
|
106
144
|
end
|
107
145
|
end
|
108
146
|
|
109
|
-
def
|
147
|
+
def stop
|
148
|
+
@log.debug "Executing halt nicely: #{@halt_command}"
|
110
149
|
`#{@halt_command}`
|
111
|
-
|
150
|
+
if not $?
|
151
|
+
sleep @settings[:checkinterval]
|
152
|
+
else
|
153
|
+
raise NodeError, "Got status #{$?}"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def halt_nicely
|
112
158
|
if self.is_running?
|
159
|
+
@log.debug "Executing halt nicely: #{@halt_command}"
|
160
|
+
`#{@halt_command}`
|
161
|
+
sleep @settings[:checkinterval]
|
113
162
|
self.halt_brutally
|
114
163
|
end
|
115
164
|
end
|
116
165
|
|
117
166
|
def halt_brutally
|
118
|
-
`#{@brutal_halt_command}`
|
119
|
-
sleep @settings[:checkinterval]
|
120
167
|
if self.is_running?
|
168
|
+
@log.debug "Executing halt brutally: #{@brutal_halt_command}"
|
169
|
+
`#{@brutal_halt_command}`
|
170
|
+
sleep @settings[:checkinterval]
|
121
171
|
self.external_kill
|
122
172
|
end
|
123
173
|
end
|
124
174
|
|
125
175
|
def external_kill
|
126
|
-
|
176
|
+
if self.is_running?
|
177
|
+
@log.debug "Killing pid: #{@pid}"
|
178
|
+
Process.kill("KILL", @pid) if @pid
|
179
|
+
end
|
127
180
|
end
|
128
181
|
|
129
182
|
def interpolate_cmd(cmd)
|
data/lib/erlnixify/opts.rb
CHANGED
@@ -8,37 +8,130 @@ module Erlnixify
|
|
8
8
|
#
|
9
9
|
class Opts
|
10
10
|
|
11
|
-
attr_reader :options, :opts
|
11
|
+
attr_reader :options, :opts, :command
|
12
12
|
|
13
13
|
def initialize(args)
|
14
|
+
cmd = :start
|
14
15
|
@opts = Slop.parse(args) do
|
15
16
|
|
16
17
|
banner = "Usage: erlnixify [options]"
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
19
|
+
command 'startdeamon' do
|
20
|
+
on :b, :release=, 'Release Root Directory'
|
21
|
+
on :e, :erlang=, 'Erlang Root Directory'
|
22
|
+
on :o, :home=, "The home directory to explicitly set"
|
23
|
+
on :n, :name=, "The short name of the node to be managed"
|
24
|
+
on :fullnode=, "The fully qualified node name"
|
25
|
+
on :m, :command=, "The command to run to start the release"
|
26
|
+
on :k, :check=, "The command to check if the release is active"
|
27
|
+
on :r, :checkregex=, "The regex that must match to the output of check command"
|
28
|
+
on :x, :cookiefile=, "A file that contains the erlang cookie, not needed if cookie is set"
|
29
|
+
on :i, :cookie=, "The cookie itself, not needed if cookie-file is set"
|
30
|
+
on(:t, :startuptimeout=,
|
31
|
+
"The amount of time to let the system startup in seconds",
|
32
|
+
as: Integer)
|
33
|
+
on(:a, :checkinterval=,
|
34
|
+
"How often erlnixify should check to see if the system is still running",
|
35
|
+
as: Integer)
|
36
|
+
on(:w, :checktimeout=,
|
37
|
+
"The longest time a check can run, defaults to 30 seconds",
|
38
|
+
as: Integer)
|
39
|
+
on :c, :config=, "A file that contains the YAML based config for this system"
|
40
|
+
on :v, :version, "Show the Version"
|
41
|
+
|
42
|
+
run do |opts, args|
|
43
|
+
cmd = :startdeamon
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
command 'start' do
|
48
|
+
on :b, :release=, 'Release Root Directory'
|
49
|
+
on :e, :erlang=, 'Erlang Root Directory'
|
50
|
+
on :o, :home=, "The home directory to explicitly set"
|
51
|
+
on :n, :name=, "The short name of the node to be managed"
|
52
|
+
on :fullnode=, "The fully qualified node name"
|
53
|
+
on :m, :command=, "The command to run to start the release"
|
54
|
+
on :k, :check=, "The command to check if the release is active"
|
55
|
+
on :r, :checkregex=, "The regex that must match to the output of check command"
|
56
|
+
on :x, :cookiefile=, "A file that contains the erlang cookie, not needed if cookie is set"
|
57
|
+
on :i, :cookie=, "The cookie itself, not needed if cookie-file is set"
|
58
|
+
on(:t, :startuptimeout=,
|
59
|
+
"The amount of time to let the system startup in seconds",
|
60
|
+
as: Integer)
|
61
|
+
on(:a, :checkinterval=,
|
62
|
+
"How often erlnixify should check to see if the system is still running",
|
63
|
+
as: Integer)
|
64
|
+
on(:w, :checktimeout=,
|
65
|
+
"The longest time a check can run, defaults to 30 seconds",
|
66
|
+
as: Integer)
|
67
|
+
on :c, :config=, "A file that contains the YAML based config for this system"
|
68
|
+
on :v, :version, "Show the Version"
|
69
|
+
|
70
|
+
run do |opts, args|
|
71
|
+
cmd = :start
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
command 'stop' do
|
76
|
+
on :b, :release=, 'Release Root Directory'
|
77
|
+
on :e, :erlang=, 'Erlang Root Directory'
|
78
|
+
on :o, :home=, "The home directory to explicitly set"
|
79
|
+
on :n, :name=, "The short name of the node to be managed"
|
80
|
+
on :fullnode=, "The fully qualified node name"
|
81
|
+
on :m, :command=, "The command to run to start the release"
|
82
|
+
on :k, :check=, "The command to check if the release is active"
|
83
|
+
on :r, :checkregex=, "The regex that must match to the output of check command"
|
84
|
+
on :x, :cookiefile=, "A file that contains the erlang cookie, not needed if cookie is set"
|
85
|
+
on :i, :cookie=, "The cookie itself, not needed if cookie-file is set"
|
86
|
+
on(:t, :startuptimeout=,
|
87
|
+
"The amount of time to let the system startup in seconds",
|
88
|
+
as: Integer)
|
89
|
+
on(:a, :checkinterval=,
|
90
|
+
"How often erlnixify should check to see if the system is still running",
|
91
|
+
as: Integer)
|
92
|
+
on(:w, :checktimeout=,
|
93
|
+
"The longest time a check can run, defaults to 30 seconds",
|
94
|
+
as: Integer)
|
95
|
+
on :c, :config=, "A file that contains the YAML based config for this system"
|
96
|
+
on :v, :version, "Show the Version"
|
97
|
+
|
98
|
+
run do |opts, args|
|
99
|
+
cmd = :stop
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
command 'status' do
|
104
|
+
on :b, :release=, 'Release Root Directory'
|
105
|
+
on :e, :erlang=, 'Erlang Root Directory'
|
106
|
+
on :o, :home=, "The home directory to explicitly set"
|
107
|
+
on :n, :name=, "The short name of the node to be managed"
|
108
|
+
on :fullnode=, "The fully qualified node name"
|
109
|
+
on :m, :command=, "The command to run to start the release"
|
110
|
+
on :k, :check=, "The command to check if the release is active"
|
111
|
+
on :r, :checkregex=, "The regex that must match to the output of check command"
|
112
|
+
on :x, :cookiefile=, "A file that contains the erlang cookie, not needed if cookie is set"
|
113
|
+
on :i, :cookie=, "The cookie itself, not needed if cookie-file is set"
|
114
|
+
on(:t, :startuptimeout=,
|
115
|
+
"The amount of time to let the system startup in seconds",
|
116
|
+
as: Integer)
|
117
|
+
on(:a, :checkinterval=,
|
118
|
+
"How often erlnixify should check to see if the system is still running",
|
119
|
+
as: Integer)
|
120
|
+
on(:w, :checktimeout=,
|
121
|
+
"The longest time a check can run, defaults to 30 seconds",
|
122
|
+
as: Integer)
|
123
|
+
on :c, :config=, "A file that contains the YAML based config for this system"
|
124
|
+
on :v, :version, "Show the Version"
|
125
|
+
|
126
|
+
run do |opts, args|
|
127
|
+
cmd = :status
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
39
131
|
end
|
40
132
|
|
41
|
-
@options = opts.to_hash
|
133
|
+
@options = opts.to_hash(true)
|
134
|
+
@command = cmd
|
42
135
|
end
|
43
136
|
end
|
44
137
|
|
data/lib/erlnixify/settings.rb
CHANGED
@@ -14,14 +14,13 @@ module Erlnixify
|
|
14
14
|
CHECK_COMMAND = "erlang statistics [reductions]"
|
15
15
|
CHECK_REGEX = "^{\\d+, \\d+}$"
|
16
16
|
|
17
|
-
def initialize(
|
18
|
-
|
19
|
-
config = @options.options[:config]
|
17
|
+
def initialize(options)
|
18
|
+
config = options[:config]
|
20
19
|
|
21
20
|
@settings = self.default_settings
|
22
21
|
|
23
22
|
self.load! config if config
|
24
|
-
self.merge(
|
23
|
+
self.merge(options)
|
25
24
|
self.post_settings_setup
|
26
25
|
end
|
27
26
|
|
data/lib/erlnixify/version.rb
CHANGED
data/lib/erlnixify.rb
CHANGED
@@ -9,34 +9,52 @@ module Erlnixify
|
|
9
9
|
class Main
|
10
10
|
def self.main(args)
|
11
11
|
@opts = Erlnixify::Opts.new(args)
|
12
|
-
|
13
|
-
|
12
|
+
options = nil
|
13
|
+
options = @opts.options[@opts.command]
|
14
|
+
if options[:version]
|
14
15
|
puts Erlnixify::VERSION
|
15
16
|
exit 0
|
16
17
|
end
|
17
18
|
|
18
|
-
if not
|
19
|
+
if not options[:command]
|
19
20
|
puts "missing command option, this is required"
|
20
21
|
puts @opts.opts.help
|
21
22
|
exit 1
|
22
23
|
end
|
23
24
|
|
24
|
-
if not
|
25
|
+
if not options[:name]
|
25
26
|
puts "missing name option"
|
26
27
|
puts @opts.opts.help
|
27
28
|
exit 1
|
28
29
|
end
|
29
30
|
|
30
|
-
if not (
|
31
|
+
if not (options[:cookie] || options[:cookiefile])
|
31
32
|
puts "missing both cookie and cookiefile options, at least one is required"
|
32
33
|
puts @opts.opts.help
|
33
34
|
exit 1
|
34
35
|
end
|
35
36
|
|
36
|
-
@settings = Erlnixify::Settings.new(
|
37
|
-
@
|
37
|
+
@settings = Erlnixify::Settings.new(options)
|
38
|
+
@node = Erlnixify::Node.new(@settings)
|
38
39
|
begin
|
39
|
-
@
|
40
|
+
case @opts.command
|
41
|
+
when :start
|
42
|
+
@node.start
|
43
|
+
when :startdeamon
|
44
|
+
@node.start_deamon
|
45
|
+
exit 0
|
46
|
+
when :stop
|
47
|
+
@node.stop
|
48
|
+
when :status
|
49
|
+
begin
|
50
|
+
@node.status
|
51
|
+
rescue Exception => msg
|
52
|
+
puts "stopped", msg
|
53
|
+
exit 127
|
54
|
+
end
|
55
|
+
else
|
56
|
+
@node.start
|
57
|
+
end
|
40
58
|
rescue Erlnixify::NodeError
|
41
59
|
exit 127
|
42
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: erlnixify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Merritt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|