cheftacular 2.8.0 → 2.9.0

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cheftacular/README.md +92 -70
  3. data/lib/cheftacular/actions/check.rb +3 -2
  4. data/lib/cheftacular/actions/console.rb +8 -2
  5. data/lib/cheftacular/actions/db_console.rb +28 -4
  6. data/lib/cheftacular/actions/deploy.rb +6 -8
  7. data/lib/cheftacular/actions/log.rb +7 -2
  8. data/lib/cheftacular/actions/migrate.rb +16 -5
  9. data/lib/cheftacular/actions/run.rb +10 -3
  10. data/lib/cheftacular/actions/scale.rb +4 -1
  11. data/lib/cheftacular/actions/tail.rb +8 -3
  12. data/lib/cheftacular/cheftacular.rb +1 -1
  13. data/lib/cheftacular/cloud_provider.rb +5 -1
  14. data/lib/cheftacular/dns.rb +1 -1
  15. data/lib/cheftacular/error.rb +2 -2
  16. data/lib/cheftacular/file_system.rb +50 -0
  17. data/lib/cheftacular/getter.rb +1 -1
  18. data/lib/cheftacular/helper.rb +34 -5
  19. data/lib/cheftacular/initializer.rb +15 -25
  20. data/lib/cheftacular/parser.rb +2 -0
  21. data/lib/cheftacular/stateless_actions/add_ssh_key_to_bag.rb +4 -1
  22. data/lib/cheftacular/stateless_actions/arguments.rb +8 -3
  23. data/lib/cheftacular/stateless_actions/backups.rb +5 -2
  24. data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +8 -5
  25. data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +15 -1
  26. data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +9 -2
  27. data/lib/cheftacular/stateless_actions/chef_server.rb +5 -2
  28. data/lib/cheftacular/stateless_actions/cheftacular_config.rb +26 -4
  29. data/lib/cheftacular/stateless_actions/cheftacular_yml_help.rb +31 -0
  30. data/lib/cheftacular/stateless_actions/clean_cookbooks.rb +6 -37
  31. data/lib/cheftacular/stateless_actions/clear_caches.rb +9 -2
  32. data/lib/cheftacular/stateless_actions/client_list.rb +5 -2
  33. data/lib/cheftacular/stateless_actions/cloud.rb +4 -1
  34. data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +4 -1
  35. data/lib/cheftacular/stateless_actions/compile_audit_log.rb +4 -1
  36. data/lib/cheftacular/stateless_actions/compile_readme.rb +10 -1
  37. data/lib/cheftacular/stateless_actions/create_git_key.rb +4 -1
  38. data/lib/cheftacular/stateless_actions/disk_report.rb +5 -2
  39. data/lib/cheftacular/stateless_actions/environment.rb +5 -2
  40. data/lib/cheftacular/stateless_actions/file.rb +5 -2
  41. data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +5 -2
  42. data/lib/cheftacular/stateless_actions/full_bootstrap.rb +10 -2
  43. data/lib/cheftacular/stateless_actions/get_active_ssh_connections.rb +3 -2
  44. data/lib/cheftacular/stateless_actions/get_haproxy_log.rb +5 -2
  45. data/lib/cheftacular/stateless_actions/get_log_from_bag.rb +5 -2
  46. data/lib/cheftacular/stateless_actions/get_pg_pass.rb +5 -2
  47. data/lib/cheftacular/stateless_actions/get_shorewall_allowed_connections.rb +2 -1
  48. data/lib/cheftacular/stateless_actions/help.rb +28 -16
  49. data/lib/cheftacular/stateless_actions/initialize_cheftacular_yml.rb +4 -1
  50. data/lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb +4 -1
  51. data/lib/cheftacular/stateless_actions/knife_upload.rb +4 -1
  52. data/lib/cheftacular/stateless_actions/list_toggleable_roles.rb +5 -2
  53. data/lib/cheftacular/stateless_actions/location_aliases.rb +5 -2
  54. data/lib/cheftacular/stateless_actions/pass.rb +5 -2
  55. data/lib/cheftacular/stateless_actions/reinitialize.rb +4 -1
  56. data/lib/cheftacular/stateless_actions/remove_client.rb +9 -2
  57. data/lib/cheftacular/stateless_actions/replication_status.rb +4 -1
  58. data/lib/cheftacular/stateless_actions/reset_bag.rb +4 -1
  59. data/lib/cheftacular/stateless_actions/restart_swap.rb +4 -1
  60. data/lib/cheftacular/stateless_actions/role_toggle.rb +7 -4
  61. data/lib/cheftacular/stateless_actions/rvm.rb +4 -1
  62. data/lib/cheftacular/stateless_actions/server_update.rb +5 -2
  63. data/lib/cheftacular/stateless_actions/service.rb +4 -1
  64. data/lib/cheftacular/stateless_actions/slack.rb +4 -1
  65. data/lib/cheftacular/stateless_actions/test_env.rb +4 -1
  66. data/lib/cheftacular/stateless_actions/update_chef_client.rb +2 -1
  67. data/lib/cheftacular/stateless_actions/update_cloudflare_dns_from_cloud.rb +4 -1
  68. data/lib/cheftacular/stateless_actions/update_split_branches.rb +4 -1
  69. data/lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb +38 -0
  70. data/lib/cheftacular/stateless_actions/update_tld.rb +4 -1
  71. data/lib/cheftacular/stateless_actions/upload_nodes.rb +6 -3
  72. data/lib/cheftacular/stateless_actions/upload_roles.rb +4 -1
  73. data/lib/cheftacular/version.rb +1 -1
  74. data/lib/cloud_interactor/authentication.rb +3 -4
  75. data/lib/cloud_interactor/flavor.rb +7 -2
  76. data/lib/cloud_interactor/helpers.rb +5 -1
  77. data/lib/cloud_interactor/server/create.rb +7 -2
  78. data/lib/sshkit/actions/start_task.rb +9 -1
  79. metadata +6 -7
  80. data/bin/client-list +0 -4
  81. data/lib/cheftacular/stateless_actions/clean_sensu_plugins.rb +0 -19
@@ -2,20 +2,24 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def cheftacular_config
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft cheftacular_config [display|sync|overwrite]` this command " +
7
8
  "Allows you to interact with your complete cheftacular configuration, the union of all repository's cheftacular.ymls. ",
8
9
 
9
10
  [
10
11
  " 1. `display` will show the current overall configuration for cheftacular.",
11
12
 
12
- " 2. `sync` will sync your local cheftacular yaml keys ONTO the server's keys. This happens automatically whenever a " +
13
- "difference is detected between the local keys and the remote keys but can be run manually. Will send a slack notification " +
13
+ " 2. `diff` will show the difference between your current cheftacular.yml and the server's. Run automatically on a sync.",
14
+
15
+ " 3. `sync` will sync your local cheftacular yaml keys ONTO the server's keys. Will send a slack notification " +
14
16
  "if slack is configured (the slack notification contains the diffed keys). The sync only occurs if there are CHANGES to the file."
15
17
  ]
16
18
  ]
17
19
 
18
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
20
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Allows you to see the overall cheftacular config or force a sync'
21
+
22
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
19
23
  end
20
24
  end
21
25
 
@@ -34,7 +38,25 @@ class Cheftacular
34
38
  ap(@config['cheftacular'], {indent: 2})
35
39
  end
36
40
 
41
+ def cheftacular_config_diff
42
+ diff_hash = @config['initial_cheftacular_yml'].deep_diff(@config['default']['cheftacular_bag_hash'], true).except('mode', 'default_repository').compact
43
+
44
+ diff_hash.each_pair do |key, value|
45
+ diff_hash.delete(key) if value.empty? || value.nil?
46
+ end
47
+
48
+ if @config['helper'].running_in_mode?('devops') && !diff_hash.empty?
49
+ puts "Difference detected between local cheftacular.yml and data bag cheftacular.yml! Displaying..."
50
+
51
+ ap diff_hash
52
+ elsif @config['helper'].running_in_mode?('application') && @config['default']['cheftacular_bag_hash']['slack']['webhook'] && !diff_hash.empty?
53
+ @config['slack_queue'] << diff_hash.awesome_inspect({plain: true, indent: 2}).prepend('```').insert(-1, '```')
54
+ end
55
+ end
56
+
37
57
  def cheftacular_config_sync
58
+ cheftacular_config_diff
59
+
38
60
  parsed_cheftacular = Digest::SHA2.hexdigest(@config['helper'].get_cheftacular_yml_as_hash.to_s)
39
61
 
40
62
  return true if File.exist?(@config['filesystem'].local_cheftacular_file_cache_path) && File.read(@config['filesystem'].local_cheftacular_file_cache_path) == parsed_cheftacular
@@ -0,0 +1,31 @@
1
+
2
+ class Cheftacular
3
+ class StatelessActionDocumentation
4
+ def cheftacular_yml_help
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
7
+ "[NYI]`cft cheftacular_yml_help KEY` this command" +
8
+ "allows you to get help on the meaning of each key in your cheftacular.yml overall config.",
9
+
10
+ [
11
+ " 1. This command can also by run with `cft yaml_help`."
12
+ ]
13
+ ]
14
+
15
+ @config['documentation']['stateless_action'][__method__]['short_description'] = '[NYI]Gives help on the keys in your cheftacular.yml'
16
+
17
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
18
+ end
19
+ end
20
+
21
+ class StatelessAction
22
+ def cheftacular_yml_help command=''
23
+ raise "Not Yet Implemented"
24
+
25
+ end
26
+
27
+ alias_method :yaml_help, :cheftacular_yml_help
28
+
29
+ private
30
+ end
31
+ end
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def clean_cookbooks
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft clean_cookbooks [force] [remove_cookbooks]` allows you to update the internal chef-repo's cookbooks easily. " +
7
8
  "By default this script will force you to decide what to do with each cookbook individually (shows version numbers and whether to overwrite it to cookbooks or not).",
8
9
 
@@ -12,6 +13,8 @@ class Cheftacular
12
13
  " 2. If you would like to remove all the cookbooks on the chef server, run `knife cookbook bulk delete '.*' -p -c ~/.chef/knife.rb`"
13
14
  ]
14
15
  ]
16
+
17
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Allows you to update all cookbooks via berkshelf'
15
18
  end
16
19
  end
17
20
 
@@ -35,43 +38,9 @@ class Cheftacular
35
38
  out = `berks install`
36
39
  puts "#{out}\nFinished... Beginning directory scanning and conflict resolution..."
37
40
 
38
- berkshelf_cookbooks = {}
39
-
40
- Dir.foreach(@config['locs']['berks']) do |berkshelf_cookbook|
41
- next if @config['filesystem'].is_junk_filename?(berkshelf_cookbook)
42
- skip = false
43
-
44
- berkshelf_cookbooks.keys.each do |processed_berkshelf_cookbook|
45
- if processed_berkshelf_cookbook.rpartition('-').first == berkshelf_cookbook.rpartition('-').first
46
- cookbook_mtime = File.mtime(File.expand_path("#{ @config['locs']['berks'] }/#{ berkshelf_cookbook }"))
47
- pcookbook_mtime = File.mtime(File.expand_path("#{ @config['locs']['berks'] }/#{ processed_berkshelf_cookbook }"))
48
-
49
- skip = true if cookbook_mtime < pcookbook_mtime #get only the latest version, berkshelf pulls in multiple commits from git repos for SOME REASON
50
- end
51
- end
52
-
53
- next if skip
54
-
55
- berkshelf_cookbooks[berkshelf_cookbook] = if File.exists?(File.expand_path("#{ @config['locs']['berks'] }/#{ berkshelf_cookbook }/metadata.rb"))
56
- File.read(File.expand_path("#{ @config['locs']['berks'] }/#{ berkshelf_cookbook }/metadata.rb")).gsub('"',"'").gsub(/^version[\s]*('\d[.\d]+')/).peek[/('\d[.\d]+')/].gsub("'",'')
57
- else
58
- berkshelf_cookbook.split('-').last
59
- end
60
- end
61
-
62
- chef_repo_cookbooks = {}
63
-
64
- Dir.foreach(@config['locs']['cookbooks']) do |chef_repo_cookbook|
65
- next if @config['filesystem'].is_junk_filename?(chef_repo_cookbook)
66
-
67
- new_name = chef_repo_cookbook.rpartition('-').first
41
+ berkshelf_cookbooks = @config['filesystem'].parse_latest_berkshelf_cookbook_versions
68
42
 
69
- chef_repo_cookbooks[chef_repo_cookbook] = if File.exists?(File.expand_path("#{ @config['locs']['cookbooks'] }/#{ chef_repo_cookbook }/metadata.rb"))
70
- File.read(File.expand_path("#{ @config['locs']['cookbooks'] }/#{ chef_repo_cookbook }/metadata.rb")).gsub('"',"'").gsub(/^version[\s]*('\d[.\d]+')/).peek[/('\d[.\d]+')/].gsub("'",'')
71
- else
72
- JSON.parse(File.read(File.expand_path("#{ @config['locs']['cookbooks'] }/#{ chef_repo_cookbook }/metadata.json"))).to_hash['version']
73
- end
74
- end
43
+ chef_repo_cookbooks = @config['filesystem'].parse_chef_repo_cookbook_versions
75
44
 
76
45
  berkshelf_cookbooks.each_pair do |berkshelf_cookbook, version|
77
46
  new_name = berkshelf_cookbook.rpartition('-').first
@@ -2,11 +2,18 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def clear_caches
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft clear_caches` this command allows you to clear all of your local caches.",
8
+
9
+ [
10
+ " 1. This command will force you to refetch all previously cached chef server data on the next `cft` run."
11
+ ]
7
12
  ]
8
13
 
9
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
14
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Clears all cheftacular caches'
15
+
16
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
10
17
  end
11
18
  end
12
19
 
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def client_list
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft client_list` Allows you check the basic information for all the servers setup via chef. " +
7
8
  "Shows the server's short name, its public ip address and roles (run_list) by default.",
8
9
 
@@ -17,7 +18,9 @@ class Cheftacular
17
18
  ]
18
19
  ]
19
20
 
20
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
21
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Retrieves useful information for all servers in all environments'
22
+
23
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
21
24
  end
22
25
  end
23
26
 
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def cloud
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft cloud <FIRST_LEVEL_ARG> [<SECOND_LEVEL_ARG>[:<SECOND_LEVEL_ARG_QUERY>]*] ` this command handles talking to various cloud APIs. " +
7
8
  "If no args are passed nothing will happen.",
8
9
 
@@ -114,6 +115,8 @@ class Cheftacular
114
115
  "exists on DigitalOcean under a different name, this specific command will fail with a generic error. Please check your keys."
115
116
  ]
116
117
  ]
118
+
119
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Retrieves useful information about cloud services being used'
117
120
  end
118
121
  end
119
122
 
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def cloud_bootstrap
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft cloud_bootstrap NODE_NAME FLAVOR_NAME [DESCRIPTOR] [--with-dn DOMAIN]` uses a cloud api to " +
7
8
  "create a server and attaches its DOMAIN_NAME to the TLD specified for that environment (IE: example-staging.com for staging)",
8
9
 
@@ -21,6 +22,8 @@ class Cheftacular
21
22
  "It is recommended to enter a custom repository-dependent tag here to make nodes easier to load-balance like \"lb:[CODEBASE_NAME]\""
22
23
  ]
23
24
  ]
25
+
26
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Uses the cloud API to setup a server and bring it to a deployable state'
24
27
  end
25
28
  end
26
29
 
@@ -1,11 +1,14 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def compile_audit_log
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft compile_audit_log [clean]` compiles the audit logs in each environment's " +
6
7
  "audit data bag a audit-log-CURRENTDAY.md file in the log folder of the application. Bear in mind that the bag " +
7
8
  "can only hold 100K bytes and will need to have that data removed to store more than that."
8
9
  ]
10
+
11
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Compiles the audit logs for all environments'
9
12
  end
10
13
  end
11
14
 
@@ -1,9 +1,18 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def compile_readme
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft compile_readme` compiles all documentation methods and creates a README.md file in the log folder of the application."
6
7
  ]
8
+
9
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Compiles and creates a readme based on all accessable commands'
10
+ end
11
+ end
12
+
13
+ class InitializationAction
14
+ def compile_readme
15
+
7
16
  end
8
17
  end
9
18
 
@@ -1,7 +1,8 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def create_git_key
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft create_git_key ID_RSA_FILE [OAUTH_TOKEN]` This command will update the default/authentication data bag with new credentials. " +
6
7
  "The [ID_RSA_FILE](https://help.github.com/articles/generating-ssh-keys) needs to exist beforehand.",
7
8
 
@@ -14,6 +15,8 @@ class Cheftacular
14
15
  " 3. NOTE! The ID_RSA_FILE should be in your .chef folder in the root of your home directory!"
15
16
  ]
16
17
  ]
18
+
19
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Adds a git key to your authentication bag so your github repos can be accessed'
17
20
  end
18
21
  end
19
22
 
@@ -1,11 +1,14 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def disk_report
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft disk_report` will fetch useful statistics from every server for every environment and output it into your log directory."
6
7
  ]
7
8
 
8
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
9
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
10
+
11
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Retrives basic info about the filesystem for your nodes'
9
12
  end
10
13
  end
11
14
 
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def environment
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft environment boot|destroy` will boot / destroy the current environment",
7
8
 
8
9
  [
@@ -15,7 +16,9 @@ class Cheftacular
15
16
  ]
16
17
  ]
17
18
 
18
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
19
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Boots (or destroys) an environment based on data stored in cheftacular.yml'
20
+
21
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
19
22
  end
20
23
  end
21
24
 
@@ -1,7 +1,8 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def file
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft file NODE_NAME LOCATION_ALIAS MODE FILE_NAME` interacts with a file on the remote server",
6
7
 
7
8
  [
@@ -41,7 +42,9 @@ class Cheftacular
41
42
  ]
42
43
  ]
43
44
 
44
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
45
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Allows you to perform a variety of file commands on a remote file'
46
+
47
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
45
48
  end
46
49
  end
47
50
 
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def fix_known_hosts
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft fix_known_hosts [HOSTNAME]` this command will delete entries in your known_hosts file " +
7
8
  "for all the servers that are in our system (ip addresses AND dns names)",
8
9
 
@@ -11,7 +12,9 @@ class Cheftacular
11
12
  ]
12
13
  ]
13
14
 
14
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
15
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Fixes issues with the known_hosts ssh file'
16
+
17
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
15
18
  end
16
19
  end
17
20
 
@@ -2,10 +2,18 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def full_bootstrap
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft full_bootstrap ADDRESS ROOT_PASS NODE_NAME` This command performs both " +
7
- "#{ @config['cheftacular']['preferred_cloud_os'] }_bootstrap and chef_bootstrap."
8
+ "#{ @config['cheftacular']['preferred_cloud_os'] }_bootstrap and chef_bootstrap.",
9
+
10
+ [
11
+ " 1. This command is run by `cft cloud_bootstrap` and should not be run on its own unless the " +
12
+ "target server is already created and not initialized."
13
+ ]
8
14
  ]
15
+
16
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Attempts to setup a server that has already been created'
9
17
  end
10
18
  end
11
19
 
@@ -1,11 +1,12 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def get_active_ssh_connections
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "[NYI]`cft get_active_ssh_connections` will fetch the active ssh connections from every server and output it into your log directory."
6
7
  ]
7
8
 
8
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
9
+ #@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
9
10
  end
10
11
  end
11
12
 
@@ -2,7 +2,8 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def get_haproxy_log
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft get_haproxy_log` this command will generate a haproxy html file for the load balancer(s) associated with a repository in the log directory. " +
7
8
  "Opening this log file in the browser will show the status of that haproxy at the time of the log. ",
8
9
 
@@ -11,7 +12,9 @@ class Cheftacular
11
12
  ]
12
13
  ]
13
14
 
14
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
15
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Attempts to fetch haproxy load balancer logs from the remote server(s)'
16
+
17
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
15
18
  end
16
19
  end
17
20
 
@@ -2,12 +2,15 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def get_log_from_bag
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft get_log_from_bag <NODE_NAME-COMMAND_TYPE>` this command grabs the latest command run log from the data bags " +
7
8
  "and saves it to your log directory. There are different types of logs saved per server depending on command."
8
9
  ]
9
10
 
10
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
11
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Fetches all the logs stored in the current environment bags'
12
+
13
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
11
14
  end
12
15
  end
13
16
 
@@ -2,12 +2,15 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def get_pg_pass
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft get_pg_pass ['clip']` command will output the current environment's pg_password to your terminal. " +
7
8
  "Optionally you can pass in clip like `cft get_pg_pass clip` to have it also copy the pass to your clipboard."
8
9
  ]
9
10
 
10
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
11
+ @config['documentation']['stateless_action'][__method__]['short_description'] = "Fetches the current environment's postgres password"
12
+
13
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
11
14
  end
12
15
  end
13
16
 
@@ -1,7 +1,8 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def get_shorewall_allowed_connections
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft get_shorewall_allowed_connections [PATH_TO_LOCAL_FILE] -n NODE_NAME` command will query a single server and return all of its ACCEPT connections " +
6
7
  "from shorewall in it's syslog and return the results in a CSV format. Useful for tracking IP activity.",
7
8
 
@@ -1,13 +1,16 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def help
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft help COMMAND|MODE` this command returns the documentation for a specific command if COMMAND matches the name of a command. " +
6
7
  "Alternatively, it can be passed `action|arguments|application|current|devops|stateless_action` to fetch the commands for a specific mode." +
7
8
  "Misspellings of commands will display near hits."
8
9
  ]
9
10
 
10
- @config['documentation']['application'] << @config['documentation']['stateless_action'].last
11
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Displays useful help related information based on the current context'
12
+
13
+ @config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
11
14
  end
12
15
  end
13
16
 
@@ -27,34 +30,43 @@ class Cheftacular
27
30
  when 'action' then inference_modes << 'action'
28
31
  when 'application' || 'devops' then inference_modes << 'both'
29
32
  when 'stateless_action' then inference_modes << 'stateless_action'
30
- when '' then inference_modes << 'both'
33
+ when '' then inference_modes << 'short_context_descriptions'
31
34
  end
32
35
 
33
36
  if @config['helper'].is_command? target_command
34
37
  @config['action_documentation'].send(target_command)
35
38
 
36
- puts @config['documentation']['action'].flatten.join("\n\n")
37
-
39
+ puts @config['documentation']['action'][target_command.to_sym]['long_description'].flatten.join("\n\n")
38
40
  elsif @config['helper'].is_stateless_command? target_command
39
41
  @config['stateless_action_documentation'].send(target_command)
40
42
 
41
- puts @config['documentation']['stateless_action'].flatten.join("\n\n")
43
+ puts @config['documentation']['stateless_action'][target_command.to_sym]['long_description'].flatten.join("\n\n")
42
44
  end
43
45
 
44
- @config['action_documentation'].public_methods(false).each do |method|
45
- @config['action_documentation'].send(method)
46
-
47
- end if inference_modes.include?('action') || inference_modes.include?('both')
48
-
49
- @config['stateless_action_documentation'].public_methods(false).each do |method|
50
- @config['stateless_action_documentation'].send(method)
46
+ if inference_modes.include?('action') || inference_modes.include?('both') || inference_modes.include?('short_context_descriptions')
47
+ @config['action_documentation'].public_methods(false).each do |method|
48
+ @config['action_documentation'].send(method)
49
+ end
50
+ end
51
51
 
52
- end if inference_modes.include?('stateless_action') || inference_modes.include?('both')
52
+ if inference_modes.include?('action') || inference_modes.include?('both') ||
53
+ ( inference_modes.include?('short_context_descriptions') && @config['helper'].running_in_mode?('devops') )
54
+
55
+ @config['stateless_action_documentation'].public_methods(false).each do |method|
56
+ @config['stateless_action_documentation'].send(method)
57
+ end
58
+ end
53
59
 
54
60
  puts @config['documentation']['arguments'].flatten.join("\n\n") if target_command == 'arguments'
55
61
 
56
- puts @config['helper'].compile_documentation_lines('application').flatten.join("\n\n") if target_command.empty?
57
-
62
+ if inference_modes.include?('short_context_descriptions')
63
+ if @config['helper'].running_in_mode?('devops')
64
+ puts @config['helper'].compile_short_context_descriptions(@config['documentation']['action'].merge(@config['documentation']['stateless_action']), 35)
65
+ else
66
+ puts @config['helper'].compile_short_context_descriptions(@config['documentation']['action'].merge(@config['documentation']['application']))
67
+ end
68
+ end
69
+
58
70
  puts @config['helper'].compile_documentation_lines(target_command).flatten.join("\n\n") if target_command =~ /action|stateless_action|application|devops/
59
71
 
60
72
  if inference_modes.empty? && @config['helper'].is_not_command_or_stateless_command?(target_command)
@@ -1,7 +1,8 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def initialize_cheftacular_yml
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft initialize_cheftacular_yml [application|TheCheftacularCookbook]` will create a cheftacular.yml " +
6
7
  "file in your config folder (and create the config folder if it does not exist). If you already have a cheftacular.yml file " +
7
8
  "in the config folder, it will create a cheftacular.example.yml file that will contain the new changes / keys in the latest " +
@@ -13,6 +14,8 @@ class Cheftacular
13
14
  " 2. If `application` is passed, the generated cheftacular.yml file will look like one you could use in an application directory."
14
15
  ]
15
16
  ]
17
+
18
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Sets up a cheftacular.yml file or a cheftacular.yml.example file'
16
19
  end
17
20
  end
18
21
 
@@ -1,10 +1,13 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
3
  def initialize_data_bag_contents
4
- @config['documentation']['stateless_action'] << [
4
+ @config['documentation']['stateless_action'][__method__] ||= {}
5
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
5
6
  "`cft initialize_data_bag_contents ENVIRONMENT_NAME` will ensure the data bags always have the correct structure before each run. " +
6
7
  "This command is run every time the gem is started and if called directly, will exit after completion."
7
8
  ]
9
+
10
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Ensures the data bags always contain correct initialization information'
8
11
  end
9
12
  end
10
13
 
@@ -2,10 +2,13 @@
2
2
  class Cheftacular
3
3
  class StatelessActionDocumentation
4
4
  def knife_upload
5
- @config['documentation']['stateless_action'] << [
5
+ @config['documentation']['stateless_action'][__method__] ||= {}
6
+ @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
7
  "`cft knife_upload` will resync the chef-server with the local chef-repo code. " +
7
8
  "This command is analog for `knife upload /`"
8
9
  ]
10
+
11
+ @config['documentation']['stateless_action'][__method__]['short_description'] = 'Uploads your current cookbooks to the chef server'
9
12
  end
10
13
  end
11
14