rails_pwnerer 0.3.5 → 0.4
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/CHANGELOG +2 -0
- data/lib/pwnage/app/database.rb +30 -1
- data/lib/pwnage/app/main.rb +16 -0
- data/lib/pwnage/app/svn.rb +65 -4
- data/lib/pwnage/config/main.rb +6 -1
- data/lib/pwnage/executor.rb +42 -32
- data/lib/pwnage/scaffolds/dirs.rb +2 -2
- data/rails_pwnerer.gemspec +2 -2
- metadata +1 -1
data/CHANGELOG
CHANGED
data/lib/pwnage/app/database.rb
CHANGED
@@ -63,6 +63,31 @@ ENDSQL
|
|
63
63
|
migrate_database app_name
|
64
64
|
end
|
65
65
|
|
66
|
+
# backs up or restores the database
|
67
|
+
def backup(app_name, action)
|
68
|
+
db_name = RailsPwnage::Config.app_dbname(app_name)
|
69
|
+
db_user = RailsPwnage::Config.app_db_user(app_name)
|
70
|
+
db_pass = RailsPwnage::Config.app_db_password(app_name)
|
71
|
+
|
72
|
+
pwnerer_user = RailsPwnage::Config.pwnerer_user
|
73
|
+
pwnerer_uid = uid_for_username(pwnerer_user)
|
74
|
+
pwnerer_gid = gid_for_username(pwnerer_user)
|
75
|
+
|
76
|
+
case action
|
77
|
+
when :checkpoint
|
78
|
+
timestamp = Time.now.strftime '%Y%m%d%H%M%S'
|
79
|
+
dump_file = "db/#{app_name}_#{timestamp}.sql"
|
80
|
+
with_dir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
81
|
+
system "mysqldump --add-drop-database --add-drop-table --extended-insert --single-transaction -u#{db_user} -p#{db_pass} #{db_name} > #{dump_file}"
|
82
|
+
# lockdown the file
|
83
|
+
File.chmod(0400, dump_file)
|
84
|
+
File.chown(pwnerer_uid, pwnerer_gid, dump_file)
|
85
|
+
end
|
86
|
+
when :rollback
|
87
|
+
# TODO: rollback
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
66
91
|
def control_all(action)
|
67
92
|
case action
|
68
93
|
when :start
|
@@ -80,7 +105,11 @@ ENDSQL
|
|
80
105
|
self.new.update(app_name)
|
81
106
|
end
|
82
107
|
|
108
|
+
def self.backup(app_name, action)
|
109
|
+
self.new.backup(app_name, action)
|
110
|
+
end
|
111
|
+
|
83
112
|
def self.control_all(action = :start)
|
84
113
|
self.new.control_all(action)
|
85
|
-
end
|
114
|
+
end
|
86
115
|
end
|
data/lib/pwnage/app/main.rb
CHANGED
@@ -15,6 +15,22 @@ module RailsPwnage::App
|
|
15
15
|
end
|
16
16
|
NginxConfig.update(app_name)
|
17
17
|
end
|
18
|
+
|
19
|
+
# performs a backup task (checkpoint / release
|
20
|
+
def self.backup(app_name, action = :checkpoint)
|
21
|
+
case action
|
22
|
+
when :checkpoint
|
23
|
+
Svn.backup app_name, action
|
24
|
+
ClusterConfig.update(app_name) do
|
25
|
+
Database.backup app_name, action
|
26
|
+
end
|
27
|
+
when :rollback
|
28
|
+
ClusterConfig.update(app_name) do
|
29
|
+
Svn.backup app_name, action
|
30
|
+
Database.backup app_name, action
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
18
34
|
|
19
35
|
# start or stop all apps
|
20
36
|
def self.control_all(action = :start)
|
data/lib/pwnage/app/svn.rb
CHANGED
@@ -5,7 +5,7 @@ require 'fileutils'
|
|
5
5
|
class RailsPwnage::App::Svn
|
6
6
|
include RailsPwnage::Base
|
7
7
|
|
8
|
-
def
|
8
|
+
def svn_checkout(svn_path)
|
9
9
|
app_name = File.basename(svn_path)
|
10
10
|
|
11
11
|
prod_apps = RailsPwnage::Config.path_to :prod_apps
|
@@ -17,18 +17,75 @@ class RailsPwnage::App::Svn
|
|
17
17
|
return app_name
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def svn_update(app_name)
|
21
21
|
with_dir(RailsPwnage::Config.path_to(app_name)) do
|
22
22
|
system "svn update"
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
def scaffold_backup(app_name)
|
27
|
+
pwnerer_user = RailsPwnage::Config.pwnerer_user
|
28
|
+
pwnerer_uid = uid_for_username(pwnerer_user)
|
29
|
+
pwnerer_gid = gid_for_username(pwnerer_user)
|
30
|
+
|
31
|
+
backup_dir = RailsPwnage::Config.path_to :backup, app_name
|
32
|
+
FileUtils.mkpath backup_dir unless File.exists? backup_dir
|
33
|
+
File.chown(pwnerer_uid, pwnerer_gid, backup_dir)
|
34
|
+
|
35
|
+
with_dir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
36
|
+
['db', 'files', 'tmp'].each do |subdir|
|
37
|
+
Dir.mkdir subdir unless File.exists? subdir
|
38
|
+
File.chown pwnerer_uid, pwnerer_gid, subdir
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def backup(app_name, action)
|
44
|
+
pwnerer_user = RailsPwnage::Config.pwnerer_user
|
45
|
+
pwnerer_uid = uid_for_username(pwnerer_user)
|
46
|
+
pwnerer_gid = gid_for_username(pwnerer_user)
|
47
|
+
|
48
|
+
case action
|
49
|
+
when :checkpoint
|
50
|
+
timestamp = Time.now.strftime '%Y%m%d%H%M%S'
|
51
|
+
dump_file = "files/#{app_name}_#{timestamp}.tar.gz"
|
52
|
+
|
53
|
+
with_dir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
54
|
+
# create a cold copy of the application files
|
55
|
+
cold_copy = "tmp#{File::SEPARATOR}#{app_name}"
|
56
|
+
FileUtils.rm_r cold_copy if File.exists? cold_copy
|
57
|
+
FileUtils.cp_r RailsPwnage::Config.path_to(app_name), 'tmp'
|
58
|
+
|
59
|
+
# pack and protect the cold copy
|
60
|
+
with_dir 'tmp' do
|
61
|
+
system "tar -czf ../#{dump_file} #{app_name}"
|
62
|
+
end
|
63
|
+
File.chmod(400, dump_file)
|
64
|
+
File.chown(pwnerer_uid, pwnerer_gid, dump_file)
|
25
65
|
|
66
|
+
# clean up
|
67
|
+
FileUtils.rm_r cold_copy
|
68
|
+
end
|
69
|
+
when :rollback
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
26
73
|
def setup(svn_path)
|
27
|
-
app_name =
|
74
|
+
app_name = svn_checkout(svn_path)
|
28
75
|
|
29
76
|
# TODO: fetch configuration, feed to system
|
30
77
|
|
31
|
-
|
78
|
+
scaffold_backup(app_name)
|
79
|
+
|
80
|
+
return app_name
|
81
|
+
end
|
82
|
+
|
83
|
+
def update(app_name)
|
84
|
+
scaffold_backup(app_name)
|
85
|
+
|
86
|
+
# TODO: maybe backup old version before issuing the svn update?
|
87
|
+
|
88
|
+
svn_update(app_name)
|
32
89
|
end
|
33
90
|
|
34
91
|
def self.setup(svn_path)
|
@@ -39,5 +96,9 @@ class RailsPwnage::App::Svn
|
|
39
96
|
self.new.update(app_name)
|
40
97
|
end
|
41
98
|
|
99
|
+
def self.backup(app_name, action)
|
100
|
+
self.new.backup(app_name, action)
|
101
|
+
end
|
102
|
+
|
42
103
|
# TODO: uninstallation
|
43
104
|
end
|
data/lib/pwnage/config/main.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module RailsPwnage::Config
|
2
2
|
# the path to something important (e.g. :prod_apps --> path to all production applications)
|
3
|
-
def self.path_to(what = :prod)
|
3
|
+
def self.path_to(what = :prod, app_name = nil)
|
4
4
|
case what
|
5
5
|
when :prod
|
6
6
|
# the directory containing all the production data
|
@@ -11,12 +11,17 @@ module RailsPwnage::Config
|
|
11
11
|
when :prod_config
|
12
12
|
# the directory containing the config files
|
13
13
|
'/prod/config'
|
14
|
+
when :prod_backups
|
15
|
+
'/prod/backups'
|
14
16
|
when :mongrel_configs
|
15
17
|
# the directory containing the mongrel_cluster config files
|
16
18
|
'/etc/mongrel_cluster'
|
17
19
|
when :nginx_configs
|
18
20
|
# the directory containing the nginx config files
|
19
21
|
'/etc/nginx/sites-enabled'
|
22
|
+
when :backup
|
23
|
+
# the backup directory for an application
|
24
|
+
'/prod/backups/' + app_name
|
20
25
|
when String
|
21
26
|
# an application
|
22
27
|
self.path_to(:prod_apps) + File::SEPARATOR + what
|
data/lib/pwnage/executor.rb
CHANGED
@@ -4,38 +4,48 @@ class RailsPwnage::Executor
|
|
4
4
|
# standalone runner
|
5
5
|
def run(args)
|
6
6
|
case args[0]
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
7
|
+
when 'scaffold', 'den00b'
|
8
|
+
case args[1]
|
9
|
+
when 'dirs'
|
10
|
+
Dirs.go
|
11
|
+
when 'gems'
|
12
|
+
Gems.go
|
13
|
+
when 'packages'
|
14
|
+
Packages.go
|
15
|
+
when 'mongrels'
|
16
|
+
HookMongrels.go
|
17
|
+
else
|
18
|
+
Packages.go
|
19
|
+
Gems.go
|
20
|
+
Dirs.go
|
21
|
+
HookMongrels.go
|
22
|
+
end
|
23
|
+
|
24
|
+
when 'install', 'micro'
|
25
|
+
svn_path = args[1]
|
26
|
+
RailsPwnage::App.install svn_path
|
27
|
+
|
28
|
+
when 'update', 'ubermicro'
|
29
|
+
app_name = args[1]
|
30
|
+
RailsPwnage::App.update app_name
|
31
|
+
|
32
|
+
when 'go'
|
33
|
+
case args[1]
|
34
|
+
when 'live', 'pwn'
|
35
|
+
RailsPwnage::App.control_all :start
|
36
|
+
when 'down', 'panic'
|
37
|
+
RailsPwnage::App.control_all :stop
|
38
|
+
else
|
39
|
+
print "Unrecognized go command #{args[1]}\n"
|
40
|
+
end
|
41
|
+
|
42
|
+
when 'backup', 'checkpoint', 'save'
|
43
|
+
RailsPwnage::App.backup args[1], :checkpoint
|
44
|
+
when 'restore', 'reload', 'recover', 'rollback'
|
45
|
+
RailsPwnage::App.backup args[1], :rollback
|
46
|
+
|
47
|
+
else
|
48
|
+
print "Unrecognized command #{args[0]}\n"
|
39
49
|
end
|
40
50
|
end
|
41
51
|
|
@@ -9,9 +9,9 @@ class RailsPwnage::Scaffolds::Dirs
|
|
9
9
|
def run
|
10
10
|
pwnerer_uid = uid_for_username(RailsPwnage::Config.pwnerer_user)
|
11
11
|
with_dir('/') do
|
12
|
-
[:prod_apps, :prod_config].map { |k| RailsPwnage::Config.path_to k }.each do |path|
|
12
|
+
[:prod_apps, :prod_config, :prod_backups].map { |k| RailsPwnage::Config.path_to k }.each do |path|
|
13
13
|
FileUtils.mkpath path
|
14
|
-
File.chown(pwnerer_uid, nil, path)
|
14
|
+
File.chown(pwnerer_uid, nil, path)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/rails_pwnerer.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Rails_pwnerer-0.
|
2
|
+
# Gem::Specification for Rails_pwnerer-0.4
|
3
3
|
# Originally generated by Echoe
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = %q{rails_pwnerer}
|
7
|
-
s.version = "0.
|
7
|
+
s.version = "0.4"
|
8
8
|
|
9
9
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
10
|
|