nitro 0.29.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +410 -0
- data/ProjectInfo +36 -44
- data/README +5 -5
- data/doc/AUTHORS +6 -0
- data/doc/RELEASES +159 -2
- data/lib/glue/sweeper.rb +2 -2
- data/lib/glue/webfile.rb +14 -1
- data/lib/nitro.rb +6 -9
- data/lib/nitro/adapter/mongrel.rb +36 -43
- data/lib/nitro/adapter/scgi.rb +1 -1
- data/lib/nitro/adapter/webrick.rb +96 -24
- data/lib/nitro/caching/actions.rb +2 -1
- data/lib/nitro/caching/fragments.rb +1 -8
- data/lib/nitro/caching/output.rb +14 -4
- data/lib/nitro/cgi.rb +19 -21
- data/lib/nitro/cgi/cookie.rb +5 -1
- data/lib/nitro/cgi/request.rb +20 -4
- data/lib/nitro/compiler.rb +74 -28
- data/lib/nitro/compiler/cleanup.rb +1 -1
- data/lib/nitro/compiler/elements.rb +1 -2
- data/lib/nitro/compiler/localization.rb +1 -1
- data/lib/nitro/compiler/markup.rb +1 -1
- data/lib/nitro/compiler/script.rb +52 -44
- data/lib/nitro/compiler/squeeze.rb +4 -3
- data/lib/nitro/compiler/xslt.rb +7 -6
- data/lib/nitro/context.rb +39 -20
- data/lib/nitro/controller.rb +24 -5
- data/lib/nitro/dispatcher.rb +13 -5
- data/lib/nitro/global.rb +63 -0
- data/lib/nitro/helper/feed.rb +432 -0
- data/lib/nitro/helper/form.rb +11 -3
- data/lib/nitro/helper/form/builder.rb +140 -0
- data/lib/nitro/helper/form/controls.rb +2 -1
- data/lib/nitro/helper/javascript.rb +6 -0
- data/lib/nitro/helper/javascript/morphing.rb +13 -6
- data/lib/nitro/helper/xhtml.rb +42 -6
- data/lib/nitro/helper/xml.rb +3 -0
- data/lib/nitro/part.rb +2 -2
- data/lib/nitro/render.rb +7 -2
- data/lib/nitro/router.rb +57 -16
- data/lib/nitro/scaffolding.rb +29 -20
- data/lib/nitro/server.rb +4 -10
- data/lib/nitro/server/drb.rb +1 -1
- data/lib/nitro/server/runner.rb +10 -0
- data/lib/nitro/session.rb +31 -12
- data/lib/nitro/session/drb.rb +13 -1
- data/lib/nitro/session/file.rb +1 -1
- data/lib/nitro/session/memcached.rb +1 -1
- data/lib/nitro/session/memory.rb +1 -1
- data/lib/nitro/session/og.rb +1 -1
- data/lib/nitro/test/testcase.rb +3 -0
- data/proto/public/error.xhtml +5 -5
- data/proto/public/js/controls.js +2 -2
- data/proto/public/js/dragdrop.js +320 -79
- data/proto/public/js/effects.js +200 -152
- data/proto/public/js/prototype.js +284 -63
- data/proto/public/js/scriptaculous.js +7 -5
- data/proto/public/js/unittest.js +11 -0
- data/proto/public/scaffold/advanced_search.xhtml +30 -0
- data/proto/public/scaffold/list.xhtml +8 -1
- data/proto/public/scaffold/search.xhtml +2 -1
- data/proto/script/scgi_service +1 -1
- data/src/part/admin/controller.rb +1 -1
- data/src/part/admin/skin.rb +1 -1
- data/test/nitro/CONFIG.rb +3 -0
- data/test/nitro/adapter/tc_webrick.rb +1 -1
- data/test/nitro/cgi/tc_cookie.rb +1 -1
- data/test/nitro/cgi/tc_request.rb +5 -5
- data/test/nitro/compiler/tc_client_morpher.rb +47 -0
- data/test/nitro/compiler/tc_compiler.rb +2 -0
- data/test/nitro/helper/tc_feed.rb +138 -0
- data/test/nitro/helper/tc_pager.rb +1 -1
- data/test/nitro/helper/tc_rss.rb +1 -1
- data/test/nitro/helper/tc_table.rb +1 -1
- data/test/nitro/helper/tc_xhtml.rb +1 -1
- data/test/nitro/tc_caching.rb +1 -1
- data/test/nitro/tc_cgi.rb +1 -1
- data/test/nitro/tc_context.rb +1 -1
- data/test/nitro/tc_controller.rb +31 -3
- data/test/nitro/tc_controller_aspect.rb +1 -1
- data/test/nitro/tc_dispatcher.rb +1 -1
- data/test/nitro/tc_element.rb +1 -1
- data/test/nitro/tc_flash.rb +1 -1
- data/test/nitro/tc_helper.rb +1 -1
- data/test/nitro/tc_render.rb +6 -6
- data/test/nitro/tc_router.rb +8 -4
- data/test/nitro/tc_server.rb +1 -3
- data/test/nitro/tc_session.rb +1 -3
- metadata +107 -104
- data/Rakefile +0 -232
- data/lib/nitro/adapter/acgi.rb +0 -237
- data/proto/public/Makefile.acgi +0 -40
- data/proto/public/acgi.c +0 -138
data/Rakefile
DELETED
@@ -1,232 +0,0 @@
|
|
1
|
-
require 'rake/rdoctask'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/gempackagetask'
|
4
|
-
|
5
|
-
# Initialize some variables.
|
6
|
-
|
7
|
-
readme = File.read('README')
|
8
|
-
Release = (readme[/^= (.+) README$/, 1] || 'unknown').downcase.tr(" ", "-")
|
9
|
-
Name = Release[/\D+/].sub(/\-+$/, '') || 'unknown'
|
10
|
-
Version = Release[/[\d.]+/] || 'unknown'
|
11
|
-
|
12
|
-
AuthorName, AuthorMail = 'George Moschovitis', 'gm@navel.gr'
|
13
|
-
RubyVersion = '1.8.3'
|
14
|
-
|
15
|
-
# Description = (readme[/README\s+(.+?)\n\n/m, 1] || "unknown").gsub(/\s+/, " ")
|
16
|
-
# Summary = Description[/^.+?>/] || "unknown"
|
17
|
-
|
18
|
-
# DocFiles = %w(README NEWS TODO COPYING GPL)
|
19
|
-
# RDocFiles = DocFiles - %w(GPL)
|
20
|
-
RDocOpts = ["--inline-source", "--line-numbers","--title", Name ]
|
21
|
-
# AdditionalFiles = DocFiles + %w(setup.rb)
|
22
|
-
VersionFile = MainFile = File.join("lib", Name + '.rb')
|
23
|
-
|
24
|
-
RubyForgeProject = Name
|
25
|
-
RubyForgeUser = 'gmosx'
|
26
|
-
Homepage = "http://www.nitrohq.org/"
|
27
|
-
|
28
|
-
task :default => :package
|
29
|
-
|
30
|
-
$NITRO_NO_ENVIRONMENT = true
|
31
|
-
|
32
|
-
# Run the tests.
|
33
|
-
|
34
|
-
Rake::TestTask.new do |t|
|
35
|
-
cwd = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
36
|
-
t.libs << 'test'
|
37
|
-
%w[glue nitro og].each do |dir|
|
38
|
-
t.libs << File.join(cwd, dir, 'lib')
|
39
|
-
end
|
40
|
-
t.test_files = FileList['test/**/tc*.rb']
|
41
|
-
t.verbose = true
|
42
|
-
end
|
43
|
-
|
44
|
-
# Generate RDoc documentation.
|
45
|
-
|
46
|
-
Rake::RDocTask.new do |rd|
|
47
|
-
rd.main = 'README'
|
48
|
-
rd.rdoc_dir = 'rdoc'
|
49
|
-
rd.rdoc_files.include('README', 'INSTALL', 'doc/RELEASES', 'lib/**/*.rb')
|
50
|
-
rd.options << '--all --inline-source'
|
51
|
-
end
|
52
|
-
|
53
|
-
# Build gem.
|
54
|
-
|
55
|
-
spec = Gem::Specification.new do |s|
|
56
|
-
s.name = 'nitro'
|
57
|
-
if File.read('lib/nitro.rb') =~ /Version\s+=\s+'(\d+\.\d+\.\d+)'/
|
58
|
-
s.version = $1
|
59
|
-
else
|
60
|
-
raise 'No version found'
|
61
|
-
end
|
62
|
-
s.summary = 'Nitro Web Engine'
|
63
|
-
s.description =
|
64
|
-
'Nitro provides everything you need to develop real-world, scalable ' +
|
65
|
-
'web applications.'
|
66
|
-
|
67
|
-
s.add_dependency 'glue', "= #{s.version}"
|
68
|
-
s.add_dependency 'og', "= #{s.version}"
|
69
|
-
s.add_dependency 'gen', "= #{s.version}"
|
70
|
-
s.add_dependency 'ruby-breakpoint', '= 0.5'
|
71
|
-
s.add_dependency 'RedCloth', '= 3.0.3'
|
72
|
-
|
73
|
-
s.required_ruby_version = '= 1.8.3'
|
74
|
-
|
75
|
-
s.files = FileList[
|
76
|
-
'[A-Z]*', 'setup.rb', '{bin,benchmark,examples,doc,proto,lib,test,vendor}/**/*'
|
77
|
-
].exclude("_darcs").exclude("_darcs/**/*").exclude('*.og').exclude('**/*.log').to_a
|
78
|
-
|
79
|
-
s.require_path = 'lib'
|
80
|
-
s.autorequire = 'nitro'
|
81
|
-
|
82
|
-
s.has_rdoc = true
|
83
|
-
s.extra_rdoc_files = FileList['[A-Z]*'].to_a
|
84
|
-
s.rdoc_options << '--main' << 'README' << '--title' << 'Nitro Documentation'
|
85
|
-
s.rdoc_options << '--all' << '--inline-source'
|
86
|
-
|
87
|
-
s.test_files = []
|
88
|
-
|
89
|
-
s.bindir = 'bin'
|
90
|
-
s.executables = ['nitro', 'nitrogen']
|
91
|
-
s.default_executable = 'nitro'
|
92
|
-
|
93
|
-
s.author = 'George Moschovitis'
|
94
|
-
s.email = 'gm@navel.gr'
|
95
|
-
s.homepage = 'http://www.nitrohq.com'
|
96
|
-
s.rubyforge_project = 'nitro'
|
97
|
-
end
|
98
|
-
|
99
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
100
|
-
pkg.package_dir = 'dist'
|
101
|
-
pkg.need_zip = true
|
102
|
-
pkg.need_tar = true
|
103
|
-
end
|
104
|
-
|
105
|
-
# Manual install (not recommended).
|
106
|
-
|
107
|
-
task :install do
|
108
|
-
ruby 'install.rb'
|
109
|
-
end
|
110
|
-
|
111
|
-
# Release files to Rubyforge.
|
112
|
-
# The code for this task provided by Florian Gross.
|
113
|
-
|
114
|
-
desc "Publish the release files to RubyForge."
|
115
|
-
task :publish => [:package] do
|
116
|
-
files = ['gem', 'tgz', 'zip'].map { |ext| "dist/#{Release}.#{ext}" }
|
117
|
-
|
118
|
-
if RubyForgeProject then
|
119
|
-
require 'net/http'
|
120
|
-
require 'open-uri'
|
121
|
-
|
122
|
-
changes = ''
|
123
|
-
if File.exist?('doc/RELEASES') then
|
124
|
-
changes_re = /^== \s+ Version \s+ #{Regexp.quote(Version)} \s*
|
125
|
-
(.+?) (?:==|\Z)/mx
|
126
|
-
changes = File.read('doc/RELEASES')[changes_re, 1] || ''
|
127
|
-
end
|
128
|
-
|
129
|
-
project_uri = "http://rubyforge.org/projects/#{RubyForgeProject}/"
|
130
|
-
project_data = open(project_uri) { |data| data.read }
|
131
|
-
group_id = project_data[/[?&]group_id=(\d+)/, 1]
|
132
|
-
raise "Couldn't get group id" unless group_id
|
133
|
-
|
134
|
-
print "#{RubyForgeUser}@rubyforge.org's password: "
|
135
|
-
password = STDIN.gets.chomp
|
136
|
-
|
137
|
-
login_response = Net::HTTP.start('rubyforge.org', 80) do |http|
|
138
|
-
data = [
|
139
|
-
"login=1",
|
140
|
-
"form_loginname=#{RubyForgeUser}",
|
141
|
-
"form_pw=#{password}"
|
142
|
-
].join("&")
|
143
|
-
http.post('/account/login.php', data)
|
144
|
-
end
|
145
|
-
|
146
|
-
cookie = login_response['set-cookie']
|
147
|
-
raise 'Login failed' unless cookie
|
148
|
-
headers = { 'Cookie' => cookie }
|
149
|
-
|
150
|
-
release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
|
151
|
-
release_data = open(release_uri, headers) { |data| data.read }
|
152
|
-
package_id = release_data[/[?&]package_id=(\d+)/, 1]
|
153
|
-
raise "Couldn't get package id" unless package_id
|
154
|
-
|
155
|
-
first_file = true
|
156
|
-
release_id = ""
|
157
|
-
|
158
|
-
files.each do |filename|
|
159
|
-
basename = File.basename(filename)
|
160
|
-
file_ext = File.extname(filename)
|
161
|
-
file_data = File.open(filename, "rb") { |file| file.read }
|
162
|
-
|
163
|
-
puts "Releasing #{basename}..."
|
164
|
-
|
165
|
-
release_response = Net::HTTP.start('rubyforge.org', 80) do |http|
|
166
|
-
release_date = Time.now.strftime('%Y-%m-%d %H:%M')
|
167
|
-
type_map = {
|
168
|
-
'.zip' => '3000',
|
169
|
-
'.tgz' => '3110',
|
170
|
-
'.gz' => '3110',
|
171
|
-
'.gem' => '1400',
|
172
|
-
'.md5sum' => '8100'
|
173
|
-
}; type_map.default = '9999'
|
174
|
-
type = type_map[file_ext]
|
175
|
-
boundary = 'rubyqMY6QN9bp6e4kS21H4y0zxcvoor'
|
176
|
-
|
177
|
-
query_hash = if first_file then
|
178
|
-
{
|
179
|
-
'group_id' => group_id,
|
180
|
-
'package_id' => package_id,
|
181
|
-
'release_name' => Release,
|
182
|
-
'release_date' => release_date,
|
183
|
-
'type_id' => type,
|
184
|
-
'processor_id' => '8000', # Any
|
185
|
-
'release_notes' => '',
|
186
|
-
'release_changes' => changes,
|
187
|
-
'preformatted' => '1',
|
188
|
-
'submit' => '1'
|
189
|
-
}
|
190
|
-
else
|
191
|
-
{
|
192
|
-
'group_id' => group_id,
|
193
|
-
'release_id' => release_id,
|
194
|
-
'package_id' => package_id,
|
195
|
-
'step2' => '1',
|
196
|
-
'type_id' => type,
|
197
|
-
'processor_id' => '8000', # Any
|
198
|
-
'submit' => 'Add This File'
|
199
|
-
}
|
200
|
-
end
|
201
|
-
|
202
|
-
query = '?' + query_hash.map do |(name, value)|
|
203
|
-
[name, URI.encode(value)].join('=')
|
204
|
-
end.join('&')
|
205
|
-
|
206
|
-
data = [
|
207
|
-
"--" + boundary,
|
208
|
-
"Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
|
209
|
-
"Content-Type: application/octet-stream",
|
210
|
-
"Content-Transfer-Encoding: binary",
|
211
|
-
"", file_data, ""
|
212
|
-
].join("\x0D\x0A")
|
213
|
-
|
214
|
-
release_headers = headers.merge(
|
215
|
-
'Content-Type' => "multipart/form-data; boundary=#{boundary}"
|
216
|
-
)
|
217
|
-
|
218
|
-
target = first_file ? '/frs/admin/qrs.php' : '/frs/admin/editrelease.php'
|
219
|
-
http.post(target + query, data, release_headers)
|
220
|
-
end
|
221
|
-
|
222
|
-
if first_file then
|
223
|
-
release_id = release_response.body[/release_id=(\d+)/, 1]
|
224
|
-
raise("Couldn't get release id") unless release_id
|
225
|
-
end
|
226
|
-
|
227
|
-
first_file = false
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
# * George Moschovitis <gm@navel.gr>
|
data/lib/nitro/adapter/acgi.rb
DELETED
@@ -1,237 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
require 'posixlock'
|
3
|
-
|
4
|
-
STDOUT.sync = STDERR.sync = true
|
5
|
-
$VERBOSE = nil
|
6
|
-
|
7
|
-
require 'nitro/context'
|
8
|
-
require 'nitro/dispatcher'
|
9
|
-
require 'nitro/cgi'
|
10
|
-
|
11
|
-
# Speeds things up, more comaptible with OSX.
|
12
|
-
|
13
|
-
Socket.do_not_reverse_lookup = true
|
14
|
-
|
15
|
-
# No multi-threading.
|
16
|
-
|
17
|
-
Og.thread_safe = false if defined?(Og) and Og.respond_to?(:thread_safe)
|
18
|
-
|
19
|
-
module Nitro
|
20
|
-
|
21
|
-
# ACGI Adaptor. ACGI is a language independent,
|
22
|
-
# scalable, open extension to CGI that provides high
|
23
|
-
# performance without the limitations of server
|
24
|
-
# specific APIs.
|
25
|
-
#
|
26
|
-
# This code is directly from the author. Please go to
|
27
|
-
# http://codeforpeople.com/lib/ruby/acgi/ for more
|
28
|
-
# information about ACGI.
|
29
|
-
# or email: ara [dot] t [dot] howard [at] noaa [dot] gov
|
30
|
-
#
|
31
|
-
# It uses a compiled C cgi program to handle
|
32
|
-
# connections compile the acgi.c by executing
|
33
|
-
# "make -f Makefile.acgi" in your public/ folder.
|
34
|
-
# then make your .htaccess redirect all calls to acgi.cgi
|
35
|
-
# instead of fcgi.rb / cgi.rb
|
36
|
-
#
|
37
|
-
#--
|
38
|
-
# gmosx: not tested! Use at your own risk!
|
39
|
-
#++
|
40
|
-
|
41
|
-
class ACGI < ::CGI
|
42
|
-
THIS = File::expand_path $0
|
43
|
-
COMMAND_LINE = [THIS, ARGV].join ' '
|
44
|
-
LOADED = Time::now
|
45
|
-
IPC_DIR = "/tmp/acgi_ipc"
|
46
|
-
CLIENT_LOCK_PATH = File::join IPC_DIR, "client.lock"
|
47
|
-
SERVER_LOCK_PATH = File::join IPC_DIR, "server.lock"
|
48
|
-
SERVER_ENVIRONMENT_PATH = File::join IPC_DIR, "server.environment"
|
49
|
-
SERVER_STDIN_PATH = File::join IPC_DIR, "server.stdin"
|
50
|
-
SERVER_STDOUT_PATH = File::join IPC_DIR, "server.stdout"
|
51
|
-
SERVER_STDERR_PATH = File::join IPC_DIR, "server.stderr"
|
52
|
-
SERVER_PID_PATH = File::join IPC_DIR, "server.pid"
|
53
|
-
|
54
|
-
RE_ENV = %r/^ ([^=]+) = (.*) $/ox
|
55
|
-
RE_NUL = %r/#{ Regexp::escape "\0" }/ox
|
56
|
-
|
57
|
-
SERVER = ENV['ACGI_SERVER'] || ARGV.delete('--server') || ARGV.delete('-s')
|
58
|
-
|
59
|
-
if SERVER
|
60
|
-
trap('HUP'){ exec ::ACGI::COMMAND_LINE }
|
61
|
-
%w( INT KILL TERM ).each{|s| trap(s){ exit }}
|
62
|
-
end
|
63
|
-
|
64
|
-
class << self
|
65
|
-
def each_cgi(*a, &b)
|
66
|
-
if SERVER
|
67
|
-
start_server(*a, &b)
|
68
|
-
else
|
69
|
-
munge_environment
|
70
|
-
@cgi = new(*a)
|
71
|
-
catching_errors{ b[ @cgi ] }
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def start_server(*a, &b)
|
76
|
-
daemon do
|
77
|
-
ENV.clear # __very__ important for speed!
|
78
|
-
aquire_server_lock
|
79
|
-
record_pid
|
80
|
-
loop do
|
81
|
-
load_environment
|
82
|
-
munge_environment
|
83
|
-
@cgi = redirecting_stdin{ new(*a) }
|
84
|
-
redirecting_stdout_and_stderr{ catching_errors{ b[ @cgi ] }}
|
85
|
-
restart_if_updated
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def restart_if_updated
|
91
|
-
# put the full path to your run.rb here if it doesn't work
|
92
|
-
#th = "/path/to/app/run.rb"
|
93
|
-
if File::stat(THIS).mtime > LOADED
|
94
|
-
#if File::stat(th).mtime > LOADED
|
95
|
-
exec COMMAND_LINE
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def aquire_server_lock
|
100
|
-
lockfile = File.open(SERVER_LOCK_PATH)
|
101
|
-
lockfile.reopen(SERVER_LOCK_PATH, 'w')
|
102
|
-
at_exit{ lockfile.close }
|
103
|
-
ret = lockfile.posixlock(File::LOCK_EX|File::LOCK_NB)
|
104
|
-
|
105
|
-
raise("#{ File::basename $0 } already running..") if(!ret or !ret.zero?)
|
106
|
-
end
|
107
|
-
|
108
|
-
def record_pid
|
109
|
-
begin
|
110
|
-
f = File::open(SERVER_PID_PATH)
|
111
|
-
f.reopen(SERVER_PID_PATH, 'w')
|
112
|
-
f.print Process::pid
|
113
|
-
f.chmod 0777 rescue nil
|
114
|
-
ensure
|
115
|
-
f.close
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def env_table
|
120
|
-
SERVER ? (@environment ||= {}) : ENV
|
121
|
-
end
|
122
|
-
|
123
|
-
def env
|
124
|
-
env_table
|
125
|
-
end
|
126
|
-
|
127
|
-
def load_environment
|
128
|
-
begin
|
129
|
-
f = File::open(SERVER_ENVIRONMENT_PATH)
|
130
|
-
f.reopen(SERVER_ENVIRONMENT_PATH, "r")
|
131
|
-
env_table.clear
|
132
|
-
kvs = f.read.chop.split RE_NUL
|
133
|
-
kvs.each do |kv|
|
134
|
-
m = RE_ENV.match(kv)
|
135
|
-
k, v = m[1], m[2]
|
136
|
-
env_table[k] = v
|
137
|
-
end
|
138
|
-
ensure
|
139
|
-
f.close
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
def munge_environment # because CGI::Cookie::parse is broken!
|
144
|
-
env_table['HTTP_COOKIE'] =
|
145
|
-
munge_http_cookie env_table['HTTP_COOKIE']
|
146
|
-
end
|
147
|
-
|
148
|
-
def munge_http_cookie http_cookie
|
149
|
-
return unless http_cookie
|
150
|
-
kvs = http_cookie.split %r/[;,]\s+/o
|
151
|
-
h = Hash::new{|h,k| h[k] = []}
|
152
|
-
kvs.each do |kv|
|
153
|
-
k, v = kv.split %r/=/o, 2
|
154
|
-
next unless k
|
155
|
-
k = CGI::unescape k
|
156
|
-
vs = v.to_s.split(%r/&/).map{|v| CGI::unescape v}
|
157
|
-
h[k].push(*vs)
|
158
|
-
end
|
159
|
-
h.sort.map{|k,vs| [k, vs.join('&')].join('=')}.join('; ')
|
160
|
-
end
|
161
|
-
|
162
|
-
def redirecting_stdin
|
163
|
-
stdin = $stdin
|
164
|
-
begin
|
165
|
-
@stdin = File::open(SERVER_STDIN_PATH)
|
166
|
-
@stdin.reopen(SERVER_STDIN_PATH, "r")
|
167
|
-
$stdin = @stdin
|
168
|
-
yield
|
169
|
-
ensure
|
170
|
-
@stdin.close if @stdin
|
171
|
-
$stdin = stdin
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
def redirecting_stdout_and_stderr
|
176
|
-
stdout, stderr = $stdout, $stderr
|
177
|
-
begin
|
178
|
-
@stdout = File::open(SERVER_STDOUT_PATH)
|
179
|
-
@stdout.reopen(SERVER_STDOUT_PATH, "w")
|
180
|
-
@stderr = File::open(SERVER_STDERR_PATH)
|
181
|
-
@stderr.reopen(SERVER_STDERR_PATH, "w")
|
182
|
-
$stdout, $stderr = @stdout, @stderr
|
183
|
-
yield
|
184
|
-
ensure
|
185
|
-
@stdout.close if @stdout
|
186
|
-
@stderr.close if @stderr
|
187
|
-
$stdout, $stderr = stdout, stderr
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
def catching_errors
|
192
|
-
@cgi ||= CGI::new
|
193
|
-
begin
|
194
|
-
yield
|
195
|
-
rescue Exception => e
|
196
|
-
m, c, b = e.message, e.class, e.backtrace.join("<br>\n")
|
197
|
-
@cgi.out{ "<hr><b><i>#{ m } (#{ c })</b></i><hr><hr>#{ b }" }
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
def daemon
|
202
|
-
exit!(0) if fork
|
203
|
-
Process::setsid
|
204
|
-
exit!(0) if fork
|
205
|
-
# Dir::chdir("/")
|
206
|
-
# File::umask(0)
|
207
|
-
|
208
|
-
# uncomment these if you don't want logs
|
209
|
-
#STDIN.reopen("/dev/null")
|
210
|
-
#STDOUT.reopen("/dev/null", "w")
|
211
|
-
#STDERR.reopen("/dev/null", "w")
|
212
|
-
yield if block_given?
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
def env_table
|
217
|
-
self::class.env_table
|
218
|
-
end
|
219
|
-
def env
|
220
|
-
self::class.env
|
221
|
-
end
|
222
|
-
|
223
|
-
# use this to start the ACGI server.
|
224
|
-
|
225
|
-
def self.start(server)
|
226
|
-
ACGI.each_cgi do |cgi|
|
227
|
-
begin
|
228
|
-
Cgi.process(server, cgi, $stdin, $stdout)
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
end
|
234
|
-
|
235
|
-
end
|
236
|
-
|
237
|
-
# * Ara Howard <ara.t.howard@noaa.gov>
|