rails_pwnerer 0.5.1 → 0.5.2

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 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: