cheftacular 2.9.1 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cheftacular/actions/deploy.rb +1 -1
- data/lib/cheftacular/actions/migrate.rb +2 -2
- data/lib/cheftacular/auditor.rb +25 -12
- data/lib/cheftacular/cheftacular.rb +2 -2
- data/lib/cheftacular/file_system.rb +5 -1
- data/lib/cheftacular/helper.rb +17 -4
- data/lib/cheftacular/initializer.rb +14 -18
- data/lib/cheftacular/queue_master.rb +4 -2
- data/lib/cheftacular/stateless_actions/arguments.rb +2 -0
- data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +23 -5
- data/lib/cheftacular/stateless_actions/cheftacular_config.rb +2 -2
- data/lib/cheftacular/stateless_actions/compile_audit_log.rb +2 -6
- data/lib/cheftacular/stateless_actions/slack.rb +4 -2
- data/lib/cheftacular/stateless_actions/update_cheftacular.rb +85 -0
- data/lib/cheftacular/stateless_actions/version.rb +27 -0
- data/lib/cheftacular/version.rb +1 -1
- data/lib/sshkit/getters.rb +6 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8949fa37858773111202176ac29af437fcbb10b4
|
4
|
+
data.tar.gz: 672dfda5a31ed376cbd1f73ad486af1e3f9f1407
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 983c929c9118974e86668048b1e4d67b5f53fc6903355e7abc668b6a69b46e7e34c35e2a74f76f5e28dcaedfa1cca12ab182b999321844344603e87778f5a8f8
|
7
|
+
data.tar.gz: c0aead1166459633e9fa03dbfd08f80ee2d23b65e78ea90a014474f34c1ae3db8c7d5af91ad4e0a96a0757ee8aab6744ea762ebbd90d361c7af7325cea8bfabb
|
@@ -35,7 +35,7 @@ class Cheftacular
|
|
35
35
|
options, locs, ridley, logs_bag_hash, pass_bag_hash, bundle_command, cheftacular, passwords = @config['helper'].set_local_instance_vars
|
36
36
|
|
37
37
|
#on is namespaced to SSHKit::Backend::Netssh.on
|
38
|
-
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ), in: :groups, limit:
|
38
|
+
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ), in: :groups, limit: 6, wait: 5 do |host|
|
39
39
|
n = get_node_from_address(nodes, host.hostname)
|
40
40
|
|
41
41
|
puts("Beginning chef client run for #{ n.name } (#{ n.public_ipaddress }) on role #{ options['role'] }") unless options['quiet']
|
@@ -54,13 +54,13 @@ class Cheftacular
|
|
54
54
|
def migrate_wordpress nodes=[]
|
55
55
|
puts "Method #{ __method__ } is not yet implemented"
|
56
56
|
|
57
|
-
|
57
|
+
return false
|
58
58
|
end
|
59
59
|
|
60
60
|
def migrate_nodejs nodes=[]
|
61
61
|
puts "Method #{ __method__ } is not yet implemented"
|
62
62
|
|
63
|
-
|
63
|
+
return false
|
64
64
|
end
|
65
65
|
|
66
66
|
def migrate_all nodes=[]
|
data/lib/cheftacular/auditor.rb
CHANGED
@@ -9,19 +9,20 @@ class Cheftacular
|
|
9
9
|
current_day = Time.now.strftime('%Y%m%d')
|
10
10
|
current_time = Time.now.strftime('%H:%M')
|
11
11
|
|
12
|
+
audit_data = audit_run_as_hash
|
13
|
+
|
12
14
|
@config[@options['env']]['audit_bag_hash']['audit_log'][current_day] ||= {}
|
13
15
|
@config[@options['env']]['audit_bag_hash']['audit_log'][current_day][current_time] ||= []
|
14
|
-
@config[@options['env']]['audit_bag_hash']['audit_log'][current_day][current_time] <<
|
16
|
+
@config[@options['env']]['audit_bag_hash']['audit_log'][current_day][current_time] << audit_data
|
15
17
|
|
16
18
|
@config['ChefDataBag'].save_audit_bag
|
17
|
-
end
|
18
19
|
|
19
|
-
|
20
|
-
File.open( @config['filesystem'].current_audit_file_path, "w") { |f| f.write( fetch_audit_data_hash ) }
|
20
|
+
audit_command_to_slack_queue(audit_data) unless @config['cheftacular']['slack']['notify_on_command_execute'].blank?
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
ret_hash
|
23
|
+
def audit_run_as_hash ret_hash={}, options_to_ignore=[]
|
24
|
+
ret_hash['hostname'] = Socket.gethostname
|
25
|
+
ret_hash['directory'] = @config['locs']['root']
|
25
26
|
ret_hash['command'] = @options['command']
|
26
27
|
|
27
28
|
options_to_ignore << :preferred_cloud if @options['preferred_cloud'] == @config['cheftacular']['preferred_cloud']
|
@@ -29,6 +30,8 @@ class Cheftacular
|
|
29
30
|
options_to_ignore << :preferred_cloud_region if @options['preferred_cloud_region'] == @config['cheftacular']['preferred_cloud_region']
|
30
31
|
options_to_ignore << :virtualization_mode if @options['virtualization_mode'] == @config['cheftacular']['virtualization_mode']
|
31
32
|
options_to_ignore << :route_dns_changes_via if @options['route_dns_changes_via'] == @config['cheftacular']['route_dns_changes_via']
|
33
|
+
options_to_ignore << :sub_env
|
34
|
+
options_to_ignore << :command
|
32
35
|
|
33
36
|
ret_hash['options'] = @options.dup.delete_if { |key, value| options_to_ignore.include?(key.to_sym) }
|
34
37
|
|
@@ -37,14 +40,24 @@ class Cheftacular
|
|
37
40
|
ret_hash
|
38
41
|
end
|
39
42
|
|
40
|
-
def
|
41
|
-
|
43
|
+
def compile_audit_hash_entry_as_array audit_hash, entry_number=0, ret_array=[]
|
44
|
+
ret_array << "#{ (entry_number.to_s + '. ') unless entry_number == 0 }#{ audit_hash['command'] }"
|
45
|
+
ret_array << " Hostname: #{ audit_hash['hostname'] }"
|
46
|
+
ret_array << " Directory: #{ audit_hash['directory'] }" if audit_hash.has_key?('directory')
|
47
|
+
ret_array << " Arguments: #{ audit_hash['arguments'] }" if !audit_hash['arguments'].nil? && !audit_hash['arguments'].empty?
|
48
|
+
ret_array << " Options: #{ audit_hash['options'].to_hash }" unless audit_hash['options'].empty?
|
49
|
+
|
50
|
+
ret_array = ret_array.map { |entry| entry.prepend(' ')} unless entry_number == 0
|
42
51
|
|
43
|
-
|
44
|
-
|
45
|
-
|
52
|
+
ret_array
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def audit_command_to_slack_queue audit_hash, msg=''
|
58
|
+
msg << compile_audit_hash_entry_as_array(audit_hash).join("\n")
|
46
59
|
|
47
|
-
@config['
|
60
|
+
@config['slack_queue'] << { message: msg.prepend('```').insert(-1, '```'), channel: @config['cheftacular']['slack']['notify_on_command_execute'] }
|
48
61
|
end
|
49
62
|
end
|
50
63
|
end
|
@@ -39,8 +39,6 @@ class Cheftacular
|
|
39
39
|
if @config['helper'].is_initialization_command?(ARGV[0])
|
40
40
|
@options['command'] = ARGV[0] #this is normally set by parse_context but that is not run for initialization commands
|
41
41
|
else
|
42
|
-
#@config['stateless_action'].cheftacular_config('sync') unless @config['helper'].running_on_chef_node?
|
43
|
-
|
44
42
|
@config['stateless_action'].initialize_data_bag_contents(@options['env']) #ensure basic structure are always maintained before each run
|
45
43
|
|
46
44
|
@config['parser'].parse_application_context if @config['helper'].running_in_mode?('application')
|
@@ -50,6 +48,8 @@ class Cheftacular
|
|
50
48
|
puts("Preparing to run command \"#{ @options['command'] }\"...") if @options['verbose']
|
51
49
|
|
52
50
|
@config['auditor'].audit_run if @config['cheftacular']['auditing']
|
51
|
+
|
52
|
+
@config['queue_master'].work_off_slack_queue #this occurs twice so commands that don't "end" can be queued
|
53
53
|
end
|
54
54
|
|
55
55
|
@config['stateless_action'].check_cheftacular_yml_keys unless @config['helper'].is_initialization_command?(ARGV[0])
|
@@ -177,7 +177,7 @@ class Cheftacular
|
|
177
177
|
chef_repo_cookbooks
|
178
178
|
end
|
179
179
|
|
180
|
-
|
180
|
+
def parse_version_from_berkshelf_cookbook berkshelf_cookbook
|
181
181
|
if File.exists?(File.expand_path("#{ @config['locs']['berks'] }/#{ berkshelf_cookbook }/metadata.rb"))
|
182
182
|
File.read(File.expand_path("#{ @config['locs']['berks'] }/#{ berkshelf_cookbook }/metadata.rb")).gsub('"',"'").gsub(/^version[\s]*('\d[.\d]+')/).peek[/('\d[.\d]+')/].gsub("'",'')
|
183
183
|
else
|
@@ -185,6 +185,10 @@ class Cheftacular
|
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
188
|
+
def parse_gemfile_gem_version gem_name
|
189
|
+
File.read(File.expand_path("#{ @config['locs']['root'] }/Gemfile"))[/#{ gem_name }.*([\d\.]+)/][/([\d\.]+)/]
|
190
|
+
end
|
191
|
+
|
188
192
|
private
|
189
193
|
def current_file_path file_name, use_timestamp=true
|
190
194
|
File.join( @config['locs']['app-root'], 'tmp', @config['helper'].declassify, ( use_timestamp ? "#{ Time.now.strftime("%Y%m%d") }-#{ file_name }" : file_name ))
|
data/lib/cheftacular/helper.rb
CHANGED
@@ -48,7 +48,7 @@ class Cheftacular
|
|
48
48
|
def fetch_remote_version
|
49
49
|
puts "Checking remote #{ declassify } version..."
|
50
50
|
|
51
|
-
`gem list #{ declassify } --remote`[/(\d
|
51
|
+
`gem list #{ declassify } --remote`[/([\d\.]+)/]
|
52
52
|
end
|
53
53
|
|
54
54
|
def completion_rate? percent, mode
|
@@ -274,7 +274,7 @@ class Cheftacular
|
|
274
274
|
next unless key.include?(method.to_s)
|
275
275
|
|
276
276
|
if hash['exit_status'] && hash['exit_status'] == 1
|
277
|
-
@config['
|
277
|
+
@config['slack_queue'] << { message: hash['text'].prepend('```').insert(-1, '```') }
|
278
278
|
|
279
279
|
@config['error'].exception_output(on_failing_exit_status_message) if !on_failing_exit_status_message.blank?
|
280
280
|
end
|
@@ -285,9 +285,22 @@ class Cheftacular
|
|
285
285
|
def slack_current_deploy_arguments
|
286
286
|
msg = "#{ Socket.gethostname } just set for the repository #{ @config['getter'].get_repository_from_role_name(@options['role']) }:\n"
|
287
287
|
msg << "the organization to #{ @options['deploy_organization'] }\n" if @options['deploy_organization']
|
288
|
-
msg << "the revision to #{ @options['target_revision'] }"
|
288
|
+
msg << "the revision to #{ @options['target_revision'] }\n" if @options['target_revision']
|
289
|
+
msg << "In the environment: #{ @options['env'] }"
|
289
290
|
|
290
|
-
@config['
|
291
|
+
@config['slack_queue'] << { message: msg.prepend('```').insert(-1, '```'), channel: @config['cheftacular']['slack']['notify_on_deployment_args'] }
|
292
|
+
end
|
293
|
+
|
294
|
+
def display_currently_installed_version
|
295
|
+
puts "The current version of cheftacular is #{ Cheftacular::VERSION }"
|
296
|
+
end
|
297
|
+
|
298
|
+
def set_detected_cheftacular_version
|
299
|
+
@config['detected_cheftacular_version'] ||= if File.exists?( @config['filesystem'].current_version_file_path )
|
300
|
+
File.read( @config['filesystem'].current_version_file_path )
|
301
|
+
else
|
302
|
+
@config['helper'].fetch_remote_version
|
303
|
+
end
|
291
304
|
end
|
292
305
|
end
|
293
306
|
end
|
@@ -55,9 +55,7 @@ class Cheftacular
|
|
55
55
|
|
56
56
|
@config['helper'].completion_rate? 100, 'initializer'
|
57
57
|
|
58
|
-
initialize_version_check
|
59
|
-
|
60
|
-
initialize_auditing_checks if @config['cheftacular']['auditing']
|
58
|
+
initialize_version_check if @config['cheftacular']['strict_version_checks']
|
61
59
|
|
62
60
|
initialize_chef_repo_up_to_date if @config['cheftacular']['keep_chef_repo_cheftacular_yml_up_to_date']
|
63
61
|
end
|
@@ -133,6 +131,12 @@ class Cheftacular
|
|
133
131
|
@options['verbose'] = true
|
134
132
|
end
|
135
133
|
|
134
|
+
opts.on('-V', '--version', "Displays the current version of cheftacular") do
|
135
|
+
@config['helper'].display_currently_installed_version
|
136
|
+
|
137
|
+
exit
|
138
|
+
end
|
139
|
+
|
136
140
|
opts.on('--no-logs', "Do not make logs for any command") do
|
137
141
|
@options['no_logs'] = true
|
138
142
|
end
|
@@ -426,38 +430,30 @@ class Cheftacular
|
|
426
430
|
end
|
427
431
|
end
|
428
432
|
|
429
|
-
def initialize_version_check
|
433
|
+
def initialize_version_check
|
430
434
|
current_version = Cheftacular::VERSION
|
431
435
|
|
432
|
-
|
436
|
+
@config['helper'].set_detected_cheftacular_version
|
433
437
|
|
434
|
-
if @config['helper'].is_higher_version?
|
435
|
-
puts "\n Your Cheftacular is out of date. Currently #{ current_version } and remote version is #{
|
438
|
+
if @config['helper'].is_higher_version? @config['detected_cheftacular_version'], current_version
|
439
|
+
puts "\n Your Cheftacular is out of date. Currently #{ current_version } and remote version is #{ @config['detected_cheftacular_version'] }.\n"
|
436
440
|
|
437
441
|
if @config['internal_ruby_config'].include?('@global')
|
438
442
|
puts "Please run rvm #{ @config['internal_ruby_config'] } do gem update cheftacular to update to the latest version"
|
439
443
|
else
|
440
|
-
|
444
|
+
@config['stateless_action'].update_cheftacular
|
441
445
|
end
|
442
446
|
|
443
447
|
exit
|
444
448
|
else
|
445
449
|
unless File.exists?( @config['filesystem'].current_version_file_path )
|
446
|
-
puts "Creating file cache for #{ Time.now.strftime("%Y%m%d") } (#{
|
450
|
+
puts "Creating file cache for #{ Time.now.strftime("%Y%m%d") } (#{ @config['detected_cheftacular_version'] }). No new version detected."
|
447
451
|
|
448
|
-
@config['filesystem'].write_version_file
|
452
|
+
@config['filesystem'].write_version_file @config['detected_cheftacular_version']
|
449
453
|
end
|
450
454
|
end
|
451
455
|
end
|
452
456
|
|
453
|
-
def initialize_auditing_checks
|
454
|
-
unless File.exists? @config['filesystem'].current_audit_file_path
|
455
|
-
puts "Creating file cache for #{ Time.now.strftime("%Y%m%d") } audit data..."
|
456
|
-
|
457
|
-
@config['auditor'].write_audit_cache_file
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
457
|
def initialize_classes
|
462
458
|
@config['auditor'] = Cheftacular::Auditor.new(@options, @config)
|
463
459
|
@config['parser'] = Cheftacular::Parser.new(@options, @config)
|
@@ -8,9 +8,11 @@ class Cheftacular
|
|
8
8
|
def work_off_slack_queue
|
9
9
|
return true if @config['slack_queue'].empty?
|
10
10
|
|
11
|
-
@config['slack_queue'].each do |
|
12
|
-
@config['stateless_action'].slack(message)
|
11
|
+
@config['slack_queue'].each do |slack_hash|
|
12
|
+
@config['stateless_action'].slack(slack_hash[:message], slack_hash[:channel])
|
13
13
|
end
|
14
|
+
|
15
|
+
@config['slack_queue'] = []
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
@@ -16,13 +16,32 @@ class Cheftacular
|
|
16
16
|
def check_cheftacular_yml_keys out=[], exit_on_missing=false, warn_on_missing=false
|
17
17
|
base_message = "Your cheftacular.yml is missing the key KEY, its default value is being set to DEFAULT for this run."
|
18
18
|
|
19
|
+
#############################2.10.0################################################
|
20
|
+
|
21
|
+
unless @config['cheftacular'].has_key?('self_update_repository')
|
22
|
+
puts base_message.gsub('KEY', 'self_update_repository').gsub('DEFAULT', 'blank')
|
23
|
+
|
24
|
+
@config['cheftacular']['self_update_repository'] = ''
|
25
|
+
|
26
|
+
warn_on_missing = true
|
27
|
+
end
|
28
|
+
|
29
|
+
#############################2.9.2################################################
|
30
|
+
|
31
|
+
unless @config['cheftacular']['slack'].has_key?('notify_on_command_execute')
|
32
|
+
puts base_message.gsub('KEY', 'slack:notify_on_command_execute').gsub('DEFAULT', 'blank')
|
33
|
+
|
34
|
+
@config['cheftacular']['slack']['notify_command_execute'] = ''
|
35
|
+
|
36
|
+
warn_on_missing = true
|
37
|
+
end
|
38
|
+
|
19
39
|
#############################2.9.0################################################
|
20
40
|
|
21
41
|
unless @config['cheftacular']['slack'].has_key?('notify_on_deployment_args')
|
22
|
-
|
23
|
-
base_message.gsub('KEY', 'notify_on_deployment_args').gsub('DEFAULT', 'false')
|
42
|
+
puts base_message.gsub('KEY', 'slack:notify_on_deployment_args').gsub('DEFAULT', 'blank')
|
24
43
|
|
25
|
-
@config['cheftacular']['slack']['notify_on_deployment_args'] =
|
44
|
+
@config['cheftacular']['slack']['notify_on_deployment_args'] = ''
|
26
45
|
|
27
46
|
warn_on_missing = true
|
28
47
|
end
|
@@ -30,8 +49,7 @@ class Cheftacular
|
|
30
49
|
#############################2.7.0################################################
|
31
50
|
|
32
51
|
unless @config['cheftacular'].has_key?('backup_config')
|
33
|
-
|
34
|
-
base_message.gsub('KEY', 'backup_config').gsub('DEFAULT', 'nil')
|
52
|
+
puts base_message.gsub('KEY', 'backup_config').gsub('DEFAULT', 'nil')
|
35
53
|
|
36
54
|
warn_on_missing = true
|
37
55
|
end
|
@@ -4,7 +4,7 @@ class Cheftacular
|
|
4
4
|
def cheftacular_config
|
5
5
|
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
6
|
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
-
"`cft cheftacular_config [display|sync|overwrite]` this command " +
|
7
|
+
"`cft cheftacular_config [diff|display|sync|overwrite]` this command " +
|
8
8
|
"Allows you to interact with your complete cheftacular configuration, the union of all repository's cheftacular.ymls. ",
|
9
9
|
|
10
10
|
[
|
@@ -27,7 +27,7 @@ class Cheftacular
|
|
27
27
|
def cheftacular_config command=''
|
28
28
|
command = ARGV[1] if command.blank?
|
29
29
|
|
30
|
-
raise "Unsupported command (#{ command }) for cft cheftacular_config" unless command =~ /display|sync|overwrite/
|
30
|
+
raise "Unsupported command (#{ command }) for cft cheftacular_config" unless command =~ /diff|display|sync|overwrite/
|
31
31
|
|
32
32
|
self.send("cheftacular_config_#{ command }")
|
33
33
|
end
|
@@ -42,11 +42,7 @@ class Cheftacular
|
|
42
42
|
|
43
43
|
compiled_audit_hash[day][time].each do |log_arr|
|
44
44
|
log_arr.each do |log_hash|
|
45
|
-
out <<
|
46
|
-
out << " 1. Hostname: #{ log_hash['hostname'] }"
|
47
|
-
out << " 3. Arguments: #{ log_hash['arguments'] }"
|
48
|
-
out << " 4. Options: #{ log_hash['options'].to_hash }"
|
49
|
-
out << ""
|
45
|
+
out << @config['auditor'].compile_audit_hash_entry_as_array(log_hash, log_array_entry_count)
|
50
46
|
|
51
47
|
log_array_entry_count += 1
|
52
48
|
end
|
@@ -56,7 +52,7 @@ class Cheftacular
|
|
56
52
|
end
|
57
53
|
end
|
58
54
|
|
59
|
-
File.open("#{ @config['locs']['chef-log'] }/audit-log-#{ Time.now.strftime("%Y%m%d%H%M%S") }.md", "w") { |f| f.write(out.join("\n")) }
|
55
|
+
File.open("#{ @config['locs']['chef-log'] }/audit-log-#{ Time.now.strftime("%Y%m%d%H%M%S") }.md", "w") { |f| f.write(out.flatten.join("\n")) }
|
60
56
|
end
|
61
57
|
end
|
62
58
|
end
|
@@ -20,10 +20,12 @@ class Cheftacular
|
|
20
20
|
|
21
21
|
class StatelessAction
|
22
22
|
def slack message='', channel=''
|
23
|
+
return false if @config['cheftacular']['slack']['webhook'].nil?
|
24
|
+
|
23
25
|
@slack_notifier ||= Slack::Notifier.new @config['cheftacular']['slack']['webhook'], username: 'Cheftacular'
|
24
26
|
|
25
|
-
message = ARGV[1] if message.blank?
|
26
|
-
channel = ARGV[2] if channel.blank?
|
27
|
+
message = ARGV[1] if !message.nil? && message.blank?
|
28
|
+
channel = ARGV[2] if !channel.nil? && channel.blank?
|
27
29
|
|
28
30
|
@slack_notifier.channel = channel.nil? ? @config['cheftacular']['slack']['default_channel'] : channel
|
29
31
|
@slack_notifier.ping message
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
class Cheftacular
|
3
|
+
class StatelessActionDocumentation
|
4
|
+
def update_cheftacular
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
+
"`cft #{ __method__ }` this command attempts to update cheftacular to the latest version."
|
8
|
+
]
|
9
|
+
|
10
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Update cheftacular to the latest version'
|
11
|
+
|
12
|
+
@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class StatelessAction
|
17
|
+
def update_cheftacular status_hash={}
|
18
|
+
update_cheftacular_not_configured_to_update if @config['cheftacular']['self_update_repository'] != @config['locs']['root']
|
19
|
+
|
20
|
+
@config['helper'].set_detected_cheftacular_version
|
21
|
+
|
22
|
+
puts "Attempting to update cheftacular from #{ Cheftacular::VERSION } to #{ @config['detected_cheftacular_version'] }..."
|
23
|
+
|
24
|
+
status_hash['gemfile_is_latest_version'] = update_cheftacular_from_git
|
25
|
+
status_hash['gemfile_is_latest_version'] = update_cheftacular_gemfile unless status_hash['gemfile_is_latest_version']
|
26
|
+
status_hash['bundled_latest_version'] = update_cheftacular_bundle if status_hash['gemfile_is_latest_version']
|
27
|
+
|
28
|
+
if !status_hash['gemfile_is_latest_version'] || !status_hash['bundled_latest_version']
|
29
|
+
puts(
|
30
|
+
"Issues occured in automatically updating your cheftacular " +
|
31
|
+
"to #{ @config['detected_cheftacular_version'] }, please send " +
|
32
|
+
"the output of this command to your DevOps administrator or add " +
|
33
|
+
"it as an issue at this gem's github page."
|
34
|
+
)
|
35
|
+
else
|
36
|
+
puts "Successfully installed version #{ @config['detected_cheftacular_version'] }, please re-run your command."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def update_cheftacular_from_git out=[]
|
42
|
+
out << `git reset --hard origin/master && git pull origin master`
|
43
|
+
|
44
|
+
parsed_gemfile_version = @config['filesystem'].parse_gemfile_gem_version('cheftacular')
|
45
|
+
|
46
|
+
puts "After git update, Gemfile lists version #{ parsed_gemfile_version } versus latest version: #{ @config['detected_cheftacular_version'] }"
|
47
|
+
|
48
|
+
return parsed_gemfile_version == @config['detected_cheftacular_version']
|
49
|
+
end
|
50
|
+
|
51
|
+
def update_cheftacular_gemfile
|
52
|
+
puts "Forcing gemfile update to the latest version of cheftacular..."
|
53
|
+
|
54
|
+
gemfile_path = File.expand_path("#{ @config['locs']['root'] }/Gemfile")
|
55
|
+
parsed_gemfile_version = @config['filesystem'].parse_gemfile_gem_version('cheftacular')
|
56
|
+
new_file_content = File.read(gemfile_path).gsub(parsed_gemfile_version, @config['detected_cheftacular_version'])
|
57
|
+
|
58
|
+
File.open( gemfile_path, "w") { |f| f.write(new_file_content) }
|
59
|
+
|
60
|
+
new_parsed_gemfile_version = @config['filesystem'].parse_gemfile_gem_version('cheftacular')
|
61
|
+
|
62
|
+
puts "After forced gemfile update, Gemfile lists version #{ new_parsed_gemfile_version } versus latest version: #{ @config['detected_cheftacular_version'] }"
|
63
|
+
|
64
|
+
return new_parsed_gemfile_version == @config['detected_cheftacular_version']
|
65
|
+
end
|
66
|
+
|
67
|
+
def update_cheftacular_bundle out=[]
|
68
|
+
puts "Running bundle install..."
|
69
|
+
|
70
|
+
out << `bundle install`
|
71
|
+
|
72
|
+
cheftacular_bundle_version = out.first[/cheftacular.*([\d\.]+)/][/([\d\.]+)/]
|
73
|
+
|
74
|
+
puts "After bundle install, version is #{ cheftacular_bundle_version } versus latest version: #{ @config['detected_cheftacular_version'] }"
|
75
|
+
|
76
|
+
return cheftacular_bundle_version == @config['detected_cheftacular_version']
|
77
|
+
end
|
78
|
+
|
79
|
+
def update_cheftacular_not_configured_to_update
|
80
|
+
puts "Please update the gemfile to #{ @config['detected_cheftacular_version'] }, bundle install and then restart this process.\n"
|
81
|
+
|
82
|
+
exit
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class Cheftacular
|
3
|
+
class StatelessActionDocumentation
|
4
|
+
def version
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
+
"`cft version` this command prints out the current version of cheftacular.",
|
8
|
+
]
|
9
|
+
|
10
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Displays the current version of cheftacular'
|
11
|
+
|
12
|
+
@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class InitializationAction
|
17
|
+
def version
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class StatelessAction
|
23
|
+
def version
|
24
|
+
@config['helper'].display_currently_installed_version
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/cheftacular/version.rb
CHANGED
data/lib/sshkit/getters.rb
CHANGED
@@ -36,11 +36,13 @@ module SSHKit
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def get_true_environment run_list, chef_env_roles, default_env
|
39
|
-
chef_env_roles.
|
40
|
-
|
41
|
-
|
39
|
+
unless chef_env_roles.nil?
|
40
|
+
chef_env_roles.each_pair do |role, env|
|
41
|
+
if run_list.include?("role[#{ role }]")
|
42
|
+
default_env = env
|
42
43
|
|
43
|
-
|
44
|
+
break
|
45
|
+
end
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cheftacular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Louis Alridge
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -303,12 +303,14 @@ files:
|
|
303
303
|
- lib/cheftacular/stateless_actions/slack.rb
|
304
304
|
- lib/cheftacular/stateless_actions/test_env.rb
|
305
305
|
- lib/cheftacular/stateless_actions/update_chef_client.rb
|
306
|
+
- lib/cheftacular/stateless_actions/update_cheftacular.rb
|
306
307
|
- lib/cheftacular/stateless_actions/update_cloudflare_dns_from_cloud.rb
|
307
308
|
- lib/cheftacular/stateless_actions/update_split_branches.rb
|
308
309
|
- lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb
|
309
310
|
- lib/cheftacular/stateless_actions/update_tld.rb
|
310
311
|
- lib/cheftacular/stateless_actions/upload_nodes.rb
|
311
312
|
- lib/cheftacular/stateless_actions/upload_roles.rb
|
313
|
+
- lib/cheftacular/stateless_actions/version.rb
|
312
314
|
- lib/cheftacular/version.rb
|
313
315
|
- lib/cloud_interactor/authentication.rb
|
314
316
|
- lib/cloud_interactor/cloud_interactor.rb
|