gitpusshuten 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/.bundle/config +2 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +9 -0
  4. data/Gemfile.lock +53 -0
  5. data/README.md +7 -0
  6. data/bin/gitpusshuten +4 -0
  7. data/bin/heavenly +4 -0
  8. data/bin/ten +4 -0
  9. data/gitpusshuten.gemspec +26 -0
  10. data/lib/gitpusshuten/cli.rb +78 -0
  11. data/lib/gitpusshuten/command.rb +147 -0
  12. data/lib/gitpusshuten/commands/base.rb +246 -0
  13. data/lib/gitpusshuten/commands/delete.rb +27 -0
  14. data/lib/gitpusshuten/commands/help.rb +36 -0
  15. data/lib/gitpusshuten/commands/initialize.rb +61 -0
  16. data/lib/gitpusshuten/commands/push.rb +54 -0
  17. data/lib/gitpusshuten/commands/remote.rb +29 -0
  18. data/lib/gitpusshuten/commands/user.rb +252 -0
  19. data/lib/gitpusshuten/commands/version.rb +21 -0
  20. data/lib/gitpusshuten/configuration.rb +122 -0
  21. data/lib/gitpusshuten/environment.rb +70 -0
  22. data/lib/gitpusshuten/gem.rb +33 -0
  23. data/lib/gitpusshuten/git.rb +111 -0
  24. data/lib/gitpusshuten/helpers/environment/installers.rb +59 -0
  25. data/lib/gitpusshuten/helpers/environment/packages.rb +21 -0
  26. data/lib/gitpusshuten/helpers/environment/scp.rb +57 -0
  27. data/lib/gitpusshuten/helpers/environment/ssh.rb +77 -0
  28. data/lib/gitpusshuten/helpers/environment/ssh_key.rb +79 -0
  29. data/lib/gitpusshuten/helpers/environment/user.rb +70 -0
  30. data/lib/gitpusshuten/helpers/spinner.rb +98 -0
  31. data/lib/gitpusshuten/hook.rb +26 -0
  32. data/lib/gitpusshuten/hooks.rb +147 -0
  33. data/lib/gitpusshuten/initializer.rb +95 -0
  34. data/lib/gitpusshuten/local.rb +35 -0
  35. data/lib/gitpusshuten/log.rb +83 -0
  36. data/lib/gitpusshuten/modules/active_record/hooks.rb +19 -0
  37. data/lib/gitpusshuten/modules/apache/command.rb +354 -0
  38. data/lib/gitpusshuten/modules/bundler/command.rb +43 -0
  39. data/lib/gitpusshuten/modules/bundler/hooks.rb +8 -0
  40. data/lib/gitpusshuten/modules/mysql/command.rb +192 -0
  41. data/lib/gitpusshuten/modules/nanoc/hooks.rb +9 -0
  42. data/lib/gitpusshuten/modules/nginx/command.rb +447 -0
  43. data/lib/gitpusshuten/modules/passenger/command.rb +310 -0
  44. data/lib/gitpusshuten/modules/passenger/hooks.rb +4 -0
  45. data/lib/gitpusshuten/modules/rvm/command.rb +277 -0
  46. data/lib/gitpusshuten.rb +21 -0
  47. data/lib/templates/config.rb +37 -0
  48. data/lib/templates/hooks.rb +40 -0
  49. data/spec/cli_spec.rb +83 -0
  50. data/spec/command_spec.rb +76 -0
  51. data/spec/configuration_spec.rb +45 -0
  52. data/spec/environment_spec.rb +64 -0
  53. data/spec/fixtures/combined_hooks.rb +23 -0
  54. data/spec/fixtures/config.rb +23 -0
  55. data/spec/fixtures/hooks.rb +37 -0
  56. data/spec/fixtures/passenger.json +1 -0
  57. data/spec/gem_spec.rb +28 -0
  58. data/spec/git_spec.rb +59 -0
  59. data/spec/gitpusshuten_spec.rb +9 -0
  60. data/spec/hook_spec.rb +48 -0
  61. data/spec/hooks_spec.rb +150 -0
  62. data/spec/initializer_spec.rb +26 -0
  63. data/spec/log_spec.rb +20 -0
  64. data/spec/spec_helper.rb +43 -0
  65. metadata +220 -0
