wpcap 0.1.0 → 0.2.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.
- 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
|