rails_pwnerer 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.5.2. Extracts per-app and per-instance configuration from the application dir.
2
+
1
3
  v0.5.1. Application instances with per-instance configuration.
2
4
 
3
5
  v0.5.0. Implemented configuration repository.
data/Manifest CHANGED
@@ -1,18 +1,28 @@
1
1
  bin/rpwn
2
+ bin/rpwndev
2
3
  CHANGELOG
3
4
  lib/pwnage/app/cluster_config.rb
5
+ lib/pwnage/app/config.rb
4
6
  lib/pwnage/app/database.rb
5
7
  lib/pwnage/app/gems.rb
6
8
  lib/pwnage/app/main.rb
7
9
  lib/pwnage/app/nginx_config.rb
8
10
  lib/pwnage/app/svn.rb
11
+ lib/pwnage/base/atomics.rb
9
12
  lib/pwnage/base/dirs.rb
10
13
  lib/pwnage/base/gems.rb
14
+ lib/pwnage/base/hostname.rb
11
15
  lib/pwnage/base/packages.rb
12
16
  lib/pwnage/base/startup.rb
13
17
  lib/pwnage/base.rb
18
+ lib/pwnage/config/app.rb
14
19
  lib/pwnage/config/main.rb
20
+ lib/pwnage/config/paths.rb
21
+ lib/pwnage/config/ports.rb
22
+ lib/pwnage/config/repository.rb
23
+ lib/pwnage/dev_executor.rb
15
24
  lib/pwnage/executor.rb
25
+ lib/pwnage/scaffolds/config.rb
16
26
  lib/pwnage/scaffolds/dirs.rb
17
27
  lib/pwnage/scaffolds/gems.rb
18
28
  lib/pwnage/scaffolds/hook_dyndns.rb
@@ -23,5 +33,6 @@ lib/pwnage/scaffolds/rubygems.rb
23
33
  lib/rails_pwnage.rb
24
34
  LICENSE
25
35
  Manifest
36
+ Rakefile
26
37
  README
27
38
  RUBYFORGE
data/bin/rpwn CHANGED
@@ -2,4 +2,4 @@
2
2
  require 'rubygems'
3
3
  require 'rails_pwnage'
4
4
 
5
- RailsPwnage::Executor.go ARGV
5
+ RailsPwnage::Executor.new.run ARGV
data/bin/rpwndev ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'rails_pwnage'
4
+
5
+ RailsPwnage::DevExecutor.new.run ARGV
@@ -75,6 +75,12 @@ class RailsPwnage::App::ClusterConfig
75
75
  # silently die if the app was completely busted
76
76
  return unless app_config and File.exists? app_config[:app_path]
77
77
 
78
+ # alloc a port if somehow that slipped through the cracks
79
+ if app_config[:port0] == 0
80
+ manage_ports app_name, instance_name, :alloc
81
+ configure_mongrels app_name, instance_name
82
+ end
83
+
78
84
  Dir.chdir app_config[:app_path] do
79
85
  system 'mongrel_rails cluster::start'
80
86
  end
