dtr 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/CHANGES +21 -0
  2. data/README.rdoc +39 -28
  3. data/Rakefile +1 -1
  4. data/TODO +1 -3
  5. data/bin/dtr +20 -13
  6. data/dtr.gemspec +3 -3
  7. data/lib/dtr.rb +2 -2
  8. data/lib/dtr/agent.rb +12 -5
  9. data/lib/dtr/agent/brain.rb +45 -19
  10. data/lib/dtr/agent/herald.rb +8 -10
  11. data/lib/dtr/agent/process_root.rb +23 -0
  12. data/lib/dtr/agent/rails_ext.rb +57 -0
  13. data/lib/dtr/agent/runner.rb +19 -39
  14. data/lib/dtr/agent/sync_codebase.rb +10 -19
  15. data/lib/dtr/agent/sync_logger.rb +1 -0
  16. data/lib/dtr/agent/worker.rb +13 -61
  17. data/lib/dtr/agent/working_env_ext.rb +51 -17
  18. data/lib/dtr/agent/working_status.rb +34 -0
  19. data/lib/dtr/facade.rb +19 -17
  20. data/lib/dtr/master.rb +2 -0
  21. data/lib/dtr/monitor.rb +2 -2
  22. data/lib/dtr/raketasks.rb +14 -19
  23. data/lib/dtr/shared.rb +1 -0
  24. data/lib/dtr/shared/adapter.rb +2 -101
  25. data/lib/dtr/shared/adapter/base.rb +118 -0
  26. data/lib/dtr/shared/adapter/mortality.rb +41 -0
  27. data/lib/dtr/shared/configuration.rb +32 -14
  28. data/lib/dtr/shared/root.rb +20 -0
  29. data/lib/dtr/shared/sync_codebase/master_ext.rb +2 -2
  30. data/lib/dtr/shared/sync_codebase/sync_service.rb +7 -4
  31. data/lib/dtr/shared/utils/cmd.rb +4 -2
  32. data/lib/dtr/shared/utils/env_store.rb +16 -24
  33. data/lib/dtr/shared/working_env.rb +8 -0
  34. data/lib/dtr/test_unit/drb_test_runner.rb +1 -1
  35. data/lib/dtr/test_unit/thread_safe_test_result.rb +56 -3
  36. data/test/acceptance/dtr_package_task_test.rb +3 -3
  37. data/test/acceptance/general_test.rb +3 -3
  38. data/test/acceptance/rails_ext_test.rb +86 -0
  39. data/test/acceptance/raketasks_test.rb +14 -0
  40. data/test/acceptance/sync_codebase_test.rb +8 -31
  41. data/test/acceptance/sync_logger_test.rb +6 -3
  42. data/test/agent_helper.rb +24 -16
  43. data/test/logger_stub.rb +3 -3
  44. data/test/test_helper.rb +12 -9
  45. data/test/unit/adapter_test.rb +1 -1
  46. data/test/unit/configuration_test.rb +36 -4
  47. data/test/unit/database_initializer_test.rb +36 -0
  48. data/test/unit/facade_test.rb +11 -1
  49. data/test/unit/thread_safe_test_result_test.rb +41 -0
  50. data/test/unit/working_env_test.rb +11 -21
  51. data/testdata/rails_projects/simple_project/README +256 -0
  52. data/testdata/rails_projects/simple_project/Rakefile +10 -0
  53. data/testdata/rails_projects/simple_project/app/controllers/application.rb +15 -0
  54. data/testdata/rails_projects/simple_project/app/controllers/products_controller.rb +5 -0
  55. data/testdata/rails_projects/simple_project/app/helpers/application_helper.rb +3 -0
  56. data/testdata/rails_projects/simple_project/app/helpers/products_helper.rb +2 -0
  57. data/testdata/rails_projects/simple_project/app/models/product.rb +5 -0
  58. data/testdata/rails_projects/simple_project/app/views/products/index.rhtml +7 -0
  59. data/testdata/rails_projects/simple_project/config/boot.rb +109 -0
  60. data/testdata/rails_projects/simple_project/config/database.yml +19 -0
  61. data/testdata/rails_projects/simple_project/config/database.yml.mysql +12 -0
  62. data/testdata/rails_projects/simple_project/config/environment.rb +67 -0
  63. data/testdata/rails_projects/simple_project/config/environments/development.rb +17 -0
  64. data/testdata/rails_projects/simple_project/config/environments/production.rb +22 -0
  65. data/testdata/rails_projects/simple_project/config/environments/test.rb +22 -0
  66. data/testdata/rails_projects/simple_project/config/initializers/inflections.rb +10 -0
  67. data/testdata/rails_projects/simple_project/config/initializers/mime_types.rb +5 -0
  68. data/testdata/rails_projects/simple_project/config/initializers/new_rails_defaults.rb +17 -0
  69. data/testdata/rails_projects/simple_project/config/routes.rb +43 -0
  70. data/testdata/rails_projects/simple_project/db/migrate/20081027133744_create_products.rb +13 -0
  71. data/testdata/rails_projects/simple_project/db/schema.rb +21 -0
  72. data/testdata/rails_projects/simple_project/doc/README_FOR_APP +2 -0
  73. data/testdata/rails_projects/simple_project/public/404.html +30 -0
  74. data/testdata/rails_projects/simple_project/public/422.html +30 -0
  75. data/testdata/rails_projects/simple_project/public/500.html +30 -0
  76. data/testdata/rails_projects/simple_project/public/dispatch.cgi +10 -0
  77. data/testdata/rails_projects/simple_project/public/dispatch.fcgi +24 -0
  78. data/testdata/rails_projects/simple_project/public/dispatch.rb +10 -0
  79. data/testdata/rails_projects/simple_project/public/favicon.ico +0 -0
  80. data/testdata/rails_projects/simple_project/public/images/rails.png +0 -0
  81. data/testdata/rails_projects/simple_project/public/index.html +274 -0
  82. data/testdata/rails_projects/simple_project/public/javascripts/application.js +2 -0
  83. data/testdata/rails_projects/simple_project/public/javascripts/controls.js +963 -0
  84. data/testdata/rails_projects/simple_project/public/javascripts/dragdrop.js +972 -0
  85. data/testdata/rails_projects/simple_project/public/javascripts/effects.js +1120 -0
  86. data/testdata/rails_projects/simple_project/public/javascripts/prototype.js +4225 -0
  87. data/testdata/rails_projects/simple_project/public/robots.txt +5 -0
  88. data/testdata/rails_projects/simple_project/script/about +4 -0
  89. data/testdata/rails_projects/simple_project/script/console +3 -0
  90. data/testdata/rails_projects/simple_project/script/dbconsole +3 -0
  91. data/testdata/rails_projects/simple_project/script/destroy +3 -0
  92. data/testdata/rails_projects/simple_project/script/generate +3 -0
  93. data/testdata/rails_projects/simple_project/script/performance/benchmarker +3 -0
  94. data/testdata/rails_projects/simple_project/script/performance/profiler +3 -0
  95. data/testdata/rails_projects/simple_project/script/performance/request +3 -0
  96. data/testdata/rails_projects/simple_project/script/plugin +3 -0
  97. data/testdata/rails_projects/simple_project/script/process/inspector +3 -0
  98. data/testdata/rails_projects/simple_project/script/process/reaper +3 -0
  99. data/testdata/rails_projects/simple_project/script/process/spawner +3 -0
  100. data/testdata/rails_projects/simple_project/script/runner +3 -0
  101. data/testdata/rails_projects/simple_project/script/server +3 -0
  102. data/testdata/rails_projects/simple_project/test/fixtures/products.yml +9 -0
  103. data/testdata/rails_projects/simple_project/test/functional/products_controller_test.rb +11 -0
  104. data/testdata/rails_projects/simple_project/test/test_helper.rb +38 -0
  105. data/testdata/rails_projects/simple_project/test/unit/product_test.rb +27 -0
  106. data/testdata/raketasks/Rakefile +1 -1
  107. metadata +90 -5
  108. data/testdata/verify_dir_pwd/Rakefile +0 -6
  109. data/testdata/verify_dir_pwd/verify_dir_pwd_test_case.rb +0 -10
@@ -0,0 +1,23 @@
1
+ # Copyright (c) 2007-2008 Li Xiao <iam@li-xiao.com>
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module DTR
16
+ module Agent
17
+ class ProcessRoot
18
+ def initialize(*args)
19
+ DTR.root = Dir.pwd
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2007-2008 Li Xiao <iam@li-xiao.com>
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module DTR
16
+ module Agent
17
+ module RailsExt
18
+ module DatabaseInitializer
19
+ def preparing_database_command
20
+ dtr_database_config_exists = File.exist?('config/database.yml.dtr')
21
+ default_database_config_exists = File.exist?('config/database.yml')
22
+
23
+ if !dtr_database_config_exists && !default_database_config_exists
24
+ DTR.info("No config/database.yml.dtr and config/database.yml exists, bypass database initialization.")
25
+ return
26
+ end
27
+
28
+ if dtr_database_config_exists
29
+ DTR.info("Found config/database.yml.dtr, use it as database configuration")
30
+ FileUtils.cp('config/database.yml.dtr', 'config/database.yml')
31
+ end
32
+ DTR.info("Clean databases")
33
+ Cmd.execute("rake --trace db:drop DTR_RUNNER_NAME=#{ENV['DTR_RUNNER_NAME']}", :error_output_log_level => :debug)
34
+
35
+ # Counldn't add --trace here, for Test::Unit detected --trace as a invalid option, don't know why
36
+ "rake db:create db:migrate db:test:prepare DTR_RUNNER_NAME=#{ENV['DTR_RUNNER_NAME']}"
37
+ end
38
+ end
39
+
40
+ module WorkingEnvExt
41
+ include DatabaseInitializer
42
+
43
+ def self.included(base)
44
+ base.alias_method_chain :setup_environment, :preparing_database
45
+ end
46
+
47
+ def setup_environment_with_preparing_database
48
+ if setup_environment_command.blank? && File.directory?('config')
49
+ DTR.debug("No setup environment command found but found 'config' directory, try default preparing database command")
50
+ self[:agent_env_setup_cmd] = preparing_database_command
51
+ end
52
+ setup_environment_without_preparing_database
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -14,65 +14,45 @@
14
14
 
