rails_pwnerer 0.4.10 → 0.4.12

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ v0.4.12. Added application gem management (new in Rails 2.1.0 apps).
2
+
3
+ v0.4.11. Implemented installing from source.
4
+
1
5
  v0.4.10. Added gems needed to monitor system health.
2
6
 
3
7
  v0.4.9. Added app directory cleanup before backup.
data/Manifest CHANGED
@@ -2,6 +2,7 @@ bin/rpwn
2
2
  CHANGELOG
3
3
  lib/pwnage/app/cluster_config.rb
4
4
  lib/pwnage/app/database.rb
5
+ lib/pwnage/app/gems.rb
5
6
  lib/pwnage/app/main.rb
6
7
  lib/pwnage/app/nginx_config.rb
7
8
  lib/pwnage/app/svn.rb
@@ -0,0 +1,27 @@
1
+ # sets up the application gems
2
+
3
+ class RailsPwnage::App::Gems
4
+ include RailsPwnage::Base
5
+
6
+ def setup(app_name)
7
+ Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
8
+ # install the gems needed by the app
9
+ system "rake gems:install RAILS_ENV=production"
10
+ end
11
+ end
12
+
13
+ def update(app_name)
14
+ Dir.chdir(RailsPwnage::Config.path_to(app_name)) do
15
+ # install the gems needed by the app
16
+ system "rake gems:install RAILS_ENV=production"
17
+ end
18
+ end
19
+
20
+ def self.setup(app_name)
21
+ self.new.setup(app_name)
22
+ end
23
+
24
+ def self.update(app_name)
25
+ self.new.update(app_name)
26
+ end
27
+ end
@@ -2,6 +2,7 @@ module RailsPwnage::App
2
2
  # install an application given its SVN path
3
3
  def self.install(svn_path)
4
4
  app_name = Svn.setup(svn_path)
5
+ Gems.setup(app_name)
5
6
  Database.setup(app_name)
6
7
  ClusterConfig.setup(app_name)
7
8
  NginxConfig.setup(app_name)
@@ -11,6 +12,7 @@ module RailsPwnage::App
11
12
  def self.update(app_name)
12
13
  ClusterConfig.update app_name do
13
14
  Svn.update app_name
15
+ Gems.update app_name
14
16
  Database.update app_name
15
17
  end
16
18
  NginxConfig.update app_name
data/lib/pwnage/base.rb CHANGED
@@ -24,4 +24,4 @@ module RailsPwnage::Base
24
24
  arg.each { |i| unroll_collection(i, &proc) }
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -1,6 +1,7 @@
1
1
  # extends Base with directory-related functions
2
2
 
3
3
  require 'etc'
4
+ require 'fileutils'
4
5
 
5
6
  module RailsPwnage::Base
6
7
  # gets the UID associated with the username
@@ -22,4 +23,21 @@ module RailsPwnage::Base
22
23
  group_entry = Etc.getgrgid(gid)
23
24
  return (group_entry.nil?) ? nil : group_entry.name
24
25
  end
26
+
27
+ # executes a block in a temporary directory
28
+ def with_temp_dir
29
+ temp_dir = "rbpwn_#{Time.now.to_i}"
30
+ Dir.mkdir temp_dir
31
+ Dir.chdir(temp_dir) { yield }
32
+ FileUtils.rm_r temp_dir
33
+ end
34
+
35
+ # the distribution of the OS
36
+ def os_distro
37
+ if RUBY_ARCH =~ /win/
38
+ return "Windows"
39
+ else
40
+ File.open('/etc/issue', 'r') { |f| f.read }.split(/(\r|\n)+/, 2)[0]
41
+ end
42
+ end
25
43
  end
@@ -3,26 +3,70 @@
3
3
  module RailsPwnage::Base
4
4
  # TODO: this works for debian-only
5
5
 
6
- def install_package(package_name)
7
- system "apt-get install -y #{package_name}"
6
+ # installs a package
7
+ def install_package(package_name, options = {})
8
+ if options[:source]
9
+ with_temp_dir do
10
+ system "apt-get build-dep -y #{package_name}"
11
+ system "apt-get source -b #{package_name}"
12
+ system "dpkg -i #{Dir.glob('*.deb', File::FNM_DOTMATCH).join(' ')}"
13
+ end
14
+ else
15
+ system "apt-get install -y #{package_name}"
16
+ end
8
17
  end
