rails_pwnerer 0.4.5 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/Manifest +2 -0
- data/README +16 -3
- data/RUBYFORGE +10 -7
- data/lib/pwnage/app/cluster_config.rb +7 -7
- data/lib/pwnage/app/database.rb +9 -7
- data/lib/pwnage/app/main.rb +16 -14
- data/lib/pwnage/app/nginx_config.rb +1 -1
- data/lib/pwnage/app/svn.rb +13 -9
- data/lib/pwnage/base/dirs.rb +1 -13
- data/lib/pwnage/base/startup.rb +15 -5
- data/lib/pwnage/config/main.rb +2 -0
- data/lib/pwnage/executor.rb +14 -3
- data/lib/pwnage/scaffolds/dirs.rb +1 -1
- data/lib/pwnage/scaffolds/gems.rb +1 -1
- data/lib/pwnage/scaffolds/hook_dyndns.rb +46 -0
- data/lib/pwnage/scaffolds/hook_mongrels.rb +2 -1
- data/lib/pwnage/scaffolds/mysql_config.rb +15 -0
- data/lib/pwnage/scaffolds/packages.rb +13 -3
- data/lib/rails_pwnage.rb +2 -0
- data/rails_pwnerer.gemspec +6 -6
- metadata +7 -3
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
@@ -14,7 +14,9 @@ lib/pwnage/config/main.rb
|
|
14
14
|
lib/pwnage/executor.rb
|
15
15
|
lib/pwnage/scaffolds/dirs.rb
|
16
16
|
lib/pwnage/scaffolds/gems.rb
|
17
|
+
lib/pwnage/scaffolds/hook_dyndns.rb
|
17
18
|
lib/pwnage/scaffolds/hook_mongrels.rb
|
19
|
+
lib/pwnage/scaffolds/mysql_config.rb
|
18
20
|
lib/pwnage/scaffolds/packages.rb
|
19
21
|
lib/rails_pwnage.rb
|
20
22
|
LICENSE
|
data/README
CHANGED
@@ -4,7 +4,7 @@ I built +rails_pwnerer+ because I hate the messy process of putting a rails
|
|
4
4
|
application into production. I don't enjoy following 10-page guides, so I'd
|
5
5
|
much rather having ruby do that for me.
|
6
6
|
|
7
|
-
Right now, +rails_pwnerer+ assumes a fresh Ubuntu
|
7
|
+
Right now, +rails_pwnerer+ assumes a fresh Ubuntu 8.04 installation. You're
|
8
8
|
welcome to test/update for other systems, and I'll be happy to merge patches,
|
9
9
|
or add you to the RubyForge project.
|
10
10
|
|
@@ -22,9 +22,14 @@ I won't even mention backups.
|
|
22
22
|
|
23
23
|
Life with +rails_pwnerer+:
|
24
24
|
|
25
|
-
1) Install rubygems:
|
25
|
+
1) Install ruby and rubygems (one command should be enough, but the rubygems in Ubuntu 8.04 doesn't work):
|
26
|
+
|
27
|
+
sudo apt-get install ruby
|
28
|
+
|
26
29
|
sudo apt-get install rubygems
|
27
30
|
|
31
|
+
sudo gem update --system
|
32
|
+
|
28
33
|
2) Install +rails_pwnerer+:
|
29
34
|
sudo gem install rails_pwnerer
|
30
35
|
|
@@ -37,7 +42,9 @@ sudo rpwn install svn+ssh://your.repository.host/path/to/your_application
|
|
37
42
|
5) Reboot, or start the services right away:
|
38
43
|
sudo rpwn go live
|
39
44
|
|
40
|
-
|
45
|
+
6) Maintain your application
|
46
|
+
|
47
|
+
* Push the updates in the SVN repository:
|
41
48
|
sudo rpwn update your_application
|
42
49
|
|
43
50
|
* Create a backup:
|
@@ -46,5 +53,11 @@ sudo rpwn backup your_application
|
|
46
53
|
* Restore from the latest backup:
|
47
54
|
sudo rpwn restore your_application
|
48
55
|
|
56
|
+
* Poke around your application using the Rails console:
|
57
|
+
rpwn console your_application
|
58
|
+
|
59
|
+
* Configure DynDns for your application server
|
60
|
+
sudo rpwn scaffold ddns full_host_name ddns_user ddns_password
|
61
|
+
|
49
62
|
* Bring down all the applications (panic mode):
|
50
63
|
sudo rpwn go down
|
data/RUBYFORGE
CHANGED
@@ -1,22 +1,25 @@
|
|
1
1
|
Quickstart for Rubyforge:
|
2
2
|
|
3
|
-
1)
|
3
|
+
1) Checkout the rails_pwnage code
|
4
|
+
svn co svn+ssh://your_user@rubyforge.org/var/svn/rails-pwnage/rails_pwnage
|
5
|
+
|
6
|
+
2) Install the rubyforge gem
|
4
7
|
gem install rubyforge
|
5
8
|
|
6
|
-
|
9
|
+
3) Save your rubyforge.org login information
|
7
10
|
rubyforge setup
|
8
11
|
|
9
|
-
|
12
|
+
4) Get a login cookie
|
10
13
|
rubyforge login
|
11
14
|
|
12
|
-
|
15
|
+
5) Get project configuration from rubyforge
|
13
16
|
rubyforge config rails-pwnage
|
14
17
|
|
15
|
-
|
18
|
+
6) Create a package to release under
|
16
19
|
rubyforge create_package rails-pwnage rails_pwnage
|
17
20
|
|
18
|
-
|
21
|
+
7) Install the echoe gem (required for building this gem)
|
19
22
|
gem install echoe
|
20
23
|
|
21
|
-
|
24
|
+
8) Release the gem (finally!)
|
22
25
|
rake release
|
@@ -10,7 +10,7 @@ class RailsPwnage::App::ClusterConfig
|
|
10
10
|
pwnerer_uid = uid_for_username(pwnerer_user)
|
11
11
|
pwnerer_group = group_for_username(pwnerer_user)
|
12
12
|
|
13
|
-
|
13
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
14
14
|
%w(log tmp public).each do |writable_dir|
|
15
15
|
FileUtils.chown_R(pwnerer_uid, pwnerer_group, writable_dir)
|
16
16
|
end
|
@@ -25,7 +25,7 @@ class RailsPwnage::App::ClusterConfig
|
|
25
25
|
instances = RailsPwnage::Config.app_instances(app_name)
|
26
26
|
first_port = RailsPwnage::Config.app_port0(app_name)
|
27
27
|
|
28
|
-
|
28
|
+
Dir.chdir(app_path) do
|
29
29
|
# create the mongrel_cluster configuration
|
30
30
|
system "mongrel_rails cluster::configure -e production -N #{instances} -p #{first_port} -a 127.0.0.1 -c #{app_path} --user #{pwnerer_user} --group #{pwnerer_group}"
|
31
31
|
|
@@ -38,7 +38,7 @@ class RailsPwnage::App::ClusterConfig
|
|
38
38
|
# silently die if the app was completely busted
|
39
39
|
return unless File.exists? RailsPwnage::Config.path_to(app_name)
|
40
40
|
|
41
|
-
|
41
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
42
42
|
system 'mongrel_rails cluster::stop'
|
43
43
|
|
44
44
|
# clean up PID files in case the mongrels died and left them behind
|
@@ -50,7 +50,7 @@ class RailsPwnage::App::ClusterConfig
|
|
50
50
|
# silently die if the app was completely busted
|
51
51
|
return unless File.exists? RailsPwnage::Config.path_to(app_name)
|
52
52
|
|
53
|
-
|
53
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
54
54
|
system 'mongrel_rails cluster::start'
|
55
55
|
end
|
56
56
|
end
|
@@ -69,7 +69,7 @@ class RailsPwnage::App::ClusterConfig
|
|
69
69
|
start_mongrels(app_name)
|
70
70
|
end
|
71
71
|
|
72
|
-
def
|
72
|
+
def manage(app_name, action)
|
73
73
|
case action
|
74
74
|
when :checkpoint
|
75
75
|
# nothing to do here
|
@@ -96,8 +96,8 @@ class RailsPwnage::App::ClusterConfig
|
|
96
96
|
self.new.update(app_name, &update_proc)
|
97
97
|
end
|
98
98
|
|
99
|
-
def self.
|
100
|
-
self.new.
|
99
|
+
def self.manage(app_name, action)
|
100
|
+
self.new.manage(app_name, action)
|
101
101
|
end
|
102
102
|
|
103
103
|
def self.control_all(action = :start)
|
data/lib/pwnage/app/database.rb
CHANGED
@@ -11,7 +11,7 @@ class RailsPwnage::App::Database
|
|
11
11
|
db_user = RailsPwnage::Config.app_db_user(app_name)
|
12
12
|
db_pass = RailsPwnage::Config.app_db_password(app_name)
|
13
13
|
|
14
|
-
|
14
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
15
15
|
# put together the admin script
|
16
16
|
case action
|
17
17
|
when :create
|
@@ -53,7 +53,7 @@ ENDSQL
|
|
53
53
|
|
54
54
|
# migrates the database to the latest schema version
|
55
55
|
def migrate_database(app_name)
|
56
|
-
|
56
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
57
57
|
# now migrate the database
|
58
58
|
system "rake db:migrate RAILS_ENV=production"
|
59
59
|
end
|
@@ -71,7 +71,7 @@ ENDSQL
|
|
71
71
|
|
72
72
|
timestamp = Time.now.strftime '%Y%m%d%H%M%S'
|
73
73
|
dump_file = "db/#{app_name}_#{timestamp}.sql"
|
74
|
-
|
74
|
+
Dir.chdir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
75
75
|
system "mysqldump --add-drop-database --add-drop-table --extended-insert --single-transaction -u#{db_user} -p#{db_pass} #{db_name} > #{dump_file}"
|
76
76
|
# lockdown the file
|
77
77
|
File.chmod(0400, dump_file)
|
@@ -85,7 +85,7 @@ ENDSQL
|
|
85
85
|
db_user = RailsPwnage::Config.app_db_user(app_name)
|
86
86
|
db_pass = RailsPwnage::Config.app_db_password(app_name)
|
87
87
|
|
88
|
-
|
88
|
+
Dir.chdir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
89
89
|
# find the latest dump and load it in
|
90
90
|
dump_file = Dir.glob("db/#{app_name}_*").max
|
91
91
|
system "mysql -u#{db_user} -p#{db_pass} #{db_name} < #{dump_file}"
|
@@ -93,18 +93,20 @@ ENDSQL
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def setup(app_name)
|
96
|
+
control_boot_script('mysql', :start)
|
96
97
|
admin_database app_name, :create
|
97
98
|
configure_rails app_name
|
98
99
|
migrate_database app_name
|
99
100
|
end
|
100
101
|
|
101
102
|
def update(app_name)
|
103
|
+
control_boot_script('mysql', :start)
|
102
104
|
configure_rails app_name
|
103
105
|
migrate_database app_name
|
104
106
|
end
|
105
107
|
|
106
108
|
# backs up or restores the database
|
107
|
-
def
|
109
|
+
def manage(app_name, action)
|
108
110
|
|
109
111
|
case action
|
110
112
|
when :checkpoint
|
@@ -135,8 +137,8 @@ ENDSQL
|
|
135
137
|
self.new.update(app_name)
|
136
138
|
end
|
137
139
|
|
138
|
-
def self.
|
139
|
-
self.new.
|
140
|
+
def self.manage(app_name, action)
|
141
|
+
self.new.manage(app_name, action)
|
140
142
|
end
|
141
143
|
|
142
144
|
def self.control_all(action = :start)
|
data/lib/pwnage/app/main.rb
CHANGED
@@ -9,28 +9,30 @@ module RailsPwnage::App
|
|
9
9
|
|
10
10
|
# update an application (restart servers if necessary)
|
11
11
|
def self.update(app_name)
|
12
|
-
ClusterConfig.update
|
13
|
-
Svn.update
|
14
|
-
Database.update
|
12
|
+
ClusterConfig.update app_name do
|
13
|
+
Svn.update app_name
|
14
|
+
Database.update app_name
|
15
15
|
end
|
16
|
-
NginxConfig.update
|
16
|
+
NginxConfig.update app_name
|
17
17
|
end
|
18
18
|
|
19
|
-
# performs
|
20
|
-
def self.
|
19
|
+
# performs application management (checkpoint / rollback / console)
|
20
|
+
def self.manage(app_name, action = :checkpoint)
|
21
21
|
case action
|
22
22
|
when :checkpoint
|
23
|
-
ClusterConfig.
|
24
|
-
Svn.
|
25
|
-
ClusterConfig.update
|
26
|
-
Database.
|
23
|
+
ClusterConfig.manage app_name, action
|
24
|
+
Svn.manage app_name, action
|
25
|
+
ClusterConfig.update app_name do
|
26
|
+
Database.manage app_name, action
|
27
27
|
end
|
28
28
|
when :rollback
|
29
|
-
ClusterConfig.update
|
30
|
-
Svn.
|
31
|
-
Database.
|
32
|
-
ClusterConfig.
|
29
|
+
ClusterConfig.update app_name do
|
30
|
+
Svn.manage app_name, action
|
31
|
+
Database.manage app_name, action
|
32
|
+
ClusterConfig.manage app_name, action
|
33
33
|
end
|
34
|
+
when :console
|
35
|
+
Svn.manage app_name, action
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
@@ -8,7 +8,7 @@ class RailsPwnage::App::NginxConfig
|
|
8
8
|
first_port = RailsPwnage::Config.app_port0(app_name)
|
9
9
|
hostname_filter = RailsPwnage::Config.app_servername(app_name)
|
10
10
|
|
11
|
-
File.open(RailsPwnage::Config.path_to(:nginx_configs)
|
11
|
+
File.open(File.join(RailsPwnage::Config.path_to(:nginx_configs), app_name), 'w') do |f|
|
12
12
|
# link to the mongrels
|
13
13
|
f << " upstream #{app_name} {\n"
|
14
14
|
RailsPwnage::Config.app_instances(app_name).times do |instance|
|
data/lib/pwnage/app/svn.rb
CHANGED
@@ -9,7 +9,7 @@ class RailsPwnage::App::Svn
|
|
9
9
|
app_name = File.basename(svn_path)
|
10
10
|
|
11
11
|
prod_apps = RailsPwnage::Config.path_to :prod_apps
|
12
|
-
|
12
|
+
Dir.chdir(prod_apps) do
|
13
13
|
# checkout application
|
14
14
|
system "svn co #{svn_path} #{app_name}"
|
15
15
|
end
|
@@ -18,7 +18,7 @@ class RailsPwnage::App::Svn
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def svn_update(app_name)
|
21
|
-
|
21
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
22
22
|
system "svn update"
|
23
23
|
end
|
24
24
|
end
|
@@ -32,7 +32,7 @@ class RailsPwnage::App::Svn
|
|
32
32
|
FileUtils.mkpath backup_dir unless File.exists? backup_dir
|
33
33
|
File.chown(pwnerer_uid, pwnerer_gid, backup_dir)
|
34
34
|
|
35
|
-
|
35
|
+
Dir.chdir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
36
36
|
['db', 'files', 'tmp'].each do |subdir|
|
37
37
|
Dir.mkdir subdir unless File.exists? subdir
|
38
38
|
File.chown pwnerer_uid, pwnerer_gid, subdir
|
@@ -49,7 +49,7 @@ class RailsPwnage::App::Svn
|
|
49
49
|
timestamp = Time.now.strftime '%Y%m%d%H%M%S'
|
50
50
|
dump_file = "files/#{app_name}_#{timestamp}.tar.gz"
|
51
51
|
|
52
|
-
|
52
|
+
Dir.chdir(RailsPwnage::Config.path_to(:backup, app_name)) do
|
53
53
|
# create a cold copy of the application files
|
54
54
|
cold_copy = "tmp#{File::SEPARATOR}#{app_name}"
|
55
55
|
FileUtils.rm_r cold_copy if File.exists? cold_copy
|
@@ -65,7 +65,7 @@ class RailsPwnage::App::Svn
|
|
65
65
|
end
|
66
66
|
|
67
67
|
# pack and protect the cold copy
|
68
|
-
|
68
|
+
Dir.chdir 'tmp' do
|
69
69
|
system "tar -czf ../#{dump_file} #{app_name}"
|
70
70
|
end
|
71
71
|
File.chmod(400, dump_file)
|
@@ -79,7 +79,7 @@ class RailsPwnage::App::Svn
|
|
79
79
|
# loads the latest file dump from the backup area
|
80
80
|
def load_files(app_name)
|
81
81
|
dump_file = Dir.glob(RailsPwnage::Config.path_to(:backup, app_name) + File::SEPARATOR + "files/#{app_name}_*").max
|
82
|
-
|
82
|
+
Dir.chdir(RailsPwnage::Config.path_to(:prod_apps)) do
|
83
83
|
# find the latest dump and load it in
|
84
84
|
system "tar -xzf #{dump_file}"
|
85
85
|
end
|
@@ -90,13 +90,17 @@ class RailsPwnage::App::Svn
|
|
90
90
|
FileUtils.rm_r RailsPwnage::Config.path_to(app_name) if File.exists? RailsPwnage::Config.path_to(app_name)
|
91
91
|
end
|
92
92
|
|
93
|
-
def
|
93
|
+
def manage(app_name, action)
|
94
94
|
case action
|
95
95
|
when :checkpoint
|
96
96
|
dump_files app_name
|
97
97
|
when :rollback
|
98
98
|
drop_files app_name
|
99
99
|
load_files app_name
|
100
|
+
when :console
|
101
|
+
Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
|
102
|
+
Kernel.system 'ruby script/console production'
|
103
|
+
end
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
@@ -126,8 +130,8 @@ class RailsPwnage::App::Svn
|
|
126
130
|
self.new.update(app_name)
|
127
131
|
end
|
128
132
|
|
129
|
-
def self.
|
130
|
-
self.new.
|
133
|
+
def self.manage(app_name, action)
|
134
|
+
self.new.manage(app_name, action)
|
131
135
|
end
|
132
136
|
|
133
137
|
# TODO: uninstallation
|
data/lib/pwnage/base/dirs.rb
CHANGED
@@ -2,19 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'etc'
|
4
4
|
|
5
|
-
module RailsPwnage::Base
|
6
|
-
# runs the associated block within a certain directory
|
7
|
-
def with_dir(dir)
|
8
|
-
old_dir = Dir.pwd()
|
9
|
-
Dir.chdir(dir)
|
10
|
-
|
11
|
-
begin
|
12
|
-
yield
|
13
|
-
ensure
|
14
|
-
Dir.chdir(old_dir)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
5
|
+
module RailsPwnage::Base
|
18
6
|
# gets the UID associated with the username
|
19
7
|
def uid_for_username(name)
|
20
8
|
passwd_entry = Etc.getpwnam(name)
|
data/lib/pwnage/base/startup.rb
CHANGED
@@ -4,19 +4,29 @@ require 'fileutils'
|
|
4
4
|
|
5
5
|
module RailsPwnage::Base
|
6
6
|
# TODO: make this work w/o initd (OSX, Windows)
|
7
|
+
|
8
|
+
# returns the filesystem path to a boot script
|
9
|
+
def path_to_boot_script(script_name)
|
10
|
+
File.join '', 'etc', 'init.d', script_name
|
11
|
+
end
|
12
|
+
|
13
|
+
# returns the filesystem path to the defaults used by a boot script (or nil if unsupported)
|
14
|
+
def path_to_boot_script_defaults(script_name)
|
15
|
+
File.join '', 'etc', 'default', script_name
|
16
|
+
end
|
7
17
|
|
8
18
|
# hooks a script into the boot sequence
|
9
19
|
def hook_boot_script(script_location)
|
10
20
|
# copy the script to /etc/init.d and chmod +x
|
11
|
-
script_name = File.basename
|
12
|
-
target_script =
|
13
|
-
FileUtils.cp
|
14
|
-
File.chmod
|
21
|
+
script_name = File.basename script_location
|
22
|
+
target_script = path_to_boot_script script_name
|
23
|
+
FileUtils.cp script_location, target_script
|
24
|
+
File.chmod 0755, target_script
|
15
25
|
|
16
26
|
# add to boot sequence
|
17
27
|
system "update-rc.d #{script_name} defaults"
|
18
28
|
end
|
19
|
-
|
29
|
+
|
20
30
|
def control_boot_script(script_name, action = :restart)
|
21
31
|
path_to_script = "/etc/init.d/#{script_name}"
|
22
32
|
case action
|
data/lib/pwnage/config/main.rb
CHANGED
@@ -19,6 +19,8 @@ module RailsPwnage::Config
|
|
19
19
|
when :nginx_configs
|
20
20
|
# the directory containing the nginx config files
|
21
21
|
'/etc/nginx/sites-enabled'
|
22
|
+
when :ddclient_config
|
23
|
+
'/etc/ddclient.conf'
|
22
24
|
when :backup
|
23
25
|
# the backup directory for an application
|
24
26
|
'/prod/backups/' + app_name
|
data/lib/pwnage/executor.rb
CHANGED
@@ -14,10 +14,19 @@ class RailsPwnage::Executor
|
|
14
14
|
Packages.go
|
15
15
|
when 'mongrels'
|
16
16
|
HookMongrels.go
|
17
|
+
when 'mysql'
|
18
|
+
MysqlConfig.go
|
19
|
+
when 'ddns'
|
20
|
+
if args.length < 5
|
21
|
+
print 'Usage: rpwn scaffold ddns host_name user_name user_password'
|
22
|
+
else
|
23
|
+
HookDyndns.go args[2], args[3], args[4]
|
24
|
+
end
|
17
25
|
else
|
18
26
|
Packages.go
|
19
27
|
Gems.go
|
20
28
|
Dirs.go
|
29
|
+
MysqlConfig.go
|
21
30
|
HookMongrels.go
|
22
31
|
end
|
23
32
|
|
@@ -40,10 +49,12 @@ class RailsPwnage::Executor
|
|
40
49
|
end
|
41
50
|
|
42
51
|
when 'backup', 'checkpoint', 'save'
|
43
|
-
RailsPwnage::App.
|
52
|
+
RailsPwnage::App.manage args[1], :checkpoint
|
44
53
|
when 'restore', 'reload', 'recover', 'rollback'
|
45
|
-
RailsPwnage::App.
|
46
|
-
|
54
|
+
RailsPwnage::App.manage args[1], :rollback
|
55
|
+
when 'console'
|
56
|
+
RailsPwnage::App.manage args[1], :console
|
57
|
+
|
47
58
|
else
|
48
59
|
print "Unrecognized command #{args[0]}\n"
|
49
60
|
end
|
@@ -8,7 +8,7 @@ class RailsPwnage::Scaffolds::Dirs
|
|
8
8
|
# runner
|
9
9
|
def run
|
10
10
|
pwnerer_uid = uid_for_username(RailsPwnage::Config.pwnerer_user)
|
11
|
-
|
11
|
+
Dir.chdir('/') do
|
12
12
|
[:prod_apps, :prod_config, :prod_backups].map { |k| RailsPwnage::Config.path_to k }.each do |path|
|
13
13
|
FileUtils.mkpath path
|
14
14
|
File.chown(pwnerer_uid, nil, path)
|
@@ -14,7 +14,7 @@ class RailsPwnage::Scaffolds::Gems
|
|
14
14
|
|
15
15
|
def install_tools
|
16
16
|
# TODO: an application should have its own tools
|
17
|
-
install_gems %w(
|
17
|
+
install_gems %w(mechanize sys-proctable rmagick pdf-writer highline echoe)
|
18
18
|
end
|
19
19
|
|
20
20
|
# runner
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# hooks up the dynamic dns service
|
2
|
+
|
3
|
+
class RailsPwnage::Scaffolds::HookDyndns
|
4
|
+
include RailsPwnage::Base
|
5
|
+
|
6
|
+
# patches the ddclient boot script and configuration to enable the daemon
|
7
|
+
def enable_daemon
|
8
|
+
boot_script = File.open(path_to_boot_script('ddclient'), 'r') { |f| f.read }
|
9
|
+
boot_script.gsub!(/run_daemon\=false/, 'run_daemon=true')
|
10
|
+
File.open(path_to_boot_script('ddclient'), 'w') { |f| f.write boot_script }
|
11
|
+
|
12
|
+
dd_defaults = File.open(path_to_boot_script_defaults('ddclient'), 'r') { |f| f.read }
|
13
|
+
dd_defaults.gsub!(/run_daemon\=\"false\"/, 'run_daemon="true"')
|
14
|
+
File.open(path_to_boot_script_defaults('ddclient'), 'w') { |f| f.write dd_defaults }
|
15
|
+
end
|
16
|
+
|
17
|
+
# configures ddclient
|
18
|
+
def configure(ddns_hostname, ddns_username, ddns_password)
|
19
|
+
File.open(RailsPwnage::Config.path_to(:ddclient_config), 'w') do |f|
|
20
|
+
f << <<END_CONFIG
|
21
|
+
pid=/var/run/ddclient.pid
|
22
|
+
use=web, web=checkip.dyndns.com/, web-skip='IP Address'
|
23
|
+
|
24
|
+
protocol=dyndns2
|
25
|
+
server=members.dyndns.org
|
26
|
+
|
27
|
+
login=#{ddns_username}
|
28
|
+
password='#{ddns_password}'
|
29
|
+
#{ddns_hostname}
|
30
|
+
END_CONFIG
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# runner
|
35
|
+
def run(ddns_hostname, ddns_username, ddns_password)
|
36
|
+
control_boot_script 'ddclient', :stop
|
37
|
+
configure ddns_hostname, ddns_username, ddns_password
|
38
|
+
enable_daemon
|
39
|
+
control_boot_script 'ddclient', :start
|
40
|
+
end
|
41
|
+
|
42
|
+
# standalone runner
|
43
|
+
def self.go(ddns_hostname, ddns_username, ddns_password)
|
44
|
+
self.new.run ddns_hostname, ddns_username, ddns_password
|
45
|
+
end
|
46
|
+
end
|
@@ -21,7 +21,8 @@ class RailsPwnage::Scaffolds::HookMongrels
|
|
21
21
|
|
22
22
|
# build the configuration
|
23
23
|
def make_config
|
24
|
-
|
24
|
+
config_dir = RailsPwnage::Config.path_to(:mongrel_configs)
|
25
|
+
Dir.mkdir config_dir unless File.exists? config_dir
|
25
26
|
end
|
26
27
|
|
27
28
|
# runner
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# installs the required OS (read: Ubuntu) packages
|
2
|
+
|
3
|
+
class RailsPwnage::Scaffolds::MysqlConfig
|
4
|
+
include RailsPwnage::Base
|
5
|
+
|
6
|
+
# runner
|
7
|
+
def run
|
8
|
+
Kernel.system 'ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock'
|
9
|
+
end
|
10
|
+
|
11
|
+
# standalone runner
|
12
|
+
def self.go
|
13
|
+
self.new.run
|
14
|
+
end
|
15
|
+
end
|
@@ -1,20 +1,29 @@
|
|
1
|
-
# installs the required OS packages
|
1
|
+
# installs the required OS (read: Ubuntu) packages
|
2
2
|
|
3
3
|
class RailsPwnage::Scaffolds::Packages
|
4
4
|
include RailsPwnage::Base
|
5
5
|
|
6
|
+
# the packages needed to manage the server remotely and instal applications
|
7
|
+
def install_management
|
8
|
+
install_packages %w(openssh-server subversion ddclient)
|
9
|
+
end
|
10
|
+
|
11
|
+
# packages that are needed by popular gems
|
6
12
|
def install_tools
|
7
|
-
install_packages %w(
|
13
|
+
install_packages %w(libmagick9-dev)
|
8
14
|
end
|
9
15
|
|
16
|
+
# the packages comprising ruby
|
10
17
|
def install_ruby
|
11
|
-
install_packages %w(build-essential ruby rubygems irb)
|
18
|
+
install_packages %w(build-essential ruby rubygems ruby1.8-dev irb)
|
12
19
|
end
|
13
20
|
|
21
|
+
# the packages for a mysql server and development libraries
|
14
22
|
def install_mysql
|
15
23
|
install_packages %w(mysql-client mysql-server libmysqlclient15-dev)
|
16
24
|
end
|
17
25
|
|
26
|
+
# the packager for _the_ load balancer (nginx, from Russia with <3)
|
18
27
|
def install_balancer
|
19
28
|
install_packages %w(nginx)
|
20
29
|
end
|
@@ -22,6 +31,7 @@ class RailsPwnage::Scaffolds::Packages
|
|
22
31
|
# runner
|
23
32
|
def run
|
24
33
|
update_packages
|
34
|
+
install_management
|
25
35
|
install_tools
|
26
36
|
install_ruby
|
27
37
|
install_mysql
|
data/lib/rails_pwnage.rb
CHANGED
@@ -17,6 +17,8 @@ require 'pwnage/executor.rb'
|
|
17
17
|
require 'pwnage/scaffolds/dirs.rb'
|
18
18
|
require 'pwnage/scaffolds/gems.rb'
|
19
19
|
require 'pwnage/scaffolds/hook_mongrels.rb'
|
20
|
+
require 'pwnage/scaffolds/hook_dyndns.rb'
|
21
|
+
require 'pwnage/scaffolds/mysql_config.rb'
|
20
22
|
require 'pwnage/scaffolds/packages.rb'
|
21
23
|
|
22
24
|
require 'pwnage/app/main.rb'
|
data/rails_pwnerer.gemspec
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Rails_pwnerer-0.4.
|
2
|
+
# Gem::Specification for Rails_pwnerer-0.4.7
|
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.4.
|
7
|
+
s.version = "0.4.7"
|
8
8
|
|
9
9
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.authors = ["Victor Costan"]
|
13
|
-
s.date = %q{2008-04-
|
13
|
+
s.date = %q{2008-04-25}
|
14
14
|
s.default_executable = %q{rpwn}
|
15
15
|
s.description = %q{Rails deployment tool/hack.}
|
16
16
|
s.email = %q{victor@costan.us}
|
17
17
|
s.executables = ["rpwn"]
|
18
|
-
s.extra_rdoc_files = ["bin/rpwn", "CHANGELOG", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/main.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_mongrels.rb", "lib/pwnage/scaffolds/packages.rb", "lib/rails_pwnage.rb", "LICENSE", "README"]
|
19
|
-
s.files = ["bin/rpwn", "CHANGELOG", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/main.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_mongrels.rb", "lib/pwnage/scaffolds/packages.rb", "lib/rails_pwnage.rb", "LICENSE", "Manifest", "README", "RUBYFORGE", "rails_pwnerer.gemspec"]
|
18
|
+
s.extra_rdoc_files = ["bin/rpwn", "CHANGELOG", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/main.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_dyndns.rb", "lib/pwnage/scaffolds/hook_mongrels.rb", "lib/pwnage/scaffolds/mysql_config.rb", "lib/pwnage/scaffolds/packages.rb", "lib/rails_pwnage.rb", "LICENSE", "README"]
|
19
|
+
s.files = ["bin/rpwn", "CHANGELOG", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/main.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_dyndns.rb", "lib/pwnage/scaffolds/hook_mongrels.rb", "lib/pwnage/scaffolds/mysql_config.rb", "lib/pwnage/scaffolds/packages.rb", "lib/rails_pwnage.rb", "LICENSE", "Manifest", "README", "RUBYFORGE", "rails_pwnerer.gemspec"]
|
20
20
|
s.has_rdoc = true
|
21
21
|
s.homepage = %q{http://www.costan.us/rails_pwnage}
|
22
22
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rails_pwnerer", "--main", "README"]
|
23
23
|
s.require_paths = ["lib"]
|
24
24
|
s.rubyforge_project = %q{rails-pwnage}
|
25
|
-
s.rubygems_version = %q{1.1.
|
25
|
+
s.rubygems_version = %q{1.1.1}
|
26
26
|
s.summary = %q{Rails deployment tool/hack.}
|
27
27
|
end
|
28
28
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_pwnerer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Costan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-04-
|
12
|
+
date: 2008-04-25 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -36,7 +36,9 @@ extra_rdoc_files:
|
|
36
36
|
- lib/pwnage/executor.rb
|
37
37
|
- lib/pwnage/scaffolds/dirs.rb
|
38
38
|
- lib/pwnage/scaffolds/gems.rb
|
39
|
+
- lib/pwnage/scaffolds/hook_dyndns.rb
|
39
40
|
- lib/pwnage/scaffolds/hook_mongrels.rb
|
41
|
+
- lib/pwnage/scaffolds/mysql_config.rb
|
40
42
|
- lib/pwnage/scaffolds/packages.rb
|
41
43
|
- lib/rails_pwnage.rb
|
42
44
|
- LICENSE
|
@@ -58,7 +60,9 @@ files:
|
|
58
60
|
- lib/pwnage/executor.rb
|
59
61
|
- lib/pwnage/scaffolds/dirs.rb
|
60
62
|
- lib/pwnage/scaffolds/gems.rb
|
63
|
+
- lib/pwnage/scaffolds/hook_dyndns.rb
|
61
64
|
- lib/pwnage/scaffolds/hook_mongrels.rb
|
65
|
+
- lib/pwnage/scaffolds/mysql_config.rb
|
62
66
|
- lib/pwnage/scaffolds/packages.rb
|
63
67
|
- lib/rails_pwnage.rb
|
64
68
|
- LICENSE
|
@@ -93,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
97
|
requirements: []
|
94
98
|
|
95
99
|
rubyforge_project: rails-pwnage
|
96
|
-
rubygems_version: 1.1.
|
100
|
+
rubygems_version: 1.1.1
|
97
101
|
signing_key:
|
98
102
|
specification_version: 2
|
99
103
|
summary: Rails deployment tool/hack.
|