rails_pwnerer 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/Manifest +6 -0
- data/README +24 -7
- data/lib/pwnage/app/cluster_config.rb +45 -0
- data/lib/pwnage/app/database.rb +50 -0
- data/lib/pwnage/app/main.rb +9 -0
- data/lib/pwnage/app/nginx_config.rb +63 -0
- data/lib/pwnage/app/svn.rb +33 -0
- data/lib/pwnage/base/dirs.rb +19 -5
- data/lib/pwnage/base/startup.rb +12 -0
- data/lib/pwnage/config/main.rb +68 -0
- data/lib/pwnage/executor.rb +4 -0
- data/lib/pwnage/scaffolds/dirs.rb +7 -5
- data/lib/pwnage/scaffolds/hook_mongrels.rb +1 -1
- data/lib/rails_pwnage.rb +8 -0
- data/rails_pwnerer.gemspec +4 -4
- metadata +13 -1
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
bin/rpwn
|
2
2
|
CHANGELOG
|
3
|
+
lib/pwnage/app/cluster_config.rb
|
4
|
+
lib/pwnage/app/database.rb
|
5
|
+
lib/pwnage/app/main.rb
|
6
|
+
lib/pwnage/app/nginx_config.rb
|
7
|
+
lib/pwnage/app/svn.rb
|
3
8
|
lib/pwnage/base/dirs.rb
|
4
9
|
lib/pwnage/base/gems.rb
|
5
10
|
lib/pwnage/base/packages.rb
|
6
11
|
lib/pwnage/base/startup.rb
|
7
12
|
lib/pwnage/base.rb
|
13
|
+
lib/pwnage/config/main.rb
|
8
14
|
lib/pwnage/executor.rb
|
9
15
|
lib/pwnage/scaffolds/dirs.rb
|
10
16
|
lib/pwnage/scaffolds/gems.rb
|
data/README
CHANGED
@@ -1,9 +1,26 @@
|
|
1
|
-
|
2
|
-
ruby driver is the very powerful DSL (domain-specific language) that TEM procedures are compiled from.
|
1
|
+
I want this gem to be Pure Pwnage with Rails.
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
I built +rails_pwnerer+ because I hate the messy process of putting a rails
|
4
|
+
application into production. I don't enjoy following 10-page guides, so I'd
|
5
|
+
much rather having ruby do that for me.
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
Right now, +rails_pwnerer+ assumes a fresh Ubuntu 7.10 installation. You're
|
8
|
+
welcome to test/update for other systems, and I'll be happy to merge patches,
|
9
|
+
or add you to the RubyForge project.
|
10
|
+
|
11
|
+
|
12
|
+
Quick start with +rails_pwnerer+:
|
13
|
+
|
14
|
+
1) Install rubygems:
|
15
|
+
sudo apt-get install rubygems
|
16
|
+
|
17
|
+
2) Install +rails_pwnerer+:
|
18
|
+
sudo gem install rails_pwnerer
|
19
|
+
|
20
|
+
3) Get your server production-ready:
|
21
|
+
sudo rpwn den00b
|
22
|
+
|
23
|
+
4) Install your application:
|
24
|
+
sudo rpwn install svn+ssh://your.repo/path/to/your_application
|
25
|
+
|
26
|
+
That's it. Reboot, and you're ready.
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# builds the mongrel cluster configuration
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class RailsPwnage::App::ClusterConfig
|
6
|
+
include RailsPwnage::Base
|
7
|
+
|
8
|
+
def fix_permissions(app_name)
|
9
|
+
pwnerer_user = RailsPwnage::Config.pwnerer_user
|
10
|
+
pwnerer_uid = uid_for_username(pwnerer_user)
|
11
|
+
pwnerer_group = group_for_username(pwnerer_user)
|
12
|
+
|
13
|
+
with_dir(RailsPwnage::Config.path_to(app_name)) do
|
14
|
+
%w(log tmp public).each do |writable_dir|
|
15
|
+
FileUtils.chown_R(pwnerer_uid, pwnerer_group, writable_dir)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def configure_mongrels(app_name)
|
21
|
+
app_path = RailsPwnage::Config.path_to app_name
|
22
|
+
pwnerer_user = RailsPwnage::Config.pwnerer_user
|
23
|
+
pwnerer_group = group_for_username(pwnerer_user)
|
24
|
+
|
25
|
+
instances = RailsPwnage::Config.app_instances(app_name)
|
26
|
+
first_port = RailsPwnage::Config.app_port0(app_name)
|
27
|
+
|
28
|
+
with_dir(app_path) do
|
29
|
+
# create the mongrel_cluster configuration
|
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
|
+
|
32
|
+
# copy the configuration to the launch directory
|
33
|
+
FileUtils.cp('config/mongrel_cluster.yml', "#{RailsPwnage::Config.path_to :mongrel_configs}#{File::SEPARATOR}#{app_name}.yml")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def setup(app_name)
|
38
|
+
configure_mongrels app_name
|
39
|
+
fix_permissions app_name
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.setup(app_name)
|
43
|
+
self.new.setup(app_name)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# sets up the application database
|
2
|
+
|
3
|
+
class RailsPwnage::App::Database
|
4
|
+
include RailsPwnage::Base
|
5
|
+
|
6
|
+
# creates the mysql database for the application
|
7
|
+
def create_databse(app_name)
|
8
|
+
db_name = RailsPwnage::Config.app_dbname(app_name)
|
9
|
+
db_user = RailsPwnage::Config.app_db_user(app_name)
|
10
|
+
db_pass = RailsPwnage::Config.app_db_password(app_name)
|
11
|
+
|
12
|
+
with_dir(RailsPwnage::Config.path_to(app_name)) do
|
13
|
+
# put together the creation script
|
14
|
+
sql_commands = <<ENDSQL
|
15
|
+
CREATE DATABASE #{db_name};
|
16
|
+
GRANT ALL ON #{db_name}.* TO '#{db_user}'@'localhost' IDENTIFIED BY '#{db_pass}' WITH GRANT OPTION;
|
17
|
+
ENDSQL
|
18
|
+
|
19
|
+
# run it
|
20
|
+
File.open('tmp/create_db.sql', 'w') { |f| f.write sql_commands }
|
21
|
+
system "mysql -uroot < tmp/create_db.sql"
|
22
|
+
|
23
|
+
# cleanup
|
24
|
+
File.delete('tmp/create_db.sql')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# configures rails to use the database in the production environment
|
29
|
+
def configure_rails(app_name)
|
30
|
+
# TODO: write rails configuration file
|
31
|
+
end
|
32
|
+
|
33
|
+
# migrates the database so it's ready
|
34
|
+
def migrate_database(app_name)
|
35
|
+
with_dir(RailsPwnage::Config.path_to(app_name)) do
|
36
|
+
# now migrate the database
|
37
|
+
system "rake db:migrate RAILS_ENV=production"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def setup(app_name)
|
42
|
+
create_databse app_name
|
43
|
+
configure_rails app_name
|
44
|
+
migrate_database app_name
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.setup(app_name)
|
48
|
+
self.new.setup(app_name)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# builds the nginx configuration
|
2
|
+
|
3
|
+
class RailsPwnage::App::NginxConfig
|
4
|
+
include RailsPwnage::Base
|
5
|
+
|
6
|
+
# writes the nginx configuration for this server
|
7
|
+
def config_nginx(app_name)
|
8
|
+
first_port = RailsPwnage::Config.app_port0(app_name)
|
9
|
+
hostname_filter = RailsPwnage::Config.app_servername(app_name)
|
10
|
+
|
11
|
+
File.open(RailsPwnage::Config.path_to(:nginx_configs) + File::SEPARATOR + app_name, 'w') do |f|
|
12
|
+
# link to the mongrels
|
13
|
+
f << " upstream #{app_name} {\n"
|
14
|
+
RailsPwnage::Config.app_instances(app_name).times do |instance|
|
15
|
+
f << " server 127.0.0.1:#{first_port + instance};\n"
|
16
|
+
end
|
17
|
+
f << " }\n\n"
|
18
|
+
|
19
|
+
# server configuration -- big and ugly
|
20
|
+
f << <<NGINX_CONFIG
|
21
|
+
server {
|
22
|
+
listen 80;
|
23
|
+
#{(hostname_filter.nil? ? '' : "server_name " + hostname_filter + ";")}
|
24
|
+
root #{RailsPwnage::Config.path_to(app_name)};
|
25
|
+
client_max_body_size #{RailsPwnage::Config.app_max_request_mb(app_name)}M;
|
26
|
+
location / {
|
27
|
+
proxy_set_header X-Real-IP $remote_addr;
|
28
|
+
proxy_set_header Host $host;
|
29
|
+
proxy_redirect false;
|
30
|
+
proxy_connect_timeout 2;
|
31
|
+
proxy_read_timeout 86400;
|
32
|
+
|
33
|
+
if (-f $request_filename/index.html) {
|
34
|
+
rewrite (.*) $1/index.html break;
|
35
|
+
}
|
36
|
+
if (-f $request_filename.html) {
|
37
|
+
rewrite (.*) $1.html break;
|
38
|
+
}
|
39
|
+
if (!-f $request_filename) {
|
40
|
+
proxy_pass http://#{app_name};
|
41
|
+
break;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
NGINX_CONFIG
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# removes the default configuration stub (so nginx doesn't stumble upon it)
|
50
|
+
def remove_nginx_stub
|
51
|
+
stub_file = RailsPwnage::Config.path_to(:nginx_configs) + File::SEPARATOR + 'default'
|
52
|
+
File.delete(stub_file) if File.exists?(stub_file)
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup(app_name)
|
56
|
+
config_nginx(app_name)
|
57
|
+
remove_nginx_stub
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.setup(app_name)
|
61
|
+
self.new.setup(app_name)
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# checks out the application
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class RailsPwnage::App::Svn
|
6
|
+
include RailsPwnage::Base
|
7
|
+
|
8
|
+
def checkout(svn_path)
|
9
|
+
app_name = File.basename(svn_path)
|
10
|
+
|
11
|
+
prod_apps = RailsPwnage::Config.path_to :prod_apps
|
12
|
+
with_dir(prod_apps) do
|
13
|
+
# checkout application
|
14
|
+
system "svn co #{svn_path} #{app_name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
return app_name
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup(svn_path)
|
21
|
+
app_name = checkout(svn_path)
|
22
|
+
|
23
|
+
# TODO: fetch configuration, feed to system
|
24
|
+
|
25
|
+
return app_name
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.setup(svn_path)
|
29
|
+
self.new.setup(svn_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
# TODO: uninstallation
|
33
|
+
end
|
data/lib/pwnage/base/dirs.rb
CHANGED
@@ -4,7 +4,7 @@ require 'etc'
|
|
4
4
|
|
5
5
|
module RailsPwnage::Base
|
6
6
|
# runs the associated block within a certain directory
|
7
|
-
def
|
7
|
+
def with_dir(dir)
|
8
8
|
old_dir = Dir.pwd()
|
9
9
|
Dir.chdir(dir)
|
10
10
|
|
@@ -16,8 +16,22 @@ module RailsPwnage::Base
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# gets the UID associated with the username
|
19
|
-
def
|
20
|
-
passwd_entry = getpwnam(name)
|
19
|
+
def uid_for_username(name)
|
20
|
+
passwd_entry = Etc.getpwnam(name)
|
21
21
|
return (passwd_entry.nil?) ? nil : passwd_entry.uid
|
22
|
-
end
|
23
|
-
|
22
|
+
end
|
23
|
+
|
24
|
+
# gets the GID associated with the username
|
25
|
+
def gid_for_username(name)
|
26
|
+
passwd_entry = Etc.getpwnam(name)
|
27
|
+
return (passwd_entry.nil?) ? nil : passwd_entry.gid
|
28
|
+
end
|
29
|
+
|
30
|
+
# gets the main group of the given user
|
31
|
+
def group_for_username(name)
|
32
|
+
gid = gid_for_username(name)
|
33
|
+
return nil if gid.nil?
|
34
|
+
group_entry = Etc.getgrgid(gid)
|
35
|
+
return (group_entry.nil?) ? nil : group_entry.name
|
36
|
+
end
|
37
|
+
end
|
data/lib/pwnage/base/startup.rb
CHANGED
@@ -16,4 +16,16 @@ module RailsPwnage::Base
|
|
16
16
|
# add to boot sequence
|
17
17
|
system "update-rc.d #{script_name} defaults"
|
18
18
|
end
|
19
|
+
|
20
|
+
def control_boot_script(script_name, action = :restart)
|
21
|
+
path_to_script = "/etc/init.d/#{script_name}"
|
22
|
+
case action
|
23
|
+
when :stop
|
24
|
+
system "#{path_to_script} stop"
|
25
|
+
when :start
|
26
|
+
system "#{path_to_script} start"
|
27
|
+
when :restart
|
28
|
+
system "#{path_to_script} restart"
|
29
|
+
end
|
30
|
+
end
|
19
31
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module RailsPwnage::Config
|
2
|
+
# the path to something important (e.g. :prod_apps --> path to all production applications)
|
3
|
+
def self.path_to(what = :prod)
|
4
|
+
case what
|
5
|
+
when :prod
|
6
|
+
# the directory containing all the production data
|
7
|
+
'/prod'
|
8
|
+
when :prod_apps
|
9
|
+
# the directory containing the production apps
|
10
|
+
'/prod/apps'
|
11
|
+
when :prod_config
|
12
|
+
# the directory containing the config files
|
13
|
+
'/prod/config'
|
14
|
+
when :mongrel_configs
|
15
|
+
# the directory containing the mongrel_cluster config files
|
16
|
+
'/etc/mongrel_cluster'
|
17
|
+
when :nginx_configs
|
18
|
+
# the directory containing the nginx config files
|
19
|
+
'/etc/nginx/sites-enabled'
|
20
|
+
when String
|
21
|
+
# an application
|
22
|
+
self.path_to(:prod_apps) + File::SEPARATOR + what
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# the user which will receive the keys to the production system
|
27
|
+
def self.pwnerer_user
|
28
|
+
'victor'
|
29
|
+
end
|
30
|
+
|
31
|
+
# the number of instances for the given application
|
32
|
+
def self.app_instances(app_name)
|
33
|
+
4
|
34
|
+
end
|
35
|
+
|
36
|
+
# the first internal port for the given application
|
37
|
+
def self.app_port0(app_name)
|
38
|
+
8000
|
39
|
+
end
|
40
|
+
|
41
|
+
# the name of the database for the given application
|
42
|
+
def self.app_dbname(app_name)
|
43
|
+
# NOTE: convention, this doesn't have to change
|
44
|
+
app_name + '_prod'
|
45
|
+
end
|
46
|
+
|
47
|
+
# the datbase user for the given application
|
48
|
+
def self.app_db_user(app_name)
|
49
|
+
# NOTE: convention, this doesn't have to change
|
50
|
+
app_name
|
51
|
+
end
|
52
|
+
|
53
|
+
# the password of the database user for the given application
|
54
|
+
def self.app_db_password(app_name)
|
55
|
+
'superpass'
|
56
|
+
end
|
57
|
+
|
58
|
+
# a DNS name for server-based filtering (multiple apps on the same box)
|
59
|
+
def self.app_servername(app_name)
|
60
|
+
# "#{app_name}.zergling.net"
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
|
64
|
+
# the maximum request size (megabytes) to be accepted by an application
|
65
|
+
def self.app_max_request_mb(app_name)
|
66
|
+
48
|
67
|
+
end
|
68
|
+
end
|
data/lib/pwnage/executor.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
# sets up the required directory structure
|
2
2
|
|
3
|
+
require 'fileutils'
|
4
|
+
|
3
5
|
class RailsPwnage::Scaffolds::Dirs
|
4
6
|
include RailsPwnage::Base
|
5
7
|
|
6
8
|
# runner
|
7
9
|
def run
|
10
|
+
pwnerer_uid = uid_for_username(RailsPwnage::Config.pwnerer_user)
|
8
11
|
with_dir('/') do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
File.chown(uid_for_username('victor'), nil, 'prod/config')
|
12
|
+
[:prod_apps, :prod_config].map { |k| RailsPwnage::Config.path_to k }.each do |path|
|
13
|
+
FileUtils.mkpath path
|
14
|
+
File.chown(pwnerer_uid, nil, path)
|
15
|
+
end
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
data/lib/rails_pwnage.rb
CHANGED
@@ -10,9 +10,17 @@ require 'pwnage/base/gems.rb'
|
|
10
10
|
require 'pwnage/base/packages.rb'
|
11
11
|
require 'pwnage/base/startup.rb'
|
12
12
|
|
13
|
+
require 'pwnage/config/main.rb'
|
14
|
+
|
13
15
|
require 'pwnage/executor.rb'
|
14
16
|
|
15
17
|
require 'pwnage/scaffolds/dirs.rb'
|
16
18
|
require 'pwnage/scaffolds/gems.rb'
|
17
19
|
require 'pwnage/scaffolds/hook_mongrels.rb'
|
18
20
|
require 'pwnage/scaffolds/packages.rb'
|
21
|
+
|
22
|
+
require 'pwnage/app/main.rb'
|
23
|
+
require 'pwnage/app/svn.rb'
|
24
|
+
require 'pwnage/app/database.rb'
|
25
|
+
require 'pwnage/app/cluster_config.rb'
|
26
|
+
require 'pwnage/app/nginx_config.rb'
|
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.2
|
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.2"
|
8
8
|
|
9
9
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
10
|
|
@@ -15,8 +15,8 @@ Gem::Specification.new do |s|
|
|
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/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.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/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.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_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"]
|
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"]
|
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
|
+
version: "0.2"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Costan
|
@@ -22,11 +22,17 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- bin/rpwn
|
24
24
|
- CHANGELOG
|
25
|
+
- lib/pwnage/app/cluster_config.rb
|
26
|
+
- lib/pwnage/app/database.rb
|
27
|
+
- lib/pwnage/app/main.rb
|
28
|
+
- lib/pwnage/app/nginx_config.rb
|
29
|
+
- lib/pwnage/app/svn.rb
|
25
30
|
- lib/pwnage/base/dirs.rb
|
26
31
|
- lib/pwnage/base/gems.rb
|
27
32
|
- lib/pwnage/base/packages.rb
|
28
33
|
- lib/pwnage/base/startup.rb
|
29
34
|
- lib/pwnage/base.rb
|
35
|
+
- lib/pwnage/config/main.rb
|
30
36
|
- lib/pwnage/executor.rb
|
31
37
|
- lib/pwnage/scaffolds/dirs.rb
|
32
38
|
- lib/pwnage/scaffolds/gems.rb
|
@@ -38,11 +44,17 @@ extra_rdoc_files:
|
|
38
44
|
files:
|
39
45
|
- bin/rpwn
|
40
46
|
- CHANGELOG
|
47
|
+
- lib/pwnage/app/cluster_config.rb
|
48
|
+
- lib/pwnage/app/database.rb
|
49
|
+
- lib/pwnage/app/main.rb
|
50
|
+
- lib/pwnage/app/nginx_config.rb
|
51
|
+
- lib/pwnage/app/svn.rb
|
41
52
|
- lib/pwnage/base/dirs.rb
|
42
53
|
- lib/pwnage/base/gems.rb
|
43
54
|
- lib/pwnage/base/packages.rb
|
44
55
|
- lib/pwnage/base/startup.rb
|
45
56
|
- lib/pwnage/base.rb
|
57
|
+
- lib/pwnage/config/main.rb
|
46
58
|
- lib/pwnage/executor.rb
|
47
59
|
- lib/pwnage/scaffolds/dirs.rb
|
48
60
|
- lib/pwnage/scaffolds/gems.rb
|