procodile 1.0.12 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 507f12e0dc524f32be34c9dfaf80f1696dd6da41
4
- data.tar.gz: ff6feb4c0ccf2d3f7db4972ded509729cc18ab50
3
+ metadata.gz: 7feabe360a0d490ac91076744fd7f782d39eebd0
4
+ data.tar.gz: 71e2007d58331378e50d47263f12dee80b35d103
5
5
  SHA512:
6
- metadata.gz: 295a7caf4a5969807ed492ee3dad806dd120c060d73d21880af573c3f5fde655f941d0cf45fb8c32464ab24174fc9498ee229b1a63c70a999e4189ed2cb9dad2
7
- data.tar.gz: af5cbb8a7678c306f1ce4844bef0c2e87e1d3126686d554aa015e26b33bad5531cc37818bc31d29534be4051eaacfc655aaf469283fc9b4acdea41bb1534f718
6
+ metadata.gz: ee34c71d613246a255baaa0c9d2a6bf43be1ed845bd0001413c3e1cf45bc4b43eb7fb39563c79483ced396a277158a11f65348e82791340db699cf4f7e847089
7
+ data.tar.gz: d6f501fbb6997231185507fcddd508446399a75b74eb53fa519f922c54d5eaecfb7e1c12f909407b056d1122b80baa9e3dfb1f2d279abffd3093e19667632f16
data/bin/procodile CHANGED
@@ -46,100 +46,58 @@ rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
46
46
  exit 1
47
47
  end
48
48
 
49
- root = nil
50
- procfile = nil
51
- global_config = {}
52
- if options[:root] && options[:procfile]
53
- # root and profile provided on the command line
54
- root = options[:root]
55
- procfile = options[:procfile]
56
- elsif options[:root] && options[:procfile].nil?
57
- # root provided on the command line but no procfile
58
- root = options[:root]
59
- procfile = nil
60
- elsif options[:root].nil? && options[:procfile]
61
- # no root provided but a procfile is provided
62
- procfile = File.expand_path(options[:procfile])
63
- root = File.dirname(procfile)
49
+
50
+ # Get the global configuration file data
51
+ global_config_path = ENV['PROCODILE_CONFIG'] || "/etc/procodile"
52
+ if File.file?(global_config_path)
53
+ global_config = YAML.load_file(global_config_path)
64
54
  else
65
- # we don't really know what to do in this situation, if there's a global config
66
- # file we can use that
67
- global_config_path = ENV['PROCODILE_CONFIG'] || "/etc/procodile"
68
- if File.exist?(global_config_path)
69
- global_config = YAML.load_file(global_config_path)
70
- if global_config.is_a?(Array)
71
- if ENV['PROCODILE_APP_ID']
72
- app_id = ENV['PROCODILE_APP_ID'].to_i
73
- preselect = true
74
- else
75
- puts "There are multiple applications configured in #{global_config_path}"
76
- if File.file?("Procfile")
77
- puts "\e[45;37mChoose an appplication or press ENTER to use the current directory:\e[0m"
78
- else
79
- puts "\e[45;37mChoose an application:\e[0m"
80
- end
81
- global_config.each_with_index do |app, i|
82
- col = i % 3
83
- print "#{(i+1)}) #{app['name']}"[0,28].ljust(col != 2 ? 30 : 0, ' ')
84
- if col == 2 || i == global_config.size - 1
85
- puts
86
- end
87
- end
88
- app_id = STDIN.gets.to_i
89
- ENV['PROCODILE_APP_ID'] = app_id.to_s
90
- preselect = false
91
- end
55
+ global_config = {}
56
+ end
92
57
 
93
- if app_id == 0
94
- if File.file?('Procfile')
95
- unless preselect
96
- puts "Skipping application selection... using current directory"
97
- end
98
- global_config = {}
99
- else
100
- exit 1
101
- end
102
- elsif app = global_config[app_id - 1]
103
- unless preselect
104
- puts "\e[35mYou selected #{app['name']}\e[0m"
105
- end
106
- global_config = app
107
- else
108
- puts "Invalid app number"
109
- exit 1
58
+ # Create a determination to work out where we want to load our app from
59
+ require 'procodile/app_determination'
60
+ ap = Procodile::AppDetermination.new(FileUtils.pwd, options[:root], options[:procfile], options[:environment], global_config)
61
+ if ap.ambiguous?
62
+ if ENV['PROCODILE_APP_ID']
63
+ ap.set_app(ENV['PROCODILE_APP_ID'].to_i)
64
+ elsif ap.app_options.empty?
65
+ $stderr.puts "Error: Could not find procodile in #{FileUtils.pwd}/Procfile".color(31)
66
+ exit 1
67
+ else
68
+ puts "There are multiple applications configured in #{global_config_path}"
69
+ puts "\e[45;37mChoose an application:\e[0m"
70
+ ap.app_options.each do |i, app|
71
+ col = i % 3
72
+ print "#{(i+1)}) #{app}"[0,28].ljust(col != 2 ? 30 : 0, ' ')
73
+ if col == 2 || i == ap.app_options.size - 1
74
+ puts
110
75
  end
111
76
  end
77
+
78
+ app_id = STDIN.gets.strip.to_i - 1
79
+ if ap.app_options[app_id]
80
+ ap.set_app(app_id)
81
+ else
82
+ puts "Invalid app number: #{app_id + 1}"
83
+ exit 1
84
+ end
112
85
  end
113
86
  end
114
87
 
115
- if global_config['user'] && ENV['USER'] != global_config['user']
88
+ if ap.user && ENV['USER'] != ap.user
116
89
  if global_config['user_reexec']
117
- $stderr.puts "\e[31mProcodile must be run as #{global_config['user']}. Re-executing as #{global_config['user']}...\e[0m"
118
- exec("sudo -E -u #{global_config['user']} -- #{$0} #{ORIGINAL_ARGV}")
90
+ $stderr.puts "\e[31mProcodile must be run as #{ap.user}. Re-executing as #{ap.user}...\e[0m"
91
+ exec("sudo -E -u #{ap.user} -- #{$0} #{ORIGINAL_ARGV}")
119
92
  else
120
- $stderr.puts "\e[31mError: Procodile must be run as #{global_config['user']}\e[0m"
93
+ $stderr.puts "\e[31mError: Procodile must be run as #{ap.user}\e[0m"
121
94
  exit 1
122
95
  end
123
96
  end
124
97
 
125
- if global_config['root'] && global_config['procfile']
126
- # the global config specifies a root and a procfile
127
- root = global_config['root']
128
- procfile = File.expand_path(global_config['procfile'], root)
129
- elsif global_config['root'] && global_config['procfile'].nil?
130
- root = global_config['root']
131
- procfile = nil # assume from the root
132
- elsif global_config['root'].nil? && global_config['procfile']
133
- procfile = global_config['procfile']
134
- root = File.dirname(procfile)
135
- else
136
- root ||= FileUtils.pwd
137
- procfile ||= nil
138
- end
139
-
140
98
  begin
141
99
  if command != 'help'
142
- cli.config = Procodile::Config.new(root, options[:environment], procfile)
100
+ cli.config = Procodile::Config.new(ap.root, ap.environment, ap.procfile)
143
101
  end
144
102
  cli.dispatch(command)
145
103
  rescue Procodile::Error => e