9
18
 
10
- def upgrade_package(package_name)
11
- system "apt-get upgrade -y #{package_name.nil ? '' : package_name}"
19
+ # upgrades a package to the latest version
20
+ def upgrade_package(package_name, options = {})
21
+ if options[:source]
22
+ install_package(package_name, :source => true)
23
+ else
24
+ system "apt-get upgrade -y #{package_name.nil ? '' : package_name}"
25
+ end
26
+ end
27
+
28
+ def remove_package(package_name, options = {})
29
+ system "apt-get remove -y #{package_name}" unless package_name.nil?
12
30
  end
13
31
 
14
32
  # update the metadata for all the packages
15
- def update_packages()
33
+ def update_package_metadata()
16
34
  system "apt-get update"
17
35
  end
36
+
37
+ # add a source to the package system
38
+ def add_package_source(source_url, source_repos = [], options = {})
39
+ source_prefix = options[:source] ? 'deb-src' : 'deb'
40
+ source_patterns = [source_prefix, source_url] + source_repos
41
+
42
+ # grab the sources
43
+ sources = File.open('/etc/apt/sources.list', 'r') { |f| f.read }.split(/(\r|\n)+/)
44
+
45
+ # see if the source we are trying to add is already there
46
+ source_exists = sources.any? do |source_line|
47
+ source_frags = source_line.split(' ')
48
+ p source_frags
49
+ source_patterns.all? { |pattern| source_frags.any? { |frag| frag == pattern } }
50
+ end
51
+ return if source_exists
52
+
53
+ # the source does exist, add it
54
+ File.open('/etc/apt/sources.list', 'a') do |f|
55
+ f.write "#{source_prefix} #{source_url} #{source_repos.join(' ')}\n"
56
+ end
57
+ end
18
58
  end
19
59
 
20
60
  module RailsPwnage::Base
21
- def install_packages(package_names)
22
- unroll_collection(package_names) { |n| install_package(n) }
61
+ def install_packages(package_names, options = {})
62
+ unroll_collection(package_names) { |n| install_package(n, options) }
23
63
  end
24
64
 
25
- def upgrade_packages(package_names)
26
- unroll_collection(package_names) { |n| update_package(n) }
65
+ def upgrade_packages(package_names, options = {})
66
+ unroll_collection(package_names) { |n| upgrade_package(n, options) }
67
+ end
68
+
69
+ def remove_packages(package_names)
70
+ unroll_collection(package_names) { |n| remove_package(n) }
27
71
  end
28
72
  end
@@ -3,6 +3,10 @@
3
3
  class RailsPwnage::Scaffolds::Gems
4
4
  include RailsPwnage::Base
5
5
 
6
+ def install_self
7
+ # need to reinstall self because ruby gets swapped while the gem is running
8
+ install_gems %w(rails_pwnerer)
9
+ end
6
10
 
7
11
  def install_servers
8
12
  install_gems %w(rails mongrel mongrel_cluster)
@@ -14,12 +18,13 @@ class RailsPwnage::Scaffolds::Gems
14
18
 
15
19
  def install_tools
16
20
  # TODO: an application should have its own tools
17
- install_gems %w(mechanize sys-cpu sys-proctable sys-uname sys-uptime rmagick pdf-writer highline echoe)
21
+ install_gems %w(highline echoe)
18
22
  end
19
23
 
20
24
  # runner
21
25
  def run
22
26
  update_gems
27
+ install_self
23
28
  install_servers
24
29
  install_tools
25
30
  end
@@ -1,42 +1,54 @@
1
- # installs the required OS (read: Ubuntu) packages
1
+ # installs the required OS (read: Ubuntu / Debian) packages
2
2
 
3
3
  class RailsPwnage::Scaffolds::Packages
4
4
  include RailsPwnage::Base
5
5
 
6
6
  # the packages needed to manage the server remotely and instal applications
7
7
  def install_management
8
+ # dpkg-dev allows building from source
9
+ install_packages %w(dpkg_dev)
10
+
8
11
  # openssh-server allows us to ssh into the box
9
12
  # subversion is needed to pull code from SVN repositories
10
13
  # ddclient does dynamic DNS
11
14
  # avahi-daemon does mDNS, a.k.a. Bonjour (makes "ping hostname.local" work)
12
- install_packages %w(openssh-server subversion ddclient avahi-daemon)
15
+ install_packages %w(openssh-server subversion ddclient avahi-daemon), :source => true
13
16
  end
14
17
 
15
18
  # packages that are needed by popular gems
16
19
  def install_tools
17
20
  # needed by rmagick which does image processing
18
- install_packages %w(libmagick9-dev)
21
+ install_packages %w(libmagick9-dev), :source => true
19
22
  end
20
23
 
21
24
  # the packages comprising ruby
22
25
  def install_ruby
23
- # irb, rdoc, ri aren't really essential but they come in handy
24
- install_packages %w(build-essential ruby rubygems ruby1.8-dev irb rdoc ri)
26
+ # wipe the old version (and pray we don't die until we're done, otherwise we're on a ruby-less system)
27
+ remove_packages %w(ruby1.8 libruby1.8)
28
+
29
+ # install ruby from source (get
30
+ install_packages %w(ruby1.8 rdoc libsetup-ruby1.8 ruby-pkg-tools rubygems irb), :source => true
25
31
  end
26
32
 
27
33
  # the packages for a mysql server and development libraries
28
34
  def install_mysql
29
- install_packages %w(mysql-client mysql-server libmysqlclient15-dev)
35
+ install_packages %w(mysql-client mysql-server libmysqlclient15-dev), :source => true
30
36
  end
31
37
 
32
38
  # the packager for _the_ load balancer (nginx, from Russia with <3)
33
39
  def install_balancer
34
- install_packages %w(nginx)
40
+ install_packages %w(nginx), :source => true
35
41
  end
36
42
 
37
43
  # runner
38
44
  def run
39
- update_packages
45
+ add_package_source 'http://debian.mirrors.tds.net/debian/',
46
+ %w(unstable main non-free contrib), :source => true
47
+
48
+ # debugging
49
+ exit
50
+
51
+ update_package_metadata
40
52
  install_management
41
53
  install_tools
42
54
  install_ruby
data/lib/rails_pwnage.rb CHANGED
@@ -23,6 +23,7 @@ require 'pwnage/scaffolds/packages.rb'
23
23
 
24
24
  require 'pwnage/app/main.rb'
25
25
  require 'pwnage/app/svn.rb'
26
+ require 'pwnage/app/gems.rb'
26
27
  require 'pwnage/app/database.rb'
27
28
  require 'pwnage/app/cluster_config.rb'
28
29
  require 'pwnage/app/nginx_config.rb'
@@ -1,22 +1,22 @@
1
1
 
2
- # Gem::Specification for Rails_pwnerer-0.4.10
2
+ # Gem::Specification for Rails_pwnerer-0.4.12
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.10"
7
+ s.version = "0.4.12"
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-05-12}
13
+ s.date = %q{2008-06-20}
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_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"]
18
+ s.extra_rdoc_files = ["bin/rpwn", "CHANGELOG", "lib/pwnage/app/cluster_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/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/gems.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"]
@@ -42,7 +42,8 @@ end
42
42
  # p.url = 'http://www.costan.us/rails_pwnage'
43
43
  # # p.dependencies = ['rails >=2.0']
44
44
  #
45
- # p.need_tar_gz = false
45
+ # p.need_tar_gz = true
46
+ # p.need_zip = true
46
47
  # p.rdoc_pattern = /^(lib|bin|tasks|ext)|^BUILD|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
47
48
  # end
48
49
  #
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.10
4
+ version: 0.4.12
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-05-12 00:00:00 -04:00
12
+ date: 2008-06-20 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -24,6 +24,7 @@ extra_rdoc_files:
24
24
  - CHANGELOG
25
25
  - lib/pwnage/app/cluster_config.rb
26
26
  - lib/pwnage/app/database.rb
27
+ - lib/pwnage/app/gems.rb
27
28
  - lib/pwnage/app/main.rb
28
29
  - lib/pwnage/app/nginx_config.rb
29
30
  - lib/pwnage/app/svn.rb
@@ -48,6 +49,7 @@ files:
48
49
  - CHANGELOG
49
50
  - lib/pwnage/app/cluster_config.rb
50
51
  - lib/pwnage/app/database.rb
52
+ - lib/pwnage/app/gems.rb
51
53
  - lib/pwnage/app/main.rb
52
54
  - lib/pwnage/app/nginx_config.rb
53
55
  - lib/pwnage/app/svn.rb