orats 0.6.5 → 0.7.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +231 -58
  3. data/lib/orats/cli.rb +63 -25
  4. data/lib/orats/commands/common.rb +47 -22
  5. data/lib/orats/commands/{outdated → diff}/compare.rb +5 -4
  6. data/lib/orats/commands/diff/exec.rb +86 -0
  7. data/lib/orats/commands/{outdated → diff}/parse.rb +5 -1
  8. data/lib/orats/commands/inventory.rb +121 -0
  9. data/lib/orats/commands/{play.rb → playbook.rb} +5 -5
  10. data/lib/orats/commands/project/exec.rb +74 -0
  11. data/lib/orats/commands/{new → project}/rails.rb +57 -81
  12. data/lib/orats/commands/{new → project}/server.rb +6 -4
  13. data/lib/orats/templates/auth.rb +26 -481
  14. data/lib/orats/templates/base.rb +74 -716
  15. data/lib/orats/templates/includes/common/LICENSE +22 -0
  16. data/lib/orats/templates/includes/new/rails/.env +43 -0
  17. data/lib/orats/templates/includes/{Gemfile → new/rails/Gemfile} +1 -1
  18. data/lib/orats/templates/includes/new/rails/Procfile +3 -0
  19. data/lib/orats/templates/includes/new/rails/README.md +3 -0
  20. data/lib/orats/templates/includes/{app → new/rails/app}/assets/favicon/favicon_base.png +0 -0
  21. data/lib/orats/templates/includes/new/rails/app/helpers/application_helper.rb +53 -0
  22. data/lib/orats/templates/includes/new/rails/app/models/account.rb +40 -0
  23. data/lib/orats/templates/includes/new/rails/app/views/devise/confirmations/new.html.erb +26 -0
  24. data/lib/orats/templates/includes/new/rails/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  25. data/lib/orats/templates/includes/new/rails/app/views/devise/mailer/reset_password_instructions.html.erb +10 -0
  26. data/lib/orats/templates/includes/new/rails/app/views/devise/mailer/unlock_instructions.html.erb +8 -0
  27. data/lib/orats/templates/includes/new/rails/app/views/devise/passwords/edit.html.erb +28 -0
  28. data/lib/orats/templates/includes/new/rails/app/views/devise/passwords/new.html.erb +26 -0
  29. data/lib/orats/templates/includes/new/rails/app/views/devise/registrations/edit.html.erb +51 -0
  30. data/lib/orats/templates/includes/new/rails/app/views/devise/registrations/new.html.erb +31 -0
  31. data/lib/orats/templates/includes/new/rails/app/views/devise/sessions/new.html.erb +39 -0
  32. data/lib/orats/templates/includes/new/rails/app/views/devise/shared/_links.html.erb +38 -0
  33. data/lib/orats/templates/includes/new/rails/app/views/devise/unlocks/new.html.erb +26 -0
  34. data/lib/orats/templates/includes/new/rails/app/views/layouts/_disqus_comments_snippet.html.erb +19 -0
  35. data/lib/orats/templates/includes/new/rails/app/views/layouts/_disqus_count_snippet.html.erb +12 -0
  36. data/lib/orats/templates/includes/new/rails/app/views/layouts/_flash.html.erb +10 -0
  37. data/lib/orats/templates/includes/new/rails/app/views/layouts/_footer.html.erb +2 -0
  38. data/lib/orats/templates/includes/new/rails/app/views/layouts/_google_analytics_snippet.html.erb +13 -0
  39. data/lib/orats/templates/includes/new/rails/app/views/layouts/_google_analytics_tracker.html.erb +4 -0
  40. data/lib/orats/templates/includes/new/rails/app/views/layouts/_navigation.html.erb +18 -0
  41. data/lib/orats/templates/includes/new/rails/app/views/layouts/_navigation_auth.html.erb +15 -0
  42. data/lib/orats/templates/includes/new/rails/app/views/layouts/_navigation_links.html.erb +3 -0
  43. data/lib/orats/templates/includes/new/rails/app/views/layouts/application.html.erb +48 -0
  44. data/lib/orats/templates/includes/new/rails/app/views/pages/home.html.erb +81 -0
  45. data/lib/orats/templates/includes/new/rails/config/database.yml +19 -0
  46. data/lib/orats/templates/includes/new/rails/config/environments/staging.rb +5 -0
  47. data/lib/orats/templates/includes/new/rails/config/initializers/devise_async.rb +1 -0
  48. data/lib/orats/templates/includes/new/rails/config/initializers/mini_profiler.rb +4 -0
  49. data/lib/orats/templates/includes/new/rails/config/initializers/sidekiq.rb +16 -0
  50. data/lib/orats/templates/includes/new/rails/config/puma.rb +25 -0
  51. data/lib/orats/templates/includes/new/rails/config/secrets.yml +12 -0
  52. data/lib/orats/templates/includes/new/rails/config/sidekiq.yml +5 -0
  53. data/lib/orats/templates/includes/new/rails/config/sitemap.rb +20 -0
  54. data/lib/orats/templates/includes/new/rails/config/whenever.rb +7 -0
  55. data/lib/orats/templates/includes/new/rails/lib/backup/config.rb +116 -0
  56. data/lib/orats/templates/includes/new/rails/lib/backup/models/backup.rb +55 -0
  57. data/lib/orats/templates/includes/new/rails/lib/tasks/orats/backup.rake +18 -0
  58. data/lib/orats/templates/includes/new/rails/lib/tasks/orats/favicon.rake +48 -0
  59. data/lib/orats/templates/includes/new/rails/public/404.html +13 -0
  60. data/lib/orats/templates/includes/new/rails/public/422.html +13 -0
  61. data/lib/orats/templates/includes/new/rails/public/500.html +13 -0
  62. data/lib/orats/templates/includes/new/rails/public/502.html +13 -0
  63. data/lib/orats/templates/includes/new/rails/test/fixtures/accounts.yml +27 -0
  64. data/lib/orats/templates/includes/new/rails/test/models/account_test.rb +46 -0
  65. data/lib/orats/templates/includes/{Galaxyfile → playbook/Galaxyfile} +0 -0
  66. data/lib/orats/templates/includes/playbook/site.yml +53 -0
  67. data/lib/orats/templates/playbook.rb +115 -0
  68. data/lib/orats/version.rb +1 -1
  69. data/test/integration/cli_test.rb +122 -75
  70. data/test/test_helper.rb +16 -8
  71. metadata +63 -14
  72. data/lib/orats/commands/new/ansible.rb +0 -98
  73. data/lib/orats/commands/new/exec.rb +0 -60
  74. data/lib/orats/commands/outdated/exec.rb +0 -46
  75. data/lib/orats/templates/play.rb +0 -185
