eye 0.7 → 0.8.celluloid15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +141 -0
  3. data/.travis.yml +5 -3
  4. data/CHANGES.md +9 -1
  5. data/README.md +5 -2
  6. data/Rakefile +6 -6
  7. data/bin/leye +9 -4
  8. data/bin/loader_eye +14 -15
  9. data/examples/custom_check.eye +24 -0
  10. data/examples/custom_trigger.eye +30 -0
  11. data/examples/delayed_job.eye +3 -3
  12. data/examples/dependency.eye +10 -11
  13. data/examples/leye_example/Eyefile +10 -0
  14. data/examples/notify.eye +3 -4
  15. data/examples/plugin/main.eye +5 -5
  16. data/examples/plugin/plugin.rb +10 -2
  17. data/examples/process_thin.rb +8 -8
  18. data/examples/processes/em.rb +18 -12
  19. data/examples/processes/forking.rb +5 -5
  20. data/examples/processes/sample.rb +46 -44
  21. data/examples/puma.eye +9 -8
  22. data/examples/rbenv.eye +5 -5
  23. data/examples/sidekiq.eye +3 -3
  24. data/examples/stress_test.eye +4 -4
  25. data/examples/syslog.eye +1 -1
  26. data/examples/test.eye +1 -2
  27. data/examples/thin-farm.eye +7 -8
  28. data/examples/triggers.eye +13 -15
  29. data/examples/unicorn.eye +12 -13
  30. data/eye.gemspec +16 -14
  31. data/lib/eye.rb +2 -3
  32. data/lib/eye/application.rb +5 -6
  33. data/lib/eye/checker.rb +44 -25
  34. data/lib/eye/checker/children_count.rb +1 -1
  35. data/lib/eye/checker/file_ctime.rb +1 -1
  36. data/lib/eye/checker/http.rb +13 -15
  37. data/lib/eye/checker/nop.rb +1 -0
  38. data/lib/eye/checker/socket.rb +60 -63
  39. data/lib/eye/checker/ssl_socket.rb +5 -5
  40. data/lib/eye/child_process.rb +6 -4
  41. data/lib/eye/cli.rb +74 -46
  42. data/lib/eye/cli/commands.rb +4 -5
  43. data/lib/eye/cli/render.rb +61 -41
  44. data/lib/eye/cli/server.rb +19 -16
  45. data/lib/eye/client.rb +1 -0
  46. data/lib/eye/config.rb +36 -33
  47. data/lib/eye/controller.rb +2 -3
  48. data/lib/eye/controller/commands.rb +1 -1
  49. data/lib/eye/controller/helpers.rb +2 -2
  50. data/lib/eye/controller/load.rb +19 -17
  51. data/lib/eye/controller/options.rb +1 -5
  52. data/lib/eye/controller/send_command.rb +21 -23
  53. data/lib/eye/controller/status.rb +17 -14
  54. data/lib/eye/dsl.rb +6 -1
  55. data/lib/eye/dsl/application_opts.rb +4 -3
  56. data/lib/eye/dsl/chain.rb +2 -2
  57. data/lib/eye/dsl/child_process_opts.rb +3 -3
  58. data/lib/eye/dsl/config_opts.rb +7 -7
  59. data/lib/eye/dsl/group_opts.rb +3 -3
  60. data/lib/eye/dsl/helpers.rb +1 -1
  61. data/lib/eye/dsl/main.rb +4 -3
  62. data/lib/eye/dsl/opts.rb +31 -28
  63. data/lib/eye/dsl/process_opts.rb +13 -7
  64. data/lib/eye/dsl/pure_opts.rb +13 -9
  65. data/lib/eye/dsl/validation.rb +48 -35
  66. data/lib/eye/group.rb +23 -8
  67. data/lib/eye/group/chain.rb +6 -6
  68. data/lib/eye/loader.rb +3 -3
  69. data/lib/eye/local.rb +9 -4
  70. data/lib/eye/logger.rb +11 -4
  71. data/lib/eye/notify.rb +10 -6
  72. data/lib/eye/notify/jabber.rb +1 -1
  73. data/lib/eye/notify/mail.rb +2 -2
  74. data/lib/eye/notify/slack.rb +4 -3
  75. data/lib/eye/process.rb +2 -0
  76. data/lib/eye/process/children.rb +4 -4
  77. data/lib/eye/process/commands.rb +38 -39
  78. data/lib/eye/process/config.rb +22 -16
  79. data/lib/eye/process/controller.rb +5 -19
  80. data/lib/eye/process/data.rb +11 -9
  81. data/lib/eye/process/monitor.rb +86 -76
  82. data/lib/eye/process/notify.rb +10 -10
  83. data/lib/eye/process/scheduler.rb +36 -31
  84. data/lib/eye/process/states.rb +7 -5
  85. data/lib/eye/process/states_history.rb +9 -3
  86. data/lib/eye/process/system.rb +35 -20
  87. data/lib/eye/process/trigger.rb +1 -5
  88. data/lib/eye/process/watchers.rb +12 -9
  89. data/lib/eye/reason.rb +4 -1
  90. data/lib/eye/server.rb +3 -2
  91. data/lib/eye/system.rb +22 -15
  92. data/lib/eye/system_resources.rb +17 -8
  93. data/lib/eye/trigger.rb +18 -16
  94. data/lib/eye/trigger/check_dependency.rb +7 -4
  95. data/lib/eye/trigger/flapping.rb +24 -7
  96. data/lib/eye/trigger/starting_guard.rb +7 -6
  97. data/lib/eye/trigger/stop_children.rb +2 -2
  98. data/lib/eye/trigger/transition.rb +1 -1
  99. data/lib/eye/trigger/wait_dependency.rb +3 -2
  100. data/lib/eye/utils.rb +4 -3
  101. data/lib/eye/utils/alive_array.rb +9 -4
  102. data/lib/eye/utils/celluloid_chain.rb +12 -10
  103. data/lib/eye/utils/mini_active_support.rb +16 -16
  104. data/lib/eye/utils/pmap.rb +2 -0
  105. data/lib/eye/utils/tail.rb +2 -2
  106. metadata +39 -8
  107. data/lib/eye/utils/leak_19.rb +0 -10
@@ -1,4 +1,5 @@
1
1
  module Eye::Cli::Commands
2
+
2
3
  private
3
4
 
4
5
  def client
@@ -39,12 +40,10 @@ private
39
40
  def show_load_message(res, opts = {})
40
41
  if res[:error]
41
42
  say res[:message], :red
42
- res[:backtrace].to_a.each{|line| say line, :red }
43
+ res[:backtrace].to_a.each { |line| say line, :red }
43
44
  else
44
- if opts[:syntax]
45
- say 'Config ok!', :green if !res[:empty]
46
- else
47
- say 'Config loaded!', :green if !res[:empty]
45
+ unless res[:empty]
46
+ say(opts[:syntax] ? 'Config ok!' : 'Config loaded!', :green)
48
47
  end
49
48
 
50
49
  if opts[:print_config]
@@ -1,9 +1,11 @@
1
1
  module Eye::Cli::Render
2
+
2
3
  private
4
+
3
5
  def render_status(data)
4
6
  return [1, "unexpected server response #{data.inspect}"] unless data.is_a?(Hash)
5
7
  data = data[:subtree]
6
- return [1, "match #{data.size} objects (#{data.map{|d| d[:name]}}), but expected only 1 process"] if data.size != 1
8
+ return [1, "match #{data.size} objects (#{data.map { |d| d[:name] }}), but expected only 1 process"] if data.size != 1
7
9
  process = data[0]
8
10
  return [1, "unknown status for :#{process[:type]}=#{process[:name]}"] unless process[:type] == :process
