hayabusa 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/hayabusa.gemspec +2 -2
- data/lib/hayabusa.rb +7 -3
- data/lib/hayabusa_ext/mailing.rb +24 -22
- data/lib/hayabusa_fcgi.rb +47 -40
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/hayabusa.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hayabusa}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-08-
|
12
|
+
s.date = %q{2012-08-22}
|
13
13
|
s.description = %q{A threadded web/app-server that focuses on threadding, shared ressources, speed and more.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.executables = ["check_running.rb", "hayabusa_benchmark.rb", "hayabusa_cgi.rb", "hayabusa_fcgi.fcgi", "hayabusa_fcgi.rb", "knjappserver_start.rb"]
|
data/lib/hayabusa.rb
CHANGED
@@ -34,7 +34,8 @@ class Hayabusa
|
|
34
34
|
:default_filetype => "text/html",
|
35
35
|
:max_requests_working => 20,
|
36
36
|
:size_send => 1024,
|
37
|
-
:cleaner_timeout => 300
|
37
|
+
:cleaner_timeout => 300,
|
38
|
+
:mailing_time => 30
|
38
39
|
}.merge(config)
|
39
40
|
|
40
41
|
@config[:smtp_args] = {"smtp_host" => "localhost", "smtp_port" => 25} if !@config[:smtp_args]
|
@@ -422,14 +423,17 @@ class Hayabusa
|
|
422
423
|
|
423
424
|
#This should be done first to be sure it finishes (else we have a serious bug).
|
424
425
|
self.log_puts "Flush out loaded sessions." if @debug
|
425
|
-
|
426
|
+
|
427
|
+
#Flush sessions and mails (only if the modules are loaded).
|
428
|
+
self.sessions_flush if self.respond_to?(:sessions_flush)
|
429
|
+
self.mail_flush if self.respond_to?(:mail_flush)
|
426
430
|
|
427
431
|
self.log_puts "Stopping done..." if @debug
|
428
432
|
}
|
429
433
|
|
430
434
|
#If we cant get a paused-execution in 5 secs - we just force the stop.
|
431
435
|
begin
|
432
|
-
Timeout.timeout(
|
436
|
+
Timeout.timeout(7) do
|
433
437
|
self.paused_exec(&proc_stop)
|
434
438
|
end
|
435
439
|
rescue Timeout::Error, SystemExit, Interrupt
|
data/lib/hayabusa_ext/mailing.rb
CHANGED
@@ -5,12 +5,11 @@ class Hayabusa
|
|
5
5
|
|
6
6
|
def initialize_mailing
|
7
7
|
require "knj/autoload/ping"
|
8
|
-
require "monitor"
|
9
8
|
|
10
9
|
@mails_waiting = []
|
11
10
|
@mails_mutex = Monitor.new
|
12
11
|
@mails_queue_mutex = Monitor.new
|
13
|
-
@mails_timeout = self.timeout(:time =>
|
12
|
+
@mails_timeout = self.timeout(:time => @config[:mailing_time], &self.method(:mail_flush))
|
14
13
|
end
|
15
14
|
|
16
15
|
#Queue a mail for sending. Possible keys are: :subject, :from, :to, :text and :html.
|
@@ -31,7 +30,13 @@ class Hayabusa
|
|
31
30
|
mailobj = Hayabusa::Mail.new({:hb => self, :errors => {}, :status => :waiting}.merge(mail_args))
|
32
31
|
STDOUT.print "Added mail '#{mailobj.__id__}' to the mail-send-queue.\n" if debug
|
33
32
|
@mails_waiting << mailobj
|
34
|
-
|
33
|
+
|
34
|
+
#Try to send right away and raise error instantly if something happens if told to do so.
|
35
|
+
if mail_args[:now] or @config[:mailing_instant]
|
36
|
+
self.mail_flush
|
37
|
+
raise mailobj.args[:error] if mailobj.args[:error]
|
38
|
+
end
|
39
|
+
|
35
40
|
return mailobj
|
36
41
|
end
|
37
42
|
end
|
@@ -53,11 +58,9 @@ class Hayabusa
|
|
53
58
|
return false #Dont run if we dont have a connection to the internet and then properly dont have a connection to the SMTP as well.
|
54
59
|
end
|
55
60
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
require "knj/process_meta"
|
60
|
-
subproc = Knj::Process_meta.new("debug" => @debug, "debug_err" => true, "id" => "hayabusa_mailing")
|
61
|
+
#Use subprocessing to avoid the mail-framework (activesupport and so on, also possible memory leaks in those large frameworks).
|
62
|
+
STDOUT.print "Starting subprocess for mailing.\n" if @debug
|
63
|
+
Knj::Process_meta.new("debug" => @debug, "debug_err" => true, "id" => "hayabusa_mailing") do |subproc|
|
61
64
|
subproc.static("Object", "require", "rubygems")
|
62
65
|
subproc.static("Object", "require", "mail")
|
63
66
|
subproc.static("Object", "require", "#{@config[:knjrbfw_path]}knjrbfw")
|
@@ -80,9 +83,6 @@ class Hayabusa
|
|
80
83
|
|
81
84
|
sleep 1 #sleep so we dont take up too much bandwidth.
|
82
85
|
end
|
83
|
-
ensure
|
84
|
-
subproc.destroy if subproc
|
85
|
-
subproc = nil
|
86
86
|
end
|
87
87
|
|
88
88
|
return nil
|
@@ -91,12 +91,23 @@ class Hayabusa
|
|
91
91
|
|
92
92
|
#This class represents the queued mails.
|
93
93
|
class Mail
|
94
|
+
attr_reader :args
|
95
|
+
|
94
96
|
def initialize(args)
|
95
97
|
@args = args
|
96
98
|
|
97
99
|
raise "No hayabusa-object was given (as :hb)." if !@args[:hb].is_a?(Hayabusa)
|
98
100
|
raise "No :to was given." if !@args[:to]
|
99
101
|
raise "No content was given (:html or :text)." if !@args[:html] and !@args[:text]
|
102
|
+
|
103
|
+
#Test from-argument.
|
104
|
+
if !@args[:from].to_s.strip.empty?
|
105
|
+
#Its ok.
|
106
|
+
elsif !@args[:hb].config[:error_report_from].to_s.strip.empty?
|
107
|
+
@args[:from] = @args[:hb].config[:error_report_from]
|
108
|
+
else
|
109
|
+
raise "Dont know where to take the 'from'-paramter from - none given in appserver config or mail-method-arguments?"
|
110
|
+
end
|
100
111
|
end
|
101
112
|
|
102
113
|
#Returns a key from the arguments.
|
@@ -108,14 +119,6 @@ class Hayabusa
|
|
108
119
|
def send(args = {})
|
109
120
|
STDOUT.print "Sending mail '#{__id__}'.\n" if @args[:hb].debug
|
110
121
|
|
111
|
-
if @args[:from]
|
112
|
-
from = @args[:from]
|
113
|
-
elsif @args[:hb].config[:error_report_from]
|
114
|
-
from = @args[:hb].config[:error_report_from]
|
115
|
-
else
|
116
|
-
raise "Dont know where to take the 'from'-paramter from - none given in appserver config or mail-method-arguments?"
|
117
|
-
end
|
118
|
-
|
119
122
|
if args["proc"]
|
120
123
|
args["proc"].static("Object", "require", "knj/mailobj")
|
121
124
|
mail = args["proc"].new("Knj::Mailobj", @args[:hb].config[:smtp_args])
|
@@ -123,16 +126,15 @@ class Hayabusa
|
|
123
126
|
mail._pm_send_noret("subject=", @args[:subject]) if @args[:subject]
|
124
127
|
mail._pm_send_noret("html=", Knj::Strings.email_str_safe(@args[:html])) if @args[:html]
|
125
128
|
mail._pm_send_noret("text=", Knj::Strings.email_str_safe(@args[:text])) if @args[:text]
|
126
|
-
mail._pm_send_noret("from=", from)
|
129
|
+
mail._pm_send_noret("from=", @args[:from])
|
127
130
|
mail._pm_send_noret("send")
|
128
131
|
else
|
129
|
-
require "knj/mailobj"
|
130
132
|
mail = Knj::Mailobj.new(@args[:hb].config[:smtp_args])
|
131
133
|
mail.to = @args[:to]
|
132
134
|
mail.subject = @args[:subject] if @args[:subject]
|
133
135
|
mail.html = Knj::Strings.email_str_safe(@args[:html]) if @args[:html]
|
134
136
|
mail.text = Knj::Strings.email_str_safe(@args[:text]) if @args[:text]
|
135
|
-
mail.from = from
|
137
|
+
mail.from = @args[:from]
|
136
138
|
mail.send
|
137
139
|
end
|
138
140
|
|
data/lib/hayabusa_fcgi.rb
CHANGED
@@ -31,6 +31,8 @@ class Hayabusa::Fcgi
|
|
31
31
|
hayabusa_conf = Hayabusa::FCGI_CONF[:hayabusa]
|
32
32
|
hayabusa_conf.merge!(
|
33
33
|
:cmdline => false,
|
34
|
+
:mailing_timeout => 1,
|
35
|
+
:mailing_instant => true,
|
34
36
|
:port => 0 #Ruby picks random port and we get the actual port after starting the appserver.
|
35
37
|
)
|
36
38
|
|
@@ -84,49 +86,54 @@ class Hayabusa::Fcgi
|
|
84
86
|
|
85
87
|
def fcgi_loop
|
86
88
|
$stderr.puts "[hayabusa] Starting FCGI." if @debug
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
89
|
+
|
90
|
+
begin
|
91
|
+
FCGI.each_cgi do |cgi|
|
92
|
+
begin
|
93
|
+
#cgi.print "Content-Type: text/html\r\n"
|
94
|
+
#cgi.print "\r\n"
|
95
|
+
|
96
|
+
#Set 'cgi'-variable for CGI-tools.
|
97
|
+
@cgi_tools.cgi = cgi
|
98
|
+
@cgi = cgi
|
99
|
+
|
100
|
+
#Evaluate the mode of this instance.
|
101
|
+
self.evaluate_mode
|
102
|
+
|
103
|
+
#Ensure the same FCGI-process isnt active for more than one website.
|
104
|
+
raise "Expected 'HTTP_HAYABUSA_FCGI_CONFIG' to be '#{@hayabusa_fcgi_conf_path}' but it wasnt: '#{cgi.env_table["HTTP_HAYABUSA_FCGI_CONFIG"]}'." if @hayabusa_fcgi_conf_path and @hayabusa_fcgi_conf_path != cgi.env_table["HTTP_HAYABUSA_FCGI_CONFIG"]
|
105
|
+
|
106
|
+
if @fcgi_proxy
|
107
|
+
#Proxy request to the host-FCGI-process.
|
108
|
+
$stderr.puts "[hayabusa] Proxying request." if @debug
|
109
|
+
begin
|
110
|
+
@cgi_tools.proxy_request_to(:cgi => cgi, :http => @fcgi_proxy[:http], :fp_log => @fcgi_proxy[:fp_log])
|
111
|
+
rescue Errno::ECONNABORTED
|
112
|
+
@fcgi_proxy = nil #Force re-evaluate if this process should be host or proxy.
|
113
|
+
raise
|
114
|
+
end
|
115
|
+
else
|
116
|
+
self.handle_fcgi_request(:cgi => cgi)
|
110
117
|
end
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
118
|
+
rescue Exception => e
|
119
|
+
cgi.print "Content-Type: text/html\r\n"
|
120
|
+
cgi.print "\r\n"
|
121
|
+
cgi.print Knj::Errors.error_str(e, :html => true)
|
122
|
+
|
123
|
+
if @hayabusa
|
124
|
+
@hayabusa.log_puts e.inspect
|
125
|
+
@hayabusa.log_puts e.backtrace
|
126
|
+
else
|
127
|
+
STDERR.puts e.inspect
|
128
|
+
STDERR.puts e.backtrace
|
129
|
+
end
|
130
|
+
ensure
|
131
|
+
@cgi = nil
|
132
|
+
@cgi_tools.cgi = nil
|
125
133
|
end
|
126
|
-
ensure
|
127
|
-
@cgi = nil
|
128
|
-
@cgi_tools.cgi = nil
|
129
134
|
end
|
135
|
+
ensure
|
136
|
+
@hayabusa.stop if @hayabusa
|
130
137
|
end
|
131
138
|
end
|
132
139
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: hayabusa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-08-
|
13
|
+
date: 2012-08-22 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -249,7 +249,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
249
249
|
requirements:
|
250
250
|
- - ">="
|
251
251
|
- !ruby/object:Gem::Version
|
252
|
-
hash: -
|
252
|
+
hash: -1836290877562781605
|
253
253
|
segments:
|
254
254
|
- 0
|
255
255
|
version: "0"
|