erlnixify 0.0.2 → 0.0.3
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.
- 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
|