2010-05-05 16:25:07 +00:00
|
|
|
require 'fileutils'
|
|
|
|
|
2010-05-04 15:48:59 +00:00
|
|
|
Dir[File.join(File.dirname(__FILE__), '*.rb')].each { |f| require f }
|
2010-04-27 20:11:47 +00:00
|
|
|
|
|
|
|
module Apache
|
|
|
|
class Config
|
|
|
|
class << self
|
2010-05-05 16:25:07 +00:00
|
|
|
attr_accessor :line_indent, :config, :rotate_logs_path
|
2010-05-04 15:48:59 +00:00
|
|
|
|
2010-04-27 20:11:47 +00:00
|
|
|
include Apache::Master
|
|
|
|
include Apache::Quoteize
|
2010-04-27 21:00:43 +00:00
|
|
|
include Apache::Permissions
|
2010-05-05 14:44:20 +00:00
|
|
|
include Apache::Directories
|
|
|
|
include Apache::Logging
|
2010-05-05 16:25:07 +00:00
|
|
|
include Apache::Performance
|
|
|
|
include Apache::Rewrites
|
2010-04-27 20:11:47 +00:00
|
|
|
|
2010-05-04 21:04:44 +00:00
|
|
|
def build(target = nil, &block)
|
2010-05-04 15:48:59 +00:00
|
|
|
reset!
|
2010-04-27 20:11:47 +00:00
|
|
|
|
|
|
|
self.instance_eval(&block)
|
2010-05-05 14:44:20 +00:00
|
|
|
|
2010-05-05 16:25:07 +00:00
|
|
|
if target
|
|
|
|
FileUtils.mkdir_p File.split(target).first
|
|
|
|
File.open(target, 'w') { |f| f.puts @config * "\n" }
|
|
|
|
end
|
2010-05-05 14:44:20 +00:00
|
|
|
|
|
|
|
@config
|
2010-05-04 15:48:59 +00:00
|
|
|
end
|
2010-04-27 20:11:47 +00:00
|
|
|
|
2010-05-04 15:48:59 +00:00
|
|
|
# Reset the current settings
|
|
|
|
def reset!
|
|
|
|
@config = []
|
|
|
|
@line_indent = 0
|
2010-04-27 20:11:47 +00:00
|
|
|
end
|
2010-04-28 20:19:03 +00:00
|
|
|
|
2010-05-04 15:48:59 +00:00
|
|
|
# Indent the string by the current @line_indent level
|
2010-05-05 16:25:07 +00:00
|
|
|
def indent(string_or_array)
|
|
|
|
case string_or_array
|
|
|
|
when Array
|
|
|
|
string_or_array.collect { |s| indent(s) }
|
|
|
|
else
|
|
|
|
" " * (@line_indent * 2) + string_or_array.to_s
|
|
|
|
end
|
2010-04-28 20:19:03 +00:00
|
|
|
end
|
|
|
|
|
2010-05-04 15:48:59 +00:00
|
|
|
# Add the string to the current config
|
2010-04-28 20:19:03 +00:00
|
|
|
def <<(string)
|
|
|
|
@config << indent(string)
|
|
|
|
end
|
2010-05-04 15:48:59 +00:00
|
|
|
|
2010-05-05 16:25:07 +00:00
|
|
|
def +(other)
|
|
|
|
@config += other
|
|
|
|
end
|
|
|
|
|
2010-05-04 15:48:59 +00:00
|
|
|
# Apachify a string
|
|
|
|
#
|
|
|
|
# Split the provided name on underscores and capitalize the individual parts
|
|
|
|
def apachify(name)
|
2010-05-05 16:25:07 +00:00
|
|
|
case name
|
|
|
|
when String, Symbol
|
|
|
|
name.to_s.split("_").collect(&:capitalize).join.gsub('Ssl', 'SSL')
|
|
|
|
when Array
|
|
|
|
name.collect { |n| apachify(n) }
|
|
|
|
end
|
2010-05-04 15:48:59 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# Handle options that aren't specially handled
|
|
|
|
def method_missing(method, *args)
|
|
|
|
if method.to_s[-1..-1] == "!"
|
|
|
|
method = method.to_s[0..-2].to_sym
|
|
|
|
else
|
|
|
|
args = *quoteize(*args)
|
|
|
|
end
|
|
|
|
|
|
|
|
self << [ apachify(method), *args ] * ' '
|
|
|
|
end
|
|
|
|
|
|
|
|
# Handle creating block methods
|
|
|
|
def block_methods(*methods)
|
|
|
|
methods.each do |method|
|
|
|
|
self.class.class_eval <<-EOT
|
|
|
|
def #{method}(*name, &block)
|
|
|
|
blockify(apachify("#{method}"), name, &block)
|
|
|
|
end
|
|
|
|
EOT
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-05-05 14:44:20 +00:00
|
|
|
def if_module(mod, &block)
|
|
|
|
blockify(apachify('if_module'), "#{mod}_module".to_sym, &block)
|
|
|
|
end
|
|
|
|
|
|
|
|
def directory(dir, &block)
|
|
|
|
directory? dir
|
|
|
|
blockify(apachify('directory'), dir, &block)
|
|
|
|
end
|
|
|
|
|
2010-05-05 16:25:07 +00:00
|
|
|
def if_environment(env, &block)
|
|
|
|
self.instance_eval(&block) if APACHE_ENV == env
|
|
|
|
end
|
|
|
|
|
2010-05-04 15:48:59 +00:00
|
|
|
# Handle the blockification of a provided block
|
|
|
|
def blockify(tag_name, name, &block)
|
|
|
|
start = [ tag_name ]
|
|
|
|
|
|
|
|
case name
|
|
|
|
when String
|
2010-05-05 14:44:20 +00:00
|
|
|
start << quoteize(name).first
|
2010-05-04 15:48:59 +00:00
|
|
|
when Array
|
2010-05-05 14:44:20 +00:00
|
|
|
start << (quoteize(*name) * " ")
|
|
|
|
when Symbol
|
|
|
|
start << name.to_s
|
2010-05-04 15:48:59 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
start = start.join(' ')
|
|
|
|
|
2010-05-05 14:44:20 +00:00
|
|
|
self << "" if (@line_indent == 0)
|
2010-05-04 15:48:59 +00:00
|
|
|
self << "<#{start}>"
|
|
|
|
@line_indent += 1
|
|
|
|
self.instance_eval(&block)
|
|
|
|
@line_indent -= 1
|
|
|
|
self << "</#{tag_name}>"
|
|
|
|
end
|
2010-05-05 14:44:20 +00:00
|
|
|
|
|
|
|
def apache_include(*opts)
|
|
|
|
self << "Include #{opts * " "}"
|
|
|
|
end
|
|
|
|
|
2010-05-05 16:25:07 +00:00
|
|
|
def rotatelogs(path, time)
|
|
|
|
"|#{@rotate_logs_path} #{path} #{time}"
|
|
|
|
end
|
|
|
|
|
2010-05-05 14:44:20 +00:00
|
|
|
private
|
|
|
|
def writable?(path)
|
|
|
|
if !File.directory? File.split(path).first
|
|
|
|
puts "[warn] #{path} may not be writable!"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def directory?(path)
|
|
|
|
if !File.directory? path
|
|
|
|
puts "[warn] #{path} does not exist!"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-04-27 20:11:47 +00:00
|
|
|
end
|
|
|
|
|
2010-05-05 16:25:07 +00:00
|
|
|
block_methods :virtual_host, :files_match, :location
|
2010-04-27 20:11:47 +00:00
|
|
|
end
|
|
|
|
end
|