apache-vhosts-parser 0.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/lib/apache-vhosts-parser.rb +89 -0
- data/spec/apache_vhosts_parser_spec.rb +96 -0
- metadata +49 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
module ApacheVhostsParser
|
2
|
+
|
3
|
+
class Config
|
4
|
+
attr_reader :vhosts
|
5
|
+
|
6
|
+
|
7
|
+
def initialize tag
|
8
|
+
@tag = tag
|
9
|
+
|
10
|
+
@vhosts = @tag[:children].keep_if do |child|
|
11
|
+
child[:name] == 'virtualhost'
|
12
|
+
end.each do |vhost|
|
13
|
+
|
14
|
+
vhost[:addresses] = vhost[:arguments].map do |hp|
|
15
|
+
host, port = hp.split(':')
|
16
|
+
{
|
17
|
+
host: host,
|
18
|
+
port: port ? port.to_i : nil
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
(vhost[:children] || []).each do |nested|
|
23
|
+
if nested[:type] == 'directive'
|
24
|
+
case nested[:name]
|
25
|
+
when 'servername'
|
26
|
+
vhost[:server_name] = nested[:arguments].first
|
27
|
+
when 'documentroot'
|
28
|
+
vhost[:document_root] = nested[:arguments].first
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def urlFor dir
|
36
|
+
vhosts.each do |h|
|
37
|
+
if h[:document_root] == dir
|
38
|
+
return h[:server_name]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
return nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.parseString str
|
46
|
+
vhosts = []
|
47
|
+
|
48
|
+
tag = {
|
49
|
+
children: []
|
50
|
+
}
|
51
|
+
|
52
|
+
str.split(/\n+/).map(&:strip).each do |line|
|
53
|
+
if m = line.match(/<\s*(\w+)(.*?)>$/)
|
54
|
+
opener, rest = m[1], m[2].to_s.strip.split(/\s+/)
|
55
|
+
new_tag = {
|
56
|
+
name: opener.downcase,
|
57
|
+
type: 'tag',
|
58
|
+
original_name: opener,
|
59
|
+
arguments: rest,
|
60
|
+
parent: tag,
|
61
|
+
children: []
|
62
|
+
}
|
63
|
+
tag[:children] << new_tag
|
64
|
+
tag = new_tag
|
65
|
+
elsif closer = line[/<\/\s*(\w+)>$/, 1]
|
66
|
+
if closer.downcase == tag[:name]
|
67
|
+
tag = tag[:parent]
|
68
|
+
else
|
69
|
+
throw "Mismatched closing tag: #{closer} for #{tag[:original_name]}"
|
70
|
+
end
|
71
|
+
else
|
72
|
+
directive, *arguments = line.split(/\s+/)
|
73
|
+
tag[:children] << {
|
74
|
+
name: directive.downcase,
|
75
|
+
arguments: arguments,
|
76
|
+
type: 'directive',
|
77
|
+
original_name: directive,
|
78
|
+
parent: tag
|
79
|
+
}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
return Config.new(tag)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.parseDirectory dir='/etc/apache2/sites-enabled/'
|
87
|
+
parseString Dir.glob(File.join(dir, '*')).map(&File.method(:read)).join "\n"
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'apache-vhosts-parser'
|
2
|
+
|
3
|
+
describe 'Parser' do
|
4
|
+
it 'should find one virtualhost' do
|
5
|
+
str = <<-eos
|
6
|
+
<VirtualHost>
|
7
|
+
ServerName localhost
|
8
|
+
</VirtualHost>
|
9
|
+
eos
|
10
|
+
|
11
|
+
conf = ApacheVhostsParser.parseString(str)
|
12
|
+
expect(conf.vhosts.count).to be 1
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should find one virtualhost with *:80 as addresses' do
|
16
|
+
str = <<-eos
|
17
|
+
<VirtualHost *:80>
|
18
|
+
ServerName localhost
|
19
|
+
</VirtualHost>
|
20
|
+
eos
|
21
|
+
|
22
|
+
res = ApacheVhostsParser.parseString(str)
|
23
|
+
expect(res.vhosts.count).to be 1
|
24
|
+
expect(res.vhosts.first[:addresses]).to eq [{host: '*', port: 80}]
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should find one virtualhost with *:80 and 127.0.0.1:8080 as addresses' do
|
28
|
+
str = <<-eos
|
29
|
+
<VirtualHost *:80 127.0.0.1:8080 1.2.3.4>
|
30
|
+
ServerName localhost
|
31
|
+
</VirtualHost>
|
32
|
+
eos
|
33
|
+
|
34
|
+
res = ApacheVhostsParser.parseString(str)
|
35
|
+
expect(res.vhosts.count).to be 1
|
36
|
+
expect(res.vhosts.first[:addresses]).to eq [
|
37
|
+
{host: '*', port: 80},
|
38
|
+
{host: '127.0.0.1', port: 8080},
|
39
|
+
{host: '1.2.3.4', port: nil}
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should find one virtualhost with servername localhost' do
|
44
|
+
str = <<-eos
|
45
|
+
<VirtualHost>
|
46
|
+
ServerName localhost
|
47
|
+
</VirtualHost>
|
48
|
+
eos
|
49
|
+
|
50
|
+
res = ApacheVhostsParser.parseString(str)
|
51
|
+
expect(res.vhosts.count).to be 1
|
52
|
+
expect(res.vhosts.first[:server_name]).to eq 'localhost'
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should find 2 virtualhosts' do
|
56
|
+
str = <<-eos
|
57
|
+
<VirtualHost>
|
58
|
+
ServerName localhost
|
59
|
+
</VirtualHost>
|
60
|
+
|
61
|
+
<VirtualHost>
|
62
|
+
ServerName example.com
|
63
|
+
</VirtualHost>
|
64
|
+
eos
|
65
|
+
|
66
|
+
res = ApacheVhostsParser.parseString(str)
|
67
|
+
expect(res.vhosts.count).to be 2
|
68
|
+
expect(res.vhosts.first[:server_name]).to eq 'localhost'
|
69
|
+
expect(res.vhosts.last[:server_name]).to eq 'example.com'
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should find one virtualhost with document root /var/www/example.com' do
|
73
|
+
str = <<-eos
|
74
|
+
<VirtualHost>
|
75
|
+
DocumentRoot /var/www/example.com
|
76
|
+
ServerName localhost
|
77
|
+
</VirtualHost>
|
78
|
+
eos
|
79
|
+
|
80
|
+
res = ApacheVhostsParser.parseString(str)
|
81
|
+
expect(res.vhosts.count).to be 1
|
82
|
+
expect(res.vhosts.first[:document_root]).to eq '/var/www/example.com'
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should find the URL for /var/www/example.com to be example.com' do
|
86
|
+
str = <<-eos
|
87
|
+
<VirtualHost>
|
88
|
+
DocumentRoot /var/www/example.com
|
89
|
+
ServerName example.com
|
90
|
+
</VirtualHost>
|
91
|
+
eos
|
92
|
+
|
93
|
+
res = ApacheVhostsParser.parseString(str)
|
94
|
+
expect(res.urlFor '/var/www/example.com').to eq 'example.com'
|
95
|
+
end
|
96
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: apache-vhosts-parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- François-Marie de Jouvencel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-05-19 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Parses apache2 vhosts. Have a look at the spec files to see how the API
|
15
|
+
works!
|
16
|
+
email: fm.de.jouvencel@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/apache-vhosts-parser.rb
|
22
|
+
- spec/apache_vhosts_parser_spec.rb
|
23
|
+
homepage: https://github.com/djfm/apache-vhosts-parser
|
24
|
+
licenses:
|
25
|
+
- OSL
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 1.8.23
|
45
|
+
signing_key:
|
46
|
+
specification_version: 3
|
47
|
+
summary: Sometimes you need some info from an Apache vhosts file or directory. This
|
48
|
+
gem helps.
|
49
|
+
test_files: []
|