rails_pwnerer 0.6.22 → 0.6.23

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.6.23. Implemented frontends_per_core option as an alternative to frontends.
2
+
1
3
  v0.6.22. Fixed package name for git.
2
4
 
3
5
  v0.6.21. Mass-upgrade to all packages at the end of scaffolding.
data/Manifest CHANGED
@@ -12,6 +12,7 @@ lib/pwnage/app/nginx_config.rb
12
12
  lib/pwnage/app/scripts.rb
13
13
  lib/pwnage/app/svn.rb
14
14
  lib/pwnage/base/atomics.rb
15
+ lib/pwnage/base/cpus.rb
15
16
  lib/pwnage/base/dirs.rb
16
17
  lib/pwnage/base/gems.rb
17
18
  lib/pwnage/base/hostname.rb
data/README CHANGED
@@ -119,12 +119,12 @@ overrides will be version-controlled). In your Rails directory
119
119
  * Set the DNS name that your app responds to:
120
120
  rpwndev set dns-name your.dns.name
121
121
 
122
- * Tweak the number of frontends for an instance:
123
- rpwndev setnum frontends 8 your_instance
122
+ * Tweak the number of frontends per CPU core for an instance:
123
+ rpwndev setnum frontends_per_core 4 your_instance
124
124
 
125
125
  * Delete the previous tweak and apply it to all instances:
126
- rpwndev del frontends your_instance;
127
- rpwndev setnum frontends
126
+ rpwndev del frontends_per_core your_instance;
127
+ rpwndev setnum frontends_per_core 4
128
128
 
129
129
  The overrides are YAML files in +config/rails_pwnage+, so you
130
130
  can view and edit them by hand. rpwndev is just a handy tool,
@@ -24,16 +24,28 @@ class RailsPwnage::App::ClusterConfig
24
24
  end
25
25
  end
26
26
 
27
+ # computes the number of frontends to bring up / down
28
+ def num_frontends(app_name, instance_name)
29
+ app_config = RailsPwnage::Config[app_name, instance_name]
30
+ return nil unless app_config and fixed_frontends = app_config[:frontends]
31
+
32
+ if app_config[:frontends_per_core]
33
+ cores_frontends = app_config[:frontends_per_core] * app_config[:detected_cores]
34
+ return cores_frontends unless cores_frontends == 0
35
+ end
36
+ return fixed_frontends
37
+ end
38
+
27
39
  def manage_ports(app_name, instance_name, action)
28
40
  app_config = RailsPwnage::Config[app_name, instance_name]
29
- return unless app_config and app_config[:port0] and app_config[:frontends]
41
+ return unless frontends = num_frontends(app_name, instance_name)
30
42
 
31
43
  case action
32
44
  when :alloc
33
- app_config[:port0] = RailsPwnage::Config.alloc_ports app_config[:frontends]
45
+ app_config[:port0] = RailsPwnage::Config.alloc_ports frontends
34
46
  when :free
47
+ RailsPwnage::Config.free_ports app_config[:port0], frontends
35
48
  return if app_config[:port0] == 0 # do not release if ports have already been released
36
- RailsPwnage::Config.free_ports app_config[:port0], app_config[:frontends]
37
49
  app_config[:port0] = 0
38
50
  end
39
51
  RailsPwnage::Config.flush_db RailsPwnage::Config.app_db_name(app_name, instance_name)
@@ -45,7 +57,7 @@ class RailsPwnage::App::ClusterConfig
45
57
  return unless app_config and File.exists? app_config[:app_path]
46
58
 
47
59
  app_path = app_config[:app_path]
48
- frontends, first_port = app_config[:frontends], app_config[:port0]
60
+ frontends, first_port = num_frontends(app_name, instance_name), app_config[:port0]
49
61
 
50
62
  cmdline_patterns = ['thin', nil]
51
63
 
@@ -69,7 +81,7 @@ class RailsPwnage::App::ClusterConfig
69
81
 
70
82
  app_path, pwnerer_user = app_config[:app_path], app_config[:pwnerer_user]
71
83
  pwnerer_group = group_for_username(pwnerer_user)
72
- frontends, first_port = app_config[:frontends], app_config[:port0]
84
+ frontends, first_port = num_frontends(app_name, instance_name), app_config[:port0]
73
85
  environment = app_config[:environment]
74
86
 
75
87
  stop app_name, instance_name
@@ -8,7 +8,7 @@ class RailsPwnage::App::Config
8
8
  (0...16).map { |i| "abcdefghijklmnopqrstuvwxyz"[rand(26),1]}.join
9
9
  end
