nginx_config_parser 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/tasks/spec.rake ADDED
@@ -0,0 +1,40 @@
1
+ # $Id$
2
+
3
+ if HAVE_SPEC_RAKE_SPECTASK
4
+
5
+ namespace :spec do
6
+
7
+ desc 'Run all specs with basic output'
8
+ Spec::Rake::SpecTask.new(:run) do |t|
9
+ t.spec_opts = PROJ.spec_opts
10
+ t.spec_files = PROJ.specs
11
+ end
12
+
13
+ desc 'Run all specs with text output'
14
+ Spec::Rake::SpecTask.new(:specdoc) do |t|
15
+ t.spec_opts = PROJ.spec_opts + ['--format', 'specdoc']
16
+ t.spec_files = PROJ.specs
17
+ end
18
+
19
+ if HAVE_RCOV
20
+ desc 'Run all specs with RCov'
21
+ Spec::Rake::SpecTask.new(:rcov) do |t|
22
+ t.spec_opts = PROJ.spec_opts
23
+ t.spec_files = PROJ.specs
24
+ t.rcov = true
25
+ t.rcov_opts = PROJ.rcov_opts + ['--exclude', 'spec']
26
+ end
27
+ end
28
+
29
+ end # namespace :spec
30
+
31
+ desc 'Alias to spec:run'
32
+ task :spec => 'spec:run'
33
+
34
+ task :clobber => 'spec:clobber_rcov' if HAVE_RCOV
35
+
36
+ remove_desc_for_task %w(spec:clobber_rcov)
37
+
38
+ end # if HAVE_SPEC_RAKE_SPECTASK
39
+
40
+ # EOF
data/tasks/test.rake ADDED
@@ -0,0 +1,40 @@
1
+ # $Id$
2
+
3
+ require 'rake/testtask'
4
+
5
+ namespace :test do
6
+
7
+ Rake::TestTask.new(:run) do |t|
8
+ t.libs = PROJ.libs
9
+ t.test_files = if test ?f, PROJ.test_file then [PROJ.test_file]
10
+ else PROJ.tests end
11
+ t.ruby_opts += PROJ.ruby_opts
12
+ t.ruby_opts += PROJ.test_opts
13
+ end
14
+
15
+ if HAVE_RCOV
16
+ desc 'Run rcov on the unit tests'
17
+ task :rcov => :clobber_rcov do
18
+ opts = PROJ.rcov_opts.join(' ')
19
+ files = if test ?f, PROJ.test_file then [PROJ.test_file]
20
+ else PROJ.tests end
21
+ files = files.join(' ')
22
+ sh "#{RCOV} #{files} #{opts}"
23
+ end
24
+
25
+ desc 'Remove rcov products'
26
+ task :clobber_rcov do
27
+ rm_r 'coverage' rescue nil
28
+ end
29
+ end
30
+
31
+ end # namespace :test
32
+
33
+ desc 'Alias to test:run'
34
+ task :test => 'test:run'
35
+
36
+ task :clobber => 'test:clobber_rcov' if HAVE_RCOV
37
+
38
+ remove_desc_for_task %w(test:clobber_rcov)
39
+
40
+ # EOF
@@ -0,0 +1,209 @@
1
+ # user and group to run as
2
+ user ez ez;
3
+
4
+ # number of nginx workers
5
+ worker_processes 6;
6
+
7
+ # pid of nginx master process
8
+ pid /var/run/nginx.pid;
9
+
10
+ # Number of worker connections. 1024 is a good default
11
+ events {
12
+ worker_connections 1024;
13
+ }
14
+
15
+ # start the http module where we config http access.
16
+ http {
17
+ # pull in mime-types. You can break out your config
18
+ # into as many include's as you want to make it cleaner
19
+ include /etc/nginx/mime.types;
20
+
21
+ # set a default type for the rare situation that
22
+ # nothing matches from the mimie-type include
23
+ default_type application/octet-stream;
24
+
25
+ # configure log format
26
+ log_format main '$remote_addr - $remote_user [$time_local] '
27
+ '"$request" $status $body_bytes_sent "$http_referer" '
28
+ '"$http_user_agent" "$http_x_forwarded_for"';
29
+
30
+ # main access log
31
+ access_log /var/log/nginx_access.log main;
32
+
33
+ # main error log
34
+ error_log /var/log/nginx_error.log debug;
35
+
36
+ # no sendfile on OSX
37
+ sendfile on;
38
+
39
+ # These are good default values.
40
+ tcp_nopush on;
41
+ tcp_nodelay off;
42
+ # output compression saves bandwidth
43
+ gzip on;
44
+ gzip_http_version 1.0;
45
+ gzip_comp_level 2;
46
+ gzip_proxied any;
47
+ gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml
48
+ application/xml+rss text/javascript;
49
+
50
+
51
+ # this is where you define your mongrel clusters.
52
+ # you need one of these blocks for each cluster
53
+ # and each one needs its own name to refer to it later.
54
+ upstream mongrel {
55
+ server 127.0.0.1:5000;
56
+ server 127.0.0.1:5001;
57
+ server 127.0.0.1:5002;
58
+ }
59
+
60
+
61
+ # the server directive is nginx's virtual host directive.
62
+ server {
63
+ # port to listen on. Can also be set to an IP:PORT
64
+ listen 80;
65
+
66
+ # Set the max size for file uploads to 50Mb
67
+ client_max_body_size 50M;
68
+
69
+ # sets the domain[s] that this vhost server requests for
70
+ # server_name www.[engineyard].com [engineyard].com;
71
+
72
+ # doc root
73
+ root /data/ez/current/public;
74
+
75
+ # vhost specific access log
76
+ access_log /var/log/nginx.vhost.access.log main;
77
+
78
+ # this rewrites all the requests to the maintenance.html
79
+ # page if it exists in the doc root. This is for capistrano's
80
+ # disable web task
81
+ if (-f $document_root/system/maintenance.html) {
82
+ rewrite ^(.*)$ /system/maintenance.html last;
83
+ break;
84
+ }
85
+
86
+ location / {
87
+ # needed to forward user's IP address to rails
88
+ proxy_set_header X-Real-IP $remote_addr;
89
+
90
+ # needed for HTTPS
91
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
92
+ proxy_set_header Host $http_host;
93
+ proxy_redirect false;
94
+ proxy_max_temp_file_size 0;
95
+
96
+ # If the file exists as a static file serve it directly without
97
+ # running all the other rewite tests on it
98
+ if (-f $request_filename) {
99
+ break;
100
+ }
101
+
102
+ # check for index.html for directory index
103
+ # if its there on the filesystem then rewite
104
+ # the url to add /index.html to the end of it
105
+ # and then break to send it to the next config rules.
106
+ if (-f $request_filename/index.html) {
107
+ rewrite (.*) $1/index.html break;
108
+ }
109
+
110
+ # this is the meat of the rails page caching config
111
+ # it adds .html to the end of the url and then checks
112
+ # the filesystem for that file. If it exists, then we
113
+ # rewite the url to have explicit .html on the end
114
+ # and then send it on its way to the next config rule.
115
+ # if there is no file on the fs then it sets all the
116
+ # necessary headers and proxies to our upstream mongrels
117
+ if (-f $request_filename.html) {
118
+ rewrite (.*) $1.html break;
119
+ }
120
+
121
+ if (!-f $request_filename) {
122
+ proxy_pass http://mongrel;
123
+ break;
124
+ }
125
+ }
126
+
127
+ error_page 500 502 503 504 /500.html;
128
+ location = /500.html {
129
+ root /data/ez/current/public;
130
+ }
131
+ }
132
+
133
+ # This server is setup for ssl. Uncomment if
134
+ # you are using ssl as well as port 80.
135
+ server {
136
+ # port to listen on. Can also be set to an IP:PORT
137
+ listen 443;
138
+
139
+ # Set the max size for file uploads to 50Mb
140
+ client_max_body_size 50M;
141
+
142
+ # sets the domain[s] that this vhost server requests for
143
+ # server_name www.[engineyard].com [engineyard].com;
144
+
145
+ # doc root
146
+ root /data/ez/current/public;
147
+
148
+ # vhost specific access log
149
+ access_log /var/log/nginx.vhost.access.log main;
150
+
151
+ # this rewrites all the requests to the maintenance.html
152
+ # page if it exists in the doc root. This is for capistrano's
153
+ # disable web task
154
+ if (-f $document_root/system/maintenance.html) {
155
+ rewrite ^(.*)$ /system/maintenance.html last;
156
+ break;
157
+ }
158
+
159
+ location / {
160
+ # needed to forward user's IP address to rails
161
+ proxy_set_header X-Real-IP $remote_addr;
162
+
163
+ # needed for HTTPS
164
+ proxy_set_header X_FORWARDED_PROTO https;
165
+
166
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
167
+ proxy_set_header Host $http_host;
168
+ proxy_redirect false;
169
+ proxy_max_temp_file_size 0;
170
+
171
+ # If the file exists as a static file serve it directly without
172
+ # running all the other rewite tests on it
173
+ if (-f $request_filename) {
174
+ break;
175
+ }
176
+
177
+ # check for index.html for directory index
178
+ # if its there on the filesystem then rewite
179
+ # the url to add /index.html to the end of it
180
+ # and then break to send it to the next config rules.
181
+ if (-f $request_filename/index.html) {
182
+ rewrite (.*) $1/index.html break;
183
+ }
184
+
185
+ # this is the meat of the rails page caching config
186
+ # it adds .html to the end of the url and then checks
187
+ # the filesystem for that file. If it exists, then we
188
+ # rewite the url to have explicit .html on the end
189
+ # and then send it on its way to the next config rule.
190
+ # if there is no file on the fs then it sets all the
191
+ # necessary headers and proxies to our upstream mongrels
192
+ if (-f $request_filename.html) {
193
+ rewrite (.*) $1.html break;
194
+ }
195
+
196
+ if (!-f $request_filename) {
197
+ proxy_pass http://mongrel;
198
+ break;
199
+ }
200
+ }
201
+
202
+ error_page 500 502 503 504 /500.html;
203
+ location = /500.html {
204
+ root /data/ez/current/public;
205
+ }
206
+ }
207
+
208
+
209
+ }
@@ -0,0 +1,21 @@
1
+ user nobody www;
2
+ worker_processes 1;
3
+
4
+ events {
5
+ worker_connections 1024;
6
+ }
7
+
8
+ http {
9
+ default_type application/octet-stream;
10
+ sendfile on;
11
+ keepalive_timeout 65;
12
+ server {
13
+ listen 80;
14
+ server_name simple.com *.simple.com;
15
+ access_log logs/simple.access.log;
16
+ location / {
17
+ root html;
18
+ index index.html index.htm;
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,69 @@
1
+ $: << File.dirname(__FILE__) + "/../lib"
2
+
3
+ require 'nginx_config_parser'
4
+
5
+ require 'rubygems'
6
+ begin
7
+ require 'test/spec'
8
+ rescue LoadError
9
+ STDERR.puts "Testing requires test-spec; gem install test-spec"
10
+ exit 1
11
+ end
12
+
13
+ context "Nginx Configuration Parser" do
14
+
15
+ specify "can parse simple configuration" do
16
+ parsing :simple do |config|
17
+ assert_equal 2, config.sections.size
18
+ assert_equal %w(events http), config.sections.map { |s| s.name }
19
+ end
20
+ end
21
+
22
+ specify "can parser more complex configuration" do
23
+ assert_nothing_raised do
24
+ parsing :ezra do |config|
25
+ # TODO: More tests
26
+ end
27
+ end
28
+ end
29
+
30
+ specify "skips if statements" do
31
+ result = parse(<<-EOCONFIG)
32
+ start 1;
33
+ if ( an if statement here ) {
34
+ this should all be ignored
35
+ }
36
+ if( this has ( some parenths ) ) {
37
+ but_is_still_ignored ok;
38
+ }
39
+ should_reach_here 1;
40
+ and_this = / {
41
+ should_exist 1;
42
+ }
43
+ EOCONFIG
44
+ assert_equal 2, result.settings.size
45
+ assert_equal 1, result.sections.size
46
+ assert_equal({'should_exist' => 1}, result.sections.first.settings)
47
+ assert_equal(%w(= /), result.sections.first.value)
48
+ assert_nothing_raised do
49
+ result.each do |section|
50
+ assert section.is_a?(NginxConfigParser::Section)
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ #######
57
+ private
58
+ #######
59
+
60
+ def parse(text)
61
+ NginxConfigParser.parse(text)
62
+ end
63
+
64
+ def parsing(scenario)
65
+ fixture = File.dirname(__FILE__) << "/fixtures/#{scenario}/conf/nginx.conf"
66
+ yield parse(File.read(fixture))
67
+ end
68
+
69
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nginx_config_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bruce Williams
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-01-21 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: "== FEATURES/PROBLEMS: * Currently ignores `if' statements (focused on only parsing static config)"
17
+ email: bruce@codefluency.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - History.txt
24
+ - README.txt
25
+ files:
26
+ - History.txt
27
+ - Manifest.txt
28
+ - README.txt
29
+ - Rakefile
30
+ - lib/nginx_config_parser.rb
31
+ - lib/nginx_config_parser/configuration.rb
32
+ - lib/nginx_config_parser/scanner.rb
33
+ - src/scanner.rl
34
+ - tasks/annotations.rake
35
+ - tasks/doc.rake
36
+ - tasks/gem.rake
37
+ - tasks/manifest.rake
38
+ - tasks/ragel.rake
39
+ - tasks/rubyforge.rake
40
+ - tasks/setup.rb
41
+ - tasks/spec.rake
42
+ - tasks/test.rake
43
+ - test/fixtures/ezra/conf/nginx.conf
44
+ - test/fixtures/simple/conf/nginx.conf
45
+ - test/parser_test.rb
46
+ has_rdoc: true
47
+ homepage: http://codefluency.rubyforge.org/nginx_config_parser
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --main
51
+ - README.txt
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements: []
67
+
68
+ rubyforge_project: codefluency
69
+ rubygems_version: 1.0.0
70
+ signing_key:
71
+ specification_version: 2
72
+ summary: A simple nginx.conf parser and emitter
73
+ test_files:
74
+ - test/parser_test.rb