@@ -0,0 +1,150 @@
1
+ module Procodile
2
+ #
3
+ # This class is responsible for determining which application should be
4
+ # sued
5
+ #
6
+ class AppDetermination
7
+
8
+ # Start by creating an determination ased on the root and procfile that has been provided
9
+ # to us by the user (from --root and/or --procfile)
10
+ def initialize(pwd, given_root, given_procfile, given_environment, global_options = {})
11
+ @pwd = pwd
12
+ @given_root = given_root
13
+ @given_procfile = given_procfile
14
+ @given_environment = given_environment
15
+ @global_options = global_options
16
+ calculate
17
+ end
18
+
19
+ # Return the environment
20
+ def environment
21
+ @given_environment || @environment || 'production'
22
+ end
23
+
24
+ # Return the root directory
25
+ def root
26
+ @root
27
+ end
28
+
29
+ # Return the procfile
30
+ def procfile
31
+ @procfile
32
+ end
33
+
34
+ # Return the user that we must be executing as if not current user
35
+ def user
36
+ @user
37
+ end
38
+
39
+ # Should this be reexeced
40
+ def reexec?
41
+ @reexec == true
42
+ end
43
+
44
+ # Are we in an app's directory?
45
+ def in_app_directory?
46
+ @in_app_directory == true
47
+ end
48
+
49
+ # If we have a root and procfile, we're all good
50
+ def unambiguous?
51
+ !!(@root && @procfile)
52
+ end
53
+
54
+ def ambiguous?
55
+ !unambiguous?
56
+ end
57
+
58
+ # Choose which of the ambiguous options we want to choose
59
+ def set_app(id)
60
+ @app_id = id
61
+ find_root_and_procfile_from_options(@global_options)
62
+ end
63
+
64
+ # Return an hash of possible options to settle the ambiguity
65
+ def app_options
66
+ if ambiguous?
67
+ hash = {}
68
+ @global_options.each_with_index { |option, i| hash[i] = option['name'] || option['root'] }
69
+ hash
70
+ else
71
+ {}
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def calculate
78
+ # Try and find something using the information that has been given to us by the user
79
+ find_root_and_procfile(@pwd, @given_root, @given_procfile)
80
+ if ambiguous?
81
+ # Otherwise, try and use the global config we have been given
82
+ find_root_and_procfile_from_options(@global_options)
83
+ else
84
+ # Try to load additional global details on to the existing app
85
+ if @root && options = global_options_for_path(@root)
86
+ add_global_options(options)
87
+ end
88
+ end
89
+ end
90
+
91
+ def find_root_and_procfile(pwd, root, procfile)
92
+ if root && procfile
93
+ # The user has provided both the root and procfile, we can use these
94
+ @root = File.expand_path(root)
95
+ @procfile = File.expand_path(procfile, @root)
96
+ elsif root && procfile.nil?
97
+ # The user has given us a root, we can assume they want to use the procfile
98
+ # from the root
99
+ @root = File.expand_path(root)
100
+ @procfile = File.join(@root, 'Procfile')
101
+ elsif root.nil? && procfile
102
+ # The user has given us a procfile but no root. We will assume the procfile
103
+ # is in the root of the directory
104
+ @procfile = File.expand_path(procfile)
105
+ @root = File.dirname(@procfile)
106
+ else
107
+ # The user has given us nothing. We will check to see if there's a Procfile
108
+ # in the root of our current pwd
109
+ if File.file?(File.join(pwd, 'Procfile'))
110
+ # If there's a procfile in our current pwd, we'll look at using that.
111
+ @procfile = File.join(pwd, 'Procfile')
112
+ @root = File.dirname(@procfile)
113
+ @in_app_directory = true
114
+ end
115
+ end
116
+ end
117
+
118
+ def find_root_and_procfile_from_options(options)
119
+ if options.is_a?(Hash)
120
+ # Use the current hash
121
+ find_root_and_procfile(@pwd, options['root'], options['procfile'])
122
+ add_global_options(options)
123
+ elsif options.is_a?(Array)
124
+ # Global options is provides a list of apps. We need to know which one of
125
+ # these we should be looking at.
126
+ if @app_id
127
+ find_root_and_procfile_from_options(options[@app_id])
128
+ end
129
+ end
130
+ end
131
+
132
+ def global_options_for_path(root)
133
+ root = File.expand_path(root)
134
+ if @global_options.is_a?(Hash) && @global_options['root'] && File.expand_path(@global_options['root']) == root
135
+ @global_options
136
+ elsif @global_options.is_a?(Array) && option = @global_options.select { |o| o['root'] && File.expand_path(o['root']) == root }.first
137
+ option
138
+ else
139
+ nil
140
+ end
141
+ end
142
+
143
+ def add_global_options(options)
144
+ @user = options['user'] if options['user']
145
+ @reexec = options['user_reexec'] if options['user_reexec']
146
+ @environment = options['environment'] if options['environment']
147
+ end
148
+
149
+ end
150
+ end
@@ -41,6 +41,17 @@ module Procodile
41
41
  end
42
42
  end
43
43
 
44
+ #
45
+ # Should this process be running?
46
+ #
47
+ def should_be_running?
48
+ if stopped? || stopping?
49
+ false
50
+ else
51
+ true
52
+ end
53
+ end
54
+
44
55
  #
45
56
  # Return an array of environment variables that should be set
46
57
  #
@@ -184,7 +184,7 @@ module Procodile
184
184
  messages << {:type => :incorrect_quantity, :process => process.name, :current => process_instances.size, :desired => process.quantity}
185
185
  end
186
186
  for instance in process_instances
187
- if instance.status != 'Running'
187
+ if instance.should_be_running? && instance.status != 'Running'
188
188
  messages << {:type => :not_running, :instance => instance.description, :status => instance.status}
189
189
  end
190
190
  end
@@ -1,3 +1,3 @@
1
1
  module Procodile
2
- VERSION = '1.0.12'
2
+ VERSION = '1.0.13'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: procodile
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.12
4
+ version: 1.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-21 00:00:00.000000000 Z
11
+ date: 2017-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -34,6 +34,7 @@ extra_rdoc_files: []
34
34
  files:
35
35
  - bin/procodile
36
36
  - lib/procodile.rb
37
+ - lib/procodile/app_determination.rb
37
38
  - lib/procodile/cli.rb
38
39
  - lib/procodile/config.rb
39
40
  - lib/procodile/control_client.rb
@@ -75,3 +76,4 @@ specification_version: 4
75
76
  summary: This gem will help you run Ruby processes from a Procfile on Linux servers
76
77
  in the background.
77
78
  test_files: []
79
+ has_rdoc: