capistrano-database 0.0.1 → 0.0.2

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.
@@ -1,8 +1,8 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |gem|
4
- gem.authors = ["Wael M. Nasreddine"]
5
- gem.email = ["wael.nasreddine@gmail.com"]
4
+ gem.authors = ['Wael M. Nasreddine']
5
+ gem.email = ['wael.nasreddine@gmail.com']
6
6
  gem.description = 'Capistrano recipes for database server management'
7
7
  gem.summary = gem.description
8
8
  gem.homepage = 'http://technogate.github.com/contao'
@@ -11,12 +11,12 @@ Gem::Specification.new do |gem|
11
11
  gem.files = `git ls-files`.split($\)
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "capistrano-database"
15
- gem.require_paths = ["lib"]
16
- gem.version = '0.0.1'
14
+ gem.name = 'capistrano-database'
15
+ gem.require_paths = ['lib']
16
+ gem.version = '0.0.2'
17
17
 
18
18
  # Runtime dependencies
19
19
  gem.add_dependency 'rake'
20
- gem.add_dependency 'capistrano'
21
20
  gem.add_dependency 'activesupport'
21
+ gem.add_dependency 'capistrano-utils'
22
22
  end
@@ -0,0 +1,149 @@
1
+ require 'capistrano/ext/helpers'
2
+ require 'capistrano/ext/mysql'
3
+
4
+ unless Capistrano::Configuration.respond_to?(:instance)
5
+ abort "capistrano/ext/database requires Capistrano 2"
6
+ end
7
+
8
+ Capistrano::Configuration.instance(:must_exist).load do
9
+ namespace :db do
10
+ desc 'Backup the database'
11
+ task :backup, :roles => :db do
12
+ set :latest_backup,
13
+ "#{fetch :backup_path}/#{fetch :db_database_name}_#{Time.now.strftime('%d-%m-%Y_%H-%M-%S')}.sql"
14
+ transaction do
15
+ find_and_execute_db_task :backup
16
+ end
17
+ end
18
+
19
+ desc 'Export the database'
20
+ task :export, :roles => :db do
21
+ transaction do
22
+ backup
23
+ download_backup
24
+ end
25
+ end
26
+
27
+ desc 'Import the database'
28
+ task :import, :roles => :db do
29
+ transaction do
30
+ backup
31
+ backup_skiped_tables if exists_and_not_empty? :skip_tables_on_import
32
+ find_and_execute_db_task :import
33
+ restore_skiped_tables if exists_and_not_empty? :skip_tables_on_import
34
+ end
35
+ end
36
+
37
+ [:credentials, :root_credentials].each do |method|
38
+ desc "[internal] Print the database server #{method}"
39
+ task "print_#{method}", :roles => :app do
40
+ logger.trace format_credentials(fetch "db_#{method}".to_sym)
41
+ end
42
+
43
+ desc "[internal] Load the database server #{method}"
44
+ task method, :roles => :app do
45
+ unless exists?("db_#{method}".to_sym)
46
+ if remote_file_exists?(fetch("db_#{method}_file".to_sym), use_sudo: method == :root_credentials)
47
+ send "read_#{method}"
48
+ else
49
+ send "generate_#{method}"
50
+ end
51
+ end
52
+ end
53
+
54
+ desc "[internal] Read the database server #{method}"
55
+ task "read_#{method}", :roles => :app do
56
+ read(fetch("db_#{method}_file".to_sym), use_sudo: method == :root_credentials).tap do |content|
57
+ set "db_#{method}".to_sym, {
58
+ hostname: match_from_content(content, 'host'),
59
+ port: match_from_content(content, 'port'),
60
+ username: match_from_content(content, 'user'),
61
+ password: match_from_content(content, 'pass'),
62
+ }
63
+ end
64
+ end
65
+
66
+ desc "[internal] Generate the database server #{method}"
67
+ task "generate_#{method}", :roles => :app do
68
+ set "db_#{method}".to_sym, {
69
+ hostname: ask('What is the hostname used to access the database',
70
+ default: 'localhost',
71
+ validate: /.+/),
72
+ port: ask('What is the port used to access the database',
73
+ default: '',
74
+ validate: /\A[0-9]*\Z/),
75
+ username: ask('What is the username used to access the database',
76
+ default: (method == :credentials) ? fetch(:db_username) : 'root',
77
+ validate: /.+/),
78
+ password: ask('What is the password used to access the database',
79
+ default: gen_pass(8),
80
+ validate: /.+/,
81
+ echo: false),
82
+ }
83
+ end
84
+
85
+ desc "[internal] Write the database server #{method}"
86
+ task "write_#{method}", :roles => :app do
87
+ on_rollback { run "rm -f #{fetch("db_#{method}_file".to_sym)}" }
88
+
89
+ write format_credentials(fetch "db_#{method}".to_sym),
90
+ fetch("db_#{method}_file".to_sym),
91
+ use_sudo: method == :root_credentials
92
+ end
93
+ end
94
+
95
+ desc '[internal] Create the database user'
96
+ task :create_db_user, :roles => :db do
97
+ transaction do
98
+ find_and_execute_db_task :create_db_user
99
+ end
100
+ end
101
+
102
+ desc '[internal] Create the database'
103
+ task :create_database, :roles => :db do
104
+ transaction do
105
+ find_and_execute_db_task :create_database
106
+ end
107
+ end
108
+
109
+ desc '[internal] Download the db backup file'
110
+ task :download_backup, :roles => :db do
111
+ fn = "#{random_tmp_file}.sql.bz2"
112
+ on_rollback { `rm -f #{fn}` }
113
+ download "#{fetch :latest_backup}.bz2", fn
114
+ logger.important "The backup has been downloaded to #{fn}"
115
+ end
116
+
117
+ desc '[internal] Backup skiped tables'
118
+ task :backup_skiped_tables, :roles => :db do
119
+ set :backuped_skiped_tables_file, random_tmp_file
120
+ on_rollback { run "rm -f #{fetch :backuped_skiped_tables_file}" }
121
+ find_and_execute_db_task :backup_skiped_tables
122
+ end
123
+
124
+ desc '[internal] Restore skiped tables'
125
+ task :restore_skiped_tables, :roles => :db do
126
+ on_rollback { run "rm -f #{fetch :backuped_skiped_tables_file}" }
127
+ find_and_execute_db_task :restore_skiped_tables
128
+ run "rm -f #{fetch :backuped_skiped_tables_file}"
129
+ end
130
+ end
131
+
132
+ # Internal Dependencies
133
+ before 'db:print_credentials', 'db:credentials'
134
+ before 'db:print_root_credentials', 'db:root_credentials'
135
+ before 'db:create_db_user', 'db:root_credentials'
136
+ before 'db:create_db_user', 'db:credentials'
137
+ before 'db:create_database', 'db:credentials'
138
+ before 'db:backup', 'db:credentials'
139
+ before 'db:import', 'db:credentials'
140
+
141
+ ['credentials', 'root_credentials'].each do |method|
142
+ after "db:generate_#{method}", "db:write_#{method}"
143
+ end
144
+
145
+ # External Dependencies
146
+ before 'deploy:server:setup', 'db:create_db_user'
147
+ after 'deploy:server:setup', 'db:create_database'
148
+ before 'db:write_credentials', 'deploy:setup_if_needed'
149
+ end
@@ -0,0 +1,135 @@
1
+ unless Capistrano::Configuration.respond_to?(:instance)
2
+ abort "capistrano/ext/database requires Capistrano 2"
3
+ end
4
+
5
+ Capistrano::Configuration.instance(:must_exist).load do
6
+ namespace :db do
7
+ namespace :mysql do
8
+ desc '[internal] Create the database user'
9
+ task :create_db_user, :roles => :db do
10
+ auth = fetch :db_credentials
11
+ sauth = fetch :db_root_credentials
12
+
13
+ script_file = write(<<-EOS)
14
+ CREATE USER '#{auth[:username]}'@'%' IDENTIFIED BY '#{auth[:password]}';
15
+ GRANT ALL ON `#{fetch :application}\_%`.* TO '#{auth[:username]}'@'%';
16
+ FLUSH PRIVILEGES;
17
+ EOS
18
+
19
+ begin
20
+ run <<-CMD
21
+ mysql \
22
+ --host='#{sauth[:hostname]}' \
23
+ --user='#{sauth[:username]}' \
24
+ --password='#{sauth[:password]}' \
25
+ --default-character-set=utf8 < \
26
+ #{script_file}; \
27
+ rm -f #{script_file}
28
+ CMD
29
+ rescue Capistrano::CommandError
30
+ logger.important 'ERROR: Could not create the user used to access the database.'
31
+ end
32
+ end
33
+
34
+ desc '[internal] Create the database'
35
+ task :create_database, :roles => :db do
36
+ auth = fetch :db_credentials
37
+
38
+ begin
39
+ run <<-CMD
40
+ mysqladmin \
41
+ --host='#{auth[:hostname]}' \
42
+ --user='#{auth[:username]}' \
43
+ --password='#{auth[:password]}' \
44
+ create '#{fetch :db_database_name}'
45
+ CMD
46
+ rescue Capistrano::CommandError
47
+ logger.info 'ERROR: Could not create the database'
48
+ end
49
+ end
50
+
51
+ desc '[internal] Backup mysql database'
52
+ task :backup, :roles => :db do
53
+ latest_backup = fetch :latest_backup
54
+ on_rollback { run "rm -f #{latest_backup}" }
55
+ auth = fetch :db_credentials
56
+
57
+ begin
58
+ run <<-CMD
59
+ #{try_sudo} mysqldump \
60
+ --host='#{auth[:hostname]}' \
61
+ --user='#{auth[:username]}' \
62
+ --password='#{auth[:password]}' \
63
+ --default-character-set=utf8 \
64
+ '#{fetch :db_database_name}' > \
65
+ '#{latest_backup}' &&
66
+ #{try_sudo} bzip2 -9 '#{latest_backup}'
67
+ CMD
68
+ rescue Capistrano::CommandError
69
+ abort 'Not able to backup the database'
70
+ end
71
+ end
72
+
73
+ desc '[internal] Import a dump to the mysql database'
74
+ task :import, :roles => :db do
75
+ tmp_file = write File.read(arguments)
76
+ auth = fetch :db_credentials
77
+
78
+ begin
79
+ run <<-CMD
80
+ #{try_sudo} mysql \
81
+ --host='#{auth[:hostname]}' \
82
+ --user='#{auth[:username]}' \
83
+ --password='#{auth[:password]}' \
84
+ --default-character-set=utf8 \
85
+ '#{fetch :db_database_name}' < \
86
+ '#{tmp_file}' &&
87
+ rm -f '#{tmp_file}'
88
+ CMD
89
+ rescue Capistrano::CommandError
90
+ abort 'Failed to import the database'
91
+ end
92
+ end
93
+
94
+ desc '[internal] Backup skiped tables from the mysql database'
95
+ task :backup_skiped_tables, :roles => :db do
96
+ auth = fetch :db_credentials
97
+
98
+ fetch(:skip_tables_on_import, []).each do |t|
99
+ begin
100
+ run <<-CMD
101
+ #{try_sudo} mysqldump \
102
+ --host='#{auth[:hostname]}' \
103
+ --user='#{auth[:username]}' \
104
+ --password='#{auth[:password]}' \
105
+ --default-character-set=utf8 \
106
+ '#{fetch :db_database_name}' '#{t}' >> \
107
+ '#{fetch :backuped_skiped_tables_file}'
108
+ CMD
109
+ rescue Capistrano::CommandError
110
+ logger.info "WARNING: It seems the database does not have the table '#{t}', skipping it."
111
+ end
112
+ end
113
+
114
+ desc '[internal] Restore skiped tables to the mysql database'
115
+ task :restore_skiped_tables, :roles => :db do
116
+ auth = fetch :db_credentials
117
+
118
+ begin
119
+ run <<-CMD
120
+ mysql \
121
+ --host='#{auth[:hostname]}' \
122
+ --user='#{auth[:username]}' \
123
+ --password='#{auth[:password]}' \
124
+ --default-character-set=utf8 \
125
+ '#{fetch :db_database_name}' < \
126
+ #{fetch :backuped_skiped_tables_file}
127
+ CMD
128
+ rescue
129
+ abort 'ERROR: I could not restore the tables defined in skip_tables_on_import'
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-database
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-30 00:00:00.000000000 Z
12
+ date: 2012-07-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -28,7 +28,7 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: capistrano
31
+ name: activesupport
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
@@ -44,7 +44,7 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  - !ruby/object:Gem::Dependency
47
- name: activesupport
47
+ name: capistrano-utils
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -72,6 +72,8 @@ files:
72
72
  - README.md
73
73
  - Rakefile
74
74
  - capistrano-database.gemspec
75
+ - lib/capistrano/ext/database.rb
76
+ - lib/capistrano/ext/mysql.rb
75
77
  homepage: http://technogate.github.com/contao
76
78
  licenses: []
77
79
  post_install_message:
@@ -92,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
94
  version: '0'
93
95
  segments:
94
96
  - 0
95
- hash: 3886834970779781815
97
+ hash: -1917011579952684110
96
98
  requirements: []
97
99
  rubyforge_project:
98
100
  rubygems_version: 1.8.23