@@ -1,5 +1,5 @@
1
1
  require 'orats/commands/ui'
2
- require 'orats/commands/outdated/parse'
2
+ require 'orats/commands/diff/parse'
3
3
 
4
4
  module Orats
5
5
  module Commands
@@ -8,13 +8,13 @@ module Orats
8
8
  include Thor::Shell
9
9
  include Thor::Actions
10
10
  include UI
11
- include Outdated::Parse
11
+ include Diff::Parse
12
12
 
13
13
  RELATIVE_PATHS = {
14
- galaxyfile: 'templates/includes/Galaxyfile',
14
+ galaxyfile: 'templates/includes/playbook/Galaxyfile',
15
15
  hosts: 'templates/includes/inventory/hosts',
16
16
  inventory: 'templates/includes/inventory/group_vars/all.yml',
17
- playbook: 'templates/play.rb',
17
+ playbook: 'templates/includes/playbook/site.yml',
18
18
  version: 'version.rb'
19
19
  }
20
20
 
@@ -34,7 +34,14 @@ module Orats
34
34
  @behavior = :invoke
35
35
  end
36
36
 
37
- private
37
+ def self.copy_from_local_gem(source, dest)
38
+ base_path = File.join(File.expand_path(File.dirname(__FILE__)),
39
+ '..')
40
+ template_path = "#{base_path}/templates/includes"
41
+
42
+ system "mkdir -p #{File.dirname(dest)}" unless Dir.exist?(File.dirname(dest))
43
+ system "cp #{template_path}/#{source} #{dest}"
44
+ end
38
45
 