9
11
 
@@ -24,37 +26,14 @@ private
24
26
  return nil if !data || data.empty?
25
27
 
26
28
  if data.is_a?(Array)
27
- data.map{|el| make_str(el, level) }.compact * "\n"
29
+ data.map { |el| make_str(el, level) }.compact * "\n"
28
30
  else
29
31
  str = nil
30
32
 
31
33
  if data[:name]
32
34
  return make_str(data[:subtree], level) if data[:name] == '__default__'
33
35
 
34
- off = level * 2
35
- off_str = ' ' * off
36
-
37
- short_state = ((data[:type] == :application || data[:type] == :group) && data[:states])
38
- is_text = data[:state] || data[:states]
39
-
40
- name = (data[:type] == :application && !is_text) ? "\033[1m#{data[:name]}\033[0m" : data[:name].to_s
41
- off_len = 35
42
- str = off_str + (name + ' ').ljust(off_len - off, is_text ? '.' : ' ')
43
-
44
- if short_state
45
- str += ' ' + data[:states].map { |k, v| "#{k}:#{v}" }.join(', ')
46
- elsif data[:state]
47
- str += ' ' + data[:state].to_s
48
- str += ' (' + resources_str(data[:resources]) + ')' if data[:resources] && data[:state].to_sym == :up
49
- str += " (#{data[:state_reason]} at #{Eye::Utils.human_time2(data[:state_changed_at])})" if data[:state_reason] && data[:state] == 'unmonitored'
50
- elsif data[:current_command]
51
- chain_progress = if data[:chain_progress]
52
- " #{data[:chain_progress][0]} of #{data[:chain_progress][1]}" rescue ''
53
- end
54
- str += " \e[1;33m[#{data[:current_command]}#{chain_progress}]\033[0m"
55
- str += " (#{data[:chain_commands] * ', '})" if data[:chain_commands]
56
- end
57
-
36
+ str = render_element(data, level)
58
37
  end
59
38
 
60
39
  if data[:subtree].nil?
@@ -67,18 +46,10 @@ private
67
46
  end
68
47
  end
69
48
 
70
- def resources_str(r)
71
- return '' if !r || r.empty?
72
- memory, cpu, start_time, pid = r[:memory], r[:cpu], r[:start_time], r[:pid]
73
- return '' unless memory && cpu && start_time
74
-
75
- "#{Eye::Utils.human_time(start_time)}, #{cpu.to_i}%, #{memory / 1024 / 1024}Mb, <#{pid}>"
76
- end
77
-
78
49
  def render_debug_info(data)
79
50
  error!("unexpected server response #{data.inspect}") unless data.is_a?(Hash)
80
51
 
81
- s = ""
52
+ s = ''
82
53
 
83
54
  if config_yaml = data.delete(:config_yaml)
84
55
  s << config_yaml
@@ -88,10 +59,10 @@ private
88
59
  s << "#{"#{k}:".ljust(10)} "
89
60
 
90
61
  case k
91
- when :resources
92
- s << resources_str(v)
93
- else
94
- s << "#{v}"
62
+ when :resources
63
+ s << resources_str(v)
64
+ else
65
+ s << "#{v}"
95
66
  end
96
67
 
97
68
  s << "\n"
@@ -114,10 +85,10 @@ private
114
85
  res = "\033[1m#{name}\033[0m\n"
115
86
  history = history.reverse
116
87
 
117
- history.chunk{|h| [h[:state], h[:reason].to_s] }.each do |_, hist|
88
+ history.chunk { |h| [h[:state], h[:reason].to_s] }.each do |_, hist|
118
89
  if hist.size >= 3
119
90
  res << detail_process_info_string(hist[0])
120
- res << detail_process_info_string(:state => "... #{hist.size - 2} times", :reason => '...')
91
+ res << detail_process_info_string(state: "... #{hist.size - 2} times", reason: '...')
121
92
  res << detail_process_info_string(hist[-1])