10
10
 
11
- # fills inexsitent keys with their default values
11
+ # fills inexistent keys with their default values
12
12
  # setup: this effectively creates the baseline configuration db
13
13
  # update: this adds keys that might have been added in new versions of rpwn
14
14
  def populate_defaults(app_name, instance_name, app_db)
@@ -16,11 +16,13 @@ class RailsPwnage::App::Config
16
16
  app_db[:app_path] = File.join(RailsPwnage::Config.path_to(:apps), app_name + '.' + instance_name)
17
17
  # the path to application backups
18
18
  app_db[:backup_path] ||= File.join(RailsPwnage::Config.path_to(:backups), app_name + '.' + instance_name)
19
-
19
+
20
20
  # the user which will receive the "keys" to the production system
21
21
  app_db[:pwnerer_user] ||= RailsPwnage::Config[:host][:pwnerer_user]
22
22
  # the number of frontends for the application instance
23
- app_db[:frontends] ||= 4
23
+ app_db[:frontends] ||= 4 # most computers have 2 cores nowadays
24
+ # the number of frontends per core for the application instance
25
+ app_db[:frontends_per_core] ||= 2 # best practice
24
26
  # the first internal port for the application instance
25
27
  app_db[:port0] = 0 # will be overwritten during allocation
26
28
  # the name of the database for the application instance
@@ -43,6 +45,9 @@ class RailsPwnage::App::Config
43
45
  app_db[:gems] ||= ''
44
46
  # set to disable accidental db resets (on production vs. staging instances)
45
47
  app_db[:enable_db_reset] ||= false
48
+
49
+ # the number of cores on the platform
50
+ app_db[:detected_cores] ||= cpu_cores.count
46
51
  end
47
52
 
48
53
  # allocates room for the application and creates the application configuration database
@@ -0,0 +1,62 @@
1
+ if File.exists? '/proc/cpuinfo'
2
+ # safest option: emulate Sys::CPU based on procfs
3
+ module Sys; end
4
+
5
+ module Sys::CPU
6
+ def self.processors
7
+ cpuinfo_text = File.read '/proc/cpuinfo'
8
+ cpus_text = cpuinfo_text.split "\n\n"
9
+ cpus = []
10
+ cpus_text.each do |cpu_text|
11
+ cpu = {}
12
+ cpu_text.each_line do |cpu_line|
13
+ key, value = *cpu_line.split(':', 2)
14
+ key.strip!
15
+ key.gsub! /\s/, '_'
16
+ key.downcase!
17
+ value.strip!
18
+ cpu[key.to_sym] = value
19
+ end
20
+ cpus << Struct.new(*cpu.keys).new(*cpu.values)
21
+ end
22
+
23
+ cpus.each { |cpu| yield cpu } if Kernel.block_given?
24
+ return cpus
25
+ end
26
+ end
27
+
28
+ else
29
+ # no procfs, try to use sys-cpu
30
+
31
+ begin
32
+ require 'rubygems'
33
+ require 'sys/cpu'
34
+ rescue
35
+ # no gem either, stub sys-cpu
36
+ module Sys; end
37
+
38
+ module Sys::CPU
39
+ def self.processors
40
+ return []
41
+ end
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+ module RailsPwnage::Base
48
+ # returns information for each core in the system
49
+ def cpu_cores
50
+ cpus = []
51
+ Sys::CPU.processors do |p|
52
+ cpus << {
53
+ :freq => p.cpu_mhz.to_f,
54
+ :id => p.processor.to_i,
55
+ :cpu => p.physical_id.to_i,
56
+ :core => p.core_id.to_i,
57
+ :num_cores => p.cpu_cores.to_i
58
+ }
59
+ end
60
+ return cpus
61
+ end
62
+ end
@@ -20,8 +20,11 @@ class RailsPwnage::Scaffolds::Gems
20
20
  # we need this to do controlled app container startups
21
21
  install_gems %w(sys-proctable)
22
22
 
23
- # TODO: an application should have its own tools
24
- install_gems %w(highline echoe)
23
+ # used to determine the number of available CPUs and cores
24
+ install_gems %w(sys-cpu)
25
+
26
+ # useful for building gems and debugging
27
+ install_gems %w(highline echoe)
25
28
  end
26
29
 
27
30
  # runner
@@ -14,7 +14,7 @@ class RailsPwnage::Scaffolds::Packages
14
14
  # should work from source, except package author decided to block that
15
15
  install_packages %w(subversion)
16
16
 
17
- # rpwn doesn't deal with git yes, but we'd like to offer that, so we'll
17
+ # rpwn doesn't deal with git yet, but we'd like to offer that, so we'll
18
18
  # bring in the git infrastructure during scaffolding
19
19
  install_packages %w(git-core), :source => true
20
20
 
data/lib/rails_pwnerer.rb CHANGED
@@ -13,6 +13,7 @@ end
13
13
 
14
14
  require 'pwnage/base.rb'
15
15
  require 'pwnage/base/atomics.rb'
16
+ require 'pwnage/base/cpus.rb'
16
17
  require 'pwnage/base/dirs.rb'
17
18
  require 'pwnage/base/gems.rb'
18
19
  require 'pwnage/base/hostname.rb'
@@ -1,30 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = %q{rails_pwnerer}
3
- s.version = "0.6.22"
5
+ s.version = "0.6.23"
4
6
 
5
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
6
8
  s.authors = ["Victor Costan"]
7
- s.date = %q{2008-11-08}
9
+ s.date = %q{2008-12-31}
8
10
  s.default_executable = %q{bin/rpwn}
9
11
  s.description = %q{Rails deployment tool/hack.}
10
12
  s.email = %q{victor@costan.us}
11
13
  s.executables = ["rpwn", "rpwnctl", "rpwndev"]
12
14
  s.extensions = ["ext/rpwn_setup_notice/extconf.rb"]
13
- s.extra_rdoc_files = ["bin/rpwn", "bin/rpwnctl", "bin/rpwndev", "CHANGELOG", "ext/rpwn_setup_notice/extconf.rb", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/gems.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/scripts.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/atomics.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/hostname.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/process.rb", "lib/pwnage/base/rails.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/app.rb", "lib/pwnage/config/main.rb", "lib/pwnage/config/paths.rb", "lib/pwnage/config/ports.rb", "lib/pwnage/config/repository.rb", "lib/pwnage/ctl_executor.rb", "lib/pwnage/dev_executor.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/config.rb", "lib/pwnage/scaffolds/dir_permissions.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_daemon.rb", "lib/pwnage/scaffolds/hook_dyndns.rb", "lib/pwnage/scaffolds/mysql_config.rb", "lib/pwnage/scaffolds/packages.rb", "lib/pwnage/scaffolds/rubygems.rb", "lib/pwnage/scaffolds/sshd.rb", "lib/pwnage/util/kill_process_set.rb", "lib/pwnage/util/main.rb", "lib/rails_pwnerer.rb", "LICENSE", "README"]
14
- s.files = ["bin/rpwn", "bin/rpwnctl", "bin/rpwndev", "CHANGELOG", "ext/rpwn_setup_notice/extconf.rb", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/gems.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/scripts.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/atomics.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/hostname.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/process.rb", "lib/pwnage/base/rails.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/app.rb", "lib/pwnage/config/main.rb", "lib/pwnage/config/paths.rb", "lib/pwnage/config/ports.rb", "lib/pwnage/config/repository.rb", "lib/pwnage/ctl_executor.rb", "lib/pwnage/dev_executor.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/config.rb", "lib/pwnage/scaffolds/dir_permissions.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_daemon.rb", "lib/pwnage/scaffolds/hook_dyndns.rb", "lib/pwnage/scaffolds/mysql_config.rb", "lib/pwnage/scaffolds/packages.rb", "lib/pwnage/scaffolds/rubygems.rb", "lib/pwnage/scaffolds/sshd.rb", "lib/pwnage/util/kill_process_set.rb", "lib/pwnage/util/main.rb", "lib/rails_pwnerer.rb", "LICENSE", "Manifest", "Rakefile", "README", "RUBYFORGE", "rails_pwnerer.gemspec"]
15
+ s.extra_rdoc_files = ["bin/rpwn", "bin/rpwnctl", "bin/rpwndev", "CHANGELOG", "ext/rpwn_setup_notice/extconf.rb", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/gems.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/scripts.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/atomics.rb", "lib/pwnage/base/cpus.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/hostname.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/process.rb", "lib/pwnage/base/rails.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/app.rb", "lib/pwnage/config/main.rb", "lib/pwnage/config/paths.rb", "lib/pwnage/config/ports.rb", "lib/pwnage/config/repository.rb", "lib/pwnage/ctl_executor.rb", "lib/pwnage/dev_executor.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/config.rb", "lib/pwnage/scaffolds/dir_permissions.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_daemon.rb", "lib/pwnage/scaffolds/hook_dyndns.rb", "lib/pwnage/scaffolds/mysql_config.rb", "lib/pwnage/scaffolds/packages.rb", "lib/pwnage/scaffolds/rubygems.rb", "lib/pwnage/scaffolds/sshd.rb", "lib/pwnage/util/kill_process_set.rb", "lib/pwnage/util/main.rb", "lib/rails_pwnerer.rb", "LICENSE", "README"]
16
+ s.files = ["bin/rpwn", "bin/rpwnctl", "bin/rpwndev", "CHANGELOG", "ext/rpwn_setup_notice/extconf.rb", "lib/pwnage/app/cluster_config.rb", "lib/pwnage/app/config.rb", "lib/pwnage/app/database.rb", "lib/pwnage/app/gems.rb", "lib/pwnage/app/main.rb", "lib/pwnage/app/nginx_config.rb", "lib/pwnage/app/scripts.rb", "lib/pwnage/app/svn.rb", "lib/pwnage/base/atomics.rb", "lib/pwnage/base/cpus.rb", "lib/pwnage/base/dirs.rb", "lib/pwnage/base/gems.rb", "lib/pwnage/base/hostname.rb", "lib/pwnage/base/packages.rb", "lib/pwnage/base/process.rb", "lib/pwnage/base/rails.rb", "lib/pwnage/base/startup.rb", "lib/pwnage/base.rb", "lib/pwnage/config/app.rb", "lib/pwnage/config/main.rb", "lib/pwnage/config/paths.rb", "lib/pwnage/config/ports.rb", "lib/pwnage/config/repository.rb", "lib/pwnage/ctl_executor.rb", "lib/pwnage/dev_executor.rb", "lib/pwnage/executor.rb", "lib/pwnage/scaffolds/config.rb", "lib/pwnage/scaffolds/dir_permissions.rb", "lib/pwnage/scaffolds/dirs.rb", "lib/pwnage/scaffolds/gems.rb", "lib/pwnage/scaffolds/hook_daemon.rb", "lib/pwnage/scaffolds/hook_dyndns.rb", "lib/pwnage/scaffolds/mysql_config.rb", "lib/pwnage/scaffolds/packages.rb", "lib/pwnage/scaffolds/rubygems.rb", "lib/pwnage/scaffolds/sshd.rb", "lib/pwnage/util/kill_process_set.rb", "lib/pwnage/util/main.rb", "lib/rails_pwnerer.rb", "LICENSE", "Manifest", "Rakefile", "README", "RUBYFORGE", "rails_pwnerer.gemspec"]
15
17
  s.has_rdoc = true
16
18
  s.homepage = %q{http://www.costan.us/rails_pwnage}
17
19
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rails_pwnerer", "--main", "README"]
18
20
  s.require_paths = ["lib", "ext"]
19
21
  s.rubyforge_project = %q{rails-pwnage}
20
- s.rubygems_version = %q{1.2.0}
22
+ s.rubygems_version = %q{1.3.1}
21
23
  s.summary = %q{Rails deployment tool/hack.}
22
24
 
23
25
  if s.respond_to? :specification_version then
24
26
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
27
  s.specification_version = 2
26
28
 
27
- if current_version >= 3 then
29
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
30
  s.add_development_dependency(%q<echoe>, [">= 0"])
29
31
  else
30
32
  s.add_dependency(%q<echoe>, [">= 0"])
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.6.22
4
+ version: 0.6.23
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-11-08 00:00:00 -05:00
12
+ date: 2008-12-31 00:00:00 -05:00
13
13
  default_executable: bin/rpwn
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,6 +45,7 @@ extra_rdoc_files:
45
45
  - lib/pwnage/app/scripts.rb
46
46
  - lib/pwnage/app/svn.rb
47
47
  - lib/pwnage/base/atomics.rb
48
+ - lib/pwnage/base/cpus.rb
48
49
  - lib/pwnage/base/dirs.rb
49
50
  - lib/pwnage/base/gems.rb
50
51
  - lib/pwnage/base/hostname.rb
@@ -91,6 +92,7 @@ files:
91
92
  - lib/pwnage/app/scripts.rb
92
93
  - lib/pwnage/app/svn.rb
93
94
  - lib/pwnage/base/atomics.rb
95
+ - lib/pwnage/base/cpus.rb
94
96
  - lib/pwnage/base/dirs.rb
95
97
  - lib/pwnage/base/gems.rb
96
98
  - lib/pwnage/base/hostname.rb
@@ -154,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
156
  requirements: []
155
157
 
156
158
  rubyforge_project: rails-pwnage
157
- rubygems_version: 1.2.0
159
+ rubygems_version: 1.3.1
158
160
  signing_key:
159
161
  specification_version: 2
160
162
  summary: Rails deployment tool/hack.