ace-eye 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +38 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/CHANGES.md +77 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +212 -0
- data/Rakefile +35 -0
- data/bin/eye +5 -0
- data/bin/loader_eye +72 -0
- data/bin/runner +16 -0
- data/examples/dependency.eye +17 -0
- data/examples/notify.eye +19 -0
- data/examples/plugin/README.md +15 -0
- data/examples/plugin/main.eye +15 -0
- data/examples/plugin/plugin.rb +63 -0
- data/examples/process_thin.rb +29 -0
- data/examples/processes/em.rb +57 -0
- data/examples/processes/forking.rb +20 -0
- data/examples/processes/sample.rb +144 -0
- data/examples/processes/thin.ru +12 -0
- data/examples/puma.eye +29 -0
- data/examples/rbenv.eye +11 -0
- data/examples/sidekiq.eye +23 -0
- data/examples/test.eye +87 -0
- data/examples/thin-farm.eye +30 -0
- data/examples/unicorn.eye +39 -0
- data/eye.gemspec +40 -0
- data/lib/eye.rb +28 -0
- data/lib/eye/application.rb +73 -0
- data/lib/eye/checker.rb +258 -0
- data/lib/eye/checker/children_count.rb +44 -0
- data/lib/eye/checker/children_memory.rb +12 -0
- data/lib/eye/checker/cpu.rb +17 -0
- data/lib/eye/checker/cputime.rb +13 -0
- data/lib/eye/checker/file_ctime.rb +24 -0
- data/lib/eye/checker/file_size.rb +34 -0
- data/lib/eye/checker/file_touched.rb +15 -0
- data/lib/eye/checker/http.rb +96 -0
- data/lib/eye/checker/memory.rb +17 -0
- data/lib/eye/checker/nop.rb +6 -0
- data/lib/eye/checker/runtime.rb +18 -0
- data/lib/eye/checker/socket.rb +159 -0
- data/lib/eye/child_process.rb +101 -0
- data/lib/eye/cli.rb +185 -0
- data/lib/eye/cli/commands.rb +78 -0
- data/lib/eye/cli/render.rb +130 -0
- data/lib/eye/cli/server.rb +93 -0
- data/lib/eye/client.rb +32 -0
- data/lib/eye/config.rb +91 -0
- data/lib/eye/control.rb +2 -0
- data/lib/eye/controller.rb +54 -0
- data/lib/eye/controller/commands.rb +88 -0
- data/lib/eye/controller/helpers.rb +101 -0
- data/lib/eye/controller/load.rb +224 -0
- data/lib/eye/controller/options.rb +18 -0
- data/lib/eye/controller/send_command.rb +177 -0
- data/lib/eye/controller/status.rb +72 -0
- data/lib/eye/dsl.rb +53 -0
- data/lib/eye/dsl/application_opts.rb +39 -0
- data/lib/eye/dsl/chain.rb +12 -0
- data/lib/eye/dsl/child_process_opts.rb +13 -0
- data/lib/eye/dsl/config_opts.rb +55 -0
- data/lib/eye/dsl/group_opts.rb +32 -0
- data/lib/eye/dsl/helpers.rb +20 -0
- data/lib/eye/dsl/main.rb +51 -0
- data/lib/eye/dsl/opts.rb +151 -0
- data/lib/eye/dsl/process_opts.rb +36 -0
- data/lib/eye/dsl/pure_opts.rb +121 -0
- data/lib/eye/dsl/validation.rb +88 -0
- data/lib/eye/group.rb +140 -0
- data/lib/eye/group/chain.rb +81 -0
- data/lib/eye/loader.rb +10 -0
- data/lib/eye/local.rb +100 -0
- data/lib/eye/logger.rb +104 -0
- data/lib/eye/notify.rb +118 -0
- data/lib/eye/notify/jabber.rb +30 -0
- data/lib/eye/notify/mail.rb +48 -0
- data/lib/eye/process.rb +85 -0
- data/lib/eye/process/children.rb +60 -0
- data/lib/eye/process/commands.rb +280 -0
- data/lib/eye/process/config.rb +81 -0
- data/lib/eye/process/controller.rb +73 -0
- data/lib/eye/process/data.rb +78 -0
- data/lib/eye/process/monitor.rb +108 -0
- data/lib/eye/process/notify.rb +32 -0
- data/lib/eye/process/scheduler.rb +82 -0
- data/lib/eye/process/states.rb +86 -0
- data/lib/eye/process/states_history.rb +66 -0
- data/lib/eye/process/system.rb +97 -0
- data/lib/eye/process/trigger.rb +34 -0
- data/lib/eye/process/validate.rb +33 -0
- data/lib/eye/process/watchers.rb +66 -0
- data/lib/eye/reason.rb +20 -0
- data/lib/eye/server.rb +60 -0
- data/lib/eye/sigar.rb +5 -0
- data/lib/eye/system.rb +139 -0
- data/lib/eye/system_resources.rb +99 -0
- data/lib/eye/trigger.rb +136 -0
- data/lib/eye/trigger/check_dependency.rb +30 -0
- data/lib/eye/trigger/flapping.rb +41 -0
- data/lib/eye/trigger/stop_children.rb +17 -0
- data/lib/eye/trigger/transition.rb +15 -0
- data/lib/eye/trigger/wait_dependency.rb +49 -0
- data/lib/eye/utils.rb +45 -0
- data/lib/eye/utils/alive_array.rb +57 -0
- data/lib/eye/utils/celluloid_chain.rb +71 -0
- data/lib/eye/utils/celluloid_klass.rb +5 -0
- data/lib/eye/utils/leak_19.rb +10 -0
- data/lib/eye/utils/mini_active_support.rb +111 -0
- data/lib/eye/utils/pmap.rb +7 -0
- data/lib/eye/utils/tail.rb +20 -0
- metadata +398 -0
data/lib/eye/dsl.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'dsl/helpers'
|
2
|
+
|
3
|
+
Eye::BINDING = binding
|
4
|
+
|
5
|
+
class Eye::Dsl
|
6
|
+
|
7
|
+
autoload :Main, 'eye/dsl/main'
|
8
|
+
autoload :ApplicationOpts, 'eye/dsl/application_opts'
|
9
|
+
autoload :GroupOpts, 'eye/dsl/group_opts'
|
10
|
+
autoload :ProcessOpts, 'eye/dsl/process_opts'
|
11
|
+
autoload :ChildProcessOpts, 'eye/dsl/child_process_opts'
|
12
|
+
autoload :Opts, 'eye/dsl/opts'
|
13
|
+
autoload :PureOpts, 'eye/dsl/pure_opts'
|
14
|
+
autoload :Chain, 'eye/dsl/chain'
|
15
|
+
autoload :ConfigOpts, 'eye/dsl/config_opts'
|
16
|
+
autoload :Validation, 'eye/dsl/validation'
|
17
|
+
|
18
|
+
class Error < Exception; end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
attr_accessor :verbose
|
22
|
+
|
23
|
+
def debug(msg = '')
|
24
|
+
puts msg if verbose
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse(content = nil, filename = nil)
|
28
|
+
Eye.parsed_config = Eye::Config.new
|
29
|
+
Eye.parsed_filename = filename
|
30
|
+
Eye.parsed_default_app = nil
|
31
|
+
|
32
|
+
content = File.read(filename) if content.blank?
|
33
|
+
|
34
|
+
silence_warnings do
|
35
|
+
Kernel.eval(content, Eye::BINDING, filename.to_s)
|
36
|
+
end
|
37
|
+
|
38
|
+
Eye.parsed_config.validate!(false)
|
39
|
+
Eye.parsed_config
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse_apps(*args)
|
43
|
+
parse(*args).applications
|
44
|
+
end
|
45
|
+
|
46
|
+
def check_name(name)
|
47
|
+
raise Error, "':' is not allowed in name '#{name}'" if name.to_s.include?(':')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# extend here global module
|
53
|
+
Eye.send(:extend, Eye::Dsl::Main)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Eye::Dsl::ApplicationOpts < Eye::Dsl::Opts
|
2
|
+
|
3
|
+
include Eye::Dsl::Chain
|
4
|
+
|
5
|
+
def disallow_options
|
6
|
+
[:pid_file, :start_command, :daemonize]
|
7
|
+
end
|
8
|
+
|
9
|
+
def not_seed_options
|
10
|
+
[:groups]
|
11
|
+
end
|
12
|
+
|
13
|
+
def group(name, &block)
|
14
|
+
Eye::Dsl.check_name(name)
|
15
|
+
Eye::Dsl.debug "=> group #{name}"
|
16
|
+
|
17
|
+
opts = Eye::Dsl::GroupOpts.new(name, self)
|
18
|
+
opts.instance_eval(&block)
|
19
|
+
|
20
|
+
@config[:groups] ||= {}
|
21
|
+
@config[:groups][name.to_s] ||= {}
|
22
|
+
|
23
|
+
if cfg = opts.config
|
24
|
+
Eye::Utils.deep_merge!(@config[:groups][name.to_s], cfg)
|
25
|
+
end
|
26
|
+
|
27
|
+
Eye::Dsl.debug "<= group #{name}"
|
28
|
+
opts
|
29
|
+
end
|
30
|
+
|
31
|
+
def process(name, &block)
|
32
|
+
res = nil
|
33
|
+
group('__default__'){ res = process(name.to_s, &block) }
|
34
|
+
res
|
35
|
+
end
|
36
|
+
|
37
|
+
alias xgroup nop
|
38
|
+
alias xprocess nop
|
39
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Eye::Dsl::ChildProcessOpts < Eye::Dsl::Opts
|
2
|
+
|
3
|
+
def allow_options
|
4
|
+
[:stop_command, :restart_command, :children_update_period,
|
5
|
+
:stop_signals, :stop_grace, :stop_timeout, :restart_timeout]
|
6
|
+
end
|
7
|
+
|
8
|
+
def triggers(*args)
|
9
|
+
raise Eye::Dsl::Error, 'triggers not allowed in monitor_children'
|
10
|
+
end
|
11
|
+
alias trigger triggers
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Eye::Dsl::ConfigOpts < Eye::Dsl::PureOpts
|
2
|
+
|
3
|
+
create_options_methods([:logger_level], Fixnum)
|
4
|
+
create_options_methods([:http], Hash)
|
5
|
+
|
6
|
+
def logger(*args)
|
7
|
+
if args.empty?
|
8
|
+
@config[:logger]
|
9
|
+
else
|
10
|
+
str = args[0]
|
11
|
+
raise Eye::Dsl::Error, "logger should be a String #{str.inspect}" if !(str.is_a?(String) || str == nil)
|
12
|
+
@config[:logger] = args
|
13
|
+
end
|
14
|
+
end
|
15
|
+
alias logger= logger
|
16
|
+
|
17
|
+
# ==== contact options ==============================
|
18
|
+
def self.add_notify(type)
|
19
|
+
create_options_methods([type], Hash)
|
20
|
+
|
21
|
+
define_method("set_#{type}") do |value|
|
22
|
+
value = value.merge(:type => type)
|
23
|
+
super(value)
|
24
|
+
Eye::Notify.validate!(value)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Eye::Notify::TYPES.keys.each { |name| add_notify(name) }
|
29
|
+
|
30
|
+
def contact(contact_name, contact_type, contact, contact_opts = {})
|
31
|
+
raise Eye::Dsl::Error, "unknown contact_type #{contact_type}" unless Eye::Notify::TYPES[contact_type]
|
32
|
+
raise Eye::Dsl::Error, 'contact should be a String' unless contact.is_a?(String)
|
33
|
+
|
34
|
+
notify_hash = @config[contact_type] || (@parent && @parent.config[contact_type]) || Eye::parsed_config.settings[contact_type] || {}
|
35
|
+
validate_hash = notify_hash.merge(contact_opts).merge(:type => contact_type)
|
36
|
+
|
37
|
+
Eye::Notify.validate!(validate_hash)
|
38
|
+
|
39
|
+
@config[:contacts] ||= {}
|
40
|
+
@config[:contacts][contact_name.to_s] = {name: contact_name.to_s, type: contact_type,
|
41
|
+
contact: contact, opts: contact_opts}
|
42
|
+
end
|
43
|
+
|
44
|
+
def contact_group(contact_group_name, &block)
|
45
|
+
c = Eye::Dsl::ConfigOpts.new nil, self, false
|
46
|
+
c.instance_eval(&block)
|
47
|
+
cfg = c.config
|
48
|
+
@config[:contacts] ||= {}
|
49
|
+
if cfg[:contacts].present?
|
50
|
+
@config[:contacts][contact_group_name.to_s] = cfg[:contacts].values
|
51
|
+
@config[:contacts].merge!(cfg[:contacts])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Eye::Dsl::GroupOpts < Eye::Dsl::Opts
|
2
|
+
|
3
|
+
include Eye::Dsl::Chain
|
4
|
+
|
5
|
+
def disallow_options
|
6
|
+
[:pid_file, :start_command, :daemonize]
|
7
|
+
end
|
8
|
+
|
9
|
+
def not_seed_options
|
10
|
+
[:processes, :chain]
|
11
|
+
end
|
12
|
+
|
13
|
+
def process(name, &block)
|
14
|
+
Eye::Dsl.check_name(name)
|
15
|
+
|
16
|
+
Eye::Dsl.debug "=> process #{name}"
|
17
|
+
|
18
|
+
opts = Eye::Dsl::ProcessOpts.new(name, self)
|
19
|
+
opts.instance_eval(&block)
|
20
|
+
@config[:processes] ||= {}
|
21
|
+
@config[:processes][name.to_s] ||= {}
|
22
|
+
Eye::Utils.deep_merge!(@config[:processes][name.to_s], opts.config) if opts.config
|
23
|
+
|
24
|
+
Eye::Dsl.debug "<= process #{name}"
|
25
|
+
opts
|
26
|
+
end
|
27
|
+
|
28
|
+
alias xprocess nop
|
29
|
+
alias application parent
|
30
|
+
alias app application
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
# Dsl Helpers
|
3
|
+
|
4
|
+
# current eye parsed config path
|
5
|
+
def current_config_path
|
6
|
+
Eye.parsed_filename && File.symlink?(Eye.parsed_filename) ? File.readlink(Eye.parsed_filename) : Eye.parsed_filename
|
7
|
+
end
|
8
|
+
|
9
|
+
# host name
|
10
|
+
def hostname
|
11
|
+
Eye::Local.host
|
12
|
+
end
|
13
|
+
|
14
|
+
def example_process(proxy, name)
|
15
|
+
proxy.process(name) do
|
16
|
+
pid_file "/tmp/#{name}.pid"
|
17
|
+
start_command "sleep 100"
|
18
|
+
daemonize true
|
19
|
+
end
|
20
|
+
end
|
data/lib/eye/dsl/main.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module Eye::Dsl::Main
|
2
|
+
attr_accessor :parsed_config, :parsed_filename, :parsed_default_app
|
3
|
+
|
4
|
+
def application(name, &block)
|
5
|
+
Eye::Dsl.check_name(name)
|
6
|
+
name = name.to_s
|
7
|
+
|
8
|
+
Eye::Dsl.debug "=> app: #{name}"
|
9
|
+
|
10
|
+
if name == '__default__'
|
11
|
+
@parsed_default_app ||= Eye::Dsl::ApplicationOpts.new(name)
|
12
|
+
@parsed_default_app.instance_eval(&block)
|
13
|
+
else
|
14
|
+
opts = Eye::Dsl::ApplicationOpts.new(name, @parsed_default_app)
|
15
|
+
opts.instance_eval(&block)
|
16
|
+
@parsed_config.applications[name] = opts.config if opts.config
|
17
|
+
end
|
18
|
+
|
19
|
+
Eye::Dsl.debug "<= app: #{name}"
|
20
|
+
end
|
21
|
+
|
22
|
+
alias project application
|
23
|
+
alias app application
|
24
|
+
|
25
|
+
def load(glob = '')
|
26
|
+
return if glob.blank?
|
27
|
+
|
28
|
+
Eye::Dsl::Opts.with_parsed_file(glob) do |mask|
|
29
|
+
Dir[mask].each do |path|
|
30
|
+
Eye::Dsl.debug "=> load #{path}"
|
31
|
+
Eye.parsed_filename = path
|
32
|
+
res = Kernel.load(path)
|
33
|
+
Eye.info "load: subload #{path} (#{res})"
|
34
|
+
Eye::Dsl.debug "<= load #{path}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def config(&block)
|
40
|
+
Eye::Dsl.debug '=> config'
|
41
|
+
|
42
|
+
opts = Eye::Dsl::ConfigOpts.new
|
43
|
+
opts.instance_eval(&block)
|
44
|
+
Eye::Utils.deep_merge!(@parsed_config.settings, opts.config)
|
45
|
+
|
46
|
+
Eye::Dsl.debug '<= config'
|
47
|
+
end
|
48
|
+
|
49
|
+
alias settings config
|
50
|
+
|
51
|
+
end
|
data/lib/eye/dsl/opts.rb
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
class Eye::Dsl::Opts < Eye::Dsl::PureOpts
|
2
|
+
|
3
|
+
STR_OPTIONS = [ :pid_file, :working_dir, :stdout, :stderr, :stdall, :stdin, :start_command,
|
4
|
+
:stop_command, :restart_command, :uid, :gid ]
|
5
|
+
create_options_methods(STR_OPTIONS, String)
|
6
|
+
|
7
|
+
BOOL_OPTIONS = [ :daemonize, :keep_alive, :auto_start, :stop_on_delete, :clear_pid, :preserve_fds, :use_leaf_child, :clear_env ]
|
8
|
+
create_options_methods(BOOL_OPTIONS, [TrueClass, FalseClass])
|
9
|
+
|
10
|
+
INTERVAL_OPTIONS = [ :check_alive_period, :start_timeout, :restart_timeout, :stop_timeout, :start_grace,
|
11
|
+
:restart_grace, :stop_grace, :children_update_period, :restore_in,
|
12
|
+
:auto_update_pidfile_grace, :revert_fuckup_pidfile_grace ]
|
13
|
+
create_options_methods(INTERVAL_OPTIONS, [Fixnum, Float])
|
14
|
+
|
15
|
+
create_options_methods([:environment], Hash)
|
16
|
+
create_options_methods([:stop_signals], Array)
|
17
|
+
create_options_methods([:umask], Fixnum)
|
18
|
+
|
19
|
+
|
20
|
+
def initialize(name = nil, parent = nil)
|
21
|
+
super(name, parent)
|
22
|
+
|
23
|
+
@config[:application] = parent.name if parent.is_a?(Eye::Dsl::ApplicationOpts)
|
24
|
+
@config[:group] = parent.name if parent.is_a?(Eye::Dsl::GroupOpts)
|
25
|
+
|
26
|
+
# hack for full name
|
27
|
+
@full_name = parent.full_name if @name == '__default__' && parent.respond_to?(:full_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def checks(type, opts = {})
|
31
|
+
nac = Eye::Checker.name_and_class(type.to_sym)
|
32
|
+
raise Eye::Dsl::Error, "unknown checker type #{type}" unless nac
|
33
|
+
|
34
|
+
opts.merge!(:type => nac[:type])
|
35
|
+
Eye::Checker.validate!(opts)
|
36
|
+
|
37
|
+
@config[:checks] ||= {}
|
38
|
+
@config[:checks][nac[:name]] = opts
|
39
|
+
end
|
40
|
+
|
41
|
+
def triggers(type, opts = {})
|
42
|
+
nac = Eye::Trigger.name_and_class(type.to_sym)
|
43
|
+
raise Eye::Dsl::Error, "unknown trigger type #{type}" unless nac
|
44
|
+
|
45
|
+
opts.merge!(:type => nac[:type])
|
46
|
+
Eye::Trigger.validate!(opts)
|
47
|
+
|
48
|
+
@config[:triggers] ||= {}
|
49
|
+
@config[:triggers][nac[:name]] = opts
|
50
|
+
end
|
51
|
+
|
52
|
+
# clear checks from parent
|
53
|
+
def nochecks(type)
|
54
|
+
nac = Eye::Checker.name_and_class(type.to_sym)
|
55
|
+
raise Eye::Dsl::Error, "unknown checker type #{type}" unless nac
|
56
|
+
@config[:checks].try :delete, nac[:name]
|
57
|
+
end
|
58
|
+
|
59
|
+
# clear triggers from parent
|
60
|
+
def notriggers(type)
|
61
|
+
nac = Eye::Trigger.name_and_class(type.to_sym)
|
62
|
+
raise Eye::Dsl::Error, "unknown trigger type #{type}" unless nac
|
63
|
+
@config[:triggers].try :delete, nac[:name]
|
64
|
+
end
|
65
|
+
|
66
|
+
alias check checks
|
67
|
+
alias nocheck nochecks
|
68
|
+
alias trigger triggers
|
69
|
+
alias notrigger notriggers
|
70
|
+
|
71
|
+
def notify(contact, level = :warn)
|
72
|
+
unless Eye::Process::Notify::LEVELS[level]
|
73
|
+
raise Eye::Dsl::Error, "level should be in #{Eye::Process::Notify::LEVELS.keys}"
|
74
|
+
end
|
75
|
+
|
76
|
+
@config[:notify] ||= {}
|
77
|
+
@config[:notify][contact.to_s] = level
|
78
|
+
end
|
79
|
+
|
80
|
+
def nonotify(contact)
|
81
|
+
@config[:notify] ||= {}
|
82
|
+
@config[:notify].delete(contact.to_s)
|
83
|
+
end
|
84
|
+
|
85
|
+
def set_environment(value)
|
86
|
+
raise Eye::Dsl::Error, "environment should be a hash, but not #{value.inspect}" unless value.is_a?(Hash)
|
87
|
+
@config[:environment] ||= {}
|
88
|
+
@config[:environment].merge!(value)
|
89
|
+
end
|
90
|
+
|
91
|
+
alias dir working_dir
|
92
|
+
alias env environment
|
93
|
+
|
94
|
+
def set_stdall(value)
|
95
|
+
super
|
96
|
+
|
97
|
+
set_stdout value
|
98
|
+
set_stderr value
|
99
|
+
end
|
100
|
+
|
101
|
+
def set_uid(value)
|
102
|
+
raise Eye::Dsl::Error, ':uid not supported (use ruby >= 2.0)' unless Eye::Local.supported_setsid?
|
103
|
+
super
|
104
|
+
end
|
105
|
+
|
106
|
+
def set_gid(value)
|
107
|
+
raise Eye::Dsl::Error, ':gid not supported (use ruby >= 2.0)' unless Eye::Local.supported_setsid?
|
108
|
+
super
|
109
|
+
end
|
110
|
+
|
111
|
+
def daemonize!
|
112
|
+
set_daemonize true
|
113
|
+
end
|
114
|
+
|
115
|
+
def clear_bundler_env
|
116
|
+
env('GEM_PATH' => nil, 'GEM_HOME' => nil, 'RUBYOPT' => nil, 'BUNDLE_BIN_PATH' => nil, 'BUNDLE_GEMFILE' => nil)
|
117
|
+
end
|
118
|
+
|
119
|
+
def scoped(&block)
|
120
|
+
h = self.class.new(self.name, self)
|
121
|
+
h.instance_eval(&block)
|
122
|
+
Eye::Utils.deep_merge!(config, h.config, [:groups, :processes])
|
123
|
+
end
|
124
|
+
|
125
|
+
# execute part of config on particular server
|
126
|
+
# array of strings
|
127
|
+
# regexp
|
128
|
+
# string
|
129
|
+
def with_server(glob = nil, &block)
|
130
|
+
on_server = true
|
131
|
+
|
132
|
+
if glob.present?
|
133
|
+
host = Eye::Local.host
|
134
|
+
|
135
|
+
if glob.is_a?(Array)
|
136
|
+
on_server = !!glob.any?{|elem| elem == host}
|
137
|
+
elsif glob.is_a?(Regexp)
|
138
|
+
on_server = !!host.match(glob)
|
139
|
+
elsif glob.is_a?(String) || glob.is_a?(Symbol)
|
140
|
+
on_server = (host == glob.to_s)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
scoped do
|
145
|
+
with_condition(on_server, &block)
|
146
|
+
end
|
147
|
+
|
148
|
+
on_server
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Eye::Dsl::ProcessOpts < Eye::Dsl::Opts
|
2
|
+
|
3
|
+
def monitor_children(&block)
|
4
|
+
opts = Eye::Dsl::ChildProcessOpts.new
|
5
|
+
opts.instance_eval(&block) if block
|
6
|
+
@config[:monitor_children] ||= {}
|
7
|
+
Eye::Utils.deep_merge!(@config[:monitor_children], opts.config)
|
8
|
+
end
|
9
|
+
|
10
|
+
alias xmonitor_children nop
|
11
|
+
|
12
|
+
def application
|
13
|
+
parent.try(:parent)
|
14
|
+
end
|
15
|
+
alias app application
|
16
|
+
alias group parent
|
17
|
+
|
18
|
+
def depend_on(names, opts = {})
|
19
|
+
names = Array(names).map(&:to_s)
|
20
|
+
trigger("wait_dependency_#{unique_num}", {:names => names}.merge(opts))
|
21
|
+
nm = @config[:name]
|
22
|
+
names.each do |name|
|
23
|
+
parent.process(name) do
|
24
|
+
trigger("check_dependency_#{unique_num}", :names => [ nm ] )
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def unique_num
|
32
|
+
$unique_num ||= 0
|
33
|
+
$unique_num += 1
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|