122
93
  else
123
94
  hist.each do |h|
@@ -135,4 +106,53 @@ private
135
106
  "#{at} - #{state} (#{h[:reason]})\n"
136
107
  end
137
108
 
109
+ private
110
+
111
+ def render_element(data, level)
112
+ off = level * 2
113
+ off_str = ' ' * off
114
+
115
+ short_state = (data[:type] == :application || data[:type] == :group) && data[:states]
116
+ is_text = data[:state] || data[:states]
117
+
118
+ name = (data[:type] == :application && !is_text) ? "\033[1m#{data[:name]}\033[0m" : data[:name].to_s
119
+ off_len = 35
120
+ str = off_str + (name + ' ').ljust(off_len - off, is_text ? '.' : ' ')
121
+
122
+ if short_state
123
+ str += ' ' + data[:states].map { |k, v| "#{k}:#{v}" }.join(', ')
124
+ elsif data[:state]
125
+ str += ' ' + data[:state].to_s
126
+ if data[:resources] && data[:state].to_sym == :up
127
+ str += ' (' + resources_str(data[:resources])
128
+ str += ", <#{data[:procline]}>" if data[:procline]
129
+ str += ')'
130
+ end
131
+ if data[:state_reason] && data[:state] == 'unmonitored'
132
+ str += " (#{data[:state_reason]} at #{Eye::Utils.human_time2(data[:state_changed_at])})"
133
+ end
134
+ elsif data[:current_command]
135
+ chain_progress = if data[:chain_progress]
136
+ " #{data[:chain_progress][0]} of #{data[:chain_progress][1]}" rescue ''
137
+ end
138
+ str += " \e[1;33m[#{data[:current_command]}#{chain_progress}]\033[0m"
139
+ str += " (#{data[:chain_commands] * ', '})" if data[:chain_commands]
140
+ end
141
+
142
+ str
143
+ end
144
+
145
+ def resources_str(r)
146
+ return '' if !r || r.empty?
147
+
148
+ memory = r[:memory]
149
+ cpu = r[:cpu]
150
+ start_time = r[:start_time]
151
+ pid = r[:pid]
152
+
153
+ return '' unless memory && cpu && start_time
154
+
155
+ "#{Eye::Utils.human_time(start_time)}, #{cpu.to_i}%, #{memory / 1024 / 1024}Mb, <#{pid}>"
156
+ end
157
+
138
158
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Eye::Cli::Server
4
+
4
5
  private
5
6
 
6
7
  def server_started?
@@ -26,17 +27,15 @@ private
26
27
  ensure_loader_path
27
28
  Eye::Local.ensure_eye_dir
28
29
 
29
- if server_started?
30
- _cmd(:quit) && sleep(1) # stop previous server
31
- end
32
-
33
30
  args = []
34
31
  args += ['--config', conf] if conf
35
32
  args += ['--logger', 'stdout']
33
+ args += ['--stop_all']
36
34
  if Eye::Local.local_runner
37
- args += ['--stop_all']
38
35
  args += ['--dir', Eye::Local.dir]
39
- args += ['--config', Eye::Local.eyefile] unless conf
36
+ if !conf && Eye::Local.eyefile
37
+ args += ['--config', Eye::Local.eyefile]
38
+ end
40
39
  end
41
40
 
42
41
  Process.exec(ruby_path, loader_path, *args)
@@ -51,12 +50,18 @@ private
51
50
  args = []
52
51
  args += ['--dir', Eye::Local.dir] if Eye::Local.local_runner
53
52
 
54
- opts = {:out => '/dev/null', :err => '/dev/null', :in => '/dev/null',
55
- :chdir => '/', :pgroup => true}
53
+ chdir = if Eye::Local.local_runner
54
+ Eye::Local.home
55
+ else
56
+ '/'
57
+ end
58
+
59
+ opts = { out: '/dev/null', err: '/dev/null', in: '/dev/null',
60
+ chdir: chdir, pgroup: true }
56
61
 
57
62
  pid = Process.spawn(ruby_path, loader_path, *args, opts)
58
63
  Process.detach(pid)
59
- File.open(Eye::Local.pid_path, 'w'){|f| f.write(pid) }
64
+ File.open(Eye::Local.pid_path, 'w') { |f| f.write(pid) }
60
65
 
61
66
  unless wait_server
62
67
  error! 'server has not started in 15 seconds, something is very wrong'
@@ -64,11 +69,11 @@ private
64
69
 
65
70
  configs.unshift(Eye::Local.global_eyeconfig) if File.exist?(Eye::Local.global_eyeconfig)
66
71
  configs.unshift(Eye::Local.eyeconfig) if File.exist?(Eye::Local.eyeconfig)
67
- configs << Eye::Local.eyefile if Eye::Local.local_runner
72
+ configs << Eye::Local.eyefile if Eye::Local.local_runner && Eye::Local.eyefile
68
73
 
69
- say 'Eye started! ㋡', :green
74
+ say "Eye started! ㋡ (#{Eye::Local.home})", :green
70
75
 
71
- if !configs.empty?
76
+ if configs.any?
72
77
  say_load_result cmd(:load, *configs)
73
78
  end
74
79
  end
@@ -76,16 +81,14 @@ private
76
81
  def ensure_stop_previous_server
77
82
  Eye::Local.ensure_eye_dir
78
83
  pid = File.read(Eye::Local.pid_path).to_i rescue nil
79
- if pid
80
- Process.kill(9, pid) rescue nil
81
- end
84
+ Process.kill(9, pid) rescue nil if pid
82
85
  File.delete(Eye::Local.pid_path) rescue nil
83
86
  true
84
87
  end
85
88
 
86
89
  def wait_server(timeout = 15)
87
90
  Timeout.timeout(timeout) do
88
- sleep 0.3 while !server_started?
91
+ sleep 0.3 until server_started?
89
92
  end
90
93
  true
91
94
  rescue Timeout::Error
@@ -2,6 +2,7 @@ require 'socket'
2
2
  require 'timeout'
3
3
 
4
4
  class Eye::Client
5
+
5
6
  attr_reader :socket_path
6
7
 
7
8
  def initialize(socket_path)
@@ -32,71 +32,74 @@ class Eye::Config
32
32
 
33
33
  # raise an error if config wrong
34
34
  def validate!(validate_apps = [])
35
- all_processes = processes
36
-
37
35
  # Check blank pid_files
38
- no_pid_file = all_processes.select{|c| c[:pid_file].blank? }
39
- if no_pid_file.present?
40
- raise Eye::Dsl::Error, "blank pid_file for: #{no_pid_file.map{|c| c[:name]} * ', '}"
36
+ no_pid_file = []
37
+ each_process { |c| no_pid_file << c if c[:pid_file].blank? }
38
+ if no_pid_file.any?
39
+ raise Eye::Dsl::Error, "blank pid_file for: #{no_pid_file.map { |c| c[:name] } * ', '}"
41
40
  end
42
41
 
43
42
  # Check duplicates of the full pid_file
44
43
 
45
- dupl_pids = all_processes.each_with_object(Hash.new(0)) do |o, h|
44
+ dupl_pids = Hash.new(0)
45
+ each_process do |o|
46
46
  ex_pid_file = Eye::System.normalized_file(o[:pid_file], o[:working_dir])
47
- h[ex_pid_file] += 1
47
+ dupl_pids[ex_pid_file] += 1
48
48
  end
49
- dupl_pids = dupl_pids.select{|k,v| v>1}
49
+ dupl_pids = dupl_pids.select { |_, v| v > 1 }
50
50
 
