aggkit 0.3.1.8768 → 0.3.4

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.
data/bin/agggen CHANGED
@@ -7,65 +7,65 @@ require 'optparse'
7
7
  UTIL = File.basename(__FILE__)
8
8
 
9
9
  @opts = {
10
- token: ENV['GITLAB_API_PRIVATE_TOKEN'] || ENV['BOT_TOKEN'] || ENV['TOKEN'],
10
+ token: ENV['GITLAB_API_PRIVATE_TOKEN'] || ENV['BOT_TOKEN'] || ENV['TOKEN'],
11
11
  endpoint: 'https://br.rnds.pro/api/v4',
12
- exclude: 'core/mq,core/auth,core/ca,core/router,core/admin,core/filator',
13
- gtmpl: '%name%:%id%',
14
- ptmpl: '%badge% %name%:%id%',
12
+ exclude: 'core/mq,core/auth,core/ca,core/router,core/admin,core/filator',
13
+ gtmpl: '%name%:%id%',
14
+ ptmpl: '%badge% %name%:%id%'
15
15
  }
16
16
 
17
17
 
18
18
  @dynamic = {
19
- badge: Proc.new do |object|
19
+ badge: proc do |object|
20
20
  "#{object.web_url}/badges/master/pipeline.svg"
21
21
  end,
22
- pipeline: Proc.new do |object|
22
+ pipeline: proc do |object|
23
23
  "#{object.web_url}/pipelines"
24
24
  end,
25
- redmine_badge:Proc.new do |object|
25
+ redmine_badge: proc do |object|
26
26
  "!#{object.web_url}/badges/master/pipeline.svg!:#{object.web_url}/pipelines"
27
27
  end,
28
- redmine_link:Proc.new do |object|
28
+ redmine_link: proc do |object|
29
29
  "\"#{object.name}\":#{object.web_url}"
30
30
  end,
31
31
 
32
- gitlab_link:Proc.new do |object|
32
+ gitlab_link: proc do |object|
33
33
  "[#{object.name}](#{object.web_url})"
34
34
  end,
35
- gitlab_badge:Proc.new do |object|
35
+ gitlab_badge: proc do |object|
36
36
  "[![#{object.name} status](#{object.web_url}/badges/master/pipeline.svg)](#{object.web_url})"
37
- end,
37
+ end
38
38
  }
39
39
 
40
40
  @tempaltes = {
41
- redmine: "|%redmine_badge%|%redmine_link%|%description%|",
41
+ redmine: '|%redmine_badge%|%redmine_link%|%description%|',
42
42
  gredmine: "\n|*%name%*||%description%|",
43
- gitlab: "* [ ] %gitlab_link% %description%",
44
- ggitlab: "\n**%name%**",
43
+ gitlab: '* [ ] %gitlab_link% %description%',
44
+ ggitlab: "\n**%name%**"
45
45
  }
46
46
 
47
47
  parser = OptionParser.new do |o|
48
48
  o.banner = "Usage: #{UTIL} [options]"
49
49
 
50
- o.on("--list", 'list projects') do
50
+ o.on('--list', 'list projects') do
51
51
  @opts[:list] = true
52
52
  end
53
53
 
54
- o.on("--groups groups", 'process only these groups') do |groups|
54
+ o.on('--groups groups', 'process only these groups') do |groups|
55
55
  @opts[:groups] = groups.to_s.split(/[ ,;|]/).map(&:to_s).reject(&:empty?).uniq
56
56
  end
57
57
 
58
- o.on("--gtmpl template", 'template to print group') do |tmpl|
58
+ o.on('--gtmpl template', 'template to print group') do |tmpl|
59
59
  tmpl = @tempaltes[tmpl.to_s.to_sym] || tmpl
60
60
  @opts[:gtmpl] = tmpl.to_s
61
61
  end
62
62
 
63
- o.on("--ptmpl template", 'template to print projects') do |tmpl|
63
+ o.on('--ptmpl template', 'template to print projects') do |tmpl|
64
64
  tmpl = @tempaltes[tmpl.to_s.to_sym] || tmpl
65
65
  @opts[:ptmpl] = tmpl.to_s
66
66
  end
67
67
 
68
- o.on("--exclude projects", 'exclude projects from selection') do |exclude|
68
+ o.on('--exclude projects', 'exclude projects from selection') do |exclude|
69
69
  @opts[:exclude] = exclude.to_s
70
70
  end
71
71
 
@@ -73,23 +73,22 @@ parser = OptionParser.new do |o|
73
73
  @opts[:endpoint] = endpoint.to_s.strip
74
74
  end
75
75
 
76
- o.on("--token token", 'set api token') do |token|
76
+ o.on('--token token', 'set api token') do |token|
77
77
  @opts[:token] = token.to_s.strip
78
78
  end
79
-
80
79
  end
81
80
  parser.parse!
82
81
 
83
82
  @api = Gitlab.client(endpoint: @opts[:endpoint], private_token: @opts[:token])
84
83
 
85
- MAIN_GROUP='aggredator'
84
+ MAIN_GROUP = 'aggredator'.freeze
86
85
 
87
86
 
88
87
 
89
- def each_group group
88
+ def each_group(group)
90
89
  Enumerator.new do |y|
91
90
  y << group
92
-
91
+
93
92
  @api.group_subgroups(group.id, per_page: 1000).each do |sub|
94
93
  each_group(sub).each do |g|
95
94
  y << g
@@ -98,7 +97,7 @@ def each_group group
98
97
  end
99
98
  end
100
99
 
101
- def each_project group
100
+ def each_project(group)
102
101
  Enumerator.new do |y|
103
102
  @api.group_projects(group.id, per_page: 1000).each do |p|
104
103
  y << p
@@ -106,17 +105,16 @@ def each_project group
106
105
  end
107
106
  end
108
107
 
109
- def inspect_group group
108
+ def inspect_group(group)
110
109
  result = {}
111
110
  result[:groups] = @api.group_subgroups(group.id).each_with_object({}) do |sub, ret|
112
111
  ret[sub.name] = inspect_group(sub)
113
112
  end
114
- result[:projects] = @api.group_projects(group.id).map(&:name)
113
+ result[:projects] = @api.group_projects(group.id).map(&:name)
115
114
  result
116
115
  end
117
116
 
118
-
119
- def render tmpl, substs, object
117
+ def render(tmpl, substs, object)
120
118
  substs.reduce(tmpl) do |ret, s|
121
119
  if callable = @dynamic[s.to_sym]
122
120
  ret.gsub("%#{s}%", callable.call(object).to_s)
@@ -129,9 +127,9 @@ end
129
127
 
130
128
 
131
129
  if @opts[:list]
132
- gsubsts = @opts[:gtmpl].scan(/%\w+%/).map{|pattern| pattern[/\w+/]}
133
- psubsts = @opts[:ptmpl].scan(/%\w+%/).map{|pattern| pattern[/\w+/]}
134
-
130
+ gsubsts = @opts[:gtmpl].scan(/%\w+%/).map{|pattern| pattern[/\w+/] }
131
+ psubsts = @opts[:ptmpl].scan(/%\w+%/).map{|pattern| pattern[/\w+/] }
132
+
135
133
 
136
134
  main = @api.groups(search: MAIN_GROUP).first
137
135
 
@@ -158,7 +156,7 @@ if @opts[:list]
158
156
  puts line
159
157
  end
160
158
  end
161
-
159
+
162
160
  exit 0
163
161
  end
164
162
 
@@ -166,4 +164,3 @@ end
166
164
  STDERR.puts parser.help
167
165
  exit 1
168
166
 
169
-
data/bin/agglock CHANGED
@@ -4,9 +4,9 @@ require 'optparse'
4
4
  require 'diplomat'
5
5
 
6
6
  @opts = {
7
- url: 'http://localhost:8500',
7
+ url: 'http://localhost:8500',
8
8
  timeout: 10,
9
- ttl: 30 * 60
9
+ ttl: 30 * 60
10
10
  }
11
11
 
12
12
  parser = OptionParser.new do |o|
@@ -48,9 +48,9 @@ end
48
48
 
49
49
  if resource = @opts[:lock]
50
50
  locker = {
51
- Name: "#{resource}_locker_#{rand(999_999)}",
51
+ Name: "#{resource}_locker_#{rand(999_999)}",
52
52
  Behavior: 'delete',
53
- TTL: "#{@opts[:ttl]}s",
53
+ TTL: "#{@opts[:ttl]}s",
54
54
  resource: resource
55
55
  }
56
56
  sessionid = Diplomat::Session.create(locker)
@@ -69,3 +69,4 @@ else
69
69
  STDERR.puts parser.help
70
70
  exit 1
71
71
  end
72
+
data/bin/aggmerge CHANGED
@@ -40,7 +40,9 @@ def extend_hash(first, second)
40
40
  next unless second.key?(fk)
41
41
 
42
42
  sv = second[fk]
43
- raise "Types of values not match(#{fv.class}, #{sv.class})" if fv.class != sv.class
43
+ if !fv.nil? && !sv.nil? && fv.class != sv.class
44
+ raise "Types of values not match(#{fv.class}, #{sv.class})" if fv.class != sv.class
45
+ end
44
46
 
45
47
  # Специальный случай потому что command не мерджится а заменяется
46
48
  if fk == 'command'
@@ -67,31 +69,32 @@ end
67
69
  def process_compose_hash(yml, dirname, parent = {})
68
70
  (yml['services'] || {}).each_pair do |name, service|
69
71
  next unless ext = service['extends']
72
+
70
73
  base = if ext.is_a? String
71
- template = yml['services'][ext]
72
- parent_service = (parent['services'] || {})[ext] || {}
73
- extend_hash(parent_service.deep_dup, template)
74
- elsif file = ext['file']
75
- ENV.each_pair do |k, v|
76
- file.gsub!("$#{k}", v)
77
- file.gsub!("${#{k}}", v)
78
- end
79
-
80
- file_to_load = if File.exist?(dirname + '/' + file)
81
- dirname + '/' + file
82
- else
83
- file
84
- end
85
-
86
- tmp = process_compose_hash(YAML.load(File.read(file_to_load)), File.dirname(file_to_load), service)
87
-
88
- begin
89
- (tmp['services'][ext['service']] || {})
90
- rescue StandardError
91
- {}
92
- end
93
- else
94
- yml['services'][ext['service']]
74
+ template = yml['services'][ext]
75
+ parent_service = (parent['services'] || {})[ext] || {}
76
+ extend_hash(parent_service.deep_dup, template)
77
+ elsif file = ext['file']
78
+ ENV.each_pair do |k, v|
79
+ file.gsub!("$#{k}", v)
80
+ file.gsub!("${#{k}}", v)
81
+ end
82
+
83
+ file_to_load = if File.exist?(dirname + '/' + file)
84
+ dirname + '/' + file
85
+ else
86
+ file
87
+ end
88
+
89
+ tmp = process_compose_hash(YAML.load(File.read(file_to_load)), File.dirname(file_to_load), service)
90
+
91
+ begin
92
+ (tmp['services'][ext['service']] || {})
93
+ rescue StandardError
94
+ {}
95
+ end
96
+ else
97
+ yml['services'][ext['service']]
95
98
  end.deep_dup
96
99
 
97
100
  service.delete 'extends'
@@ -101,13 +104,13 @@ def process_compose_hash(yml, dirname, parent = {})
101
104
  yml
102
105
  end
103
106
 
104
- def remove_build_section hash
105
- if hash.has_key?(:build) || hash.has_key?('build')
107
+ def remove_build_section(hash)
108
+ if hash.key?(:build) || hash.key?('build')
106
109
  hash.delete(:build)
107
110
  hash.delete('build')
108
111
  end
109
112
 
110
- hash.each_pair do |k, v|
113
+ hash.each_pair do |_k, v|
111
114
  if v.is_a?(Hash)
112
115
  remove_build_section(v)
113
116
  elsif v.is_a?(Array)
@@ -124,6 +127,7 @@ if File.basename($PROGRAM_NAME) == File.basename(__FILE__)
124
127
  if yml['version'] && parent['version'] && yml['version'] != parent['version']
125
128
  raise "version mismatch: #{file}"
126
129
  end
130
+
127
131
  ret = extend_hash(parent.deep_dup, yml)
128
132
  ret
129
133
  end
@@ -138,3 +142,4 @@ if File.basename($PROGRAM_NAME) == File.basename(__FILE__)
138
142
  end
139
143
 
140
144
  end
145
+
data/bin/aggstart CHANGED
@@ -5,16 +5,24 @@ require 'aggkit'
5
5
  UTIL = File.basename(__FILE__)
6
6
 
7
7
  @opts = {
8
- service: ENV['AGGREDATOR_SERVICE'],
9
- consul: ENV['CONSUL_HOST'] || 'localhost',
8
+ service: ENV['AGGREDATOR_SERVICE'],
9
+ consul: ENV['CONSUL_HTTP_ADDR'] || ENV['CONSUL_HOST'] || 'localhost',
10
10
  consulconf: [],
11
- depends: [],
11
+ depends: []
12
12
  }
13
13
 
14
+ @opts[:exec] = (begin
15
+ idx = ARGV.index {|a| a.strip == '--' } + 1
16
+ ARGV[idx..-1]
17
+ rescue StandardError
18
+ []
19
+ end)
20
+
21
+
14
22
  parser = Aggkit::OptionParser.new do |o|
15
23
  o.banner = "Usage: #{UTIL} [options]"
16
24
 
17
- o.on("--service <NAME>", 'Set service NAME. AGGREDATOR_SERVICE env can be used instead') do |service|
25
+ o.on('--service <NAME>', 'Set service NAME. AGGREDATOR_SERVICE env can be used instead') do |service|
18
26
  @opts[:service] = service.to_s
19
27
  end
20
28
 
@@ -22,7 +30,7 @@ parser = Aggkit::OptionParser.new do |o|
22
30
  @opts[:consul] = consul.to_s
23
31
  end
24
32
 
25
- o.on("--consulconf=consul,consul/smev3...", 'Set list of folders with consul configs. Special: none - disable local consul') do |list|
33
+ o.on('--consulconf=consul,consul/smev3...', 'Set list of folders with consul configs. Special: none - disable local consul') do |list|
26
34
  @opts[:consulconf] = if list.to_s == 'none'
27
35
  nil
28
36
  else
@@ -30,28 +38,18 @@ parser = Aggkit::OptionParser.new do |o|
30
38
  end
31
39
  end
32
40
 
33
- o.on("--depends=mq,db,router...", 'Set list of services to wait for ready before start') do |list|
41
+ o.on('--depends=mq,db,router...', 'Set list of services to wait for ready before start') do |list|
34
42
  @opts[:depends] = list.to_s.split(/[ ;,|]/).map(&:to_s).reject(&:empty?)
35
43
  end
36
-
37
- o.on("--exec <FILE>", 'Set FILE to execute.') do |file|
38
- @opts[:exec] = file.to_s
39
- end
40
-
41
-
42
44
  end
43
45
  parser.parse!
44
46
 
45
47
 
46
48
  include Aggkit::Runner
47
49
 
48
- if @opts[:service].to_s.empty?
49
- die "service name must be provided"
50
- end
50
+ die 'service name must be provided' if @opts[:service].to_s.empty?
51
51
 
52
- if @opts[:exec].to_s.empty?
53
- die "exec script must be provided"
54
- end
52
+ die 'exec script must be provided' if @opts[:exec].empty?
55
53
 
56
54
  @opts[:node_name] = "#{@opts[:service]}_#{`hostname`.strip}".strip
57
55
 
@@ -64,7 +62,6 @@ init_service @opts[:service], @opts
64
62
  envsubst '/home/app/consul'
65
63
 
66
64
  Aggkit::Watcher.new.exec do |watcher|
67
-
68
65
  if @opts[:consulconf]
69
66
  configs = @opts[:consulconf].map do |folder|
70
67
  "-config-dir #{folder}"
@@ -76,9 +73,9 @@ Aggkit::Watcher.new.exec do |watcher|
76
73
  if File.exist?('/home/app/docker/start_checker.py')
77
74
  watcher.add '/home/app/docker/start_checker.py'
78
75
  end
79
-
80
76
 
81
- execute!("aggwait -t 20 --consul-addr=http://#{@opts[:consul]}:8500 --consul", "Timeout for consul service")
77
+
78
+ execute!("aggwait -t 20 --consul-addr=http://#{@opts[:consul]}:8500 --consul", 'Timeout for consul service')
82
79
 
83
80
  load_envs_from_consul(@opts[:consul], @opts[:service])
84
81
 
@@ -88,6 +85,6 @@ Aggkit::Watcher.new.exec do |watcher|
88
85
 
89
86
  sleep 2
90
87
 
91
- watcher.add %W{#{@opts[:exec]}}
88
+ watcher.add @opts[:exec]
92
89
  end
93
90
 
data/bin/aggterm CHANGED
@@ -6,8 +6,8 @@ STDOUT.sync = true
6
6
  STDERR.sync = true
7
7
 
8
8
  @opts = {
9
- code: 0,
10
- sleep: 1,
9
+ code: 0,
10
+ sleep: 1,
11
11
  term_code: 0
12
12
  }
13
13
 
@@ -69,3 +69,4 @@ end
69
69
 
70
70
  log "normal exit with: #{@opts[:code]}"
71
71
  exit @opts[:code]
72
+
data/bin/aggwait CHANGED
@@ -105,9 +105,9 @@ if @opts[:db]
105
105
  @pg[:db] = "-d #{@opts[:db]}"
106
106
  @pg[:user] = "-U #{@opts[:user]}" if @opts[:user]
107
107
  @pg[:pass] = if @opts[:pass] && !@opts[:pass].empty?
108
- "PGPASSWORD=#{@opts[:pass]}"
109
- else
110
- ''
108
+ "PGPASSWORD=#{@opts[:pass]}"
109
+ else
110
+ ''
111
111
  end
112
112
 
113
113
  @pg[:host] = "-h #{@opts[:host]}" if @opts[:host]
@@ -124,6 +124,7 @@ def wait_for(timeout)
124
124
  return success if success
125
125
 
126
126
  return false if (Time.now - starttime) > timeout
127
+
127
128
  sleep @opts[:interval]
128
129
  end
129
130
 
@@ -280,3 +281,4 @@ if @opts[:docker]
280
281
  complete!(success)
281
282
  end
282
283
  end
284
+
data/bin/aggwrap ADDED
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'diplomat'
4
+ require 'securerandom'
5
+ require 'aggkit'
6
+ require 'net/http'
7
+
8
+ STDERR.sync
9
+ STDOUT.sync
10
+
11
+ UTIL = File.basename(__FILE__)
12
+
13
+ @opts = {
14
+ service: ENV['AGGREDATOR_SERVICE'],
15
+ id: SecureRandom.hex(8),
16
+ consul: ENV['CONSUL_HTTP_ADDR'] || ENV['CONSUL_HOST'] || 'localhost'
17
+ }
18
+
19
+ @opts[:exec] = (begin
20
+ idx = ARGV.index {|a| a.strip == '--' } + 1
21
+ ARGV[idx..-1]
22
+ rescue StandardError
23
+ []
24
+ end)
25
+
26
+ parser = Aggkit::OptionParser.new do |o|
27
+ o.banner = "Usage: #{UTIL} [options] -- exec script"
28
+
29
+ o.on('--service <NAME>', 'Set service NAME. AGGREDATOR_SERVICE env used when missed') do |service|
30
+ @opts[:service] = service.to_s
31
+ end
32
+
33
+ o.on('--id <identifier>', 'Set service identifier to concat with name. Random when default') do |id|
34
+ @opts[:id] = id.to_s
35
+ end
36
+
37
+ o.on("--consul=#{@opts[:consul]}", 'Set consul host. CONSUL_HOST env used when missed') do |consul|
38
+ @opts[:consul] = consul.to_s
39
+ Diplomat.configure do |config|
40
+ config.url = @opts[:consul]
41
+ end
42
+ end
43
+
44
+ o.on('--http <PORT>', 'Create TTL consul check and pass http result to it') do |port|
45
+ @opts[:http] = port.to_s
46
+ end
47
+
48
+ o.on('--file <FILE>', 'Create TTL consul check and pass file contents to it') do |file|
49
+ @opts[:file] = file.to_s
50
+ end
51
+
52
+ o.on('--pidfile <FILE>', 'Create TTL consul check and pass pid check(from file) to it') do |file|
53
+ @opts[:pidfile] = file.to_s
54
+ end
55
+
56
+ o.on('--script <FILE>', 'Create TTL consul check and pass script result to it') do |file|
57
+ @opts[:script] = file.to_s
58
+ end
59
+ end
60
+ parser.parse!
61
+
62
+ die 'service name must be provided' if @opts[:service].to_s.empty?
63
+
64
+ die 'script must be provided' if @opts[:exec].empty?
65
+
66
+ SERVICE_ID = "#{@opts[:service]}_#{@opts[:id]}".freeze
67
+
68
+ @service = {
69
+ Name: @opts[:service],
70
+ ID: SERVICE_ID,
71
+ Checks: []
72
+ }
73
+
74
+ @checks = {}
75
+
76
+
77
+ @checks[:exec] = "#{SERVICE_ID}_exec_ttl"
78
+ @service[:Checks].push(
79
+ CheckID: @checks[:exec],
80
+ Name: "Wrapped service: #{@opts[:service]}. Process: #{@opts[:exec].inspect}",
81
+ DeregisterCriticalServiceAfter: '1m',
82
+ TTL: '30s'
83
+ )
84
+
85
+ if @opts[:http]
86
+ @checks[:http] = "#{SERVICE_ID}_http_ttl"
87
+ @service[:Checks].push(
88
+ CheckID: @checks[:http],
89
+ Name: "Wrapped service: #{@opts[:service]}. HTTP: #{@opts[:http]}",
90
+ DeregisterCriticalServiceAfter: '1m',
91
+ TTL: '30s'
92
+ )
93
+ end
94
+
95
+ if @opts[:file]
96
+ @checks[:file] = "#{SERVICE_ID}_file_ttl"
97
+ @service[:Checks].push(
98
+ CheckID: @checks[:file],
99
+ Name: "Wrapped service: #{@opts[:service]}. File: #{@opts[:file]}",
100
+ DeregisterCriticalServiceAfter: '1m',
101
+ TTL: '30s'
102
+ )
103
+ end
104
+
105
+ if @opts[:pidfile]
106
+ @checks[:pidfile] = "#{SERVICE_ID}_pidfile_ttl"
107
+ @service[:Checks].push(
108
+ CheckID: @checks[:pidfile],
109
+ Name: "Wrapped service: #{@opts[:service]}. Pidfile: #{@opts[:pidfile]}",
110
+ DeregisterCriticalServiceAfter: '1m',
111
+ TTL: '30s'
112
+ )
113
+ end
114
+
115
+ if @opts[:script]
116
+ @checks[:script] = "#{SERVICE_ID}_script_ttl"
117
+ @service[:Checks].push(
118
+ CheckID: @checks[:script],
119
+ Name: "Wrapped service: #{@opts[:service]}. Script: #{@opts[:script]}",
120
+ DeregisterCriticalServiceAfter: '1m',
121
+ TTL: '30s'
122
+ )
123
+ end
124
+
125
+ def make_ttl_pass(check_id, output = nil)
126
+ STDERR.puts "TTL call failed: #{check_id}" unless Diplomat::Check.pass(check_id, output)
127
+ end
128
+
129
+ def make_ttl_fail(check_id, output = nil)
130
+ STDERR.puts "TTL call failed: #{check_id}" unless Diplomat::Check.fail(check_id, output)
131
+ end
132
+
133
+ def check_http(check_id, port)
134
+ response = Net::HTTP.get_response(URI("http://localhost:#{port}"))
135
+ output = response.body.strip
136
+ if response.code.to_i < 400
137
+ make_ttl_pass(check_id, output)
138
+ else
139
+ make_ttl_fail(check_id, output)
140
+ end
141
+ rescue StandardError => e
142
+ make_ttl_fail(check_id, e.inspect)
143
+ end
144
+
145
+ def check_file(check_id, file)
146
+ output = File.read(file).strip
147
+ make_ttl_pass(check_id, output)
148
+ rescue StandardError => e
149
+ make_ttl_fail(check_id, e.inspect)
150
+ end
151
+
152
+ def check_pidfile(check_id, pidfile)
153
+ pid = Integer(File.read(pidfile).strip)
154
+ make_ttl_pass(check_id)
155
+ rescue StandardError => e
156
+ make_ttl_fail(check_id, e.inspect)
157
+ end
158
+
159
+ def check_script(check_id, script)
160
+ output = `#{script} 2>&1`.to_s.strip
161
+ if $?&.success?
162
+ make_ttl_pass(check_id, output)
163
+ else
164
+ make_ttl_fail(check_id, output)
165
+ end
166
+ rescue StandardError => e
167
+ make_ttl_fail(check_id, e.inspect)
168
+ end
169
+
170
+ def run_check(check_id)
171
+ yield(check_id)
172
+ rescue StandardError => e
173
+ STDERR.puts "make_ttl_pass[#{check_id}] Exception: #{e.inspect}"
174
+ end
175
+
176
+ if Diplomat::Service.register(@service)
177
+ Thread.new do
178
+ loop do
179
+ run_check(@checks[:exec]) do |check_id|
180
+ make_ttl_pass(check_id)
181
+ end
182
+
183
+ if @checks[:http]
184
+ run_check(@checks[:http]) do |check_id|
185
+ check_http(check_id, @opts[:http])
186
+ end
187
+ end
188
+
189
+ if @checks[:file]
190
+ run_check(@checks[:file]) do |check_id|
191
+ check_file(check_id, @opts[:file])
192
+ end
193
+ end
194
+
195
+ if @checks[:pidfile]
196
+ run_check(@checks[:pidfile]) do |check_id|
197
+ check_pidfile(check_id, @opts[:pidfile])
198
+ end
199
+ end
200
+
201
+ if @checks[:script]
202
+ run_check(@checks[:script]) do |check_id|
203
+ check_script(check_id, @opts[:script])
204
+ end
205
+ end
206
+
207
+ sleep 10
208
+ end
209
+ end
210
+ else
211
+ die "can't register consul service"
212
+ end
213
+
214
+ $pid = fork do
215
+ exec(*@opts[:exec])
216
+ end
217
+
218
+ %w[INT TERM].each do |sig|
219
+ trap(sig) do
220
+ trap(sig, 'SYSTEM_DEFAULT')
221
+ ::Process.kill(sig, $pid)
222
+ end
223
+ end
224
+
225
+ pid, status = Process.wait2($pid)
226
+
227
+ result = {}
228
+
229
+ if status
230
+ if status.signaled?
231
+ result[:signal] = status.termsig
232
+ elsif status.exited?
233
+ result[:exit] = if status.success?
234
+ 0
235
+ else
236
+ [status.exitstatus, 2].max
237
+ end
238
+ end
239
+ end
240
+
241
+ if result[:signal]
242
+ trap(result[:signal], 'SYSTEM_DEFAULT')
243
+ ::Process.kill(result[:signal], ::Process.pid)
244
+ elsif result[:exit]
245
+ exit(result[:exit])
246
+ else
247
+ STDERR.puts 'unknown subprocess result'
248
+ exit(-1)
249
+ end
250
+