@@ -0,0 +1,354 @@
1
+ module GitPusshuTen
2
+ module Commands
3
+ class Apache < GitPusshuTen::Commands::Base
4
+ description "[Module] Apache commands."
5
+ usage "apache <command> <for|from|to> <environment> (environment)"
6
+ example "heavenly apache install to staging # Installs the Apache2 web server"
7
+ example "heavenly apache update-configuration for staging # Only for Passenger users, when updating Ruby/Passenger versions."
8
+ example "heavenly apache download-configuration from staging # Downloads the Apache2 configuration file from the specified environment."
9
+ example "heavenly apache upload-configuration to staging # Uploads the Apache2 configuration file to the specified environment."
10
+ example "heavenly apache create-vhost for production # Creates a local vhost template for the specified environment."
11
+ example "heavenly apache delete-vhost from production # Deletes the remote vhost for the specified environment."
12
+ example "heavenly apache upload-vhost to staging # Uploads your local vhost to the server for the specified environment."
13
+ example "heavenly apache download-vhost from production # Downloads the remote vhost from the specified environment."
14
+ example "heavenly apache start staging environment # Starts the Apache webserver."
15
+ example "heavenly apache stop production environment # Stops the Apache webserver."
16
+ example "heavenly apache restart production environment # Restarts the Apache webserver."
17
+ example "heavenly apache reload production environment # Reloads the Apache webserver."
18
+
19
+ def initialize(*objects)
20
+ super
21
+
22
+ @command = cli.arguments.shift
23
+
24
+ help if command.nil? or e.name.nil?
25
+
26
+ @command = @command.underscore
27
+
28
+ ##
29
+ # Default Configuration
30
+ @installation_dir = "/etc/apache2"
31
+ @configuration_directory = @installation_dir
32
+ @configuration_file = File.join(@configuration_directory, 'apache2.conf')
33
+ end
34
+
35
+ ##
36
+ # Installs the Apache2 web server
37
+ def perform_install!
38
+ warning "If you are planning to use #{y('Ruby')} and #{y('Passenger')} then #{r("DON'T")} use this Apache2 installer."
39
+ warning "Instead, use the Passenger module to install it."
40
+ standard "\n\s\s#{y("heavenly passenger install to #{y(e.name)}")}\n\n"
41
+
42
+ message "If you do not plan on using #{y('Ruby')} on this server, then this stand-alone installation should be fine."
43
+ message "Do you want to continue?"
44
+ exit unless yes?
45
+
46
+ prompt_for_root_password!
47
+
48
+ Spinner.return :message => "Installing Apache2 web server.." do
49
+ e.install!('apache2')
50
+ g('Done!')
51
+ end
52
+ message "Apache2 has been installed in #{y('/etc/apache2')}."
53
+ message "Creating #{y('Apache')} vhost template."
54
+ GitPusshuTen::Initializer.new('apache', 'create-vhost', 'for', "#{e.name}")
55
+ end
56
+
57
+ ##
58
+ # Starts Apache
59
+ def perform_start!
60
+ message "Starting Apache."
61
+ puts e.execute_as_root("/etc/init.d/apache2 start")
62
+ end
63
+
64
+ ##
65
+ # Stops Apache
66
+ def perform_stop!
67
+ message "Stopping Apache."
68
+ puts e.execute_as_root("/etc/init.d/apache2 stop")
69
+ end
70
+
71
+ ##
72
+ # Restarts Apache
73
+ def perform_restart!
74
+ message "Restarting Apache."
75
+ puts e.execute_as_root("/etc/init.d/apache2 restart")
76
+ end
77
+
78
+ ##
79
+ # Reload Apache
80
+ def perform_reload!
81
+ message "Reloading Apache Configuration."
82
+ puts e.execute_as_root("/etc/init.d/apache2 reload")
83
+ end
84
+
85
+ ##
86
+ # Downloads the Apache2 configuration file
87
+ def perform_download_config!
88
+ if not e.file?('/etc/apache2/apache2.conf')
89
+ error "Could not find the Apache2 configuration file in #{y('/etc/apache2/apache2.conf')}"
90
+ exit
91
+ end
92
+
93
+ local_apache_dir = File.join(local.gitpusshuten_dir, 'apache')
94
+ local.execute("mkdir -p '#{local_apache_dir}'")
95
+ Spinner.return :message => "Downloading Apache2 configuration file to #{y(local_apache_dir)}.." do
96
+ scp_as_root(:download, "/etc/apache2/apache2.conf", local_apache_dir)
97
+ g('Done!')
98
+ end
99
+ end
100
+
101
+ ##
102
+ # Uploads the Apache2 configuration file
103
+ def perform_upload_config!
104
+ if not e.directory?('/etc/apache2')
105
+ error "Could not find the Apache2 installation directory in #{y('/etc/apache2')}"
106
+ exit
107
+ end
108
+
109
+ local_configuration_file = File.join(local.gitpusshuten_dir, 'apache', 'apache2.conf')
110
+ if not File.exist?(local_configuration_file)
111
+ error "Could not find the local Apache2 configuration file in #{y(local_configuration_file)}"
112
+ exit
113
+ end
114
+
115
+ Spinner.return :message => "Uploading Apache2 configuration file #{y(local_configuration_file)}.." do
116
+ scp_as_root(:upload, local_configuration_file, "/etc/apache2/apache2.conf")
117
+ g('Done!')
118
+ end
119
+ end
120
+
121
+ def perform_download_vhost!
122
+ remote_vhost = File.join(@configuration_directory, "sites-enabled", "#{e.sanitized_app_name}.#{e.name}.vhost")
123
+ if not e.file?(remote_vhost) #prompts root
124
+ error "There is no vhost currently present in #{y(remote_vhost)}."
125
+ exit
126
+ end
127
+
128
+ local.execute("mkdir -p #{File.join(local.gitpusshuten_dir, 'apache')}")
129
+ local_vhost = File.join(local.gitpusshuten_dir, 'apache', "#{e.name}.vhost")
130
+ if File.exist?(local_vhost)
131
+ warning "#{y(local_vhost)} already exists. Do you want to overwrite it?"
132
+ exit unless yes?
133
+ end
134
+
135
+ Spinner.return :message => "Downloading vhost.." do
136
+ e.scp_as_root(:download, remote_vhost, local_vhost)
137
+ g("Finished downloading!")
138
+ end
139
+ message "You can find the vhost in: #{y(local_vhost)}."
140
+ end
141
+
142
+ ##
143
+ # Uploads a local vhost
144
+ def perform_upload_vhost!
145
+ vhost_file = File.join(local.gitpusshuten_dir, 'apache', "#{e.name}.vhost")
146
+ if File.exist?(vhost_file)
147
+ message "Uploading #{y(vhost_file)} to " +
148
+ y(File.join(@configuration_directory, 'sites-enabled', "#{e.sanitized_app_name}.#{e.name}.vhost!"))
149
+
150
+ prompt_for_root_password!
151
+
152
+ Spinner.return :message => "Uploading vhost.." do
153
+ e.scp_as_root(:upload, vhost_file, File.join(@configuration_directory, 'sites-enabled', "#{e.sanitized_app_name}.#{e.name}.vhost"))
154
+ g("Finished uploading!")
155
+ end
156
+
157
+ perform_restart!
158
+ else
159
+ error "Could not locate vhost file #{y(vhost_file)}."
160
+ error "Download an existing one from your server with:"
161
+ standard "\n\s\s#{y("heavenly apache download-vhost for #{e.name}")}\n\n"
162
+ error "Or create a new template by running:"
163
+ standard "\n\s\s#{y("heavenly apache create-vhost for #{e.name}")}\n\n"
164
+ exit
165
+ end
166
+ end
167
+
168
+ ##
169
+ # Deletes a vhost
170
+ def perform_delete_vhost!
171
+ vhost_file = File.join(@configuration_directory, 'sites-enabled', "#{e.sanitized_app_name}.#{e.name}.vhost")
172
+ if e.file?(vhost_file) # prompts root
173
+ message "Deleting #{y(vhost_file)}!"
174
+ e.execute_as_root("rm #{vhost_file}")
175
+ perform_reload!
176
+ else
177
+ message "#{y(vhost_file)} does not exist."
178
+ exit
179
+ end
180
+ end
181
+
182
+ ##
183
+ # Creates a vhost
184
+ def perform_create_vhost!
185
+ create_vhost_template_file!
186
+ end
187
+
188
+ ##
189
+ # Performs the Update Configuration command
190
+ # This is particularly used when you change Passenger or Ruby versions
191
+ # so these are updated in the apache2.conf file.
192
+ def perform_update_configuration!
193
+ message "Checking the #{y(@configuration_file)} for current Passenger configuration."
194
+ config_contents = e.execute_as_root("cat '#{@configuration_file}'") # prompts root
195
+ if not config_contents.include? 'PassengerRoot' or not config_contents.include?('PassengerRuby') or not config_contents.include?('passenger_module')
196
+ error "Could not find Passenger configuration, has it ever been set up?"
197
+ exit
198
+ end
199
+
200
+ message "Checking if Passenger is installed under the #{y('default')} Ruby."
201
+ if not e.installed?('passenger')
202
+ message "Passenger isn't installed for the current Ruby"
203
+ Spinner.return :message => "Installing latest Phusion Passenger Gem.." do
204
+ e.execute_as_root('gem install passenger --no-ri --no-rdoc')
205
+ g("Done!")
206
+ end
207
+ end
208
+
209
+ Spinner.return :message => "Finding current Phusion Passenger Gem version..." do
210
+ if e.execute_as_root('passenger-config --version') =~ /(\d+\.\d+\..+)/
211
+ @passenger_version = $1.chomp.strip
212
+ g('Found!')
213
+ else
214
+ r('Could not find the current Passenger version.')
215
+ end
216
+ end
217
+
218
+ exit if @passenger_version.nil?
219
+
220
+ Spinner.return :message => "Finding current Ruby version for the current Phusion Passenger Gem.." do
221
+ if e.execute_as_root('passenger-config --root') =~ /\/usr\/local\/rvm\/gems\/(.+)\/gems\/passenger-.+/
222
+ @ruby_version = $1.chomp.strip
223
+ g('Found!')
224
+ else
225
+ r("Could not find the current Ruby version under which the Passenger Gem has been installed.")
226
+ end
227
+ end
228
+
229
+ exit if @ruby_version.nil?
230
+
231
+ puts <<-INFO
232
+
233
+
234
+ [Detected Versions]
235
+
236
+ Ruby Version: #{@ruby_version}
237
+ Phusion Passenger Version: #{@passenger_version}
238
+
239
+
240
+ INFO
241
+
242
+ message "Apache will now be configured to work with the above versions. Is this correct?"
243
+ exit unless yes?
244
+
245
+ ##
246
+ # Checks to see if Passengers WatchDog is available in the current Passenger gem
247
+ # If it is not, then Passenger needs to run the "passenger-install-nginx-module" so it gets installed
248
+ if not e.directory?("/usr/local/rvm/gems/#{@ruby_version}/gems/passenger-#{@passenger_version}/agents")
249
+ message "Phusion Passenger has not yet been installed for this Ruby's Passenger Gem."
250
+ message "You need to update #{y('Apache')} and #{y('Passenger')} to proceed with the configuration.\n\n"
251
+ message "Would you like to update #{y('Apache')} and #{y('Phusion Passenger')} #{y(@passenger_version)} for #{y(@ruby_version)}?"
252
+ message "NOTE: Your current #{y('Apache')} configuration will #{g('not')} be lost."
253
+
254
+ if yes?
255
+ Spinner.return :message => "Ensuring #{y('Phusion Passenger')} and #{y('Apache')} dependencies are installed.." do
256
+ e.install!("build-essential libcurl4-openssl-dev bison openssl libreadline5 libreadline5-dev curl git-core zlib1g zlib1g-dev libssl-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev")
257
+ e.install!("apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev")
258
+ g("Done!")
259
+ end
260
+
261
+ message "Installing Apache with the Phusion Passenger Module."
262
+ Spinner.return :message => "Installing, this may take a while.." do
263
+ e.execute_as_root("passenger-install-apache2-module --auto")
264
+ g("Done!")
265
+ end
266
+ else
267
+ exit
268
+ end
269
+ end
270
+
271
+ ##
272
+ # Creates a tmp dir
273
+ local.create_tmp_dir!
274
+
275
+ ##
276
+ # Downloads the Apache configuration file to tmp dir
277
+ message "Updating Phusion Passenger paths in the Apache Configuration."
278
+ Spinner.return :message => "Configuring Apache.." do
279
+ e.scp_as_root(:download, @configuration_file, local.tmp_dir)
280
+ @configuration_file_name = @configuration_file.split('/').last
281
+
282
+ local_configuration_file = File.join(local.tmp_dir, @configuration_file_name)
283
+ update = File.read(local_configuration_file)
284
+
285
+ update.sub! /LoadModule passenger_module \/usr\/local\/rvm\/gems\/(.+)\/gems\/passenger-(.+)\/ext\/apache2\/mod_passenger\.so/,
286
+ "LoadModule passenger_module /usr/local/rvm/gems/#{@ruby_version}/gems/passenger-#{@passenger_version}/ext/apache2/mod_passenger.so"
287
+
288
+ update.sub! /PassengerRoot \/usr\/local\/rvm\/gems\/(.+)\/gems\/passenger-(.+)/,
289
+ "PassengerRoot /usr/local/rvm/gems/#{@ruby_version}/gems/passenger-#{@passenger_version}"
290
+
291
+ update.sub! /PassengerRuby \/usr\/local\/rvm\/wrappers\/(.+)\/ruby/,
292
+ "PassengerRuby /usr/local/rvm/wrappers/#{@ruby_version}/ruby"
293
+
294
+ File.open(local_configuration_file, 'w') do |file|
295
+ file << update
296
+ end
297
+
298
+ ##
299
+ # Create a backup of the current configuration file
300
+ e.execute_as_root("cp '#{@configuration_file}' '#{@configuration_file}.backup.#{Time.now.to_i}'")
301
+
302
+ ##
303
+ # Upload the updated NginX configuration file
304
+ e.scp_as_root(:upload, local_configuration_file, @configuration_file)
305
+
306
+ ##
307
+ # Remove the local tmp directory
308
+ local.remove_tmp_dir!
309
+
310
+ g("Done!")
311
+ end
312
+
313
+ message "Apache configuration file has been updated!"
314
+ message "#{y(@configuration_file)}\n\n"
315
+
316
+ warning "If you changed #{y('Ruby versions')}, be sure that all your application gems are installed."
317
+ warning "If you only updated #{y('Phusion Passenger')} and did not change #{y('Ruby versions')}"
318
+ warning "then you should be able to just restart #{y('Apache')} right away since all application gems should still be in tact.\n\n"
319
+
320
+ message "When ready, run the following command to restart #{y('Apache')} and have the applied updates take effect:"
321
+ standard "\n\s\s#{y("heavenly apache restart for #{e.name}")}"
322
+ end
323
+
324
+ ##
325
+ # Creates a vhost template file if it doesn't already exist.
326
+ def create_vhost_template_file!
327
+ local.execute("mkdir -p '#{File.join(local.gitpusshuten_dir, 'apache')}'")
328
+ vhost_file = File.join(local.gitpusshuten_dir, 'apache', "#{e.name}.vhost")
329
+
330
+ create_file = true
331
+ if File.exist?(vhost_file)
332
+ warning "#{y(vhost_file)} already exists, do you want to overwrite it?"
333
+ create_file = yes?
334
+ end
335
+
336
+ if create_file
337
+ File.open(vhost_file, 'w') do |file|
338
+ file << "<VirtualHost *:80>\n"
339
+ file << "\s\sServerName mydomain.com\n"
340
+ file << "\s\sServerAlias www.mydomain.com\n"
341
+ file << "\s\sDocumentRoot #{e.app_dir}/public\n"
342
+ file << "\s\s<Directory #{e.app_dir}/public>\n"
343
+ file << "\s\s\s\sAllowOverride all\n"
344
+ file << "\s\s\s\sOptions -MultiViews\n"
345
+ file << "\s\s</Directory>\n"
346
+ file << "</VirtualHost>\n"
347
+ end
348
+ message "The vhost has been created in #{y(vhost_file)}."
349
+ end
350
+ end
351
+
352
+ end
353
+ end
354
+ end
@@ -0,0 +1,43 @@
1
+ module GitPusshuTen
2
+ module Commands
3
+ class Bundler < GitPusshuTen::Commands::Base
4
+ description "[Module] Bundler commands."
5
+ usage "bundler <command> <environment> environment"
6
+ example "heavenly bundler bundle staging environment # Bundles an application's gems for the specified environment."
7
+
8
+ def initialize(*objects)
9
+ super
10
+
11
+ @command = cli.arguments.shift
12
+
13
+ help if command.nil? or e.name.nil?
14
+ end
15
+
16
+ ##
17
+ # Bundles gems
18
+ def perform_bundle!
19
+ GitPusshuTen::Log.message "Bundling Gems for #{y(c.application)} (#{y(e.name)} environment)."
20
+ installed = e.installed?('bundle')
21
+ if not installed
22
+ GitPusshuTen::Log.message "Couldn't find Bundler, installing the gem."
23
+ Spinner.return :message => "Installing Bundler.." do
24
+ e.execute_as_user('gem install bundler --no-ri --no-rdoc')
25
+ installed = e.installed?('bundle')
26
+ if not installed
27
+ r("Unable to install Bundler.")
28
+ else
29
+ g("Done!")
30
+ end
31
+ end
32
+ end
33
+
34
+ exit if not installed
35
+
36
+ Spinner.return :message => "Bundling Gems for #{y(c.application)}", :put => true do
37
+ e.execute_as_user("cd '#{e.app_dir}'; bundle install --without test development")
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,8 @@
1
+ ##
2
+ # Post Deploy Hook for installing gems
3
+ # Checks if the bundle command is available before attemping
4
+ # and installs the Bundler gem if it is not available before proceeding
5
+ post "Install dependencies (Bundler)" do
6
+ run "if [[ $(which bundle) == '' ]]; then gem install bundler; fi"
7
+ run "bundle install --without development test"
8
+ end
@@ -0,0 +1,192 @@
1
+ module GitPusshuTen
2
+ module Commands
3
+ class Mysql < GitPusshuTen::Commands::Base
4
+ description "[Module] MySQL installer and manager."
5
+ usage "mysql <command> <environment>"
6
+ example "heavenly mysql install on staging # Installs MySQL to the staging environment."
7
+ example "heavenly mysql uninstall from staging # Uninstalls MySQL from the staging environment."
8
+ example "heavenly mysql add-user to staging # Adds the user to MySQL on the production environment."
9
+ example "heavenly mysql remove-user from staging # Remvoes the user from MySQL on the production environment."
10
+ example "heavenly mysql change-root-password on staging # Changes the root password of MySQL on the staging environment."
11
+
12
+ def initialize(*objects)
13
+ super
14
+
15
+ @command = cli.arguments.shift
16
+
17
+ help if command.nil? or e.name.nil?
18
+
19
+ @command = @command.underscore
20
+ end
21
+
22
+ ##
23
+ # Install MySQL
24
+ def perform_install!
25
+ if e.installed?('mysql')
26
+ error "MySQL is already installed."
27
+ exit
28
+ end
29
+
30
+ message "Please provide a new password for your MySQL database #{y('root')} user."
31
+ prompt_for_new_password!
32
+
33
+ e.ensure_aptitude_installed!
34
+
35
+ command = "export DEBIAN_FRONTEND=noninteractive; aptitude update;"
36
+ command += "aptitude install -y mysql-client mysql-server libmysqlclient15off libmysqlclient15-dev mysql-common;"
37
+ command += "mysqladmin -u root password '#{@new_password}'"
38
+
39
+ Spinner.return :message => "Installing #{y('MySQL')} to #{y(e.name)}.." do
40
+ e.execute_as_root(command)
41
+ g('Done!')
42
+ end
43
+ end
44
+
45
+ ##
46
+ # Changes the root password of the MySQL Server
47
+ def perform_change_root_password!
48
+ if not e.installed?('mysql')
49
+ error "MySQL isn't installed."
50
+ exit
51
+ end
52
+
53
+ message "Please provide your MySQL #{y('root')} password."
54
+ @existing_password = ask('') { |q| q.echo = false }
55
+ confirm_access!
56
+
57
+ message "Please provide a new password for your MySQL database #{y('root')} user."
58
+ prompt_for_new_password!
59
+
60
+ Spinner.return :message => "Changing root password of #{y('MySQL')} on #{y(e.name)} environment.." do
61
+ e.execute_as_root("mysqladmin -u root --password='#{@existing_password}' password '#{@new_password}'")
62
+ g('Done!')
63
+ end
64
+ end
65
+
66
+ ##
67
+ # Uninstalls the MySQL server
68
+ def perform_uninstall!
69
+ if not e.installed?('mysql')
70
+ error "MySQL isn't installed."
71
+ exit
72
+ end
73
+
74
+ message "Please provide your MySQL #{y('root')} password."
75
+ @existing_password = ask('') { |q| q.echo = false }
76
+ confirm_access!
77
+
78
+ Spinner.return :message => "Uninstalling #{y('MySQL')} from #{y(e.name)} environment.." do
79
+ e.execute_as_root("mysqladmin -u root --password='#{@existing_password}' password ''")
80
+ e.execute_as_root("aptitude remove -y mysql-client mysql-server")
81
+ g('Done!')
82
+ end
83
+ end
84
+
85
+ ##
86
+ # Adds the environment user to the database
87
+ def perform_add_user!
88
+ if not e.installed?('mysql')
89
+ error "MySQL isn't installed."
90
+ exit
91
+ end
92
+
93
+ ##
94
+ # Confirm Root Password
95
+ message "Please provide your MySQL #{y('root')} password."
96
+ @existing_password = ask('') { |q| q.echo = false }
97
+ confirm_access!
98
+
99
+ ##
100
+ # Ask password for the new user
101
+ message "Please provide a new password for your MySQL database user."
102
+ prompt_for_new_password!
103
+
104
+ command = "\"CREATE USER '#{c.user}'@'localhost' IDENTIFIED BY '#{@new_password}';"
105
+ command += "GRANT ALL ON *.* TO '#{c.user}'@'localhost';\""
106
+
107
+ response = e.execute_as_root("mysql -u root --password='#{@existing_password}' -e #{command}")
108
+ if not response =~ /ERROR 1396/
109
+ message "User #{y(c.user)} has been added!"
110
+ else
111
+ error "User #{y(c.user)} already exists."
112
+ end
113
+
114
+ end
115
+
116
+ ##
117
+ # Removes the user from the database
118
+ def perform_remove_user!
119
+ if not e.installed?('mysql')
120
+ error "MySQL isn't installed."
121
+ exit
122
+ end
123
+
124
+ ##
125
+ # Confirm Root Password
126
+ message "Please provide your MySQL #{y('root')} password."
127
+ @existing_password = ask('') { |q| q.echo = false }
128
+ confirm_access!
129
+
130
+ response = e.execute_as_root("mysql -u root --password='#{@existing_password}' -e \"DROP USER '#{c.user}'@'localhost';\"")
131
+ if response =~ /ERROR 1396/
132
+ error "User #{y(c.user)} does not exist."
133
+ elsif response.nil?
134
+ message "User #{y(c.user)} has been removed!"
135
+ else
136
+ puts response
137
+ end
138
+ end
139
+
140
+ ##
141
+ # Prompts the user to fill in a new password
142
+ def prompt_for_new_password!
143
+ while not @mysql_new_password_confirmed
144
+ @new_password = ask('') { |q| q.echo = false }
145
+ message "Please enter your password again."
146
+ @password_confirmation = ask('') { |q| q.echo = false }
147
+
148
+ if not @new_password.empty? and @new_password == @password_confirmation
149
+ @mysql_new_password_confirmed = true
150
+ else
151
+ if @new_password.empty? or @password_confirmation.empty?
152
+ error "Please provide a password."
153
+ else
154
+ error "Password and Password confirmation do not match."
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ ##
161
+ # Prompts the user to fill in it's existing password
162
+ def prompt_for_existing_password!
163
+ while not @mysql_existing_password_confirmed
164
+ message "Please provide your password for your MySQL database root user."
165
+ @existing_password = ask('') { |q| q.echo = false }
166
+ message "Please enter your password again."
167
+ @password_confirmation = ask('') { |q| q.echo = false }
168
+
169
+ if not @existing_password.empty? and @existing_password == @password_confirmation
170
+ @mysql_existing_password_confirmed = true
171
+ else
172
+ if @existing_password.empty? or @password_confirmation.empty?
173
+ error "Please provide a password."
174
+ else
175
+ error "Password and Password confirmation do not match."
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ ##
182
+ # Confirms whether the provided password is correct
183
+ def confirm_access!
184
+ if e.execute_as_root("mysqladmin -u root --password='#{@existing_password}' ping") =~ /Access denied for user/
185
+ error "Incorrect password."
186
+ exit
187
+ end
188
+ end
189
+
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,9 @@
1
+ ##
2
+ # Post Deploy Hook for compiling the html files
3
+ # Checks if nanoc has been installed before attempting to compile
4
+ post "Compile HTML Files (Nanoc)" do
5
+ run "if [[ -x $(which nanoc) ]]; then gem install nanoc; fi"
6
+ run "rm -rf output public"
7
+ run "nanoc compile"
8
+ run "mv output public"
9
+ end