public
Description: My set of personal Thor scripts.
Homepage:
Clone URL: git://github.com/crnixon/thor_tasks.git
Clinton R. Nixon (author)
Sat Sep 19 08:31:34 -0700 2009
thor_tasks / nginx.thor
100644 115 lines (94 sloc) 2.988 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# module: nginx
 
require 'fileutils'
 
class Nginx < Thor
  desc "add_site DIRECTORY [HOSTNAME]", "Add a new site to nginx/sites-available"
  def add_site(directory, hostname=nil)
    if !File.exist?(directory) || !File.directory?(directory)
      puts "#{directory} does not exist or is not a directory!"
      exit(0)
    end
    
    directory = File.expand_path(directory)
    hostname ||= "#{File.basename(directory)}.local"
    passenger = true
    rails_env = 'development'
    
    conf_file = nginx_conf('sites-available', hostname)
    if File.exist?(conf_file)
      puts "#{conf_file} already exists!"
    else
      File.open(conf_file, "w") do |file|
        file.write ERB.new(SITE_TEMPLATE).result(binding)
      end
      
      puts "Wrote #{conf_file}"
    end
  end
  
  desc "en_site HOSTNAME", "Enable HOSTNAME"
  def en_site(hostname)
    site_file = nginx_conf('sites-available', hostname)
    
    if File.exists?(site_file)
      run "ln -s #{site_file} #{nginx_conf('sites-enabled', hostname)}"
    else
      puts "#{site_file} does not exist!"
    end
    
    add_host(hostname)
  end
  
  desc "dis_site HOSTNAME", "Disable HOSTNAME"
  def dis_site(hostname)
    run "rm #{nginx_conf('sites-enabled', hostname)}"
    rm_host(hostname)
  end
  
  desc "edit_site HOSTNAME", "Edit configuration for HOSTNAME"
  def edit_site(hostname)
    site_file = nginx_conf('sites-available', hostname)
    
    if File.exists?(site_file)
      run "#{ENV['EDITOR'] || 'mate'} #{site_file}"
    else
      puts "#{site_file} does not exist!"
    end
  end
  
  desc "sites", "Show all available sites"
  def sites
    enabled_sites = Dir[nginx_conf('sites-enabled/*')].map { |site| File.basename(site) }
    Dir[nginx_conf('sites-available/*')].map { |site| File.basename(site) }.each do |site|
      puts "#{enabled_sites.include?(site) ? '*' : ' '} #{File.basename(site)}"
    end
  end
    
  private
  
  def add_host(host, ip='127.0.0.1')
    rm_host(host, ip)
    run %Q{sudo sh -c "echo '#{ip} #{host}' >> /etc/hosts"}
  end
  
  def rm_host(host, ip='127.0.0.1')
    run "sudo perl -pi.bak -e 's/^#{ip.gsub('.', '\.')}\\s+#{host.gsub('.', '\.')}\//;s/^\\n$//' /etc/hosts"
  end
  
  def nginx_dir
    if @nginx_dir.nil?
      @nginx_dir = ENV['NGINX_HOME']
      if @nginx_dir
        FileUtils.mkdir_p(nginx_conf('sites-available'))
        FileUtils.mkdir_p(nginx_conf('sites-enabled'))
      else
        puts "You must define an NGINX_HOME environment variable. Example: NGINX_HOME=/usr/local/nginx"
        exit(0)
      end
    end
    
    @nginx_dir
  end
    
  def nginx_conf(*paths)
    File.join(nginx_dir, 'conf', *paths)
  end
  
  def run(cmd, print=true)
    puts cmd if print
    system cmd
  end
  
SITE_TEMPLATE = %q[
server {
    listen 80;
    server_name <%= hostname %>;
    root <%= directory %>;
 
    passenger_enabled <%= passenger ? 'on' : 'off' %>;
    <% if passenger %>
    rails_env <%= rails_env %>;
    <% end %>
}
]
end