51
- if dupl_pids.present?
51
+ if dupl_pids.any?
52
52
  raise Eye::Dsl::Error, "duplicate pid_files: #{dupl_pids.inspect}"
53
53
  end
54
54
 
55
55
  # Check duplicates of the full_name
56
- dupl_names = all_processes.each_with_object(Hash.new(0)) do |o, h|
56
+ dupl_names = Hash.new(0)
57
+ each_process do |o|
57
58
  full_name = "#{o[:application]}:#{o[:group]}:#{o[:name]}"
58
- h[full_name] += 1
59
+ dupl_names[full_name] += 1
59
60
  end
60
- dupl_names = dupl_names.select{|k,v| v>1}
61
+ dupl_names = dupl_names.select { |_, v| v > 1 }
61
62
 
62
- if dupl_names.present?
63
+ if dupl_names.any?
63
64
  raise Eye::Dsl::Error, "duplicate names: #{dupl_names.inspect}"
64
65
  end
65
66
 
66
67
  # validate processes with their own validate
67
- all_processes.each do |process_cfg|
68
+ each_process do |process_cfg|
68
69
  Eye::Process.validate process_cfg, validate_apps.include?(process_cfg[:application])
69
70
  end
70
71
 
71
72
  # just to be sure ENV was not removed
72
- ENV[''] rescue raise Eye::Dsl::Error.new("ENV is not a hash '#{ENV.inspect}'")
73
+ ENV[''] rescue raise Eye::Dsl::Error, "ENV is not a hash '#{ENV.inspect}'"
73
74
  end
74
75
 
75
76
  def transform!
76
- all_processes = processes
77
-
78
77
  # transform syslog option
79
- all_processes.each do |process|
78
+ each_process do |process|
80
79
  out = process[:stdout] && process[:stdout].start_with?(':syslog')
81
80
  err = process[:stderr] && process[:stderr].start_with?(':syslog')
82
- if err || out
83
- redir = err ? '2>&1' : ''
84
- process[:stdout] = nil if out
85
- process[:stderr] = nil if err
81
+ next unless err || out
86
82
 
87
- escaped_start_command = process[:start_command].to_s.gsub(%{"}, %{\\"})
83
+ redir = err ? '2>&1' : ''
84
+ process[:stdout] = nil if out
85
+ process[:stderr] = nil if err
88
86
 
89
- names = [process[:application], process[:group] == '__default__' ? nil : process[:group], process[:name]].compact
90
- logger = "logger -t \"#{names.join(':')}\""
87
+ escaped_start_command = process[:start_command].to_s.gsub(%{"}, %{\\"})
91
88
 
92
- process[:start_command] = %{sh -c "#{escaped_start_command} #{redir} | #{logger}"}
93
- process[:use_leaf_child] = true if process[:daemonize]
94
- end
89
+ names = [process[:application], process[:group] == '__default__' ? nil : process[:group], process[:name]].compact
90
+ logger = "logger -t \"#{names.join(':')}\""
91
+
92
+ process[:start_command] = %{sh -c "#{escaped_start_command} #{redir} | #{logger}"}
93
+ process[:use_leaf_child] = true if process[:daemonize]
95
94
  end
96
95
  end
97
96
 
98
- def processes
99
- applications.values.map{|e| (e[:groups] || {}).values.map{|c| (c[:processes] || {}).values} }.flatten
97
+ def each_process(&block)
98
+ applications.each_value do |app_cfg|
99
+ (app_cfg[:groups] || {}).each_value do |gr_cfg|
100
+ (gr_cfg[:processes] || {}).each_value(&block)
101
+ end
102
+ end
100
103
  end
101
104
 
102
105
  def application_names
@@ -108,14 +111,14 @@ class Eye::Config
108
111
  end
109
112
 
110
113
  def delete_group(name)
111
- applications.each do |app_name, app_cfg|
114
+ applications.each do |_app_name, app_cfg|
112
115
  (app_cfg[:groups] || {}).delete(name)
113
116
  end
114
117
  end
115
118
 
116
119
  def delete_process(name)
117
- applications.each do |app_name, app_cfg|
118
- (app_cfg[:groups] || {}).each do |gr_name, gr_cfg|
120
+ applications.each do |_app_name, app_cfg|
121
+ (app_cfg[:groups] || {}).each do |_gr_name, gr_cfg|
119
122
  (gr_cfg[:processes] || {}).delete(name)
120
123
  end
121
124
  end
@@ -2,8 +2,6 @@ require 'celluloid'
2
2
  require 'yaml'
3
3
 
4
4
  require_relative 'utils/pmap'
5
-
6
- require_relative 'utils/leak_19'
7
5
  require_relative 'utils/mini_active_support'
8
6
 
9
7
  # Extend all objects with logger
@@ -14,6 +12,7 @@ Eye::Sigar
14
12
  Eye::SystemResources
15
13
 
16
14
  class Eye::Controller
15
+
17
16
  include Celluloid
18
17
 
19
18
  autoload :Load, 'eye/controller/load'
@@ -36,7 +35,7 @@ class Eye::Controller
36
35
  @applications = []
37
36
  @current_config = Eye::Config.new
38
37
 
39
- Celluloid::logger = Eye::Logger.new('celluloid')
38
+ Celluloid.logger = Eye::Logger.new('celluloid')
40
39
 
41
40
  info "starting #{Eye::ABOUT} <#{$$}>"
42
41
  end
@@ -1,7 +1,7 @@
1
1
  module Eye::Controller::Commands
2
2
 
3
3
  NOT_IMPORTANT_COMMANDS = [:info_data, :short_data, :debug_data, :history_data, :ping,
4
- :logger_dev, :match, :explain, :check]
4
+ :logger_dev, :match, :explain, :check]
5
5
 
6
6
  # Main method, answer for the client command
7
7
  def command(cmd, *args)
@@ -5,7 +5,7 @@ module Eye::Controller::Helpers
5
5
  str = 'l' + str if Eye::Local.local_runner
6
6
  str += " [#{@applications.map(&:name) * ', '}]" if @applications.present?
7
7
  str += " (v #{ENV['EYE_V']})" if ENV['EYE_V']
8
- str += " (in #{Eye::Local.dir})"
8
+ str += " (in #{Eye::Local.home})"
9
9
  $0 = str
10
10
  end
11
11
 
@@ -16,7 +16,7 @@ module Eye::Controller::Helpers
16
16
  end
17
17
 
18
18
  def cache_str
19
- all_processes.map{ |p| "#{p.full_name}=#{p.state}" } * "\n"
19
+ all_processes.map { |p| "#{p.full_name}=#{p.state}" } * "\n"
20
20
  end
21
21
 
22
22
  def process_by_name(name)
@@ -13,7 +13,7 @@ module Eye::Controller::Load
13
13
  obj_strs = args.flatten
14
14
  info "=> loading: #{obj_strs}"
15
15
 
16
- res = Hash.new
16
+ res = {}
17
17
 
18
18
  globbing(*obj_strs).each do |filename|
19
19
  res[filename] = catch_load_error(filename) do
@@ -35,8 +35,8 @@ private
35
35
  # regexp for clean backtrace to show for user
36
36
  BT_REGX = %r[/lib/eye/|lib/celluloid|internal:prelude|logger.rb:|active_support/core_ext|shellwords.rb|kernel/bootstrap].freeze
37
37
 
38
- def catch_load_error(filename = nil, &block)
39
- { :error => false, :config => yield }
38
+ def catch_load_error(filename = nil, &_block)
39
+ { error: false, config: yield }
40
40
 
41
41
  rescue Eye::Dsl::Error, Exception, NoMethodError => ex