39
46
  def base_path
40
47
  File.join(File.expand_path(File.dirname(__FILE__)), '..')
@@ -44,20 +51,6 @@ module Orats
44
51
  %w(https://raw.githubusercontent.com/nickjj/orats lib/orats)
45
52
  end
46
53
 
47
- def select_branch(branch, value)
48
- "#{repo_path[0]}/#{branch}/#{repo_path[1]}/#{value}"
49
- end
50
-
51
- def build_common_paths
52
- @remote_paths[:version] = select_branch 'master', RELATIVE_PATHS[:version]
53
- @remote_gem_version = gem_version
54
-
55
- RELATIVE_PATHS.each_pair do |key, value|
56
- @local_paths[key] = "#{base_path}/#{value}"
57
- @remote_paths[key] = select_branch @remote_gem_version, value
58
- end
59
- end
60
-
61
54
  def url_to_string(url)
62
55
  begin
63
56
  open(url).read
@@ -78,11 +71,15 @@ module Orats
78
71
  end
79
72
  end
80
73
 
81
- def exit_if_path_exists
74
+ def exit_if_path_exists(extend_path='')
82
75
  log_task 'Check if this path exists'
83
76
 
84
- if Dir.exist?(@active_path) || File.exist?(@active_path)
85
- log_error 'error', 'A file or directory already exists at this location', 'path', @active_path
77
+ extended_path = @active_path.dup
78
+ extended_path = File.join(extended_path, extend_path) unless extend_path
79
+ .empty?
80
+
81
+ if Dir.exist?(extended_path) || File.exist?(extended_path)
82
+ log_error 'error', 'A file or directory already exists at this location', 'path', extended_path
86
83
  exit 1
87
84
  end
88
85
  end
@@ -107,6 +104,34 @@ module Orats
107
104
  end
108
105
  end
109
106
 
107
+ private
108
+
109
+ def build_common_paths
110
+ @remote_paths[:version] = select_branch 'master', RELATIVE_PATHS[:version]
111
+ @remote_gem_version = gem_version
112
+
113
+ RELATIVE_PATHS.each_pair do |key, value|
114
+ @local_paths[key] = "#{base_path}/#{value}"
115
+ @remote_paths[key] = select_branch @remote_gem_version,
116
+ check_old_remote_file_paths(value)
117
+ end
118
+ end
119
+
120
+ def check_old_remote_file_paths(url)
121
+ new_url = url.dup
122
+
123
+ if @remote_gem_version[1..-1] < '0.6.6'
124
+ new_url.gsub!('playbook/', '')
125
+ new_url.gsub!('includes/site.yml', 'play.rb')
126
+ end
127
+
128
+ new_url
129
+ end
130
+
131
+ def select_branch(branch, value)
132
+ "#{repo_path[0]}/#{branch}/#{repo_path[1]}/#{value}"
133
+ end
134
+
110
135
  def process_unusable?(command, process, phrase)
111
136
  command_output = run(command, capture: true)
112
137
 
@@ -1,6 +1,6 @@
1
1
  module Orats
2
2
  module Commands
3
- module Outdated
3
+ module Diff
4
4
  module Compare
5
5
  def remote_to_local_gem_versions
6
6
  log_remote_info 'gem', 'Compare this version of orats to the latest orats version',
@@ -42,7 +42,8 @@ module Orats
42
42
  item_diff_count = item_diff.size
43
43
 
44
44
  log_remote_info label, "Compare this version of orats' #{label} to the latest version",
45
- 'file', label == 'playbook' ? 'site.yml' : 'all.yml'
45
+ 'file',
46
+ File.basename(Common::RELATIVE_PATHS[label.to_sym])
46
47
 
47
48
  item_diff.each do |line|
48
49
  log_status_bottom 'missing', line, :red, true unless local.include?(line)
@@ -59,7 +60,7 @@ module Orats
59
60
  def local_to_user(label, keyword, flag_path, local)
60
61
  user = yield
61
62
 
62
- log_local_info label, "Compare this version of orats' #{label} to #{File.basename(flag_path)}",
63
+ log_local_info label, "Compare this version of orats' #{label} to yours",
63
64
  'path', flag_path
64
65
 
65
66
  missing_count = log_unmatched(local, user, 'missing', :red)
@@ -74,7 +75,7 @@ module Orats
74
75
 
75
76
  if extra_count > 0
76
77
  log_results "#{extra_count} extra #{keyword} were detected:",
77
- "No problem but remember to add them to future #{keyword}"
78
+ "No problem but remember to add them to future #{label}"
78
79
  else
79
80
  log_results "No extra #{keyword} were found:", "Extra #{keyword} are fine but you have none"
80
81
  end
@@ -0,0 +1,86 @@
1
+ require 'orats/commands/common'
2
+ require 'orats/commands/diff/parse'
3
+ require 'orats/commands/diff/compare'
4
+ require 'orats/version'
5
+
6
+ module Orats
7
+ module Commands
8
+ module Diff
9
+ class Exec < Commands::Common
10
+ include Parse
11
+ include Compare
12
+
13
+ def initialize(target_path = '', options = {})
14
+ super
15
+
16
+ @remote_galaxyfile = galaxyfile url_to_string(@remote_paths[:galaxyfile])
17
+ @remote_hosts = hosts url_to_string(@remote_paths[:hosts])
18
+ @remote_inventory = inventory url_to_string(@remote_paths[:inventory])
19
+ @remote_playbook = playbook url_to_string(@remote_paths[:playbook])
20
+
21
+ @local_galaxyfile = galaxyfile file_to_string(@local_paths[:galaxyfile])
22
+ @local_hosts = hosts file_to_string(@local_paths[:hosts])
23
+ @local_inventory = inventory file_to_string(@local_paths[:inventory])
24
+ @local_playbook = playbook file_to_string(@local_paths[:playbook])
25
+ end
26
+
27
+ def init
28
+ remote_to_local_gem_versions
29
+ remote_to_local_galaxyfiles
30
+ remote_to_local 'hosts', 'groups', @remote_hosts, @local_hosts
31
+ remote_to_local 'inventory', 'variables', @remote_inventory, @local_inventory
32
+ remote_to_local 'playbook', 'roles', @remote_playbook, @local_playbook
33
+
34
+ local_to_user_hosts @options[:hosts] unless @options[:hosts].empty?
35
+
36
+ unless @options[:inventory].empty?
37
+ inventory_path = @options[:inventory]
38
+
39
+ if File.directory?(inventory_path)
40
+ hosts_path = File.join(inventory_path, 'hosts')
41
+
42
+ inventory_path = File.join(inventory_path,
43
+ 'group_vars/all.yml')
44
+
45
+ local_to_user_hosts hosts_path
46
+ end
47
+
48
+ local_to_user_inventory inventory_path
49
+ end
50
+
51
+ unless @options[:playbook].empty?
52
+ playbook_path = @options[:playbook]
53
+
54
+ if File.directory?(playbook_path)
55
+ playbook_path = File.join(playbook_path, 'site.yml')
56
+
57
+ local_to_user_playbook playbook_path
58
+ end
59
+
60
+ local_to_user_playbook playbook_path
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def local_to_user_hosts(path)
67
+ local_to_user('hosts', 'groups', path, @local_hosts) do
68
+ hosts file_to_string(path)
69
+ end
70
+ end
71
+
72
+ def local_to_user_inventory(path)
73
+ local_to_user('inventory', 'variables', path, @local_inventory) do
74
+ inventory file_to_string(path)
75
+ end
76
+ end
77
+
78
+ def local_to_user_playbook(path)
79
+ local_to_user('playbook', 'roles', path, @local_playbook) do
80
+ playbook file_to_string(path)
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -1,6 +1,6 @@
1
1
  module Orats
2
2
  module Commands
3
- module Outdated
3
+ module Diff
4
4
  module Parse
5
5
  def gem_version
6
6
  "v#{url_to_string(@remote_paths[:version]).match(/'(.*)'/)[1..-1].first}"
@@ -10,6 +10,10 @@ module Orats
10
10
  contents.split
11
11
  end
12
12
 
13
+ def hosts(contents)
14
+ contents.scan(/^\[.*\]/)
15
+ end
16
+
13
17
  def inventory(contents)
14
18
  # pluck out all of the values contained with {{ }}
15
19
  ansible_variables = contents.scan(/\{\{([^{{}}]*)\}\}/)
@@ -0,0 +1,121 @@
1
+ require 'securerandom'
2
+ require 'orats/commands/common'
3
+ require 'orats/commands/project/rails'
4
+
5
+ module Orats
6
+ module Commands
7
+ class Inventory < Common
8
+ include Project::Rails
9
+
10
+ def initialize(target_path = '', options = {})
11
+ super
12
+ end
13
+
14
+ def init
15
+ exit_if_path_exists('inventory')
16
+
17
+ create_inventory
18
+
19
+ secrets_path = "#{@target_path}/secrets"
20
+ create_secrets secrets_path
21
+
22
+ log_task 'Update secrets path in group_vars/all.yml'
23
+ gsub_file "#{@target_path}/#{fix_path_for_user(Common::RELATIVE_PATHS[:inventory])}",
24
+ '/home/yourname/dev/testproj/secrets', File.expand_path(secrets_path)
25
+
26
+ log_task 'Update place holder app name in group_vars/all.yml'
27
+ gsub_file "#{@target_path}/#{fix_path_for_user(Common::RELATIVE_PATHS[:inventory])}",
28
+ 'testproj', File.basename(@target_path)
29
+
30
+ log_task 'Add ssh keypair'
31
+ run "ssh-keygen -t rsa -P '' -f #{secrets_path}/id_rsa"
32
+
33
+ log_task 'Add self signed ssl certificates'
34
+ run create_rsa_certificate(secrets_path, 'sslkey.key', 'sslcert.crt')
35
+
36
+ log_task 'Add monit pem file'
37
+ run "#{create_rsa_certificate(secrets_path,
38
+ 'monit.pem', 'monit.pem')} && openssl gendh 512 >> #{secrets_path}/monit.pem"
39
+
40
+ install_role_dependencies unless @options[:skip_galaxy]
41
+
42
+ log_success
43
+ end
44
+
45
+ private
46
+
47
+ def create_inventory
48
+ log_task 'Add ansible inventory'
49
+ run "mkdir -p #{@target_path}/inventory/group_vars"
50
+
51
+ local_to_user Common::RELATIVE_PATHS[:hosts]
52
+ local_to_user Common::RELATIVE_PATHS[:inventory]
53
+ end
54
+
55
+ def local_to_user(file)
56
+ fixed_file = fix_path_for_user(file)
57
+
58
+ log_task "Add #{fixed_file}"
59
+ run "cp #{base_path}/#{file} #{@target_path}/#{fixed_file}"
60
+ end
61
+
62
+ def create_secrets(secrets_path)
63
+ log_task 'Add ansible secrets'
64
+ run "mkdir #{secrets_path}"
65
+
66
+ save_secret_string "#{secrets_path}/postgres_password"
67
+ save_secret_string "#{secrets_path}/redis_password"
68
+ save_secret_string "#{secrets_path}/mail_password"
69
+ save_secret_string "#{secrets_path}/rails_token"
70
+ save_secret_string "#{secrets_path}/devise_token"
71
+ save_secret_string "#{secrets_path}/devise_pepper_token"
72
+ end
73
+
74
+ def save_secret_string(file)
75
+ File.open(file, 'w+') { |f| f.write(SecureRandom.hex(64)) }
76
+ end
77
+
78
+ def create_rsa_certificate(secrets_path, keyout, out)
79
+ "openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj '/C=US/ST=Foo/L=Bar/O=Baz/CN=qux.com' -keyout #{secrets_path}/#{keyout} -out #{secrets_path}/#{out}"
80
+ end
81
+
82
+ def install_role_dependencies
83
+ log_task 'Update ansible roles from the galaxy'
84
+
85
+ galaxy_install =
86
+ "ansible-galaxy install -r #{base_path}/#{Common::RELATIVE_PATHS[:galaxyfile]} --force"
87
+
88
+ galaxy_out = run(galaxy_install, capture: true)
89
+
90
+ if galaxy_out.include?('you do not have permission')
91
+ if @options[:sudo_password].empty?
92
+ sudo_galaxy_command = 'sudo'
93
+ else
94
+ sudo_galaxy_command = "echo #{@options[:sudo_password]} | sudo -S"
95
+ end
96
+
97
+ run("#{sudo_galaxy_command} #{galaxy_install}")
98
+ end
99
+ end
100
+
101
+ def log_success
102
+ log_status_top 'success', 'Everything has been setup successfully',
103
+ :cyan
104
+ puts
105
+ log_status_bottom 'question', 'Not sure what to do?', :yellow, true
106
+ log_status_bottom 'answer', 'Check out the inventory/hosts file',
107
+ :white, true
108
+ log_status_bottom 'answer', 'Check out the inventory/group_vars/all.yml file', :white
109
+
110
+ log_status_bottom 'question', 'Are you new to ansible?', :yellow, true
111
+ log_status_bottom 'answer',
112
+ 'http://docs.ansible.com/intro_getting_started.html',
113
+ :white
114
+ end
115
+
116
+ def fix_path_for_user(file)
117
+ file.sub('templates/includes', '')
118
+ end
119
+ end
120
+ end
121
+ end
@@ -1,10 +1,10 @@
1
1
  require 'orats/commands/common'