@@ -0,0 +1,64 @@
1
+ # syncs the app's internal configuration with the configuration database
2
+ require 'yaml'
3
+
4
+ class RailsPwnage::App::Config
5
+ include RailsPwnage::Base
6
+
7
+ # allocates room for the application and creates the application configuration database
8
+ def alloc(app_name, instance_name)
9
+ app_path = File.join(RailsPwnage::Config.path_to(:apps), app_name + '.' + instance_name)
10
+ FileUtils.mkpath app_path
11
+
12
+ app_db_name = RailsPwnage::Config.app_db_name(app_name, instance_name)
13
+ app_db = RailsPwnage::Config.create_db app_db_name
14
+
15
+ # default settings
16
+
17
+ app_db[:app_path] = app_path
18
+ app_db[:backup_path] = File.join(RailsPwnage::Config.path_to(:backups), app_name + '.' + instance_name)
19
+
20
+ # the user which will receive the "keys" to the production system
21
+ app_db[:pwnerer_user] = 'victor'
22
+ # the number of mongrel instances for the application instance
23
+ app_db[:mongrels] = 4
24
+ # the first internal port for the application instance
25
+ app_db[:port0] = 0 # will be overwritten during allocation
26
+ # the name of the database for the application instance
27
+ app_db[:db_name] = app_name + '_' + instance_name + '_prod'
28
+ # the datbase user for the given application
29
+ app_db[:db_user] = (app_name + '_' + instance_name)[0...16] # mySQL doesn't like long user names
30
+ # the password of the database user for the given application
31
+ app_db[:db_pass] = instance_name # TODO: use random number generator here instead
32
+ # a DNS name for server-based filtering (multiple apps on the same box)
33
+ app_db[:dns_name] = ''
34
+ # the maximum request size (megabytes) to be accepted by an application
35
+ app_db[:max_request_mb] = 48
36
+
37
+ RailsPwnage::Config.flush_db app_db
38
+ return app_path
39
+ end
40
+
41
+ # pushes config changes from the application file to the database
42
+ def update(app_name, instance_name)
43
+ app_config = RailsPwnage::Config[app_name, instance_name]
44
+ Dir.chdir app_config[:app_path] do
45
+ ["config/rails_pwnerer/.yml", "config/rails_pwnerer/#{instance_name}.yml"].each do |fname|
46
+ next unless File.exists? fname
47
+ config_update = File.open(fname, 'r') { |f| YAML.load f }
48
+ config_update.each do |key, value|
49
+ app_config[key] = value
50
+ end
51
+ end
52
+ end
53
+ RailsPwnage::Config.flush_db RailsPwnage::Config.app_db_name(app_name, instance_name)
54
+ end
55
+
56
+ def setup(app_name, instance_name)
57
+ update app_name, instance_name
58
+ end
59
+
60
+ def remove(app_name, instance_name)
61
+ app_db_name = RailsPwnage::Config.app_db_name(app_name, instance_name)
62
+ RailsPwnage::Config.drop_db app_db_name
63
+ end
64
+ end
@@ -38,7 +38,7 @@ module RailsPwnage::App
38
38
  # removes an application (and stops its servers)
39
39
  def self.remove(app_name, instance_name)
40
40
  instance_magic(app_name, instance_name) do |app, instance|
41
- [ClusterConfig, NginxConfig, Database, Svn, Config].each do |mod|
41
+ [NginxConfig, ClusterConfig, Database, Svn, Config].each do |mod|
42
42
  mod.new.remove app, instance
43
43
  end
44
44
  end
@@ -7,7 +7,7 @@ class RailsPwnage::App::NginxConfig
7
7
  def config_nginx(app_name, instance_name)
8
8
  app_config = RailsPwnage::Config[app_name, instance_name]
9
9
  first_port = app_config[:port0]
10
- hostname_filter = app_config[:dns_name]
10
+ dns_name = app_config[:dns_name]
11
11
 
12
12
  nginx_config = File.join(RailsPwnage::Config.path_to(:nginx_configs), app_name + '.' + instance_name)
13
13
  File.open(nginx_config, 'w') do |f|
@@ -22,7 +22,7 @@ class RailsPwnage::App::NginxConfig
22
22
  f << <<NGINX_CONFIG
23
23
  server {
24
24
  listen 80;
25
- #{(hostname_filter.empty? ? '' : "server_name " + hostname_filter + ";")}
25
+ #{(dns_name.empty? ? '' : "server_name " + dns_name + ";")}
26
26
  root #{app_config[:app_path]};
27
27
  client_max_body_size #{app_config[:max_request_mb]}M;
28
28
  location / {
@@ -64,6 +64,11 @@ NGINX_CONFIG
64
64
  remove_nginx_stub
65
65
  end
66
66
 
67
+ def update(app_name, instance_name)
68
+ config_nginx app_name, instance_name
69
+ control_boot_script('nginx', :reload)
70
+ end
71
+
67
72
  def remove(app_name, instance_name)
68
73
  remove_nginx_config app_name, instance_name
69
74
  end
@@ -77,9 +82,5 @@ NGINX_CONFIG
77
82
  when :reload
78
83
  control_boot_script('nginx', :reload)
79
84
  end
80
- end
81
-
82
- def update(app_name, instance_name)
83
- # nothing to do here, unless we enable config rewriting
84
85
  end
85
86
  end
@@ -0,0 +1,57 @@
1
+ # extends Base with atomic read/write functions
2
+
3
+ require 'digest/md5'
4
+ require 'fileutils'
5
+ require 'yaml'
6
+
7
+ module RailsPwnage::Base
8
+ # reads the content of one file
9
+ # returns nil if the file is corrupted, otherwise returns [file data, timestamp]
10
+ def atomic_read_internal(file_name)
11
+ begin
12
+ raw_data = File.open(file_name, 'r') { |f| YAML::load f }
13
+ ts_checksum = Digest::MD5.hexdigest("#{raw_data[1]}.#{raw_data[2]}")
14
+ return [nil, Time.at(0, 0)] unless ts_checksum == raw_data[3]
15
+ return [raw_data[0], Time.at(raw_data[1], raw_data[2])]
16
+ rescue
17
+ # fail if the YAML can't be processed or something else goes wrong
18
+ return [nil, Time.at(0, 0)]
19
+ end
20
+ end
21
+ private :atomic_read_internal
22
+
23
+ # reads the data in a repository
24
+ def atomic_read(path, name)
25
+ main_file = File.join(path, name) + '.yml'
26
+ dup_file = File.join(path, name) + '.yml2'
27
+
28
+ # choose the single good file or, if both are good, use the latest timestamp
29
+ # this works as long as the time on a box doesn't go back (it's ok to have it skewed)
30
+ results = [main_file, dup_file].map { |file| atomic_read_internal file }
31
+ results.sort { |a, b| b[1] <=> a[1] }
32
+ return results.first[0]
33
+ end
34
+
35
+ # writes data to a repository
36
+ def atomic_write(data, path, name)
37
+ main_file = File.join(path, name) + '.yml'
38
+ dup_file = File.join(path, name) + '.yml2'
39
+
40
+ # append verification info at the end of the file to guard from incomplete writes
41
+ ts = Time.now
42
+ ts_checksum = Digest::MD5.hexdigest("#{ts.tv_sec}.#{ts.tv_usec}")
43
+ File.open(dup_file, 'w') { |f| YAML::dump [data, ts.tv_sec, ts.tv_usec, ts_checksum], f }
44
+
45
+ # move the file atomically to the main copy
46
+ FileUtils.mv(dup_file, main_file)
47
+ end
48
+
49
+ # erases a repository
50
+ def atomic_erase(path, name)
51
+ main_file = File.join(path, name) + '.yml'
52
+ dup_file = File.join(path, name) + '.yml2'
53
+ [main_file, dup_file].each do |file|
54
+ File.delete file if File.exists? file
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,8 @@
1
+ # extends Base with the ability to get the computer's hostname
2
+
3
+ require 'digest/md5'
4
+ require 'yaml'
5
+
6
+ module RailsPwnage::Base
7
+
8
+ end
@@ -0,0 +1,13 @@
1
+ # application-specific configuration functions
2
+
3
+ module RailsPwnage::Config
4
+ # the name of the database storing an app's configuration
5
+ def self.app_db_name(app_name, instance_name)
6
+ return "#{app_name}.#{instance_name}"
7
+ end
8
+
9
+ # the instances of an application installed on this box
10
+ def self.app_instances(app_name)
11
+ self.databases().filter { |db| db.include? ?. }.map { |db| db[0..(db.rindex ?.)] }
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ # important paths in the filesystem
2
+
3
+ module RailsPwnage::Config
4
+ # the path to something important (e.g. :apps --> path to all production applications)
5
+ def self.path_to(what = :prod, app_name = nil)
6
+ # need to hardcode path to config to avoid endless recursion
7
+ if what == :config
8
+ return '/prod/config/'
9
+ end
10
+
11
+ # first try the paths in the database
12
+ return self[:paths][what] if self[:paths] and self[:paths].has_key? what
13
+
14
+ # then try the global paths
15
+ static_path = static_path_to what
16
+ return static_path unless static_path.nil?
17
+ end
18
+
19
+ # hardcoded paths
20
+ def self.static_path_to(what)
21
+ case what
22
+ when :config
23
+ # the directory containing the config files
24
+ '/prod/config'
25
+ when :prod
26
+ # the directory containing all the production data
27
+ '/prod'
28
+ when :apps
29
+ # the directory containing the production apps
30
+ '/prod/apps'
31
+ when :backups
32
+ '/prod/backups'
33
+ else
34
+ return
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,45 @@
1
+ # keeps track of the available ports on the machine
2
+
3
+ module RailsPwnage::Config
4
+ def self.init_ports(free_ports = [[8000, 16000]])
5
+ self.create_db :free_ports
6
+ self[:free_ports][:list] = free_ports
7
+ self.flush_db :free_ports
8
+ end
9
+
10
+ # allocates a contiguous range of ports
11
+ # returns the starting port or nil
12
+ def self.alloc_ports(nports = 1)
13
+ free_ports = self[:free_ports][:list]
14
+ free_ports.each_index do |i|
15
+ next if free_ports[i][1] - free_ports[i][0] < nports
16
+ first_port = free_ports[i][0]
17
+ free_ports[i][0] += nports
18
+ free_ports.delete_at i if free_ports[i][0] == free_ports[i][1]
19
+ self[:free_ports][:list] = free_ports
20
+ self.flush_db :free_ports
21
+ return first_port
22
+ end
23
+ end
24
+
25
+ # returns a continuous range of ports to the free list
26
+ def self.free_ports(start, count = 1)
27
+ free_ports = self[:free_ports][:list]
28
+ free_ports << [start, start + count]
29
+
30
+ # concatenate duplicates
31
+ free_ports.sort! { |a, b| a[0] <=> b[0]}
32
+ new_ports = [free_ports.first]
33
+ free_ports.each_index do |i|
34
+ if new_ports.last[1] >= free_ports[i][0]
35
+ new_ports.last[1] = [new_ports.last[1], free_ports[i][1]].max
36
+ else
37
+ new_ports << free_ports[i]
38
+ end
39
+ end
40
+
41
+ # write the new database
42
+ self[:free_ports][:list] = new_ports
43
+ self.flush_db :free_ports
44
+ end
45
+ end
@@ -0,0 +1,119 @@
1
+ # implements the configuration repository
2
+
3
+ module RailsPwnage::Config
4
+ class << self
5
+ include RailsPwnage::Base
6
+ end
7
+
8
+ # maps each database name to its contents
9
+ @@db_cache = Hash.new
10
+ # maps each database name to its dirty flag
11
+ @@db_dirty = Hash.new
12
+
13
+ # called when a database is dirty
14
+ def self.mark_db_dirty(db_name)
15
+ @@db_dirty[db_name] = true
16
+ end
17
+
18
+ # installs the database hooks into a Hash
19
+ def self.install_db_hooks(db_contents, db_name)
20
+ # hooks:
21
+ # (1) automatically convert keys to strings
22
+ # (2) flip the dirty flag on writes
23
+ class << db_contents
24
+ def [](key)
25
+ super(key.to_s)
26
+ end
27
+ def []=(key, value)
28
+ super(key.to_s, value)
29
+ RailsPwnage::Config.mark_db_dirty @db_name
30
+ end
31
+ def has_key?(key)
32
+ super(key.to_s)
33
+ end
34
+ end
35
+ db_contents.instance_variable_set :@db_name, db_name
36
+ return db_contents
37
+ end
38
+
39
+ # creates a new database
40
+ def self.create_db(db_name)
41
+ db_name = db_name.to_s
42
+ raise "Configuration database #{db_name} already exists" if get_db(db_name)
43
+
44
+ db_contents = install_db_hooks Hash.new, db_name
45
+ @@db_cache[db_name] = db_contents
46
+ @@db_dirty[db_name] = true
47
+ flush_db db_name
48
+ return db_contents
49
+ end
50
+
51
+ # drops a database
52
+ def self.drop_db(db_name)
53
+ @@db_cache[db_name] = nil
54
+ @@db_dirty[db_name] = true
55
+ flush_db db_name
56
+ end
57
+
58
+ # retrieves the contents of a db (from cache if necessary)
59
+ def self.get_db(db_name)
60
+ db_name = db_name.to_s
61
+ unless @@db_cache.has_key? db_name
62
+ db_path = RailsPwnage::Config.path_to :config
63
+ db_contents = atomic_read(db_path, db_name)
64
+
65
+ if db_contents.nil?
66
+ @@db_cache[db_name] = nil
67
+ else
68
+ @@db_cache[db_name] = install_db_hooks db_contents, db_name
69
+ end
70
+ @@db_dirty[db_name] = false
71
+ end
72
+
73
+ return @@db_cache[db_name]
74
+ end
75
+
76
+ # flushes the contents of the given db from cache
77
+ def self.flush_db(db_name)
78
+ db_name = db_name.to_s
79
+ return unless @@db_dirty[db_name]
80
+ db_path = RailsPwnage::Config.path_to :config
81
+ if @@db_cache[db_name].nil?
82
+ atomic_erase db_path, db_name
83
+ else
84
+ atomic_write @@db_cache[db_name], db_path, db_name
85
+ end
86
+ @@db_dirty[db_name] = false
87
+ end
88
+
89
+ # flushes the entire database cache (used when exiting)
90
+ def self.flush_db_cache
91
+ @@db_dirty.each do |db_name, is_dirty|
92
+ next unless is_dirty
93
+ flush_db db_name
94
+ end
95
+ end
96
+
97
+ # override [] to make the global DB look like a Hash
98
+ def self.[](db_or_app_name, instance_name = nil)
99
+ if instance_name.nil?
100
+ db_name = db_or_app_name
101
+ else
102
+ db_name = app_db_name(db_or_app_name, instance_name)
103
+ end
104
+ get_db(db_name)
105
+ end
106
+
107
+ def self.databases()
108
+ entries = Dir.entries RailsPwnage::Config.path_to(:config)
109
+ databases = []
110
+ entries.each do |entry|
111
+ next unless entry =~ /\.yml(2)?$/
112
+ databases << entry.gsub(/\.yml(2)?$/, '')
113
+ end
114
+ return databases
115
+ end
116
+
117
+ # ensures all databases are flushed when the script exits
118
+ Kernel.at_exit { RailsPwnage::Config.flush_db_cache }
119
+ end
@@ -0,0 +1,77 @@
1
+ require 'pp'
2
+
3
+ class RailsPwnage::DevExecutor
4
+ # check if we're at the root of a Rails application
5
+ def at_app_root()
6
+ ['app', 'config', 'db', 'lib', 'log', 'public',
7
+ 'script', 'tmp', 'vendor', 'Rakefile'].all? { |dir| File.exists? dir }
8
+ end
9
+
10
+ def read_config(instance)
11
+ if instance == '*'
12
+ file = File.join(@config_root, '.yml')
13
+ else
14
+ file = File.join(@config_root, instance + '.yml')
15
+ end
16
+
17
+ begin
18
+ File.open(file, 'r' ) { |f| YAML.load f }
19
+ rescue
20
+ return Hash.new
21
+ end
22
+ end
23
+
24
+ def write_config(config, instance)
25
+ if instance == '*'
26
+ file = File.join(@config_root, '.yml')
27
+ else
28
+ file = File.join(@config_root, instance + '.yml')
29
+ end
30
+
31
+ File.open(file, 'w') { |f| YAML.dump config, f }
32
+ end
33
+
34
+
35
+ # standalone runner
36
+ def run(args)
37
+ unless at_app_root
38
+ print "You need to run this at the root of your Rails application\n"
39
+ return
40
+ end
41
+
42
+ # create the config root unless it exists
43
+ @config_root = 'config/rails_pwnerer'
44
+ Dir.mkdir @config_root unless File.exists? @config_root
45
+
46
+ case args[0]
47
+ when 'get', 'getprop'
48
+ property = args[1]
49
+ instance = args[2] || '*'
50
+ config = read_config instance
51
+ pp config[property]
52
+
53
+ when 'set', 'setprop', 'setnum', 'setpropnum'
54
+ property = args[1]
55
+ if args[0].index 'num'
56
+ value = eval(args[2] || '1')
57
+ else
58
+ value = args[2] || 'true'
59
+ end
60
+
61
+ instance = args[3] || '*'
62
+ config = read_config instance
63
+ config[property] = value
64
+ write_config config, instance
65
+
66
+ when 'del', 'delprop', 'delete', 'rm', 'remove'
67
+ property = args[1]
68
+ instance = args[2] || '*'
69
+ config = read_config instance
70
+ config.delete property
71
+ write_config config, instance
72
+
73
+ else
74
+ print "Unrecognized command #{args[0]}\n"
75
+ end
76
+ end
77
+ end
@@ -93,11 +93,5 @@ class RailsPwnage::Executor
93
93
  else
94
94
  print "Unrecognized command #{args[0]}\n"
95
95
  end
96
- end
97
-
98
-
99
- # stand-alone launcher
100
- def self.go(args)
101
- self.new.run(args)
102
- end
96
+ end
103
97
  end
@@ -0,0 +1,39 @@
1
+ # sets up the configuration repository
2
+
3
+ class RailsPwnage::Scaffolds::Config
4
+ include RailsPwnage::Base
5
+
6
+ # runner
7
+ def run
8
+ # paths
9
+ paths_db = RailsPwnage::Config.create_db :paths
10
+ # the directory containing the mongrel_cluster config files
11
+ paths_db[:mongrel_configs] = '/etc/mongrel_cluster'
12
+ # the directory containing the nginx config files
13
+ paths_db[:nginx_configs] = '/etc/nginx/sites-enabled'
14
+ # the directory containing the ddclient configuration
15
+ paths_db[:ddclient_config] = '/etc/ddclient.conf'
16
+ RailsPwnage::Config.flush_db :paths
17
+
18
+ # host info
19
+ host_info = RailsPwnage::Config.create_db :host
20
+ # the default instance name
21
+ host_info[:instance] = Socket.gethostname()
22
+ # the computer's name (if we ever do status reports)
23
+ host_info[:name] = Socket.gethostname()
24
+ # username for creating / dropping databases
25
+ host_info[:dbroot_name] = 'root'
26
+ # password for creating / dropping databases
27
+ host_info[:dbroot_pass] = ''
28
+
29
+ RailsPwnage::Config.flush_db :host
30
+
31
+ # the free port list
32
+ RailsPwnage::Config.init_ports
33
+ end
34
+
35
+ # standalone runner
36
+ def self.go
37
+ self.new.run
38
+ end
39
+ end
data/lib/rails_pwnage.rb CHANGED
@@ -25,8 +25,6 @@ require 'pwnage/config/paths.rb'
25
25
  require 'pwnage/config/ports.rb'
26
26
  require 'pwnage/config/repository.rb'
27
27
 
28
- require 'pwnage/executor.rb'
29
-
30
28
  require 'pwnage/scaffolds/config.rb'
31
29
  require 'pwnage/scaffolds/dirs.rb'
32
30
  require 'pwnage/scaffolds/gems.rb'
@@ -43,3 +41,6 @@ require 'pwnage/app/database.rb'
43
41
  require 'pwnage/app/gems.rb'
44
42
  require 'pwnage/app/nginx_config.rb'
45
43
  require 'pwnage/app/svn.rb'
44
+
45
+ require 'pwnage/dev_executor.rb'
46
+ require 'pwnage/executor.rb'
@@ -1,11 +1,11 @@
1
1
 
2
- # Gem::Specification for Rails_pwnerer-0.5.1
2
+ # Gem::Specification for Rails_pwnerer-0.5.2
3
3
  # Originally generated by Echoe
4
4
 
5
5
  --- !ruby/object:Gem::Specification
6
6
  name: rails_pwnerer
7
7
  version: !ruby/object:Gem::Version
8
- version: 0.5.1
8
+ version: 0.5.2
9
9
  platform: ruby
10
10
  authors:
11
11
  - Victor Costan
@@ -29,24 +29,35 @@ description: Rails deployment tool/hack.
29
29
  email: victor@costan.us
30
30
  executables:
31
31
  - rpwn
32
+ - rpwndev
32
33
  extensions: []
33
34
 
34
35
  extra_rdoc_files:
35
36
  - bin/rpwn
37
+ - bin/rpwndev
36
38
  - CHANGELOG
37
39
  - lib/pwnage/app/cluster_config.rb
40
+ - lib/pwnage/app/config.rb
38
41
  - lib/pwnage/app/database.rb
39
42
  - lib/pwnage/app/gems.rb
40
43
  - lib/pwnage/app/main.rb
41
44
  - lib/pwnage/app/nginx_config.rb
42
45
  - lib/pwnage/app/svn.rb
46
+ - lib/pwnage/base/atomics.rb
43
47
  - lib/pwnage/base/dirs.rb
44
48
  - lib/pwnage/base/gems.rb
49
+ - lib/pwnage/base/hostname.rb
45
50
  - lib/pwnage/base/packages.rb
46
51
  - lib/pwnage/base/startup.rb
47
52
  - lib/pwnage/base.rb
53
+ - lib/pwnage/config/app.rb
48
54
  - lib/pwnage/config/main.rb
55
+ - lib/pwnage/config/paths.rb
56
+ - lib/pwnage/config/ports.rb
57
+ - lib/pwnage/config/repository.rb
58
+ - lib/pwnage/dev_executor.rb
49
59
  - lib/pwnage/executor.rb
60
+ - lib/pwnage/scaffolds/config.rb
50
61
  - lib/pwnage/scaffolds/dirs.rb
51
62
  - lib/pwnage/scaffolds/gems.rb
52
63
  - lib/pwnage/scaffolds/hook_dyndns.rb
@@ -59,20 +70,30 @@ extra_rdoc_files:
59
70
  - README
60
71
  files:
61
72
  - bin/rpwn
73
+ - bin/rpwndev
62
74
  - CHANGELOG
63
75
  - lib/pwnage/app/cluster_config.rb
76
+ - lib/pwnage/app/config.rb
64
77
  - lib/pwnage/app/database.rb
65
78
  - lib/pwnage/app/gems.rb
66
79
  - lib/pwnage/app/main.rb
67
80
  - lib/pwnage/app/nginx_config.rb
68
81
  - lib/pwnage/app/svn.rb
82
+ - lib/pwnage/base/atomics.rb
69
83
  - lib/pwnage/base/dirs.rb
70
84
  - lib/pwnage/base/gems.rb
85
+ - lib/pwnage/base/hostname.rb
71
86
  - lib/pwnage/base/packages.rb
72
87
  - lib/pwnage/base/startup.rb
73
88
  - lib/pwnage/base.rb
89
+ - lib/pwnage/config/app.rb
74
90
  - lib/pwnage/config/main.rb
91
+ - lib/pwnage/config/paths.rb
92
+ - lib/pwnage/config/ports.rb
93
+ - lib/pwnage/config/repository.rb
94
+ - lib/pwnage/dev_executor.rb
75
95
  - lib/pwnage/executor.rb
96
+ - lib/pwnage/scaffolds/config.rb
76
97
  - lib/pwnage/scaffolds/dirs.rb
77
98
  - lib/pwnage/scaffolds/gems.rb
78
99
  - lib/pwnage/scaffolds/hook_dyndns.rb
@@ -83,10 +104,10 @@ files:
83
104
  - lib/rails_pwnage.rb
84
105
  - LICENSE
85
106
  - Manifest
107
+ - Rakefile
86
108
  - README
87
109
  - RUBYFORGE
88
110
  - rails_pwnerer.gemspec
89
- - Rakefile
90
111
  has_rdoc: true
91
112
  homepage: http://www.costan.us/rails_pwnage
92
113
  post_install_message:
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.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Costan
@@ -26,24 +26,35 @@ description: Rails deployment tool/hack.
26
26
  email: victor@costan.us
27
27
  executables:
28
28
  - rpwn
29
+ - rpwndev
29
30
  extensions: []
30
31
 
31
32
  extra_rdoc_files:
32
33
  - bin/rpwn
34
+ - bin/rpwndev
33
35
  - CHANGELOG
34
36
  - lib/pwnage/app/cluster_config.rb
37
+ - lib/pwnage/app/config.rb
35
38
  - lib/pwnage/app/database.rb
36
39
  - lib/pwnage/app/gems.rb
37
40
  - lib/pwnage/app/main.rb
38
41
  - lib/pwnage/app/nginx_config.rb
39
42
  - lib/pwnage/app/svn.rb
43
+ - lib/pwnage/base/atomics.rb
40
44
  - lib/pwnage/base/dirs.rb
41
45
  - lib/pwnage/base/gems.rb
46
+ - lib/pwnage/base/hostname.rb
42
47
  - lib/pwnage/base/packages.rb
43
48
  - lib/pwnage/base/startup.rb
44
49
  - lib/pwnage/base.rb
50
+ - lib/pwnage/config/app.rb
45
51
  - lib/pwnage/config/main.rb
52
+ - lib/pwnage/config/paths.rb
53
+ - lib/pwnage/config/ports.rb
54
+ - lib/pwnage/config/repository.rb
55
+ - lib/pwnage/dev_executor.rb
46
56
  - lib/pwnage/executor.rb
57
+ - lib/pwnage/scaffolds/config.rb
47
58
  - lib/pwnage/scaffolds/dirs.rb
48
59
  - lib/pwnage/scaffolds/gems.rb
49
60
  - lib/pwnage/scaffolds/hook_dyndns.rb
@@ -56,20 +67,30 @@ extra_rdoc_files:
56
67
  - README
57
68
  files:
58
69
  - bin/rpwn
70
+ - bin/rpwndev
59
71
  - CHANGELOG
60
72
  - lib/pwnage/app/cluster_config.rb
73
+ - lib/pwnage/app/config.rb
61
74
  - lib/pwnage/app/database.rb
62
75
  - lib/pwnage/app/gems.rb
63
76
  - lib/pwnage/app/main.rb
64
77
  - lib/pwnage/app/nginx_config.rb
65
78
  - lib/pwnage/app/svn.rb
79
+ - lib/pwnage/base/atomics.rb
66
80
  - lib/pwnage/base/dirs.rb
67
81
  - lib/pwnage/base/gems.rb
82
+ - lib/pwnage/base/hostname.rb
68
83
  - lib/pwnage/base/packages.rb
69
84
  - lib/pwnage/base/startup.rb
70
85
  - lib/pwnage/base.rb
86
+ - lib/pwnage/config/app.rb
71
87
  - lib/pwnage/config/main.rb
88
+ - lib/pwnage/config/paths.rb
89
+ - lib/pwnage/config/ports.rb
90
+ - lib/pwnage/config/repository.rb
91
+ - lib/pwnage/dev_executor.rb
72
92
  - lib/pwnage/executor.rb
93
+ - lib/pwnage/scaffolds/config.rb
73
94
  - lib/pwnage/scaffolds/dirs.rb
74
95
  - lib/pwnage/scaffolds/gems.rb
75
96
  - lib/pwnage/scaffolds/hook_dyndns.rb
@@ -80,10 +101,10 @@ files:
80
101
  - lib/rails_pwnage.rb
81
102
  - LICENSE
82
103
  - Manifest
104
+ - Rakefile
83
105
  - README
84
106
  - RUBYFORGE
85
107
  - rails_pwnerer.gemspec
86
- - Rakefile
87
108
  has_rdoc: true
88
109
  homepage: http://www.costan.us/rails_pwnage
89
110
  post_install_message: