crnixon-tap_provision_server 0.1.0

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/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,86 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
5
+
6
+ require 'tap/constants'
7
+
8
+ #
9
+ # Gem specification
10
+ #
11
+
12
+ def gemspec
13
+ data = File.read('tap_provision_server.gemspec')
14
+ spec = nil
15
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
16
+ spec
17
+ end
18
+
19
+ Rake::GemPackageTask.new(gemspec) do |pkg|
20
+ pkg.need_tar = true
21
+ end
22
+
23
+ desc 'Prints the gemspec manifest.'
24
+ task :print_manifest do
25
+ # collect files from the gemspec, labeling
26
+ # with true or false corresponding to the
27
+ # file existing or not
28
+ files = gemspec.files.inject({}) do |files, file|
29
+ files[File.expand_path(file)] = [File.exists?(file), file]
30
+ files
31
+ end
32
+
33
+ # gather non-rdoc/pkg files for the project
34
+ # and add to the files list if they are not
35
+ # included already (marking by the absence
36
+ # of a label)
37
+ Dir.glob("**/*").each do |file|
38
+ next if file =~ /^(rdoc|pkg|backup)/ || File.directory?(file)
39
+
40
+ path = File.expand_path(file)
41
+ files[path] = ["", file] unless files.has_key?(path)
42
+ end
43
+
44
+ # sort and output the results
45
+ files.values.sort_by {|exists, file| file }.each do |entry|
46
+ puts "%-5s %s" % entry
47
+ end
48
+ end
49
+
50
+ #
51
+ # Documentation tasks
52
+ #
53
+
54
+ desc 'Generate documentation.'
55
+ Rake::RDocTask.new(:rdoc) do |rdoc|
56
+ spec = gemspec
57
+
58
+ rdoc.rdoc_dir = 'rdoc'
59
+ rdoc.title = 'tap_provision_server'
60
+ rdoc.main = 'README'
61
+ rdoc.options << '--line-numbers' << '--inline-source'
62
+ rdoc.rdoc_files.include( spec.extra_rdoc_files )
63
+ rdoc.rdoc_files.include( spec.files.select {|file| file =~ /^lib.*\.rb$/} )
64
+
65
+ # Using Tdoc to template your Rdoc will result in configurations being
66
+ # listed with documentation in a subsection following attributes. Not
67
+ # necessary, but nice.
68
+ require 'tap/support/tdoc'
69
+ rdoc.template = 'tap/support/tdoc/tdoc_html_template'
70
+ rdoc.options << '--fmt' << 'tdoc'
71
+ end
72
+
73
+ #
74
+ # Test tasks
75
+ #
76
+
77
+ desc 'Default: Run tests.'
78
+ task :default => :test
79
+
80
+ desc 'Run tests.'
81
+ Rake::TestTask.new(:test) do |t|
82
+ t.test_files = Dir.glob( File.join('test', ENV['pattern'] || '**/*_test.rb') )
83
+ t.verbose = true
84
+ t.warning = true
85
+ end
86
+
@@ -0,0 +1,27 @@
1
+ # module: provision_base
2
+
3
+ require 'rubygems'
4
+ require 'highline/import'
5
+
6
+ module ProvisionBase
7
+
8
+ class StringProc < Proc
9
+ def to_s(*args)
10
+ self.call(*args)
11
+ end
12
+ end
13
+
14
+ def self.get_user
15
+ StringProc.new do
16
+ ask("Enter your user name on the remote server: ") do
17
+ |q| q.default = ENV['USER']
18
+ end
19
+ end
20
+ end
21
+
22
+ def self.get_password
23
+ StringProc.new do
24
+ ask("Enter your password on the remote server: ") { |q| q.echo = false }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,102 @@
1
+ # ProvisionUbuntu::manifest Setup a new Ubuntu server.
2
+ # Setup a new Ubuntu server with Apache, MySQL, Ruby, and Passenger.
3
+
4
+ # ProvisionUbuntu Documentation
5
+
6
+ require 'provision_base'
7
+ require 'capistrano'
8
+ require 'capistrano/cli'
9
+ require 'hpricot'
10
+ require 'open-uri'
11
+
12
+ class ProvisionUbuntu < Tap::Task
13
+ # <config file documentation>
14
+ config :user, ProvisionBase.get_user
15
+ config :password, ProvisionBase.get_password
16
+
17
+ def process(server)
18
+ get_ubuntu_cap(server).provision
19
+ end
20
+
21
+ def get_ubuntu_cap(server)
22
+ cap = Capistrano::Configuration.new
23
+ cap.logger.level = Capistrano::Logger::TRACE
24
+ cap.set :user, user.to_s
25
+ cap.set :password, password.to_s
26
+
27
+ cap.role :app, server
28
+
29
+ cap.task :provision do
30
+ install_ubuntu_env
31
+ install_ruby
32
+ install_apache
33
+ install_mysql
34
+ install_passenger
35
+ end
36
+
37
+ cap.task :install_ubuntu_env do
38
+ pkgs = %w(build-essential libssl-dev libreadline5-dev zlib1g-dev
39
+ curl git-core git-svn)
40
+ sudo 'aptitude update'
41
+ sudo 'aptitude -y -q full-upgrade'
42
+ sudo "aptitude -y -q install #{pkgs.join(' ')}"
43
+ end
44
+
45
+ cap.task :install_ruby do
46
+ # get latest Ruby Enterprise Edition
47
+ doc = open('http://rubyforge.org/frs/?group_id=5833') { |f| Hpricot(f) }
48
+ link = (doc/'a').detect { |link| link['href'] =~ /\.tar\.gz$/ }['href']
49
+
50
+ run "wget -nv http://rubyforge.org#{link}"
51
+ run "tar xfz ruby-enterprise-*.tar.gz"
52
+
53
+ sudo("./ruby-enterprise-*/installer", :pty => true) do |ch,stream,out|
54
+ next if out.chomp == ''
55
+ print out
56
+ ch.send_data(input = "\n") if out =~ /enter/i
57
+ end
58
+
59
+ sudo "ln -s /opt/ruby-enterprise-* /opt/ruby-enterprise"
60
+ sudo "ln -s /opt/ruby-enterprise/bin/* /usr/local/bin/"
61
+ end
62
+
63
+ cap.task :install_apache do
64
+ pkgs = %w(apache2-mpm-prefork apache2-prefork-dev)
65
+ sudo "aptitude -y -q install #{pkgs.join(' ')}"
66
+ sudo "a2enmod rewrite"
67
+ end
68
+
69
+ cap.task :install_mysql do
70
+ pkgs = %w(libmysql++-dev mysql-server)
71
+ sudo "aptitude -y -q install #{pkgs.join(' ')}"
72
+ end
73
+
74
+ cap.task :install_passenger do
75
+ sudo("/opt/ruby-enterprise/bin/passenger-install-apache2-module",
76
+ :pty => true) do |ch,stream,out|
77
+ next if out.chomp == ''
78
+ print out
79
+ ch.send_data(input = "\n") if out =~ /enter/i
80
+ end
81
+ passenger_root = capture('passenger-config --root').chomp
82
+ sudo "rm -f /tmp/passenger.*"
83
+ put PASSENGER_LOAD.gsub(/ROOT/, passenger_root), '/tmp/passenger.load'
84
+ put PASSENGER_CONF.gsub(/ROOT/, passenger_root), '/tmp/passenger.conf'
85
+ sudo "mv /tmp/passenger.* /etc/apache2/mods-available"
86
+ sudo "a2enmod passenger"
87
+ sudo "/etc/init.d/apache2 force-reload"
88
+ end
89
+
90
+ cap
91
+ end
92
+
93
+ PASSENGER_LOAD = <<EOF
94
+ LoadModule passenger_module ROOT/ext/apache2/mod_passenger.so
95
+ EOF
96
+
97
+ PASSENGER_CONF = <<EOF
98
+ PassengerRoot ROOT
99
+ PassengerRuby /opt/ruby-enterprise/bin/ruby
100
+ PassengerDefaultUser www-data
101
+ EOF
102
+ end
@@ -0,0 +1,103 @@
1
+ # ProvisionVhost::manifest Create a new vhost configuration for Apache remotely.
2
+ # Create a new vhost configuration for Apache remotely.
3
+
4
+ require 'provision_base'
5
+ require 'capistrano'
6
+ require 'capistrano/cli'
7
+
8
+ # ProvisionVhost Documentation
9
+ class ProvisionVhost < Tap::Task
10
+ IP_REGEX = /\b(?:\d{1,3}\.){3}\d{1,3}$/ # not perfect, but works
11
+
12
+ config :user, nil
13
+ config :password, nil
14
+ config :ip, nil, &c.check(nil, IP_REGEX)
15
+ config :docroot, nil
16
+ config :ssl, false, &c.switch
17
+
18
+ def get_ip(server)
19
+ ask("Enter the IP address for the virtual host: ") {
20
+ |q| q.default = `host -t A #{server}`.scan(IP_REGEX)[0] || server
21
+ }
22
+ end
23
+
24
+ def get_docroot(domain)
25
+ ask("Enter the docroot for the virtual host: ") {
26
+ |q| q.default = "/var/www/#{domain}"
27
+ }
28
+ end
29
+
30
+ def process(server, domain)
31
+ self.user ||= ProvisionBase.get_user.call
32
+ self.password ||= ProvisionBase.get_password.call
33
+ self.ip ||= get_ip(server)
34
+ self.docroot ||= get_docroot(domain)
35
+ get_apache_cap(server, domain).provision
36
+ end
37
+
38
+ def get_apache_cap(server, domain)
39
+ cap = Capistrano::Configuration.new
40
+ cap.logger.level = Capistrano::Logger::TRACE
41
+
42
+ cap.set :user, user.to_s
43
+ cap.set :password, password.to_s
44
+
45
+ cap.role :app, server
46
+
47
+ # fix for closure below
48
+ provision = self
49
+
50
+ cap.task :provision do
51
+ conf_text = APACHE_VHOST_CONF
52
+ conf_text += "\n\n#{APACHE_SSL_VHOST_CONF}" if provision.ssl
53
+ conf_text.gsub!('_IP_', provision.ip)
54
+ conf_text.gsub!('_DOCROOT_', provision.docroot)
55
+
56
+ apache_conf_dir = capture('apxs2 -q SYSCONFDIR')
57
+ put conf_text, "/tmp/#{domain}"
58
+ sudo "mv /tmp/#{domain} #{apache_conf_dir}/sites-available/"
59
+ sudo "a2dissite #{domain}"
60
+ sudo "a2ensite #{domain}"
61
+ sudo "apache2ctl graceful"
62
+ end
63
+
64
+ cap
65
+ end
66
+
67
+ APACHE_VHOST_CONF = <<EOF
68
+ NameVirtualHost _IP_:80
69
+
70
+ <VirtualHost _IP_:80>
71
+ ServerName _VHOST_
72
+ DocumentRoot _DOCROOT_/current/public
73
+ CustomLog _DOCROOT_/shared/log/access.log combined
74
+ ErrorLog _DOCROOT_/shared/log/error.log
75
+
76
+ RewriteEngine On
77
+ RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
78
+ RewriteCond %{SCRIPT_FILENAME} !maintenance.html
79
+ RewriteRule ^.*$ /system/maintenance.html [L]
80
+ </VirtualHost>
81
+ EOF
82
+
83
+ APACHE_SSL_VHOST_CONF = <<EOF
84
+ NameVirtualHost _IP_:80
85
+
86
+ <VirtualHost _IP_:443>
87
+ ServerName _VHOST_
88
+ DocumentRoot _DOCROOT_/current/public
89
+ CustomLog _DOCROOT_/shared/log/access.log combined
90
+ ErrorLog _DOCROOT_/shared/log/error.log
91
+
92
+ RewriteEngine On
93
+ RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
94
+ RewriteCond %{SCRIPT_FILENAME} !maintenance.html
95
+ RewriteRule ^.*$ /system/maintenance.html [L]
96
+
97
+ SSLEngine on
98
+ SSLCertificateFile /etc/apache2/certs/_VHOST_.crt
99
+ SSLCertificateKeyFile /etc/apache2/certs/_VHOST_.key
100
+ </VirtualHost>
101
+ EOF
102
+
103
+ end
data/tap.yml ADDED
@@ -0,0 +1,59 @@
1
+ ###############################################################################
2
+ # Tap::Root configurations
3
+ ###############################################################################
4
+
5
+ # The root directory.
6
+ #root:
7
+
8
+ # A hash of (alias, relative path) pairs for aliased
9
+ # subdirectories.
10
+ directories: {}
11
+
12
+ # A hash of (alias, relative path) pairs for aliased
13
+ # absolute paths.
14
+ absolute_paths: {}
15
+
16
+ ###############################################################################
17
+ # Tap::App configurations
18
+ ###############################################################################
19
+
20
+ debug: false
21
+
22
+ force: false
23
+
24
+ quiet: false
25
+
26
+ verbose: false
27
+
28
+ ###############################################################################
29
+ # Tap::Env configurations
30
+ ###############################################################################
31
+
32
+ # Specify files to require when self is activated.
33
+ requires: []
34
+
35
+ # Specify files to load when self is activated.
36
+ loads: []
37
+
38
+ # Specify gems to load as nested Envs. Gems may be
39
+ # specified by name and/or version, like 'gemname >=
40
+ # 1.2'; by default the latest version of the gem is
41
+ # selected.
42
+ #
43
+ # Gems are immediately loaded (via gem) through this
44
+ # method.
45
+ gems: []
46
+
47
+ # Specify configuration files to load as nested
48
+ # Envs.
49
+ env_paths: []
50
+
51
+ load_paths:
52
+ - lib
53
+
54
+ command_paths:
55
+ - cmd
56
+
57
+ generator_paths:
58
+ - lib
59
+
@@ -0,0 +1,37 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "tap_provision_server"
3
+ s.version = "0.1.0"
4
+ s.author = "Clinton R. Nixon"
5
+ s.email = "clinton.nixon@viget.com"
6
+ #s.homepage = "http://rubyforge.org/projects/tap_provision_server/"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.summary = "tap_provision_server"
9
+ s.require_path = "lib"
10
+ s.test_file = "test/tap_test_suite.rb"
11
+ #s.rubyforge_project = "tap_provision_server"
12
+ #s.has_rdoc = true
13
+ s.add_dependency("tap", ">= 0.11.1")
14
+ s.add_dependency('hpricot', '>= 0.6')
15
+ s.add_dependency('capistrano', '>= 2.5.2')
16
+ s.add_dependency('highline', '>= 1.5.0')
17
+
18
+ # list extra rdoc files here.
19
+ s.extra_rdoc_files = %W{
20
+ README
21
+ }
22
+
23
+ # list the files you want to include here. you can
24
+ # check this manifest using 'rake :print_manifest'
25
+ s.files = %W{
26
+ Rakefile
27
+ lib/provision_base.rb
28
+ lib/provision_ubuntu.rb
29
+ lib/provision_vhost.rb
30
+ tap.yml
31
+ tap_provision_server.gemspec
32
+ test/provision_ubuntu_test.rb
33
+ test/provision_vhost_test.rb
34
+ test/tap_test_helper.rb
35
+ test/tap_test_suite.rb
36
+ }
37
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), 'tap_test_helper.rb')
2
+ require 'provision_ubuntu'
3
+
4
+ class ProvisionUbuntuTest < Test::Unit::TestCase
5
+ acts_as_tap_test
6
+
7
+ def test_provision_ubuntu
8
+ # task = ProvisionUbuntu.new :message => "goodnight"
9
+
10
+ # # a simple test
11
+ # assert_equal({:message => 'goodnight'}, task.config)
12
+ # assert_equal "goodnight moon", task.process("moon")
13
+
14
+ # # a more complex test
15
+ # task.execute("moon")
16
+ # assert_equal ["goodnight moon"], app.results(task)
17
+ # assert_audit_equal ExpAudit[[nil, "moon"], [task, "goodnight moon"]], app._results(task)[0]
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), 'tap_test_helper.rb')
2
+ require 'provision_vhost'
3
+
4
+ class ProvisionVhostTest < Test::Unit::TestCase
5
+ acts_as_tap_test
6
+
7
+ def test_provision_vhost
8
+ # task = ProvisionVhost.new :message => "goodnight"
9
+
10
+ # # a simple test
11
+ # assert_equal({:message => 'goodnight'}, task.config)
12
+ # assert_equal "goodnight moon", task.process("moon")
13
+
14
+ # # a more complex test
15
+ # task.execute("moon")
16
+ # assert_equal ["goodnight moon"], app.results(task)
17
+ # assert_audit_equal ExpAudit[[nil, "moon"], [task, "goodnight moon"]], app._results(task)[0]
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'tap'
3
+ require 'tap/test'
@@ -0,0 +1,5 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '../lib')
2
+
3
+ # runs all subsets (see Tap::Test::SubsetTest)
4
+ ENV["ALL"] = "true"
5
+ Dir.glob("./**/*_test.rb").each {|test| require test}
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crnixon-tap_provision_server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Clinton R. Nixon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-08 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: tap
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.11.1
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hpricot
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0.6"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: capistrano
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.5.2
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: highline
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.5.0
54
+ version:
55
+ description:
56
+ email: clinton.nixon@viget.com
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - README
63
+ files:
64
+ - Rakefile
65
+ - lib/provision_base.rb
66
+ - lib/provision_ubuntu.rb
67
+ - lib/provision_vhost.rb
68
+ - tap.yml
69
+ - tap_provision_server.gemspec
70
+ - test/provision_ubuntu_test.rb
71
+ - test/provision_vhost_test.rb
72
+ - test/tap_test_helper.rb
73
+ - test/tap_test_suite.rb
74
+ - README
75
+ has_rdoc: false
76
+ homepage:
77
+ post_install_message:
78
+ rdoc_options: []
79
+
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: "0"
87
+ version:
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "0"
93
+ version:
94
+ requirements: []
95
+
96
+ rubyforge_project:
97
+ rubygems_version: 1.2.0
98
+ signing_key:
99
+ specification_version: 2
100
+ summary: tap_provision_server
101
+ test_files:
102
+ - test/tap_test_suite.rb