2
- require 'orats/commands/new/rails'
2
+ require 'orats/commands/project/rails'
3
3
 
4
4
  module Orats
5
5
  module Commands
6
- class Play < Common
7
- include New::Rails
6
+ class Playbook < Common
7
+ include Project::Rails
8
8
 
9
9
  def initialize(target_path = '', options = {})
10
10
  super
@@ -13,8 +13,8 @@ module Orats
13
13
  def init
14
14
  exit_if_path_exists
15
15
 
16
- rails_template 'play'
17
- custom_rails_template unless @options[:template].empty?
16
+ rails_template 'playbook'
17
+ custom_rails_template unless @options[:custom].empty?
18
18
  end
19
19
  end
20
20
  end
@@ -0,0 +1,74 @@
1
+ require 'orats/commands/common'
2
+ require 'orats/commands/inventory'
3
+ require 'orats/commands/project/rails'
4
+ require 'orats/commands/project/server'
5
+
6
+ module Orats
7
+ module Commands
8
+ module Project
9
+ class Exec < Commands::Common
10
+ include Rails
11
+ include Server
12
+
13
+ PROJECT_TEMPLATES = {
14
+ auth: 'add authentication and authorization'
15
+ }
16
+
17
+ def initialize(target_path = '', options = {})
18
+ super
19
+
20
+ @active_path = services_path
21
+ end
22
+
23
+ def list_templates
24
+ log_status_top 'templates', 'Available templates to choose from:',
25
+ :blue
26
+ puts
27
+ PROJECT_TEMPLATES.each_pair do |key, value|
28
+ log_status_bottom key, value, :cyan, true
29
+ log_status_bottom 'usage', "orats project /tmp/foo --template #{key}",
30
+ :white
31
+ end
32
+ end
33
+
34
+ def init
35
+ check_exit_conditions
36
+
37
+ rails_template 'base' do
38
+ gsub_postgres_info
39
+ gsub_redis_info unless @options[:redis_password].empty?
40
+ gsub_project_path
41
+ gsub_readme
42
+
43
+ bundle_install
44
+ bundle_binstubs
45
+ spring_binstub
46
+
47
+ create_and_migrate_database
48
+ generate_home_page
49
+ generate_favicons
50
+ end
51
+
52
+ if template_exist?(@options[:template])
53
+ rails_template @options[:template], '--skip ' do
54
+ migrate_and_seed_database
55
+ end
56
+ end
57
+
58
+ Commands::Inventory.new(@target_path,
59
+ @options).init unless @options[:skip_ansible]
60
+
61
+ custom_rails_template unless @options[:custom].empty?
62
+
63
+ server_start
64
+ end
65
+
66
+ private
67
+
68
+ def services_path
69
+ "#{@target_path}/services/#{File.basename @target_path}"
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end