42
42
  raise if ex.class.to_s.include?('RR') # skip RR exceptions
@@ -45,10 +45,10 @@ private
45
45
 
46
46
  # filter backtrace for user output
47
47
  bt = (ex.backtrace || [])
48
- bt = bt.reject{|line| line.to_s =~ BT_REGX } unless ENV['EYE_FULL_BACKTRACE']
48
+ bt = bt.reject { |line| line.to_s =~ BT_REGX } unless ENV['EYE_FULL_BACKTRACE']
49
49
  error bt.join("\n")
50
50
 
51
- res = { :error => true, :message => ex.message }
51
+ res = { error: true, message: ex.message }
52
52
  res[:backtrace] = bt if bt.present?
53
53
  res
54
54
  end
@@ -58,6 +58,8 @@ private
58
58
  return res if obj_strs.empty?
59
59
 
60
60
  obj_strs.each do |filename|
61
+ next unless filename
62
+
61
63
  mask = File.directory?(filename) ? File.join(filename, '{*.eye}') : filename
62
64
  debug { "loading: globbing mask #{mask}" }
63
65
 
@@ -76,11 +78,7 @@ private
76
78
  # return: result, config
77
79
  def parse_config(filename)
78
80
  debug { "parsing: #{filename}" }
79
-
80
- cfg = Eye::Dsl.parse(nil, filename)
81
- @current_config.merge(cfg).validate! # just validate summary config here
82
- Eye.parsed_config = nil # remove link on config, for better gc
83
- cfg
81
+ Eye::Dsl.parse(nil, filename)
84
82
  end
85
83
 
86
84
  # !!! exclusive operation
@@ -126,7 +124,7 @@ private
126
124
  app.groups.each do |group|
127
125
  @old_groups[group.name] = group
128
126
  group.processes.each do |proc|
129
- @old_processes[group.name + ":" + proc.name] = proc
127
+ @old_processes[group.name + ':' + proc.name] = proc
130
128
  end
131
129
  end
132
130
 
@@ -139,7 +137,8 @@ private
139
137
 
140
138
  app = Eye::Application.new(app_name, app_config)
141
139
  @applications << app
142
- @added_groups, @added_processes = [], []
140
+ @added_groups = []
141
+ @added_processes = []
143
142
 
144
143
  new_groups = app_config.delete(:groups) || {}
145
144
  new_groups.each do |group_name, group_cfg|
@@ -149,8 +148,11 @@ private
149
148
  end
150
149
 
151
150
  # now, need to clear @old_groups, and @old_processes
152
- @old_groups.each{|_, group| group.clear; group.send_command(:delete) }
153
- @old_processes.each{|_, process| process.send_command(:delete) if process.alive? }
151
+ @old_groups.each do |_, group|
152
+ group.clear
153
+ group.send_command(:delete)
154
+ end
155
+ @old_processes.each { |_, process| process.send_command(:delete) if process.alive? }
154
156
 
155
157
  # schedule monitoring for new groups, processes
156
158
  added_fully_groups = []
@@ -161,8 +163,8 @@ private
161
163
  end
162
164
  end
163
165
 
164
- added_fully_groups.each{|group| group.send_command :monitor }
165
- @added_processes.each{|process| process.send_command :monitor }
166
+ added_fully_groups.each { |group| group.send_command :monitor }
167
+ @added_processes.each { |process| process.send_command :monitor }
166
168
 
167
169
  # remove links to prevent memory leaks
168
170
  @old_groups = nil
@@ -199,7 +201,7 @@ private
199
201
  end
200
202
 
201
203
  def update_or_create_process(process_name, process_cfg)
202
- postfix = ":" + process_name
204
+ postfix = ':' + process_name
203
205
  name = process_cfg[:group] + postfix
204
206
  key = @old_processes[name] ? name : @old_processes.keys.detect { |n| n.end_with?(postfix) }
205
207