public
Description: My set of personal Thor scripts.
Homepage:
Clone URL: git://github.com/crnixon/thor_tasks.git
David Eisinger (author)
Thu Jan 22 12:47:08 -0800 2009
crnixon (committer)
Fri Jan 23 07:53:16 -0800 2009
commit  1c552b331ef1a694d23edce83ef82b0943ecd467
tree    2006d63a09a615dae483e1c918efde1dd07848f3
parent  98485c0651211a1351e634695e768411a846a9c3
thor_tasks / provision_apache.thor
100644 98 lines (76 sloc) 2.714 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# module: provision_apache
 
class Provision < Thor
  def initialize(*args)
    raise "You must have provision_base installed." unless defined?(BASE_LOADED)
    super(*args)
  end
  
  desc "apache SERVER DOMAIN", "Adds a virtual host config for DOMAIN " +
    "on the remote server SERVER."
  method_options(:user => :optional, :ip => :optional, :ssl => :boolean)
  def apache(server, domain)
    ip_regex = /\b(?:\d{1,3}\.){3}\d{1,3}$/ # not perfect, but works
    get_user_and_password(options)
    
    @ip = options['ip'] || \
      ask("Enter the IP address for the virtual host: ") {
        |q| q.default = `host -t A #{server}`.scan(ip_regex)[0] || server
      }
    
    @docroot = options['docroot'] || \
      ask("Enter the docroot for the virtual host: ") {
        |q| q.default = "/var/www/#{domain}"
      }
    
    get_apache_cap(server, domain, options).provision
  end
  
  private
  
  def get_apache_cap(server, domain, options)
    cap = Capistrano::Configuration.new
    cap.logger.level = Capistrano::Logger::TRACE
 
    cap.set :user, @user
    cap.set :password, @password
    
    cap.role :app, server
    
    # used to make closure below work
    ip = @ip
    docroot = @docroot
    
    cap.task :provision do
      conf_text = APACHE_VHOST_CONF
      conf_text += "\n\n#{APACHE_SSL_VHOST_CONF}" if options[:ssl]
      conf_text.gsub!('_IP_', ip)
      conf_text.gsub!('_DOCROOT_', docroot)
      
      apache_conf_dir = capture('apxs2 -q SYSCONFDIR')
      put conf_text, "/tmp/#{domain}"
      sudo "mv /tmp/#{domain} #{apache_conf_dir}/sites-available/"
      sudo "a2dissite #{domain}"
      sudo "a2ensite #{domain}"
      sudo "apache2ctl graceful"
    end
    
    cap
  end
  
APACHE_VHOST_CONF = <<EOF
NameVirtualHost _IP_:80
 
<VirtualHost _IP_:80>
  ServerName _VHOST_
  DocumentRoot _DOCROOT_/current/public
  CustomLog _DOCROOT_/shared/log/access.log combined
  ErrorLog _DOCROOT_/shared/log/error.log
  
  RewriteEngine On
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
</VirtualHost>
EOF
 
APACHE_SSL_VHOST_CONF = <<EOF
NameVirtualHost _IP_:80
 
<VirtualHost _IP_:443>
  ServerName _VHOST_
  DocumentRoot _DOCROOT_/current/public
  CustomLog _DOCROOT_/shared/log/access.log combined
  ErrorLog _DOCROOT_/shared/log/error.log
  
  RewriteEngine On
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
  
  SSLEngine on
  SSLCertificateFile /etc/apache2/certs/_VHOST_.crt
  SSLCertificateKeyFile /etc/apache2/certs/_VHOST_.key
</VirtualHost>
EOF
  
end