trinidad_init_services 1.2.3 → 1.3.0
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 +7 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +123 -0
- data/Gemfile +7 -1
- data/LICENSE +1 -1
- data/README.md +45 -34
- data/Rakefile +1 -6
- data/bin/trinidad_init_service +15 -11
- data/init.d/trinidad.erb +120 -51
- data/jsvc-unix-src/configure +733 -58
- data/jsvc-unix-src/native/arguments.c +3 -2
- data/jsvc-unix-src/native/jsvc-unix.c +11 -1
- data/jsvc-unix-src/native/location.c +3 -1
- data/jsvc-unix-src/native/version.h +2 -2
- data/jsvc-unix-src/support/apsupport.m4 +94 -32
- data/jsvc-unix-src/support/config.guess +770 -610
- data/jsvc-unix-src/support/config.sub +84 -59
- data/lib/trinidad/daemon.rb +11 -4
- data/lib/trinidad_init_services/configuration.rb +461 -138
- data/lib/trinidad_init_services/version.rb +1 -1
- data/spec/trinidad_init_services/configuration_spec.rb +221 -96
- data/spec/trinidad_init_services/init_service_config.yml +11 -0
- data/trinidad-libs/commons-daemon.jar +0 -0
- data/trinidad-libs/windows/amd64/prunsrv.exe +0 -0
- data/trinidad-libs/windows/ia64/prunsrv.exe +0 -0
- data/trinidad-libs/windows/prunsrv.exe +0 -0
- data/trinidad_init_services.gemspec +7 -7
- metadata +151 -147
- data/History.txt +0 -74
@@ -5,8 +5,9 @@ require 'fileutils'
|
|
5
5
|
require 'java'
|
6
6
|
|
7
7
|
describe Trinidad::InitServices::Configuration do
|
8
|
-
|
8
|
+
|
9
9
|
before :each do
|
10
|
+
ENV['JAVA_HOME'] = nil # make sure it does not interfere
|
10
11
|
Dir.mkdir(tmp_dir) unless File.exist?(tmp_dir)
|
11
12
|
Dir.mkdir(init_dir)
|
12
13
|
end
|
@@ -14,54 +15,137 @@ describe Trinidad::InitServices::Configuration do
|
|
14
15
|
after :each do
|
15
16
|
FileUtils.rm_r init_dir
|
16
17
|
Dir.rmdir(tmp_dir) if Dir.entries(tmp_dir) == [ '.', '..' ]
|
18
|
+
ENV_JAVA.update @@env_java
|
17
19
|
end
|
18
20
|
|
21
|
+
before(:all) { @@env_java = ENV_JAVA.dup }
|
22
|
+
|
19
23
|
it "creates the init.d file" do
|
20
|
-
subject.configure
|
21
|
-
|
22
|
-
File.exist?(init_file).
|
24
|
+
subject.configure config_defaults.merge 'java_home' => 'tmp/java', 'jruby_home' => 'tmp/jruby'
|
25
|
+
|
26
|
+
expect( File.exist?(init_file) ).to be true
|
27
|
+
|
28
|
+
init_file_content = File.read(init_file)
|
29
|
+
|
30
|
+
expect( init_file_content ).to match(/JSVC=tmp\/jsvc\/bin\/jsvc/)
|
31
|
+
expect( init_file_content ).to match(/JAVA_HOME="tmp\/java"/)
|
32
|
+
expect( init_file_content ).to match(/JRUBY_HOME="tmp\/jruby"/)
|
33
|
+
expect( init_file_content ).to match(/BASE_PATH="tmp\/app"/)
|
34
|
+
|
35
|
+
expect( init_file_content ).to match(/PID_FILE="tmp\/trinidad.pid"/)
|
36
|
+
expect( init_file_content ).to match(/OUT_FILE="tmp\/trinidad.out"/)
|
37
|
+
|
38
|
+
expect( init_file_content ).to match(/TRINIDAD_OPTS="--dir tmp\/app -e production"/)
|
39
|
+
|
40
|
+
expect( init_file_content ).to match(/RUN_USER=""/)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "configures memory requirements using JAVA_OPTS (Java 6)" do
|
44
|
+
ENV_JAVA['java.version'] = '1.6.0_43'
|
45
|
+
ENV_JAVA['os.arch'] = 'x64'
|
46
|
+
|
47
|
+
defaults = config_defaults.merge 'configure_memory' => true, 'hot_deployment' => true
|
48
|
+
subject.configure(defaults)
|
49
|
+
|
50
|
+
init_file_content = File.read(init_file)
|
51
|
+
|
52
|
+
java_opts = init_file_content.match(/JAVA_OPTS="(.*?)"/m)
|
53
|
+
expect( java_opts ).to_not be nil
|
54
|
+
expect( java_opts = java_opts[1] ).to_not be nil
|
55
|
+
expect( java_opts ).to include '-XX:+UseCodeCacheFlushing'
|
56
|
+
expect( java_opts ).to include '-XX:ReservedCodeCacheSize='
|
57
|
+
expect( java_opts ).to include '-XX:MaxPermSize='
|
58
|
+
expect( java_opts ).to_not include '-XX:MaxMetaspaceSize='
|
59
|
+
expect( java_opts ).to include '-Xmx'
|
60
|
+
|
61
|
+
expect( java_opts ).to include '-XX:+UseConcMarkSweepGC'
|
62
|
+
expect( java_opts ).to include '-XX:+UseConcMarkSweepGC'
|
63
|
+
expect( java_opts ).to include '-XX:+UseCompressedOops'
|
64
|
+
end
|
65
|
+
|
66
|
+
it "configures memory requirements using JAVA_OPTS (Java 8)" do
|
67
|
+
ENV_JAVA['java.version'] = '1.8.0_05'
|
68
|
+
ENV_JAVA['os.arch'] = 'x64'
|
69
|
+
|
70
|
+
defaults = config_defaults.merge 'configure_memory' => true
|
71
|
+
subject.configure(defaults)
|
72
|
+
|
73
|
+
init_file_content = File.read(init_file)
|
74
|
+
|
75
|
+
java_opts = init_file_content.match(/JAVA_OPTS="(.*?)"/m)
|
76
|
+
expect( java_opts ).to_not be nil
|
77
|
+
expect( java_opts = java_opts[1] ).to_not be nil
|
78
|
+
expect( java_opts ).to include '-XX:+UseCodeCacheFlushing'
|
79
|
+
expect( java_opts ).to include '-XX:ReservedCodeCacheSize='
|
80
|
+
expect( java_opts ).to include '-XX:MaxMetaspaceSize='
|
81
|
+
expect( java_opts ).to include '-Xmx'
|
82
|
+
|
83
|
+
expect( java_opts ).to_not include '-XX:+UseConcMarkSweepGC'
|
84
|
+
expect( java_opts ).to_not include '-XX:+UseCompressedOops'
|
85
|
+
end
|
86
|
+
|
87
|
+
it "calculates memory requirements using JAVA_OPTS" do
|
88
|
+
defaults = config_defaults.merge 'configure_memory' => true
|
89
|
+
subject.configure(defaults)
|
90
|
+
|
91
|
+
init_file_content = File.read(init_file)
|
92
|
+
|
93
|
+
java_opts = init_file_content.match(/JAVA_OPTS="(.*?)"/m)[1]
|
94
|
+
expect( java_opts ).to_not be nil
|
95
|
+
expect( code_cache_size = java_opts.match(/-XX:ReservedCodeCacheSize=(.*)m/)[1] ).to_not be nil
|
96
|
+
if java_version =~ /^1\.(6|7)/
|
97
|
+
expect( max_perm_size = java_opts.match(/-XX:MaxPermSize=(.*)m/)[1] ).to_not be nil
|
98
|
+
else
|
99
|
+
expect( max_perm_size = java_opts.match(/-XX:MaxMetaspaceSize=(.*)m/)[1] ).to_not be nil
|
100
|
+
end
|
101
|
+
expect( max_heap_size = java_opts.match(/-Xmx(.*)m/)[1] ).to_not be nil
|
102
|
+
|
103
|
+
total = code_cache_size.to_i + max_perm_size.to_i + max_heap_size.to_i
|
104
|
+
|
105
|
+
expect( 720 - total ).to be >= 0
|
106
|
+
expect( 720 - total ).to be <= 10
|
107
|
+
end
|
108
|
+
|
109
|
+
it "configures -Xmx for custom JAVA_HOME" do
|
110
|
+
defaults = config_defaults.merge 'configure_memory' => true, 'java_home' => '/opt/ibm/jre-5'
|
111
|
+
subject.configure(defaults)
|
23
112
|
|
24
113
|
init_file_content = File.read(init_file)
|
25
114
|
|
26
|
-
init_file_content.match(/
|
27
|
-
init_file_content.match(/
|
28
|
-
init_file_content.match(/JRUBY_HOME=tmp\/jruby/).should be_true
|
29
|
-
init_file_content.match(/APP_PATH=tmp\/app/).should be_true
|
30
|
-
init_file_content.match(/TRINIDAD_OPTS="-d tmp\/app -e production"/).should be_true
|
31
|
-
|
32
|
-
init_file_content.match(/RUN_USER=""/).should be_true
|
115
|
+
expect( init_file_content.match(/JAVA_OPTS=(.*)$/) ).to_not be nil
|
116
|
+
expect( init_file_content.match(/JAVA_OPTS=(.*)$/) ).to_not eql '-Xmx670m'
|
33
117
|
end
|
34
|
-
|
118
|
+
|
35
119
|
it "makes pid_file and log_file dirs" do
|
36
120
|
pids_dir = File.join(tmp_dir, "pids")
|
37
121
|
logs_dir = File.join(tmp_dir, "logs")
|
38
122
|
begin
|
39
|
-
|
40
|
-
|
41
|
-
)
|
42
|
-
|
43
|
-
File.exist?(pids_dir).
|
44
|
-
File.directory?(pids_dir).
|
45
|
-
Dir.entries(pids_dir).
|
46
|
-
|
47
|
-
File.exist?(logs_dir).
|
48
|
-
File.directory?(logs_dir).
|
49
|
-
Dir.entries(logs_dir).
|
123
|
+
config = config_defaults.dup; config.delete('out_file')
|
124
|
+
config.merge! 'pid_file' => "tmp/pids/trinidad.pid", 'log_file' => "tmp/logs/trinidad.out"
|
125
|
+
subject.configure(config)
|
126
|
+
|
127
|
+
expect( File.exist?(pids_dir) ).to be true
|
128
|
+
expect( File.directory?(pids_dir) ).to be true
|
129
|
+
expect( Dir.entries(pids_dir) ).to eql ['.', '..']
|
130
|
+
|
131
|
+
expect( File.exist?(logs_dir) ).to be true
|
132
|
+
expect( File.directory?(logs_dir) ).to be true
|
133
|
+
expect( Dir.entries(logs_dir) ).to eql ['.', '..']
|
50
134
|
ensure
|
51
135
|
Dir.rmdir(pids_dir) if File.exist?(pids_dir)
|
52
136
|
Dir.rmdir(logs_dir) if File.exist?(logs_dir)
|
53
137
|
end
|
54
138
|
end
|
55
|
-
|
139
|
+
|
56
140
|
if java.lang.System.getProperty('os.name') !~ /windows/i
|
57
141
|
|
58
142
|
it "fails for non-existing run user" do
|
59
143
|
username = random_username
|
60
|
-
lambda {
|
61
|
-
subject.configure(config_defaults.merge 'run_user' => username)
|
144
|
+
lambda {
|
145
|
+
subject.configure(config_defaults.merge 'run_user' => username)
|
62
146
|
}.should raise_error(ArgumentError)
|
63
147
|
end
|
64
|
-
|
148
|
+
|
65
149
|
it "sets valid run user" do
|
66
150
|
username = `whoami`.chomp
|
67
151
|
subject.configure(config_defaults.merge 'run_user' => username)
|
@@ -71,81 +155,90 @@ describe Trinidad::InitServices::Configuration do
|
|
71
155
|
end
|
72
156
|
|
73
157
|
unless (`which make` rescue '').chomp.empty?
|
74
|
-
|
158
|
+
|
75
159
|
before(:all) do
|
76
160
|
FileUtils.rm_r "/tmp/jsvc-unix-src" if File.exist? "/tmp/jsvc-unix-src"
|
77
161
|
end
|
78
|
-
|
162
|
+
|
79
163
|
it "configures and compiles jsvc" do
|
80
|
-
config_options = config_defaults.merge '
|
164
|
+
config_options = config_defaults.merge 'jruby_home' => '/opt/jruby'
|
165
|
+
config_options['jsvc_path'] = nil
|
81
166
|
config_options['jsvc_unpack_dir'] = '/tmp'
|
82
|
-
|
167
|
+
|
83
168
|
java_home = java.lang.System.get_property("java.home")
|
84
169
|
java_home = java_home[0...-4] if java_home[-4..-1] == '/jre'
|
85
170
|
config_options['java_home'] = java_home # need a JDK dir
|
86
|
-
|
171
|
+
|
87
172
|
subject = Trinidad::InitServices::Configuration.new
|
88
173
|
subject.instance_eval do # a bit of stubbing/mocking :
|
89
174
|
def detect_jsvc_path; nil; end
|
90
|
-
def ask_path(path, default = nil)
|
175
|
+
def ask_path(path, default = nil)
|
91
176
|
raise path unless path =~ /path to jsvc .*/; default
|
92
177
|
end
|
93
178
|
end
|
94
|
-
|
179
|
+
|
95
180
|
subject.configure(config_options)
|
96
181
|
|
97
182
|
init_file_content = File.read(init_file) rescue ''
|
98
183
|
init_file_content.should =~ /JSVC=\/tmp\/jsvc\-unix\-src\/jsvc/
|
99
|
-
end
|
100
|
-
|
184
|
+
end unless ENV['SKIP_JSVC'] == 'true'
|
185
|
+
|
101
186
|
end
|
102
|
-
|
187
|
+
|
103
188
|
end
|
104
|
-
|
189
|
+
|
105
190
|
it "resolves bundled bundled prunsrv.exe based on system arch" do
|
106
191
|
trinidad_libs = File.expand_path('trinidad-libs', File.join(File.dirname(__FILE__), '../..'))
|
107
192
|
subject = Trinidad::InitServices::Configuration.new
|
108
193
|
subject.initialize_paths
|
109
|
-
|
194
|
+
|
110
195
|
path = subject.send :bundled_prunsrv_path, "amd64"
|
111
196
|
path.should == File.join(trinidad_libs, 'windows/amd64/prunsrv.exe')
|
112
197
|
|
113
198
|
path = subject.send :bundled_prunsrv_path, "x86_64"
|
114
199
|
path.should == File.join(trinidad_libs, 'windows/ia64/prunsrv.exe')
|
115
|
-
|
200
|
+
|
116
201
|
path = subject.send :bundled_prunsrv_path, "i386"
|
117
202
|
path.should == File.join(trinidad_libs, 'windows/prunsrv.exe')
|
118
|
-
|
203
|
+
|
119
204
|
path = subject.send :bundled_prunsrv_path, "x86"
|
120
205
|
path.should == File.join(trinidad_libs, 'windows/prunsrv.exe')
|
121
206
|
end
|
122
|
-
|
123
|
-
|
207
|
+
|
208
|
+
let(:windows_configuration) do
|
124
209
|
subject = Trinidad::InitServices::Configuration.new
|
125
210
|
subject.instance_eval do
|
126
|
-
def windows?; true
|
127
|
-
def macosx?; false
|
128
|
-
def
|
129
|
-
def
|
211
|
+
def windows?; true end
|
212
|
+
def macosx?; false end
|
213
|
+
def service_listed_windows?(service); false end
|
214
|
+
def system(command); @system_command = command end
|
215
|
+
def system_command; @system_command end
|
216
|
+
def log_command(command); end
|
130
217
|
end
|
218
|
+
subject
|
219
|
+
end
|
220
|
+
|
221
|
+
it "configures windows service" do
|
222
|
+
subject = windows_configuration
|
131
223
|
config_options = {
|
132
224
|
'app_path' => "C:/MyApp",
|
133
225
|
'ruby_compat_version' => "RUBY1_9",
|
134
|
-
'
|
135
|
-
'
|
136
|
-
'
|
226
|
+
'service_id' => "TrinidadService",
|
227
|
+
'service_name' => "Trinidad",
|
228
|
+
'service_desc' => "Trinidad Service Description",
|
137
229
|
'trinidad_options' => "-e production -p 4242 ",
|
138
230
|
'java_home' => "C:/Program Files (x86)/jdk-1.7.0",
|
139
231
|
'jruby_home' => "C:/Program Files/jruby",
|
140
232
|
}
|
141
233
|
subject.configure(config_options)
|
142
|
-
subject.system_command.should_not be nil
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
234
|
+
( system_command = subject.system_command ).should_not be nil
|
235
|
+
system_command.should =~ /\/\/IS\/\/TrinidadService/
|
236
|
+
system_command.should =~ /--DisplayName="Trinidad"/
|
237
|
+
system_command.should =~ /--Description="Trinidad Service Description"/
|
238
|
+
system_command.should =~ /--StartParams=".*?\\daemon.rb;--dir;C:\\MyApp;-e;production;-p;4242"/
|
239
|
+
system_command.should =~ /--Classpath=".*?\\jruby-jsvc.jar;.*?\\commons-daemon.jar;.*?\\jruby.jar/
|
240
|
+
system_command.should =~ /--JavaHome="C\:\\Program Files \(x86\)\\jdk-1\.7\.0"/
|
241
|
+
system_command.should =~ %r{
|
149
242
|
\+\+JvmOptions="
|
150
243
|
-Djruby.home=C:\\Program\ Files\\jruby;
|
151
244
|
-Djruby.lib=C:\\Program\ Files\\jruby\\lib;
|
@@ -155,7 +248,43 @@ describe Trinidad::InitServices::Configuration do
|
|
155
248
|
"
|
156
249
|
}x
|
157
250
|
end
|
158
|
-
|
251
|
+
|
252
|
+
it "configures windows service log out/err/pid" do
|
253
|
+
subject = windows_configuration
|
254
|
+
config_options = {
|
255
|
+
'app_path' => "C:/MyApp",
|
256
|
+
'log_path' => "C:/MyApp/log",
|
257
|
+
'out_file' => "C:/MyApp/log/STD.out",
|
258
|
+
}
|
259
|
+
subject.configure(config_options)
|
260
|
+
( system_command = subject.system_command ).should_not be nil
|
261
|
+
system_command.should =~ /\/\/IS\/\/Trinidad/
|
262
|
+
system_command.should =~ /--DisplayName="Trinidad"/
|
263
|
+
system_command.should =~ /--StdOutput="C\:\\MyApp\\log\\STD.out"/
|
264
|
+
system_command.should =~ /--StdError="C\:\\MyApp\\log\\STD.out"/
|
265
|
+
system_command.should =~ /--PidFile=Trinidad.pid/
|
266
|
+
end
|
267
|
+
|
268
|
+
it "updates windows service when installed" do
|
269
|
+
subject = windows_configuration
|
270
|
+
subject.instance_eval do
|
271
|
+
def service_listed_windows?(service); service == 'Trinidad' end
|
272
|
+
end
|
273
|
+
config_options = {
|
274
|
+
'app_path' => "C:/MyApp",
|
275
|
+
}
|
276
|
+
subject.configure(config_options)
|
277
|
+
( system_command = subject.system_command ).should_not be nil
|
278
|
+
expect( system_command ).to match /\/\/US\/\/Trinidad/
|
279
|
+
end
|
280
|
+
|
281
|
+
it "uninstalls windows service" do
|
282
|
+
subject = windows_configuration
|
283
|
+
subject.uninstall
|
284
|
+
( system_command = subject.system_command ).should_not be nil
|
285
|
+
expect( system_command ).to match /\/\/DS\/\/Trinidad/
|
286
|
+
end
|
287
|
+
|
159
288
|
it "ask_path works when non tty and default nil" do
|
160
289
|
subject.ask = false
|
161
290
|
stdin = mock('stdin')
|
@@ -173,7 +302,7 @@ describe Trinidad::InitServices::Configuration do
|
|
173
302
|
subject.send(:ask_path, 'Home', false)
|
174
303
|
} ).to raise_error RuntimeError
|
175
304
|
end
|
176
|
-
|
305
|
+
|
177
306
|
it "ask= forces trinidad to not ask on tty" do
|
178
307
|
subject.ask = false
|
179
308
|
outcome = subject.send :ask, 'hello?', :there
|
@@ -182,53 +311,49 @@ describe Trinidad::InitServices::Configuration do
|
|
182
311
|
outcome = subject.send :ask, 'de-ja-vu?', nil
|
183
312
|
outcome.should be nil
|
184
313
|
end
|
185
|
-
|
314
|
+
|
186
315
|
it "say= silences standard output" do
|
187
316
|
def subject.puts(msg)
|
188
317
|
raise msg
|
189
318
|
end
|
190
319
|
lambda { subject.send :say, 'hello' }.should raise_error
|
191
|
-
|
320
|
+
|
192
321
|
subject.say = false
|
193
322
|
lambda { subject.send :say, 'hello' }.should_not raise_error
|
194
323
|
end
|
195
|
-
|
324
|
+
|
196
325
|
private
|
197
|
-
|
198
|
-
def config_defaults
|
199
|
-
YAML::load %Q{
|
200
|
-
app_path: "tmp/app"
|
201
|
-
trinidad_options: "-e production"
|
202
|
-
jruby_home: "tmp/jruby"
|
203
|
-
ruby_compat_version: RUBY1_8
|
204
|
-
trinidad_name: Trinidad
|
205
|
-
jsvc_path: "tmp/jsvc"
|
206
|
-
java_home: "tmp/java"
|
207
|
-
output_path: "tmp/etc_init.d"
|
208
|
-
pid_file: "tmp/trinidad.pid"
|
209
|
-
log_file: "tmp/trinidad.log"
|
210
|
-
run_user: ""
|
211
|
-
}
|
212
|
-
end
|
213
|
-
|
214
|
-
def init_file
|
215
|
-
File.join init_dir, 'trinidad'
|
216
|
-
end
|
217
326
|
|
218
|
-
|
219
|
-
|
220
|
-
|
327
|
+
def config_defaults
|
328
|
+
YAML::load File.read(config_file_path)
|
329
|
+
end
|
221
330
|
|
222
|
-
|
223
|
-
|
224
|
-
|
331
|
+
def config_file_path
|
332
|
+
File.expand_path('init_service_config.yml', File.dirname(__FILE__))
|
333
|
+
end
|
334
|
+
|
335
|
+
def init_file
|
336
|
+
File.join init_dir, 'trinidad'
|
337
|
+
end
|
338
|
+
|
339
|
+
def init_dir
|
340
|
+
File.join tmp_dir, 'etc_init.d'
|
341
|
+
end
|
342
|
+
|
343
|
+
def tmp_dir
|
344
|
+
File.join root_dir, 'tmp'
|
345
|
+
end
|
346
|
+
|
347
|
+
def root_dir
|
348
|
+
File.join File.dirname(__FILE__), "/../../"
|
349
|
+
end
|
350
|
+
|
351
|
+
def random_username(len = 8)
|
352
|
+
(0...len).map{ ( 65 + rand(25) ).chr }.join.downcase
|
353
|
+
end
|
354
|
+
|
355
|
+
def java_version
|
356
|
+
Java::JavaLang::System.getProperty("java.version")
|
357
|
+
end
|
225
358
|
|
226
|
-
def root_dir
|
227
|
-
File.join File.dirname(__FILE__), "/../../"
|
228
|
-
end
|
229
|
-
|
230
|
-
def random_username(len = 8)
|
231
|
-
(0...len).map{ ( 65 + rand(25) ).chr }.join.downcase
|
232
|
-
end
|
233
|
-
|
234
359
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
app_path: "tmp/app"
|
2
|
+
trinidad_options: "-e production"
|
3
|
+
#java_home: "tmp/java"
|
4
|
+
#jruby_home: "tmp/jruby"
|
5
|
+
ruby_compat_version: RUBY1_8
|
6
|
+
trinidad_name: Trinidad
|
7
|
+
jsvc_path: tmp/jsvc/bin/jsvc
|
8
|
+
output_path: tmp/etc_init.d
|
9
|
+
pid_file: tmp/trinidad.pid
|
10
|
+
out_file: tmp/trinidad.out
|
11
|
+
run_user: ""
|