apache-config-generator 0.2 → 0.2.2.1
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/CHANGELOG +6 -0
- data/Manifest +3 -1
- data/README.rdoc +51 -0
- data/Rakefile +6 -0
- data/apache-config-generator.gemspec +4 -4
- data/config/config.reek +4 -0
- data/lib/apache/apachify.rb +140 -0
- data/lib/apache/config.rb +31 -55
- data/lib/apache/directory.rb +3 -16
- data/lib/apache/logging.rb +13 -5
- data/lib/apache/master.rb +21 -29
- data/lib/apache/modules.rb +2 -6
- data/lib/apache/permissions.rb +12 -11
- data/lib/apache/rewrites.rb +104 -101
- data/lib/apache/ssl.rb +4 -5
- metadata +8 -5
- data/lib/apache/quoteize.rb +0 -16
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
CHANGELOG
|
|
2
2
|
README.rdoc
|
|
3
3
|
Rakefile
|
|
4
|
+
apache-config-generator.gemspec
|
|
4
5
|
bin/apache-configurator
|
|
6
|
+
config/config.reek
|
|
5
7
|
lib/apache.rb
|
|
8
|
+
lib/apache/apachify.rb
|
|
6
9
|
lib/apache/config.rb
|
|
7
10
|
lib/apache/directory.rb
|
|
8
11
|
lib/apache/logging.rb
|
|
@@ -11,7 +14,6 @@ lib/apache/modules.rb
|
|
|
11
14
|
lib/apache/mpm_prefork.rb
|
|
12
15
|
lib/apache/performance.rb
|
|
13
16
|
lib/apache/permissions.rb
|
|
14
|
-
lib/apache/quoteize.rb
|
|
15
17
|
lib/apache/rake/create.rb
|
|
16
18
|
lib/apache/rewrites.rb
|
|
17
19
|
lib/apache/ssl.rb
|
data/README.rdoc
CHANGED
|
@@ -19,6 +19,8 @@ Configs center around the Apache::Config.build method:
|
|
|
19
19
|
server_name 'my-cool-website.cool.wow'
|
|
20
20
|
document_root '/var/www/my-cool-website'
|
|
21
21
|
|
|
22
|
+
server_admin! "john@coswellproductions.com"
|
|
23
|
+
|
|
22
24
|
directory '/' do
|
|
23
25
|
options :follow_sym_links, :indexes
|
|
24
26
|
allow_from_all
|
|
@@ -30,5 +32,54 @@ Configs center around the Apache::Config.build method:
|
|
|
30
32
|
basic_authentication "My secret", '/etc/apache2/users/global.users', :user => :john
|
|
31
33
|
satisfy :any
|
|
32
34
|
end
|
|
35
|
+
|
|
36
|
+
rewrites "My old content" do
|
|
37
|
+
cond "%{HTTP_REFERER}", '!^my-cool-website\.cool\.wow$'
|
|
38
|
+
rule %r{\.(gif|jpg|png|pdf)$}, '/lol-image-stealer.html', :last => true, :redirect => true
|
|
39
|
+
|
|
40
|
+
rewrite_test '/index.html', '/index.html', :http_referer => 'other.site'
|
|
41
|
+
rewrite_test '/index.gif', '/lol-image-stealer.html', :http_referer => 'other.site'
|
|
42
|
+
rewrite_test '/index.gif', '/index.gif', :http_referer => 'my-cool-website.cool.wow'
|
|
43
|
+
end
|
|
33
44
|
end
|
|
34
45
|
|
|
46
|
+
Notes on how the conversion works:
|
|
47
|
+
|
|
48
|
+
* Methods within the build block are translated into NerdCapsed Apache directives.
|
|
49
|
+
* Directives that house children take blocks that contain the child methods.
|
|
50
|
+
* Directives that expect regular expressions take a Regexp object.
|
|
51
|
+
* Passing a String as a parameter, by default, double-quotes it.
|
|
52
|
+
* Passing in a Symbol does not quote the parameter.
|
|
53
|
+
** Some directives NerdCap Symbols, such as Options
|
|
54
|
+
* Appending an exclamation point to the method turns off quoting.
|
|
55
|
+
* Shortcut methods are defined as modules under the Apache module.
|
|
56
|
+
|
|
57
|
+
There are also sanity checks that occur when configuration is being generated:
|
|
58
|
+
|
|
59
|
+
* Directives that rely on a path will check to see if the path exists.
|
|
60
|
+
* Since you need to use Regexp objects for directives that require a regular expression,
|
|
61
|
+
bad expressions will be flagged by the Ruby interpreter.
|
|
62
|
+
* Rewrite rules can be tested with the rewrite_test method.
|
|
63
|
+
|
|
64
|
+
The above config is transformed into the following:
|
|
65
|
+
|
|
66
|
+
ServerName "my-cool-website.cool.wow"
|
|
67
|
+
DocumentRoot "/var/www/my-cool-website"
|
|
68
|
+
ServerAdmin john@coswellproductions.com
|
|
69
|
+
|
|
70
|
+
<Directory "/">
|
|
71
|
+
Options FollowSymLinks, Indexes
|
|
72
|
+
Allow from all
|
|
73
|
+
</Directory>
|
|
74
|
+
|
|
75
|
+
<LocationMatch "^/secret">
|
|
76
|
+
Deny from all
|
|
77
|
+
|
|
78
|
+
AuthType Basic
|
|
79
|
+
AuthName "My secret"
|
|
80
|
+
AuthUserFile "/etc/apache2/users/global.users"
|
|
81
|
+
Require user john
|
|
82
|
+
</LocationMatch>
|
|
83
|
+
|
|
84
|
+
RewriteCond "%{HTTP_REFERER}" "^!my-cool-website\.cool\.wow"
|
|
85
|
+
RewriteRule "\.(gif|jpg|png|pdf)$" "/lol-image-stealer.html" [L,R]
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
$LOAD_PATH << 'lib'
|
|
2
2
|
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
|
|
3
5
|
require 'apache'
|
|
4
6
|
require 'spec/rake/spectask'
|
|
5
7
|
require 'sdoc'
|
|
@@ -39,3 +41,7 @@ Rake::RDocTask.new do |rdoc|
|
|
|
39
41
|
rdoc.main = 'README.rdoc'
|
|
40
42
|
rdoc.rdoc_dir = 'docs'
|
|
41
43
|
end
|
|
44
|
+
|
|
45
|
+
task :reek do
|
|
46
|
+
system('reek -c config/config.reek lib/*')
|
|
47
|
+
end
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
4
|
s.name = %q{apache-config-generator}
|
|
5
|
-
s.version = "0.2"
|
|
5
|
+
s.version = "0.2.2.1"
|
|
6
6
|
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
|
8
8
|
s.authors = ["John Bintz"]
|
|
9
|
-
s.date = %q{2010-05-
|
|
9
|
+
s.date = %q{2010-05-19}
|
|
10
10
|
s.default_executable = %q{apache-configurator}
|
|
11
11
|
s.description = %q{A Ruby DSL for programmatically generating Apache configs}
|
|
12
12
|
s.email = %q{}
|
|
13
13
|
s.executables = ["apache-configurator"]
|
|
14
|
-
s.extra_rdoc_files = ["CHANGELOG", "README.rdoc", "bin/apache-configurator", "lib/apache.rb", "lib/apache/
|
|
15
|
-
s.files = ["CHANGELOG", "README.rdoc", "Rakefile", "bin/apache-configurator", "lib/apache.rb", "lib/apache/
|
|
14
|
+
s.extra_rdoc_files = ["CHANGELOG", "README.rdoc", "bin/apache-configurator", "lib/apache.rb", "lib/apache/apachify.rb", "lib/apache/config.rb", "lib/apache/directory.rb", "lib/apache/logging.rb", "lib/apache/master.rb", "lib/apache/modules.rb", "lib/apache/mpm_prefork.rb", "lib/apache/performance.rb", "lib/apache/permissions.rb", "lib/apache/rake/create.rb", "lib/apache/rewrites.rb", "lib/apache/ssl.rb"]
|
|
15
|
+
s.files = ["CHANGELOG", "README.rdoc", "Rakefile", "apache-config-generator.gemspec", "bin/apache-configurator", "config/config.reek", "lib/apache.rb", "lib/apache/apachify.rb", "lib/apache/config.rb", "lib/apache/directory.rb", "lib/apache/logging.rb", "lib/apache/master.rb", "lib/apache/modules.rb", "lib/apache/mpm_prefork.rb", "lib/apache/performance.rb", "lib/apache/permissions.rb", "lib/apache/rake/create.rb", "lib/apache/rewrites.rb", "lib/apache/ssl.rb", "skel/Rakefile", "skel/config.yml", "Manifest"]
|
|
16
16
|
s.homepage = %q{}
|
|
17
17
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Apache-config-generator", "--main", "README.rdoc"]
|
|
18
18
|
s.require_paths = ["lib"]
|
data/config/config.reek
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
module Apache
|
|
2
|
+
module Apachify
|
|
3
|
+
# Apachify a string
|
|
4
|
+
#
|
|
5
|
+
# Split the provided name on underscores and capitalize the individual parts
|
|
6
|
+
# Certain character strings are capitalized to match Apache directive names:
|
|
7
|
+
# * Cgi => CGI
|
|
8
|
+
# * Ssl => SSL
|
|
9
|
+
# * Ldap => LDAP
|
|
10
|
+
def apachify
|
|
11
|
+
self.to_s.split("_").collect { |part|
|
|
12
|
+
part.capitalize!
|
|
13
|
+
|
|
14
|
+
case part
|
|
15
|
+
when 'Ssl', 'Cgi', 'Ldap', 'Url'; part.upcase
|
|
16
|
+
when 'Etag'; 'ETag'
|
|
17
|
+
else; part
|
|
18
|
+
end
|
|
19
|
+
}.join
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Ruby strings
|
|
25
|
+
class String
|
|
26
|
+
include Apache::Apachify
|
|
27
|
+
|
|
28
|
+
alias :optionify :apachify
|
|
29
|
+
|
|
30
|
+
def commentize
|
|
31
|
+
self.split("\n")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def quoteize
|
|
35
|
+
%{"#{self}"}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
alias :blockify :quoteize
|
|
39
|
+
|
|
40
|
+
def headerize
|
|
41
|
+
"#{self.quoteize}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def replace_placeholderize(opts)
|
|
45
|
+
self.gsub(%r{%\{([^\}]+)\}}) do |match|
|
|
46
|
+
key = $1.downcase.to_sym
|
|
47
|
+
opts[key] || ''
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Ruby symbols
|
|
53
|
+
class Symbol
|
|
54
|
+
include Apache::Apachify
|
|
55
|
+
|
|
56
|
+
# Turn this into an option for IndexOptions
|
|
57
|
+
def optionify
|
|
58
|
+
output = self.apachify
|
|
59
|
+
output = "-#{output[3..-1]}" if self.to_s[0..3] == 'not_'
|
|
60
|
+
output
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def quoteize
|
|
64
|
+
self.to_s.gsub('_', ' ')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def blockify
|
|
68
|
+
self.to_s
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def headerize
|
|
72
|
+
"#{self.quoteize}"
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
class Fixnum
|
|
77
|
+
def quoteize; self; end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Ruby arrays
|
|
81
|
+
class Array
|
|
82
|
+
# Apachify all the elements within this array
|
|
83
|
+
def apachify
|
|
84
|
+
self.collect(&:apachify)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def quoteize
|
|
88
|
+
self.collect(&:quoteize)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def quoteize!
|
|
92
|
+
self.collect!(&:quoteize)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def blockify
|
|
96
|
+
self.quoteize * " "
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
alias :commentize :to_a
|
|
100
|
+
|
|
101
|
+
def headerize
|
|
102
|
+
"#{self.first.quoteize} #{self.last}"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def rewrite_cond_optionify
|
|
106
|
+
self.collect do |opt|
|
|
107
|
+
{
|
|
108
|
+
:or => 'OR',
|
|
109
|
+
:case_insensitive => 'NC',
|
|
110
|
+
:no_vary => 'NV'
|
|
111
|
+
}[opt]
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def rewrite_option_listify
|
|
116
|
+
(!self.empty?) ? "[#{self * ','}]" : nil
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Ruby hashes
|
|
121
|
+
class Hash
|
|
122
|
+
REWRITE_RULE_CONDITIONS = {
|
|
123
|
+
:last => 'L',
|
|
124
|
+
:forbidden => 'F',
|
|
125
|
+
:no_escape => 'NE',
|
|
126
|
+
:redirect => lambda { |val| val == true ? 'R' : "R=#{val}" },
|
|
127
|
+
:pass_through => 'PT',
|
|
128
|
+
:preserve_query_string => 'QSA',
|
|
129
|
+
:query_string_append => 'QSA',
|
|
130
|
+
:env => lambda { |val| "E=#{val}" }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
def rewrite_rule_optionify
|
|
134
|
+
self.collect do |key, value|
|
|
135
|
+
what = REWRITE_RULE_CONDITIONS[key]
|
|
136
|
+
what = what.call(value) if what.kind_of? Proc
|
|
137
|
+
what
|
|
138
|
+
end.compact.sort
|
|
139
|
+
end
|
|
140
|
+
end
|
data/lib/apache/config.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'rubygems'
|
|
1
2
|
require 'fileutils'
|
|
2
3
|
require 'rainbow'
|
|
3
4
|
|
|
@@ -56,7 +57,6 @@ module Apache
|
|
|
56
57
|
attr_accessor :line_indent, :rotate_logs_path
|
|
57
58
|
|
|
58
59
|
include Apache::Master
|
|
59
|
-
include Apache::Quoteize
|
|
60
60
|
include Apache::Permissions
|
|
61
61
|
include Apache::Directories
|
|
62
62
|
include Apache::Logging
|
|
@@ -71,19 +71,27 @@ module Apache
|
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
# Build the provided configuration
|
|
74
|
-
def
|
|
74
|
+
def build_and_return(&block)
|
|
75
75
|
reset!
|
|
76
76
|
|
|
77
77
|
self.instance_eval(&block)
|
|
78
78
|
|
|
79
|
-
if target
|
|
80
|
-
FileUtils.mkdir_p File.split(target).first
|
|
81
|
-
File.open(target, 'w') { |f| f.puts [ "# Generated by apache-config-generator #{Time.now.to_s}", @config ].flatten * "\n" }
|
|
82
|
-
end
|
|
83
|
-
|
|
84
79
|
@config
|
|
85
80
|
end
|
|
86
81
|
|
|
82
|
+
def build_and_return_if(*conditions, &block)
|
|
83
|
+
build_and_return(&block) if conditions.include? APACHE_ENV
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def build(target, &block)
|
|
87
|
+
config = build_and_return(&block)
|
|
88
|
+
|
|
89
|
+
FileUtils.mkdir_p File.split(target).first
|
|
90
|
+
File.open(target, 'w') { |file| file.puts [ "# Generated by apache-config-generator #{Time.now.to_s}", config ].flatten * "\n" }
|
|
91
|
+
|
|
92
|
+
config
|
|
93
|
+
end
|
|
94
|
+
|
|
87
95
|
# Reset the current settings
|
|
88
96
|
def reset!
|
|
89
97
|
@config = []
|
|
@@ -94,7 +102,7 @@ module Apache
|
|
|
94
102
|
def indent(string_or_array)
|
|
95
103
|
case string_or_array
|
|
96
104
|
when Array
|
|
97
|
-
string_or_array.collect { |
|
|
105
|
+
string_or_array.collect { |line| indent(line) }
|
|
98
106
|
else
|
|
99
107
|
" " * (@line_indent * 2) + string_or_array.to_s
|
|
100
108
|
end
|
|
@@ -115,35 +123,18 @@ module Apache
|
|
|
115
123
|
@config
|
|
116
124
|
end
|
|
117
125
|
|
|
118
|
-
# Apachify a string
|
|
119
|
-
#
|
|
120
|
-
# Split the provided name on underscores and capitalize the individual parts
|
|
121
|
-
# Certain character strings are capitalized to match Apache directive names:
|
|
122
|
-
# * Cgi => CGI
|
|
123
|
-
# * Ssl => SSL
|
|
124
|
-
# * Ldap => LDAP
|
|
125
|
-
def apachify(name)
|
|
126
|
-
case name
|
|
127
|
-
when String, Symbol
|
|
128
|
-
name.to_s.split("_").collect(&:capitalize).join.gsub('Ssl', 'SSL').
|
|
129
|
-
gsub('Cgi', 'CGI').gsub('Ldap', 'LDAP').gsub('Url', 'URL').
|
|
130
|
-
gsub('Etag', 'ETag')
|
|
131
|
-
when Array
|
|
132
|
-
name.collect { |n| apachify(n) }
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
126
|
# Handle options that aren't specially handled
|
|
137
127
|
#
|
|
138
128
|
# Method names are NerdCapsed and paramters are quoted, unless the method ends with !
|
|
139
129
|
def method_missing(method, *args)
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
method_name = method.to_s
|
|
131
|
+
if method_name[-1..-1] == "!"
|
|
132
|
+
method = method_name[0..-2].to_sym
|
|
142
133
|
else
|
|
143
|
-
args
|
|
134
|
+
args.quoteize!
|
|
144
135
|
end
|
|
145
136
|
|
|
146
|
-
self << [ apachify
|
|
137
|
+
self << [ method.apachify, *args ].compact * ' '
|
|
147
138
|
end
|
|
148
139
|
|
|
149
140
|
# Handle creating block methods
|
|
@@ -156,7 +147,7 @@ module Apache
|
|
|
156
147
|
methods.each do |method|
|
|
157
148
|
self.class.class_eval <<-EOT
|
|
158
149
|
def #{method}(*name, &block)
|
|
159
|
-
blockify(
|
|
150
|
+
blockify("#{method}".apachify, name, &block)
|
|
160
151
|
end
|
|
161
152
|
EOT
|
|
162
153
|
end
|
|
@@ -167,25 +158,25 @@ module Apache
|
|
|
167
158
|
# The provided module name is converted into Apache module name format:
|
|
168
159
|
# if_module(:php5) do #=> <IfModule mod_php5>
|
|
169
160
|
def if_module(mod, &block)
|
|
170
|
-
blockify(
|
|
161
|
+
blockify('if_module'.apachify, "#{mod}_module".to_sym, &block)
|
|
171
162
|
end
|
|
172
163
|
|
|
173
164
|
# Create a directory block, checking to see if the source directory exists.
|
|
174
165
|
def directory(dir, &block)
|
|
175
166
|
directory? dir
|
|
176
|
-
blockify(
|
|
167
|
+
blockify('directory'.apachify, dir, &block)
|
|
177
168
|
end
|
|
178
169
|
|
|
179
170
|
# Create a LocationMatch block with the provided Regexp:
|
|
180
171
|
# location_match %r{^/my/location/[a-z0-9]+\.html} do #=> <LocationMatch "^/my/location/[a-z0-9]+\.html">
|
|
181
172
|
def location_match(regexp, &block)
|
|
182
|
-
blockify(
|
|
173
|
+
blockify('location_match'.apachify, regexp.source, &block)
|
|
183
174
|
end
|
|
184
175
|
|
|
185
176
|
# Create a FilesMatch block with the provied Regexp:
|
|
186
177
|
# files_match %r{\.html$} do #=> FilesMatch "\.html$">
|
|
187
178
|
def files_match(regexp, &block)
|
|
188
|
-
blockify(
|
|
179
|
+
blockify('files_match'.apachify, regexp.source, &block)
|
|
189
180
|
end
|
|
190
181
|
|
|
191
182
|
# Only execute the provided block if APACHE_ENV matches one of the provided enviroment symbols:
|
|
@@ -194,31 +185,16 @@ module Apache
|
|
|
194
185
|
self.instance_eval(&block) if env.include?(APACHE_ENV)
|
|
195
186
|
end
|
|
196
187
|
|
|
197
|
-
# Blockify the second parameter of a block
|
|
198
|
-
#
|
|
199
|
-
# The name is processed differently based on input object type:
|
|
200
|
-
# * String - the name is quoteized
|
|
201
|
-
# * Array - all of the array members are quoteized
|
|
202
|
-
# * Symbol - the name is to_s
|
|
203
|
-
def blockify_name(name)
|
|
204
|
-
case name
|
|
205
|
-
when String
|
|
206
|
-
quoteize(name).first
|
|
207
|
-
when Array
|
|
208
|
-
(quoteize(*name) * " ")
|
|
209
|
-
when Symbol
|
|
210
|
-
name.to_s
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
188
|
# Handle the blockification of a provided block
|
|
215
189
|
def blockify(tag_name, name, &block)
|
|
216
|
-
self
|
|
217
|
-
self << "<#{[ tag_name, blockify_name(name) ].compact * ' '}>"
|
|
190
|
+
self + [ '', "<#{[ tag_name, name.blockify ].compact * ' '}>" ]
|
|
218
191
|
@line_indent += 1
|
|
219
192
|
self.instance_eval(&block)
|
|
220
193
|
@line_indent -= 1
|
|
221
|
-
self
|
|
194
|
+
self + [ "</#{tag_name}>", '' ]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def blank_line!
|
|
222
198
|
self << ""
|
|
223
199
|
end
|
|
224
200
|
|
data/lib/apache/directory.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Apache
|
|
|
6
6
|
# The options passed into this method are Apachified:
|
|
7
7
|
# options :exec_cgi, :follow_sym_links #=> Options ExecCGI FollowSymLinks
|
|
8
8
|
def options(*opt)
|
|
9
|
-
create_options_list('
|
|
9
|
+
create_options_list('options'.apachify, *opt)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
# Create an IndexOptions directive
|
|
@@ -14,25 +14,12 @@ module Apache
|
|
|
14
14
|
# The options passed into this method are Apachified:
|
|
15
15
|
# index_options :fancy_indexing, :suppress_description #=> IndexOptions FancyIndexing SuppressDescription
|
|
16
16
|
def index_options(*opt)
|
|
17
|
-
create_options_list('
|
|
17
|
+
create_options_list('index_options'.apachify, *opt)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
private
|
|
21
21
|
def create_options_list(tag, *opt)
|
|
22
|
-
|
|
23
|
-
case o
|
|
24
|
-
when Symbol
|
|
25
|
-
if o.to_s[0..3] == 'not_'
|
|
26
|
-
"-#{apachify(o.to_s[4..-1])}"
|
|
27
|
-
else
|
|
28
|
-
apachify(o)
|
|
29
|
-
end
|
|
30
|
-
else
|
|
31
|
-
apachify(o)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
self << "#{tag} #{opt * " "}"
|
|
22
|
+
self << "#{tag} #{opt.collect(&:optionify) * " "}"
|
|
36
23
|
end
|
|
37
24
|
end
|
|
38
25
|
end
|
data/lib/apache/logging.rb
CHANGED
|
@@ -19,11 +19,16 @@ module Apache
|
|
|
19
19
|
[ :custom, :error, :script, :rewrite ].each do |type|
|
|
20
20
|
class_eval <<-EOT
|
|
21
21
|
def #{type}_log(*opts)
|
|
22
|
-
handle_log '#{type.to_s.capitalize}Log',
|
|
22
|
+
handle_log :tag => '#{type.to_s.capitalize}Log',
|
|
23
|
+
:path => opts.first,
|
|
24
|
+
:additional_options => opts[1..-1]
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
def rotate_#{type}_log(*opts)
|
|
26
|
-
handle_log '#{type.to_s.capitalize}Log',
|
|
28
|
+
handle_log :tag => '#{type.to_s.capitalize}Log',
|
|
29
|
+
:path => opts.first,
|
|
30
|
+
:real_path => rotatelogs(*opts[0..1]),
|
|
31
|
+
:additional_options => opts[2..-1]
|
|
27
32
|
end
|
|
28
33
|
EOT
|
|
29
34
|
end
|
|
@@ -37,9 +42,12 @@ module Apache
|
|
|
37
42
|
end
|
|
38
43
|
|
|
39
44
|
private
|
|
40
|
-
def handle_log(
|
|
41
|
-
writable? path
|
|
42
|
-
|
|
45
|
+
def handle_log(info)
|
|
46
|
+
writable? (path = info[:path])
|
|
47
|
+
|
|
48
|
+
real_path = (info[:real_path] || path).quoteize
|
|
49
|
+
|
|
50
|
+
self << "#{info[:tag]} #{[real_path, info[:additional_options]].flatten * " "}"
|
|
43
51
|
end
|
|
44
52
|
end
|
|
45
53
|
end
|
data/lib/apache/master.rb
CHANGED
|
@@ -8,8 +8,14 @@ module Apache
|
|
|
8
8
|
@config += Modules.build(*modules, &block)
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
# Listen on network interfaces and ports
|
|
12
|
+
#
|
|
13
|
+
# Each provided parameter generates a new Listen line:
|
|
14
|
+
# listen "1.2.3.4:80", "2.3.4.5:80" #=>
|
|
15
|
+
# Listen "1.2.3.4:80"
|
|
16
|
+
# Listen "2.3.4.5:80"
|
|
11
17
|
def listen(*opt)
|
|
12
|
-
opt.each { |
|
|
18
|
+
opt.each { |adapter| self << "Listen #{adapter.quoteize}" }
|
|
13
19
|
end
|
|
14
20
|
alias :listen! :listen
|
|
15
21
|
|
|
@@ -17,9 +23,9 @@ module Apache
|
|
|
17
23
|
# runner('www', 'www-data') #=>
|
|
18
24
|
# User www
|
|
19
25
|
# Group www-data
|
|
20
|
-
def runner(user, group
|
|
26
|
+
def runner(user, group)
|
|
21
27
|
user! user
|
|
22
|
-
group! group
|
|
28
|
+
group! group
|
|
23
29
|
end
|
|
24
30
|
|
|
25
31
|
# Enable Passenger on this server
|
|
@@ -42,27 +48,19 @@ module Apache
|
|
|
42
48
|
end
|
|
43
49
|
|
|
44
50
|
# Set the TCP timeout. Defined here to get around various other timeout methods.
|
|
45
|
-
def timeout(
|
|
46
|
-
self << "Timeout #{
|
|
51
|
+
def timeout(time)
|
|
52
|
+
self << "Timeout #{time}"
|
|
47
53
|
end
|
|
48
54
|
|
|
49
55
|
# Add a comment to the Apache config. Can pass in either a String or Array of comment lines.
|
|
50
|
-
def comment(
|
|
51
|
-
|
|
52
|
-
case c
|
|
53
|
-
when String
|
|
54
|
-
out += c.split("\n")
|
|
55
|
-
when Array
|
|
56
|
-
out += c
|
|
57
|
-
end
|
|
58
|
-
out << ''
|
|
59
|
-
self + out.collect { |line| "# #{line.strip}".strip }
|
|
56
|
+
def comment(what)
|
|
57
|
+
self + [ '', what.commentize, '' ].flatten.collect { |line| "# #{line.strip}".strip }
|
|
60
58
|
end
|
|
61
59
|
|
|
62
60
|
# Create a ScriptAlias, checking to make sure the filesystem path exists.
|
|
63
61
|
def script_alias(uri, path)
|
|
64
62
|
directory? path
|
|
65
|
-
self << %{ScriptAlias #{
|
|
63
|
+
self << %{ScriptAlias #{[ uri, path ].quoteize * ' '}}
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
alias :script_alias! :script_alias
|
|
@@ -86,7 +84,7 @@ module Apache
|
|
|
86
84
|
# Alias a URL to a directory in the filesystem.
|
|
87
85
|
# Used to get around reserved Ruby keyword.
|
|
88
86
|
def apache_alias(*opts)
|
|
89
|
-
self << "Alias #{quoteize
|
|
87
|
+
self << "Alias #{opts.quoteize * " "}"
|
|
90
88
|
end
|
|
91
89
|
|
|
92
90
|
# Set multiple headers to be delivered for a particular section
|
|
@@ -96,27 +94,21 @@ module Apache
|
|
|
96
94
|
# Header set "Content-dispoaition" "attachment" env=only-for-downloads
|
|
97
95
|
def set_header(hash)
|
|
98
96
|
hash.each do |key, value|
|
|
99
|
-
|
|
100
|
-
case value
|
|
101
|
-
when String, Symbol
|
|
102
|
-
output += " #{quoteize(value)}"
|
|
103
|
-
when Array
|
|
104
|
-
output += " #{quoteize(value.first)} #{value.last}"
|
|
105
|
-
end
|
|
106
|
-
self << output
|
|
97
|
+
self << "Header set #{key.quoteize} #{value.headerize}"
|
|
107
98
|
end
|
|
108
99
|
end
|
|
109
100
|
|
|
110
101
|
def server_name(*opts)
|
|
111
102
|
if first = opts.shift
|
|
112
|
-
self << "ServerName #{quoteize
|
|
113
|
-
opts.each { |
|
|
103
|
+
self << "ServerName #{first.quoteize}"
|
|
104
|
+
opts.each { |name| server_alias name } if !opts.empty?
|
|
114
105
|
end
|
|
115
106
|
end
|
|
116
107
|
|
|
117
108
|
def document_root(*opts)
|
|
118
|
-
|
|
119
|
-
|
|
109
|
+
dir = opts.first
|
|
110
|
+
directory? dir
|
|
111
|
+
self << "DocumentRoot #{dir.quoteize}"
|
|
120
112
|
end
|
|
121
113
|
alias :document_root! :document_root
|
|
122
114
|
end
|
data/lib/apache/modules.rb
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
require 'apache/quoteize'
|
|
2
|
-
|
|
3
1
|
module Apache
|
|
4
2
|
# Create lists of modules to load in the Apache 2.2 style (with LoadModule only)
|
|
5
3
|
class Modules
|
|
6
4
|
class << self
|
|
7
|
-
include Apache::Quoteize
|
|
8
|
-
|
|
9
5
|
attr_accessor :modules
|
|
10
6
|
|
|
11
7
|
# Reset the list of modules to output
|
|
@@ -27,7 +23,7 @@ module Apache
|
|
|
27
23
|
def build(*modules, &block)
|
|
28
24
|
reset!
|
|
29
25
|
|
|
30
|
-
modules.each { |
|
|
26
|
+
modules.each { |mod| self.send(mod) }
|
|
31
27
|
self.instance_eval(&block) if block
|
|
32
28
|
|
|
33
29
|
[ '' ] + @modules + [ '' ]
|
|
@@ -37,7 +33,7 @@ module Apache
|
|
|
37
33
|
def method_missing(method, *args)
|
|
38
34
|
module_name = "#{method}_module"
|
|
39
35
|
module_path = args[0] || "modules/mod_#{method}.so"
|
|
40
|
-
@modules << [ 'LoadModule', *
|
|
36
|
+
@modules << [ 'LoadModule', *[ module_name, module_path ].quoteize ] * " "
|
|
41
37
|
end
|
|
42
38
|
end
|
|
43
39
|
end
|
data/lib/apache/permissions.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Apache
|
|
|
21
21
|
#
|
|
22
22
|
# allow_from '127.0.0.1' #=> Allow from "127.0.0.1"
|
|
23
23
|
def allow_from(*where)
|
|
24
|
-
self << "Allow from #{quoteize
|
|
24
|
+
self << "Allow from #{where.quoteize * " "}"
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
# Specify default access order
|
|
@@ -58,26 +58,18 @@ module Apache
|
|
|
58
58
|
# basic_authentication "My other secret", '/my.users', :user => [ :john ]
|
|
59
59
|
def basic_authentication(zone, users_file, requires = {})
|
|
60
60
|
exist? users_file
|
|
61
|
-
|
|
62
|
-
auth_name zone
|
|
61
|
+
authentication_basics(zone, requires)
|
|
63
62
|
auth_user_file users_file
|
|
64
|
-
requires.each do |type, values|
|
|
65
|
-
apache_require type, *values
|
|
66
|
-
end
|
|
67
63
|
end
|
|
68
64
|
|
|
69
65
|
alias :basic_authentication! :basic_authentication
|
|
70
66
|
|
|
71
67
|
# Set up LDAP authentication
|
|
72
68
|
def ldap_authentication(zone, url, requires = {})
|
|
73
|
-
|
|
74
|
-
auth_name zone
|
|
69
|
+
authentication_basics(zone, requires)
|
|
75
70
|
auth_basic_provider :ldap
|
|
76
71
|
authz_ldap_authoritative :on
|
|
77
72
|
auth_ldap_url url
|
|
78
|
-
requires.each do |type, values|
|
|
79
|
-
apache_require type, *values
|
|
80
|
-
end
|
|
81
73
|
end
|
|
82
74
|
|
|
83
75
|
alias :ldap_authentication! :ldap_authentication
|
|
@@ -87,5 +79,14 @@ module Apache
|
|
|
87
79
|
def apache_require(*opts)
|
|
88
80
|
self << "Require #{opts.compact * " "}"
|
|
89
81
|
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
def authentication_basics(zone, requires)
|
|
85
|
+
auth_type :basic
|
|
86
|
+
auth_name zone
|
|
87
|
+
requires.each do |type, values|
|
|
88
|
+
apache_require type, *values
|
|
89
|
+
end
|
|
90
|
+
end
|
|
90
91
|
end
|
|
91
92
|
end
|
data/lib/apache/rewrites.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Apache
|
|
|
9
9
|
# RewriteEngine on
|
|
10
10
|
# RewriteLogLevel 1
|
|
11
11
|
def enable_rewrite_engine(options = {})
|
|
12
|
-
|
|
12
|
+
blank_line!
|
|
13
13
|
rewrite_engine! :on
|
|
14
14
|
options.each do |option, value|
|
|
15
15
|
case option
|
|
@@ -17,7 +17,7 @@ module Apache
|
|
|
17
17
|
rewrite_log_level! value
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
blank_line!
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
# Pass the block to RewriteManager.build
|
|
@@ -27,17 +27,19 @@ module Apache
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def rewrite(*opt, &block)
|
|
30
|
-
raise "You probably want rewrites #{quoteize
|
|
30
|
+
raise "You probably want rewrites #{opt.quoteize * " "} do" if block
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# Create a permanent Redirect
|
|
34
34
|
#
|
|
35
35
|
# r301 '/here', '/there' #=> Redirect permanent "/here" "/there"
|
|
36
36
|
def r301(*opt)
|
|
37
|
-
if
|
|
38
|
-
|
|
37
|
+
if first = opt.first
|
|
38
|
+
if !first.kind_of?(::String)
|
|
39
|
+
raise "First parameter should be a String. Did you mean to wrap this in a rewrites block? #{first}"
|
|
40
|
+
end
|
|
39
41
|
end
|
|
40
|
-
self << "Redirect permanent #{quoteize
|
|
42
|
+
self << "Redirect permanent #{opt.quoteize * " "}"
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
|
|
@@ -49,30 +51,34 @@ module Apache
|
|
|
49
51
|
# Reset the current list of rewrites
|
|
50
52
|
def reset!
|
|
51
53
|
@rewrites = []
|
|
54
|
+
@any_tests = false
|
|
55
|
+
@needs_tests = false
|
|
52
56
|
end
|
|
53
57
|
|
|
54
58
|
# Build rewritable things from the provided block
|
|
55
59
|
def build(*opt, &block)
|
|
56
60
|
reset!
|
|
57
61
|
|
|
58
|
-
@any_tests = false
|
|
59
|
-
@needs_tests = false
|
|
60
62
|
self.instance_eval(&block)
|
|
61
63
|
|
|
62
|
-
name = opt.first
|
|
64
|
+
name = block_name(opt.first)
|
|
63
65
|
|
|
64
|
-
|
|
65
|
-
puts " [#{"rewrite".foreground(:blue)}] no tests found for #{name}"
|
|
66
|
-
end
|
|
66
|
+
show_messages! name
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
end
|
|
68
|
+
[ "# #{name}", @rewrites.collect(&:to_a) ].flatten
|
|
69
|
+
end
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
def block_name(first)
|
|
72
|
+
first_rewrite = @rewrites.first
|
|
74
73
|
|
|
75
|
-
|
|
74
|
+
first || (@rewrites.empty? ? 'unnamed block' : "#{first_rewrite.from} => #{first_rewrite.to}")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def show_messages!(name)
|
|
78
|
+
blue = "rewrite".foreground(:blue)
|
|
79
|
+
|
|
80
|
+
puts " [#{blue}] no tests found for #{name}" if !@any_tests && !@rewrites.empty?
|
|
81
|
+
puts " [#{blue}] #{name} needs more tests" if @needs_tests
|
|
76
82
|
end
|
|
77
83
|
|
|
78
84
|
# Commit the latest rewritable thing to the list of rewrites
|
|
@@ -122,19 +128,18 @@ module Apache
|
|
|
122
128
|
def rewrite_test(from, to, opts = {})
|
|
123
129
|
@any_tests = true
|
|
124
130
|
orig_from = from.dup
|
|
125
|
-
@rewrites.each do |
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
from = pre_from if (r.to == '-')
|
|
130
|
-
from = :http_forbidden if (r.forbidden?)
|
|
131
|
-
break if r.stop_if_match?
|
|
131
|
+
@rewrites.each do |rewrite|
|
|
132
|
+
if rewrite.match?(from, opts)
|
|
133
|
+
from = rewrite.from_tester(from, opts)
|
|
134
|
+
break if rewrite.stop_if_match?
|
|
132
135
|
end
|
|
133
136
|
end
|
|
134
137
|
|
|
135
138
|
if from != to
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
[ "#{orig_from} >> #{to} failed!", "Result: #{from}"
|
|
140
|
+
].each do |line|
|
|
141
|
+
puts " [#{"rewrite".foreground(:blue)}] #{line}"
|
|
142
|
+
end
|
|
138
143
|
end
|
|
139
144
|
end
|
|
140
145
|
|
|
@@ -170,30 +175,16 @@ module Apache
|
|
|
170
175
|
module RegularExpressionMatcher
|
|
171
176
|
# Test this rewritable thing
|
|
172
177
|
def test(from, opts = {})
|
|
173
|
-
from
|
|
174
|
-
replace_placeholders(from, opts)
|
|
178
|
+
from.gsub(@from, @to.gsub(/\$([0-9])/) { |match| '\\' + $1 }).replace_placeholderize(opts)
|
|
175
179
|
end
|
|
176
180
|
|
|
177
181
|
def match?(from, opts = {})
|
|
178
|
-
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
# Replace the placeholders in this rewritable thing
|
|
182
|
-
def replace_placeholders(string, opts)
|
|
183
|
-
opts.each do |opt, value|
|
|
184
|
-
case value
|
|
185
|
-
when String
|
|
186
|
-
string = string.gsub('%{' + opt.to_s.upcase + '}', value)
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
string.gsub(%r{%\{[^\}]+\}}, '')
|
|
182
|
+
from.replace_placeholderize(opts)[@from]
|
|
190
183
|
end
|
|
191
184
|
end
|
|
192
185
|
|
|
193
186
|
# A matchable thing to be extended
|
|
194
187
|
class MatchableThing
|
|
195
|
-
include Apache::Quoteize
|
|
196
|
-
|
|
197
188
|
attr_reader :from, :to
|
|
198
189
|
|
|
199
190
|
# The Apache directive tag for this thing
|
|
@@ -205,12 +196,14 @@ module Apache
|
|
|
205
196
|
end
|
|
206
197
|
|
|
207
198
|
def rule(from, to)
|
|
199
|
+
raise "from must be a Regexp" if (!from.kind_of?(Regexp) && require_regexp?)
|
|
200
|
+
|
|
208
201
|
@from = from
|
|
209
202
|
@to = to
|
|
210
203
|
end
|
|
211
204
|
|
|
212
205
|
def to_s
|
|
213
|
-
"#{tag} #{[
|
|
206
|
+
"#{tag} #{[@from, @to].quoteize.compact.flatten * " "}"
|
|
214
207
|
end
|
|
215
208
|
|
|
216
209
|
def to_a
|
|
@@ -219,6 +212,14 @@ module Apache
|
|
|
219
212
|
|
|
220
213
|
def stop_if_match?; false; end
|
|
221
214
|
def forbidden?; false; end
|
|
215
|
+
def require_regexp?; false; end
|
|
216
|
+
|
|
217
|
+
def from_tester(from, opts)
|
|
218
|
+
from = test(from, opts)
|
|
219
|
+
from = @from if (@to == '-')
|
|
220
|
+
from = :http_forbidden if (forbidden?)
|
|
221
|
+
from
|
|
222
|
+
end
|
|
222
223
|
end
|
|
223
224
|
|
|
224
225
|
# A RewriteRule definition
|
|
@@ -237,33 +238,23 @@ module Apache
|
|
|
237
238
|
# Define the rule, passing in additional options
|
|
238
239
|
#
|
|
239
240
|
# rule %r{^/here}, '/there', { :last => true, :preserve_query_string => true }
|
|
241
|
+
#
|
|
242
|
+
# Options for the options hash are:
|
|
243
|
+
# * :last => true #=> [L]
|
|
244
|
+
# * :forbidden => true #=> [F]
|
|
245
|
+
# * :no_escape => true #=> [NE]
|
|
246
|
+
# * :redirect => true #=> [R]
|
|
247
|
+
# * :redirect => 302 #=> [R=302]
|
|
248
|
+
# * :pass_through => true #=> [PT]
|
|
249
|
+
# * :preserve_query_string => true #=> [QSA]
|
|
250
|
+
# * :query_string_append => true #=> [QSA]
|
|
251
|
+
# * :env => 'what' #=> [E=what]
|
|
240
252
|
def rule(from, to, options = {})
|
|
241
253
|
super(from, to)
|
|
242
254
|
|
|
243
|
-
raise "from must be a Regexp" if !from.kind_of?(Regexp)
|
|
244
|
-
|
|
245
255
|
@input_options = options
|
|
246
256
|
|
|
247
|
-
options = options.
|
|
248
|
-
case key
|
|
249
|
-
when :last
|
|
250
|
-
'L'
|
|
251
|
-
when :forbidden
|
|
252
|
-
'F'
|
|
253
|
-
when :no_escape
|
|
254
|
-
'NE'
|
|
255
|
-
when :redirect
|
|
256
|
-
(value == true) ? 'R' : "R=#{value}"
|
|
257
|
-
when :pass_through
|
|
258
|
-
'PT'
|
|
259
|
-
when :preserve_query_string, :query_string_append
|
|
260
|
-
'QSA'
|
|
261
|
-
when :env
|
|
262
|
-
"E=#{value}"
|
|
263
|
-
end
|
|
264
|
-
end.compact.sort
|
|
265
|
-
|
|
266
|
-
@options = !options.empty? ? "[#{options * ','}]" : nil
|
|
257
|
+
@options = options.rewrite_rule_optionify.rewrite_option_listify
|
|
267
258
|
end
|
|
268
259
|
|
|
269
260
|
# Add a RewriteCondition to this RewriteRule
|
|
@@ -274,37 +265,43 @@ module Apache
|
|
|
274
265
|
@conditions << rewrite_cond
|
|
275
266
|
end
|
|
276
267
|
|
|
268
|
+
def initial_blank!
|
|
269
|
+
@conditions.empty? ? nil : ''
|
|
270
|
+
end
|
|
271
|
+
|
|
277
272
|
def to_s
|
|
278
|
-
"#{tag} #{[
|
|
273
|
+
"#{tag} #{[@from.source.quoteize, @to.quoteize, @options].compact.flatten * " "}"
|
|
279
274
|
end
|
|
280
275
|
|
|
281
276
|
def to_a
|
|
282
|
-
[
|
|
277
|
+
[ initial_blank!, @conditions.collect(&:to_s), super ].flatten
|
|
283
278
|
end
|
|
284
279
|
|
|
285
280
|
# Test this RewriteRule, ensuring the RewriteConds also match
|
|
286
281
|
def test(from, opts = {})
|
|
282
|
+
ensure_opts!(opts)
|
|
287
283
|
opts[:request_uri] = from
|
|
288
284
|
result = from
|
|
289
285
|
|
|
290
286
|
result = super(from, opts) if match?(from, opts)
|
|
291
287
|
|
|
292
|
-
|
|
288
|
+
result.replace_placeholderize(opts)
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def ensure_opts!(opts)
|
|
292
|
+
raise "Options must be a hash" if !opts
|
|
293
|
+
raise "Options must be a hash" if !opts.kind_of? ::Hash
|
|
293
294
|
end
|
|
294
295
|
|
|
295
296
|
def match?(from, opts = {})
|
|
297
|
+
ensure_opts!(opts)
|
|
296
298
|
opts[:request_uri] = from
|
|
297
|
-
ok = true
|
|
298
299
|
|
|
299
|
-
@conditions.each do |
|
|
300
|
-
|
|
300
|
+
@conditions.each do |cond|
|
|
301
|
+
return false if !cond.test(from, opts)
|
|
301
302
|
end
|
|
302
303
|
|
|
303
|
-
|
|
304
|
-
super(from, opts)
|
|
305
|
-
else
|
|
306
|
-
false
|
|
307
|
-
end
|
|
304
|
+
super(from, opts)
|
|
308
305
|
end
|
|
309
306
|
|
|
310
307
|
def stop_if_match?
|
|
@@ -314,25 +311,32 @@ module Apache
|
|
|
314
311
|
def forbidden?
|
|
315
312
|
@input_options[:forbidden]
|
|
316
313
|
end
|
|
314
|
+
|
|
315
|
+
def require_regexp?; true; end
|
|
317
316
|
end
|
|
318
317
|
|
|
319
318
|
# A permanent RedirectMatch
|
|
320
319
|
class RedirectMatchPermanent < MatchableThing
|
|
321
320
|
include RegularExpressionMatcher
|
|
322
321
|
|
|
322
|
+
# The Apache directive for this object.
|
|
323
323
|
def tag; 'RedirectMatch permanent'; end
|
|
324
324
|
|
|
325
|
+
# Define a RedirectMatch rule.
|
|
325
326
|
def rule(from, to)
|
|
326
327
|
super(from, to)
|
|
327
328
|
|
|
328
329
|
raise "from must be a Regexp" if !from.kind_of?(Regexp)
|
|
329
330
|
end
|
|
330
331
|
|
|
332
|
+
# Convert this tag to a String.
|
|
331
333
|
def to_s
|
|
332
|
-
"#{tag} #{[
|
|
334
|
+
"#{tag} #{[@from.source, @to].quoteize.compact.flatten * " "}"
|
|
333
335
|
end
|
|
334
336
|
|
|
337
|
+
# Stop rewrite testing if this object matches.
|
|
335
338
|
def stop_if_match; true; end
|
|
339
|
+
def require_regexp?; true; end
|
|
336
340
|
end
|
|
337
341
|
|
|
338
342
|
# A RewriteCond
|
|
@@ -345,48 +349,47 @@ module Apache
|
|
|
345
349
|
#
|
|
346
350
|
# rule "%{REQUEST_FILENAME}", "^/here", :case_insensitive #=>
|
|
347
351
|
# RewriteCond "%{REQUEST_FILENAME}" "^/here" [NC]
|
|
352
|
+
#
|
|
353
|
+
# Additional parameters can include the following:
|
|
354
|
+
# * :or #=> [OR]
|
|
355
|
+
# * :case_insensitive #=> [NC]
|
|
356
|
+
# * :no_vary #=> [NV]
|
|
348
357
|
def rule(from, to, *opts)
|
|
349
358
|
super(from, to)
|
|
350
359
|
|
|
351
|
-
options = opts.
|
|
352
|
-
case opt
|
|
353
|
-
when :or
|
|
354
|
-
'OR'
|
|
355
|
-
when :case_insensitive
|
|
356
|
-
'NC'
|
|
357
|
-
when :no_vary
|
|
358
|
-
'NV'
|
|
359
|
-
end
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
@options = (!options.empty?) ? "[#{options * ','}]" : nil
|
|
360
|
+
@options = opts.rewrite_cond_optionify.rewrite_option_listify
|
|
363
361
|
end
|
|
364
362
|
|
|
365
363
|
alias :cond :rule
|
|
366
364
|
|
|
365
|
+
# Create a new RewriteCond
|
|
367
366
|
def initialize
|
|
368
367
|
super
|
|
369
368
|
@options = nil
|
|
370
369
|
end
|
|
371
370
|
|
|
371
|
+
# Convert this tag to a String.
|
|
372
372
|
def to_s
|
|
373
|
-
"#{tag} #{[
|
|
373
|
+
"#{tag} #{[@from.quoteize, @to.quoteize, @options].compact.flatten * " "}"
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
def inverse_result?
|
|
377
|
+
@to[0..0] == '!'
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def actual_to
|
|
381
|
+
to = @to
|
|
382
|
+
to = to[1..-1] if inverse_result?
|
|
383
|
+
to
|
|
374
384
|
end
|
|
375
385
|
|
|
376
386
|
# Test this RewriteCond
|
|
377
387
|
def test(from, opts = {})
|
|
378
388
|
super(from, opts)
|
|
379
|
-
source =
|
|
389
|
+
source = @from.replace_placeholderize(opts)
|
|
380
390
|
|
|
381
|
-
to =
|
|
382
|
-
reverse = false
|
|
383
|
-
|
|
384
|
-
if @to[0..0] == '!'
|
|
385
|
-
reverse = true
|
|
386
|
-
to = @to[1..-1]
|
|
387
|
-
end
|
|
391
|
+
to = actual_to
|
|
388
392
|
|
|
389
|
-
result = false
|
|
390
393
|
case to
|
|
391
394
|
when '-f'
|
|
392
395
|
result = opts[:files].include?(source) if opts[:files]
|
|
@@ -394,7 +397,7 @@ module Apache
|
|
|
394
397
|
result = source[Regexp.new(to)]
|
|
395
398
|
end
|
|
396
399
|
|
|
397
|
-
|
|
400
|
+
inverse_result? ? !result : result
|
|
398
401
|
end
|
|
399
402
|
end
|
|
400
403
|
end
|
data/lib/apache/ssl.rb
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
module Apache
|
|
2
2
|
module SSL
|
|
3
3
|
def enable_ssl_engine(options = {})
|
|
4
|
-
self
|
|
5
|
-
self << "SSLEngine on"
|
|
4
|
+
self + [ '', "SSLEngine on" ]
|
|
6
5
|
options.each do |key, value|
|
|
7
|
-
value =
|
|
6
|
+
value = value.quoteize
|
|
8
7
|
case key
|
|
9
8
|
when :certificate_file, :certificate_key_file
|
|
10
|
-
self << "SSL#{apachify
|
|
9
|
+
self << "SSL#{key.apachify} #{value}"
|
|
11
10
|
when :ca_certificate_file
|
|
12
11
|
self << "SSLCACertificateFile #{value}"
|
|
13
12
|
end
|
|
14
13
|
end
|
|
15
|
-
|
|
14
|
+
blank_line!
|
|
16
15
|
end
|
|
17
16
|
end
|
|
18
17
|
end
|
metadata
CHANGED
|
@@ -5,7 +5,9 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 2
|
|
8
|
-
|
|
8
|
+
- 2
|
|
9
|
+
- 1
|
|
10
|
+
version: 0.2.2.1
|
|
9
11
|
platform: ruby
|
|
10
12
|
authors:
|
|
11
13
|
- John Bintz
|
|
@@ -13,7 +15,7 @@ autorequire:
|
|
|
13
15
|
bindir: bin
|
|
14
16
|
cert_chain: []
|
|
15
17
|
|
|
16
|
-
date: 2010-05-
|
|
18
|
+
date: 2010-05-19 00:00:00 -04:00
|
|
17
19
|
default_executable:
|
|
18
20
|
dependencies:
|
|
19
21
|
- !ruby/object:Gem::Dependency
|
|
@@ -39,6 +41,7 @@ extra_rdoc_files:
|
|
|
39
41
|
- README.rdoc
|
|
40
42
|
- bin/apache-configurator
|
|
41
43
|
- lib/apache.rb
|
|
44
|
+
- lib/apache/apachify.rb
|
|
42
45
|
- lib/apache/config.rb
|
|
43
46
|
- lib/apache/directory.rb
|
|
44
47
|
- lib/apache/logging.rb
|
|
@@ -47,7 +50,6 @@ extra_rdoc_files:
|
|
|
47
50
|
- lib/apache/mpm_prefork.rb
|
|
48
51
|
- lib/apache/performance.rb
|
|
49
52
|
- lib/apache/permissions.rb
|
|
50
|
-
- lib/apache/quoteize.rb
|
|
51
53
|
- lib/apache/rake/create.rb
|
|
52
54
|
- lib/apache/rewrites.rb
|
|
53
55
|
- lib/apache/ssl.rb
|
|
@@ -55,8 +57,11 @@ files:
|
|
|
55
57
|
- CHANGELOG
|
|
56
58
|
- README.rdoc
|
|
57
59
|
- Rakefile
|
|
60
|
+
- apache-config-generator.gemspec
|
|
58
61
|
- bin/apache-configurator
|
|
62
|
+
- config/config.reek
|
|
59
63
|
- lib/apache.rb
|
|
64
|
+
- lib/apache/apachify.rb
|
|
60
65
|
- lib/apache/config.rb
|
|
61
66
|
- lib/apache/directory.rb
|
|
62
67
|
- lib/apache/logging.rb
|
|
@@ -65,14 +70,12 @@ files:
|
|
|
65
70
|
- lib/apache/mpm_prefork.rb
|
|
66
71
|
- lib/apache/performance.rb
|
|
67
72
|
- lib/apache/permissions.rb
|
|
68
|
-
- lib/apache/quoteize.rb
|
|
69
73
|
- lib/apache/rake/create.rb
|
|
70
74
|
- lib/apache/rewrites.rb
|
|
71
75
|
- lib/apache/ssl.rb
|
|
72
76
|
- skel/Rakefile
|
|
73
77
|
- skel/config.yml
|
|
74
78
|
- Manifest
|
|
75
|
-
- apache-config-generator.gemspec
|
|
76
79
|
has_rdoc: true
|
|
77
80
|
homepage: ""
|
|
78
81
|
licenses: []
|
data/lib/apache/quoteize.rb
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module Apache
|
|
2
|
-
# Add quotes around parameters as needed
|
|
3
|
-
module Quoteize
|
|
4
|
-
# Add quotes around most parameters, and don't add quotes around Symbols
|
|
5
|
-
def quoteize(*args)
|
|
6
|
-
args.collect do |arg|
|
|
7
|
-
case arg
|
|
8
|
-
when Symbol
|
|
9
|
-
arg.to_s.gsub('_', ' ')
|
|
10
|
-
else
|
|
11
|
-
%{"#{arg}"}
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|