wpcap 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wpcap/backup.rb +46 -0
- data/lib/wpcap/recipes/base.rb +15 -2
- data/lib/wpcap/recipes/mysql.rb +102 -38
- data/lib/wpcap/recipes/server.rb +5 -0
- data/lib/wpcap/recipes/wordpress.rb +1 -0
- data/lib/wpcap/version.rb +1 -1
- metadata +3 -2
data/lib/wpcap/backup.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
class Wpcap::Backup
|
2
|
+
|
3
|
+
def initialize(ls)
|
4
|
+
@data ||= ls.split(" ")
|
5
|
+
end
|
6
|
+
|
7
|
+
def name
|
8
|
+
@name ||= @data[8]
|
9
|
+
end
|
10
|
+
|
11
|
+
def type
|
12
|
+
type = name.split(".")[0]
|
13
|
+
@type ||= "#{type} "
|
14
|
+
end
|
15
|
+
|
16
|
+
def size
|
17
|
+
as_size( @data[4] )
|
18
|
+
end
|
19
|
+
|
20
|
+
def at
|
21
|
+
Time.at("#{name.chomp(".sql.bz2").split(".")[1]}.#{name.chomp(".sql.bz2").split(".")[2]}".to_f).strftime("%c")
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.parse(ls_output)
|
25
|
+
backups = []
|
26
|
+
ls_output.each_line do |line|
|
27
|
+
|
28
|
+
backups << Wpcap::Backup.new( line ) unless line.include?("total")
|
29
|
+
end
|
30
|
+
return backups
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
PREFIX = %W(TiB GiB MiB KiB B).freeze
|
35
|
+
|
36
|
+
def as_size( s )
|
37
|
+
s = s.to_f
|
38
|
+
i = PREFIX.length - 1
|
39
|
+
while s > 512 && i > 0
|
40
|
+
i -= 1
|
41
|
+
s /= 1024
|
42
|
+
end
|
43
|
+
((s > 9 || s.modulo(1) < 0.1 ? '%d' : '%.1f') % s) + ' ' + PREFIX[i]
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/wpcap/recipes/base.rb
CHANGED
@@ -7,7 +7,7 @@ Capistrano::Configuration.instance(:must_exist) :
|
|
7
7
|
Capistrano.configuration(:must_exist)
|
8
8
|
|
9
9
|
configuration.load do
|
10
|
-
|
10
|
+
default_run_options[:pty] = true
|
11
11
|
def template(from, to)
|
12
12
|
erb = File.read(File.expand_path("../templates/#{from}", __FILE__))
|
13
13
|
put ERB.new(erb).result(binding), to
|
@@ -21,7 +21,11 @@ configuration.load do
|
|
21
21
|
chars = (('a'..'z').to_a + ('0'..'9').to_a) - %w(i o 0 1 l 0)
|
22
22
|
(1..size).collect{|a| chars[rand(chars.size)] }.join
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
|
+
def remote_file_exists?(full_path)
|
26
|
+
'true' == capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip
|
27
|
+
end
|
28
|
+
|
25
29
|
def run_with_tty(server, cmd)
|
26
30
|
# looks like total pizdets
|
27
31
|
command = []
|
@@ -47,4 +51,13 @@ configuration.load do
|
|
47
51
|
run "#{sudo} apt-get -y install git debconf-utils python-software-properties"
|
48
52
|
end
|
49
53
|
end
|
54
|
+
|
55
|
+
desc "Tail all or a single remote file"
|
56
|
+
task :tail do
|
57
|
+
ENV["LOGFILE"] ||= "*.log"
|
58
|
+
run "tail -f #{shared_path}/logs/#{ENV["LOGFILE"]}" do |channel, stream, data|
|
59
|
+
puts "#{data}"
|
60
|
+
break if stream == :err
|
61
|
+
end
|
62
|
+
end
|
50
63
|
end
|
data/lib/wpcap/recipes/mysql.rb
CHANGED
@@ -2,6 +2,7 @@ require 'erb'
|
|
2
2
|
require 'yaml'
|
3
3
|
require 'wpcap'
|
4
4
|
require 'wpcap/utility'
|
5
|
+
require 'wpcap/backup'
|
5
6
|
|
6
7
|
configuration = Capistrano::Configuration.respond_to?(:instance) ?
|
7
8
|
Capistrano::Configuration.instance(:must_exist) :
|
@@ -12,15 +13,30 @@ configuration.load do
|
|
12
13
|
namespace :mysql do
|
13
14
|
desc "Install Mysql Database Server"
|
14
15
|
task :install_server, roles: :db do
|
15
|
-
create_yaml
|
16
16
|
prepare_env
|
17
|
-
run "#{sudo}
|
17
|
+
run "#{sudo} apt-get -y update"
|
18
18
|
run "#{sudo} echo 'mysql-server-5.5 mysql-server/root_password password #{db_priv_pass}' | #{sudo} debconf-set-selections"
|
19
19
|
run "#{sudo} echo 'mysql-server-5.5 mysql-server/root_password_again password #{db_priv_pass}' | #{sudo} debconf-set-selections"
|
20
20
|
run "#{sudo} apt-get -y install mysql-server"
|
21
21
|
end
|
22
22
|
after "deploy:install", "db:mysql:install_server"
|
23
23
|
|
24
|
+
desc "Save db passwords on server in enviroment so new wpcap installs may provision local databases. "
|
25
|
+
task :set_priv_environment, roles: :db do
|
26
|
+
#Generate a password for the mysql install (this will be saved in the enviroment vars of the server)
|
27
|
+
unless remote_file_exists?("/etc/wpcap/database.yml")
|
28
|
+
|
29
|
+
set :db_priv_pass, random_password(16)
|
30
|
+
run "#{sudo} mkdir -p /etc/wpcap"
|
31
|
+
save_yaml({"db_priv_pass" => db_priv_pass, "db_priv_user" => "root"}, "/tmp/privdb.yml")
|
32
|
+
upload "/tmp/privdb.yml", "/etc/wpcap/database.yml"
|
33
|
+
|
34
|
+
else
|
35
|
+
Wpcap::Utility.error("MYSQL Server Already Configured")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
before "db:mysql:install_server", "db:mysql:set_priv_environment"
|
39
|
+
|
24
40
|
desc "Install Mysql Database Client Bindings"
|
25
41
|
task :install_client, roles: :web do
|
26
42
|
run "#{sudo} apt-get -y update"
|
@@ -37,7 +53,7 @@ configuration.load do
|
|
37
53
|
|
38
54
|
prepare_env
|
39
55
|
run "mkdir -p #{backups_path}"
|
40
|
-
filename = "
|
56
|
+
filename = "db_backup_#{Time.now.to_f}.sql.bz2"
|
41
57
|
filepath = "#{backups_path}/#{filename}"
|
42
58
|
on_rollback { run "rm #{filepath}" }
|
43
59
|
run "mysqldump --user=#{db_username} -p --host=#{db_host} #{db_database} | bzip2 -z9 > #{filepath}" do |ch, stream, out|
|
@@ -54,7 +70,24 @@ configuration.load do
|
|
54
70
|
puts out
|
55
71
|
end
|
56
72
|
end
|
57
|
-
|
73
|
+
|
74
|
+
desc "Restores the database from the latest compressed dump"
|
75
|
+
task :restore, :roles => :db, :only => { :primary => true } do
|
76
|
+
prepare_env
|
77
|
+
backup_list = capture "cd #{backups_path}; ls -lrt"
|
78
|
+
backups = Wpcap::Backup.parse( backup_list )
|
79
|
+
|
80
|
+
backups.each_with_index do |backup, count|
|
81
|
+
printf "%-5s %-20s %-10s %s\n", count + 1 , backup.type , backup.size , backup.at
|
82
|
+
end
|
83
|
+
puts "Select a Backup you wish to restore (1-#{backups.size})"
|
84
|
+
restore_index = $stdin.gets.chomp
|
85
|
+
if restore_index
|
86
|
+
backup_to_restore = backups[restore_index.to_i - 1 ]
|
87
|
+
puts "#{backups_path}/#{backup_to_restore.name}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
58
91
|
desc "Restores the database from the latest downloaded compressed dump"
|
59
92
|
task :local_restore do
|
60
93
|
prepare_env(:development)
|
@@ -74,7 +107,7 @@ configuration.load do
|
|
74
107
|
prepare_env(:development)
|
75
108
|
run_locally "#{local_mysql_path}mysqldump --user #{db_username} --password=#{db_password} #{db_database} | bzip2 -z9 > #{local_dump}"
|
76
109
|
run "mkdir -p #{backups_path}"
|
77
|
-
filename = "
|
110
|
+
filename = "local_upload_#{Time.now.to_f}.sql.bz2"
|
78
111
|
filepath = "#{backups_path}/#{filename}"
|
79
112
|
upload "#{local_dump}" , "#{filepath}"
|
80
113
|
end
|
@@ -97,6 +130,7 @@ configuration.load do
|
|
97
130
|
|
98
131
|
desc "Create MySQL database and user for this stage using database.yml values"
|
99
132
|
task :create, :roles => :db, :only => { :primary => true } do
|
133
|
+
create_yaml
|
100
134
|
prepare_env
|
101
135
|
create_db_if_missing
|
102
136
|
end
|
@@ -121,14 +155,13 @@ configuration.load do
|
|
121
155
|
|
122
156
|
desc "Create database.yml in shared path with settings for current stage and test env"
|
123
157
|
task :create_yaml do
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
unless db_config[rails_env]
|
128
|
-
set :db_priv_pass, random_password(16)
|
158
|
+
#Create a new database enviroment unless it already exists in config.
|
159
|
+
unless db_config[stage]
|
160
|
+
template_path = "#{shared_path}/config/database.yml"
|
129
161
|
set :db_username, "#{application.split(".").first}_#{stage}"
|
130
162
|
set :db_database, "#{application.split(".").first}_#{stage}"
|
131
163
|
set :db_password, random_password(16)
|
164
|
+
set :db_prefix, db_config["development"]["prefix"]
|
132
165
|
run "mkdir -p #{shared_path}/config"
|
133
166
|
template "mysql.yml.erb", template_path
|
134
167
|
server_yaml = capture "cat #{template_path}"
|
@@ -141,46 +174,76 @@ configuration.load do
|
|
141
174
|
@db_config ||= fetch_db_config
|
142
175
|
end
|
143
176
|
|
144
|
-
def
|
145
|
-
|
177
|
+
def remote_config(key)
|
178
|
+
@remote_config ||= fetch_db_config(true)
|
179
|
+
|
180
|
+
return @remote_config[key.to_s]
|
181
|
+
end
|
182
|
+
|
183
|
+
def fetch_db_config(remote = false)
|
184
|
+
if remote
|
185
|
+
YAML.load( capture("cat /etc/wpcap/database.yml"))
|
186
|
+
else
|
187
|
+
YAML.load(File.open("config/database.yml"))
|
188
|
+
end
|
146
189
|
end
|
147
190
|
|
148
191
|
# Sets database variables from remote database.yaml
|
149
|
-
def prepare_env(
|
150
|
-
abort "No Database Configuratons Found" if !db_config
|
192
|
+
def prepare_env(load_stage = stage)
|
151
193
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
set(:db_password) { db_config[rails_env]["password"] }
|
162
|
-
set(:db_encoding) { db_config[rails_env]["encoding"] }
|
163
|
-
set(:db_prefix) { db_config[rails_env]["prefix"].nil? ? db_config["development"]["prefix"] : db_config[rails_env]["prefix"] }
|
164
|
-
else
|
165
|
-
Wpcap::Utility.error "No Database Configuration for #{rails_env} Found"
|
194
|
+
load_stage = load_stage.to_s
|
195
|
+
|
196
|
+
if !db_config
|
197
|
+
Wpcap::Utility.error("No Database Configuratons Found")
|
198
|
+
abort
|
199
|
+
end
|
200
|
+
|
201
|
+
if remote_config(:db_priv_pass).nil?
|
202
|
+
Wpcap::Utility.error "This no privleged user for this server found in servers ssh enviroment profile (did you set it up with wpcap?)"
|
166
203
|
abort
|
167
204
|
end
|
205
|
+
|
206
|
+
set(:local_dump) { "/tmp/#{application}.sql.bz2" }
|
207
|
+
|
208
|
+
if db_config[load_stage]
|
209
|
+
|
210
|
+
set(:db_priv_user) { remote_config(:db_priv_user).nil? ? db_config[load_stage]["username"] : remote_config(:db_priv_user) }
|
211
|
+
set(:db_priv_pass) { remote_config(:db_priv_pass).nil? ? db_config[load_stage]["password"] : remote_config(:db_priv_pass) }
|
212
|
+
set(:db_host) { db_config[load_stage]["host"] }
|
213
|
+
set(:db_database) { db_config[load_stage]["database"] }
|
214
|
+
set(:db_username) { db_config[load_stage]["username"] }
|
215
|
+
set(:db_password) { db_config[load_stage]["password"] }
|
216
|
+
set(:db_encoding) { db_config[load_stage]["encoding"] }
|
217
|
+
set(:db_prefix) { db_config[load_stage]["prefix"] }
|
218
|
+
|
219
|
+
end
|
168
220
|
|
169
221
|
end
|
170
|
-
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
File.open('config/database.yml', 'w') do |f|
|
175
|
-
f.puts YAML::dump(database_yaml).sub("---","").split("\n").map(&:rstrip).join("\n").strip
|
222
|
+
|
223
|
+
def save_yaml(hash, path)
|
224
|
+
File.open(path, 'w') do |f|
|
225
|
+
f.puts YAML::dump(hash).sub("---","").split("\n").map(&:rstrip).join("\n").strip
|
176
226
|
end
|
177
227
|
end
|
178
|
-
|
228
|
+
|
229
|
+
def update_db_config(stage_config)
|
230
|
+
print "Saving Database Config file to local Repo"
|
231
|
+
database_yaml = db_config.merge(stage_config)
|
232
|
+
save_yaml(database_yaml, 'config/database.yml')
|
233
|
+
end
|
234
|
+
|
179
235
|
def most_recent_backup
|
180
236
|
most_recent_sql = capture "cd #{backups_path}; ls -lrt | awk '{ f=$NF }; END{ print f }'"
|
181
237
|
return "#{backups_path}/#{most_recent_sql}".strip
|
182
238
|
end
|
183
|
-
|
239
|
+
|
240
|
+
def restore_dump(dump_path)
|
241
|
+
run "bzcat #{dump_path} | mysql --user=#{db_username} -p --host=#{db_host} #{db_database}" do |ch, stream, out|
|
242
|
+
ch.send_data "#{db_password}\n" if out =~ /^Enter password:/
|
243
|
+
puts out
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
184
247
|
def database_exits?(environment = stage)
|
185
248
|
exists = false
|
186
249
|
databases = run_mysql_command("show databases;", environment)
|
@@ -200,7 +263,7 @@ configuration.load do
|
|
200
263
|
print "databases exists -- skipping"
|
201
264
|
end
|
202
265
|
end
|
203
|
-
|
266
|
+
|
204
267
|
def run_mysql_command(sql, environment = stage)
|
205
268
|
environment = environment.to_s
|
206
269
|
prepare_env(environment)
|
@@ -213,13 +276,14 @@ configuration.load do
|
|
213
276
|
else
|
214
277
|
run "mysql --user=#{db_username} --password --execute=\"#{sql}\"" do |channel, stream, data|
|
215
278
|
if data =~ /^Enter password:/
|
216
|
-
channel.send_data "#{db_password}\n"
|
279
|
+
channel.send_data "#{db_password}\n"
|
217
280
|
end
|
218
281
|
output += data
|
219
282
|
end
|
220
283
|
end
|
221
284
|
return output
|
222
285
|
end
|
286
|
+
|
223
287
|
before "db:mysql:push", "db:mysql:create"
|
224
288
|
before "db:mysql:pull", "db:mysql:create_local_db"
|
225
289
|
after "deploy:update_code" , "db:mysql:prepare_enviroment"
|
data/lib/wpcap/recipes/server.rb
CHANGED
data/lib/wpcap/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wpcap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
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-
|
12
|
+
date: 2012-11-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- Rakefile
|
59
59
|
- bin/wpcap
|
60
60
|
- lib/wpcap.rb
|
61
|
+
- lib/wpcap/backup.rb
|
61
62
|
- lib/wpcap/command.rb
|
62
63
|
- lib/wpcap/recipes/base.rb
|
63
64
|
- lib/wpcap/recipes/check.rb
|