15
15
  module DTR
16
16
  module Agent
17
- class Runner
17
+ class Runner < ProcessRoot
18
18
  include DRbUndumped
19
19
  include Service::Runner
20
20
 
21
- def self.start(name, env)
22
- self.new(name, env).start
23
- DRb.thread.join if DRb.thread
24
- end
25
-
26
- attr_reader :name, :identifier
21
+ attr_reader :name
27
22
 
28
- def initialize(name, env)
23
+ def initialize(name)
24
+ super
29
25
  @name = name
30
- @identifier = env[:identifier]
31
- @env = env
32
26
  end
33
27
 
34
28
  def start
35
29
  #start service first, so that all logs can be sync with master process
36
30
  start_service
37
- DTR.info("=> Starting runner #{name} at #{Dir.pwd}, pid: #{Process.pid}")
38
- init_environment
39
- provide
40
- DTR.info {"=> Runner #{name} provided"}
41
- rescue Exception
42
- DTR.error($!.message)
43
- DTR.error($!.backtrace.join("\n"))
44
- end
45
31
 
46
- def init_environment
47
- DTR.info {"#{name}: Initialize working environment..."}
48
32
  ENV['DTR_RUNNER_NAME'] = name
49
-
50
- @env[:libs].select{ |lib| !$LOAD_PATH.include?(lib) && File.exists?(lib) }.each do |lib|
51
- $LOAD_PATH << lib
52
- DTR.debug {"#{name}: appended lib: #{lib}"}
53
- end
54
- DTR.info {"#{name}: libs loaded"}
55
- DTR.debug {"#{name}: $LOAD_PATH: #{$LOAD_PATH.inspect}"}
56
-
57
- @env[:files].each do |f|
58
- begin
59
- load f unless f =~ /^-/
60
- DTR.debug {"#{name}: loaded #{f}"}
61
- rescue LoadError => e
62
- DTR.error {"#{name}: No such file to load -- #{f}"}
63
- DTR.debug {"Environment: #{@env}"}
33
+ DTR.info "Start #{self} at #{DTR.root}, pid: #{Process.pid}"
34
+ DTR.configuration.working_env.load_environment do
35
+ provide
36
+ DTR.info {"=> Runner provided"}
37
+ while DTR.configuration.runners_should_be_working?
38
+ sleep(1)
64
39
  end
65
40
  end
66
- DTR.info {"#{name}: test files loaded"}
41
+ rescue
42
+ DTR.error($!.message)
43
+ DTR.error($!.backtrace.join("\n"))
44
+ ensure
45
+ #make sure exit process for drb may cause this process hang on
46
+ exit!(0)
67
47
  end
68
48
 
69
49
  def run(test, result, &progress_block)
70
- DTR.debug {"#{name}: running #{test}..."}
50
+ DTR.debug {"running #{test}..."}
71
51
  Agent::TestCase.new(test, result, &progress_block).run
72
- DTR.debug {"#{name}: done #{test}"}
52
+ DTR.debug {"done #{test}"}
73
53
  ensure
74
54
  provide
75
- DTR.debug {"=> Runner #{name} provided"}
55
+ DTR.debug {"=> Runner provided"}
76
56
  end
77
57
 
78
58
  def provide
@@ -17,27 +17,18 @@ module DTR
17
17
  module WorkingEnvExt
18
18
  include SyncService
19
19
 
20
- def self.included(base)
21
- base.alias_method_chain :setup_env, :sync_codebase
22
- base.alias_method_chain :working_dir, :sync_codebase
23
- end
24
-
25
- def setup_env_with_sync_codebase(setup_env_cmd)
26
- unless same_working_dir_with_master_process?
27
- Dir.chdir(working_dir_without_sync_codebase) do
28
- sync_codebase
20
+ def synchronize_for(runners)
21
+ Dir.chdir(base_dir) do
22
+ sync_codebase do
23
+ FileUtils.rm_rf(package_name)
24
+ do_work(unpackage_cmd)
25
+ runners.each do |runner_name|
26
+ dir = File.expand_path escape_dir(runner_name)
27
+ FileUtils.rm_rf(dir)
28
+ FileUtils.cp_r(package_name, dir)
29
+ end
29
30
  end
30
31
  end
31
- setup_env_without_sync_codebase(setup_env_cmd)
32
- end
33
-
34
- def working_dir_with_sync_codebase
35
- same_working_dir_with_master_process? ? Dir.pwd : File.join(working_dir_without_sync_codebase, package_name)
36
- end
37
-
38
- private
39
- def same_working_dir_with_master_process?
40
- self[:host] == Socket.gethostname && self[:pwd] == Dir.pwd
41
32
  end
42
33
  end
43
34
  end
@@ -61,6 +61,7 @@ module DTR
61
61
  private
62
62
  def with_decorating_message(level, msg, &block)
63
63
  raise 'Should not use block to send log remotely' if block_given?
64
+ msg = "#{ENV['DTR_RUNNER_NAME']}: #{msg}"if ENV['DTR_RUNNER_NAME']
64
65
  @logger.send(level, decorate_message(msg))
65
66
  end
66
67
  end
@@ -15,74 +15,26 @@
15
15
  module DTR
16
16
 
17
17
  module Agent
18
- # Worker works during one dtr test task running.
19
- # Worker manages Herald & Runner processes life cycle.
18
+ # Worker watchs runner processes.
20
19
  class Worker
21
- def initialize(runner_names, agent_env_setup_cmd)
22
- @runner_names = runner_names.is_a?(Array) ? runner_names : [runner_names.to_s]
23
- @agent_env_setup_cmd = agent_env_setup_cmd
24
- @runner_pids = []
25
- @herald = nil
26
- @working_env_key = :working_env
27
- @env_store = EnvStore.new
20
+ def initialize
21
+ @runners_group = ThreadGroup.new
28
22
  end
29
23
 
30
- def launch
31
- DTR.info {"=> Agent worker started at: #{Dir.pwd}, pid: #{Process.pid}"}
32
- setup
33
- begin
34
- run
35
- ensure
36
- teardown
37
- DTR.info {"Agent worker is dieing"}
24
+ def watch_runners
25
+ DTR.configuration.agent_runners.each do |name|
26
+ runner_thread = Thread.start { DTR.run_script("DTR::Agent::Runner.new(#{name.inspect}).start") }
27
+ runner_thread[:runner_name] = name
28
+ @runners_group.add runner_thread
38
29
  end
39
- end
40
-
41
- private
42
- def setup
43
- @env_store[@working_env_key] = nil
44
- end
45
-
46
- def teardown
47
- unless @runner_pids.blank?
48
- @runner_pids.each{ |pid| DTR.kill_process pid }
49
- DTR.info {"=> All runners(#{@runner_pids.join(", ")}) were killed." }
50
- @runner_pids = []
51
- end
52
- if @herald
53
- DTR.kill_process @herald
54
- @herald = nil
55
- DTR.info {"=> Herald is killed."}
56
- end
57
- end
58
-
59
- def run
60
- herald
61
- runners
62
- DTR.info {"=> All agent worker sub processes exited."}
63
- end
64
-
65
- def herald
66
- @herald = DTR.fork_process { Herald.new @working_env_key, @agent_env_setup_cmd, @runner_names }
67
- Process.waitpid @herald
68
- exit(-1) unless $?.exitstatus == 0
69
- end
70
30
 
71
- def runners
72
- working_env = @env_store[@working_env_key]
31
+ yield
73
32
 
74
- @runner_names.each do |name|
75
- @runner_pids << DTR.fork_process {
76
- at_exit {
77
- # exit anyway, for DRb may hang on the process to be a deadwalk
78
- exit!
79
- }
80
- working_env.within do
81
- Runner.start name, working_env
82
- end
83
- }
33
+ while @runners_group.list.length > 0
34
+ alive_runners = @runners_group.list.collect {|r| r[:runner_name]}
35
+ DTR.info { "Waiting for #{alive_runners.join(', ').downcase} shutdown" }
36
+ sleep 1
84
37
  end
85
- Process.waitall
86
38
  end
87
39
  end
88
40
  end
@@ -14,33 +14,67 @@
14
14
 
15
15
  module DTR
16
16
  module Agent
17
- # Provides working environment setup beheaviours for Herald & Runner process
18
17
  module WorkingEnvExt
19
- def within
20
- ENV['DTR_MASTER_ENV'] = self[:dtr_master_env]
18
+ def base_dir
19
+ return @base_dir if defined?(@base_dir)
20
+ project_specific_len = 20
21
+ project_name = self[:pwd].length > project_specific_len ? self[:pwd][-project_specific_len..-1] : self[:pwd]
22
+ @base_dir = File.expand_path FileUtils.mkdir_p(File.join(escape_dir(self[:host]), escape_dir(project_name)))
23
+ end
24
+
25
+ def load_environment(&block)
26
+ working_dir = FileUtils.mkdir_p(File.join(base_dir, escape_dir(ENV['DTR_RUNNER_NAME'])))
21
27
  Dir.chdir(working_dir) do
22
- yield
28
+ DTR.info "Loading environment at #{Dir.pwd}"
29
+
30
+ ENV['DTR_MASTER_ENV'] = dtr_master_env
31
+
32
+ setup_environment
33
+
34
+ append_libs_to_load_path
35
+ require_files
36
+
37
+ block.call
23
38
  end
24
39
  end
25
40
 
26
- def setup_env(setup_env_cmd)
27
- within do
28
- Cmd.execute(setup_env_cmd || self[:agent_env_setup_cmd])
41
+ private
42
+
43
+ def setup_environment_command
44
+ DTR.configuration.agent_env_setup_cmd || self.agent_env_setup_cmd
45
+ end
46
+
47
+ def setup_environment
48
+ unless Cmd.execute(setup_environment_command)
49
+ raise "Stopped for setup working environment failed."
29
50
  end
30
51
  end
31
52
 
32
- private
33
- def escape(str)
34
- str.gsub(/[^a-zA-Z0-9]/, '_')
53
+ def escape_dir(str)
54
+ str.to_s.gsub(/[^a-zA-Z0-9]/, '_')
35
55
  end
36
56
 
37
- def working_dir
38
- return @working_dir if defined?(@working_dir)
39
- project_specific_len = 20
40
- project_name = self[:pwd].length > project_specific_len ? self[:pwd][-project_specific_len..-1] : self[:pwd]
41
- @working_dir = File.join(escape(self[:host]), escape(project_name))
42
- FileUtils.mkdir_p(@working_dir)
43
- @working_dir
57
+ def append_libs_to_load_path
58
+ libs.select{ |lib| !$LOAD_PATH.include?(lib) && File.exists?(lib) }.each do |lib|
59
+ $LOAD_PATH << lib
60
+ DTR.debug {"appended lib: #{lib}"}
61
+ end
62
+ DTR.info {"libs appended"}
63
+ DTR.debug {"$LOAD_PATH: #{$LOAD_PATH.inspect}"}
64
+ end
65
+
66
+ def require_files
67
+ files.each do |f|
68
+ begin
69
+ #use require instead of load to avoid load file twice.
70
+ require f unless f =~ /^-/
71
+ DTR.debug {"required #{f}"}
72
+ rescue LoadError => e
73
+ DTR.error {"No such file to load -- #{f}"}
74
+ DTR.debug {"Environment: #{self}"}
75
+ end
76
+ end
77
+ DTR.info {"test files loaded"}
44
78
  end
45
79
  end
46
80
  end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2007-2008 Li Xiao <iam@li-xiao.com>
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module DTR
16
+ module Agent
17
+ module WorkingStatus
18
+ WORKING_STATUS_KEY = :runners_working_status
19
+ def runners_should_be_working
20
+ @store[WORKING_STATUS_KEY] = Time.now
21
+ end
22
+
23
+ def runners_should_be_working?
24
+ if time = @store[WORKING_STATUS_KEY]
25
+ (time - Time.now) <= follower_listen_heartbeat_timeout
26
+ end
27
+ end
28
+
29
+ def agent_is_going_to_sleep
30
+ @store[WORKING_STATUS_KEY] = nil
31
+ end
32
+ end
33
+ end
34
+ end
@@ -15,13 +15,8 @@
15
15
  module DTR
16
16
  module Facade
17
17
  def start_agent
18
- launch_agent(DTR_AGENT_OPTIONS[:runners], DTR_AGENT_OPTIONS[:agent_env_setup_cmd])
19
- end
20
-
21
- def launch_agent(names, setup=nil)
22
18
  require 'dtr/agent'
23
- names = names || "DTR(#{Time.now})"
24
- DTR::Agent.start(names, setup)
19
+ DTR::Agent.start
25
20
  end
26
21
 
27
22
  def lib_path
@@ -29,37 +24,44 @@ module DTR
29
24
  end
30
25
 
31
26
  def broadcast_list=(list)
32
- require 'dtr/shared'
33
27
  DTR.configuration.broadcast_list = list
34
28
  DTR.configuration.save
35
29
  end
36
30
 
37
31
  def agent_listen_port=(port)
38
- require 'dtr/shared'
39
32
  DTR.configuration.agent_listen_port = port
40
33
  DTR.configuration.save
41
34
  end
42
35
 
43
36
  def group=(group)
44
- require 'dtr/shared'
45
37
  DTR.configuration.group = group
46
38
  DTR.configuration.save
47
39
  end
48
40
 
41
+ def agent_env_setup_cmd=(cmd)
42
+ DTR.configuration.agent_env_setup_cmd = cmd
43
+ DTR.configuration.save
44
+ end
45
+
46
+ def agent_runners=(runners)
47
+ DTR.configuration.agent_runners = runners
48
+ DTR.configuration.save
49
+ end
50
+
51
+ def agent_runners
52
+ DTR.configuration.agent_runners
53
+ end
54
+
49
55
  def monitor
50
56
  require 'dtr/monitor'
51
57
  DTR.logger('dtr_monitor.log')
52
58
  Monitor.new.start
53
59
  end
54
60
 
55
- # For safe fork & kill sub process, should use Process.kill and Process.fork
56
- # At least have problem on ruby 1.8.6 114 with Kernel#kill & fork
57
- def kill_process(pid)
58
- Process.kill 'TERM', pid rescue nil
59
- end
60
-
61
- def fork_process(&block)
62
- Process.fork(&block)
61
+ DTR_CMD = File.expand_path(File.dirname(__FILE__) + '/../../bin/dtr')
62
+ def run_script(cmd)
63
+ dtr = (RUBY_PLATFORM =~ /java/ || ENV['JRUBY_DTR']) ? "jruby -S #{DTR_CMD.inspect}" : "ruby #{DTR_CMD.inspect}"
64
+ system "#{dtr} -e #{cmd.inspect}"
63
65
  end
64
66
  end
65
67
  end