rsence 2.0.0.0.pre
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/INSTALL.rdoc +295 -0
- data/LICENSE +622 -0
- data/README.rdoc +24 -0
- data/VERSION +1 -0
- data/bin/build_client.rb +254 -0
- data/bin/help +6 -0
- data/bin/launch.rb +120 -0
- data/bin/rdoc.sh +2 -0
- data/bin/restart +6 -0
- data/bin/rsence +120 -0
- data/bin/run +6 -0
- data/bin/run.rb +6 -0
- data/bin/save +6 -0
- data/bin/start +6 -0
- data/bin/status +6 -0
- data/bin/stop +6 -0
- data/conf/config.ru +5 -0
- data/conf/default_conf.yaml +337 -0
- data/conf/default_strings.yaml +77 -0
- data/conf/local_conf.yaml +14 -0
- data/conf/unicorn.conf +78 -0
- data/js/comm/comm/autosync/autosync.js +18 -0
- data/js/comm/comm/autosync/js.inc +0 -0
- data/js/comm/comm/comm.js +195 -0
- data/js/comm/comm/js.inc +0 -0
- data/js/comm/comm/queue/js.inc +0 -0
- data/js/comm/comm/queue/queue.js +183 -0
- data/js/comm/comm/session/js.inc +0 -0
- data/js/comm/comm/session/session.js +51 -0
- data/js/comm/comm/sessionwatcher/js.inc +0 -0
- data/js/comm/comm/sessionwatcher/sessionwatcher.js +43 -0
- data/js/comm/comm/transporter/js.inc +0 -0
- data/js/comm/comm/transporter/transporter.js +257 -0
- data/js/comm/comm/urlresponder/js.inc +0 -0
- data/js/comm/comm/urlresponder/urlresponder.js +148 -0
- data/js/comm/comm/values/js.inc +0 -0
- data/js/comm/comm/values/values.js +432 -0
- data/js/comm/jsloader/js.inc +0 -0
- data/js/comm/jsloader/jsloader.js +114 -0
- data/js/comm/reloadapp/js.inc +0 -0
- data/js/comm/reloadapp/reloadapp.js +150 -0
- data/js/comm/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/comm/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/comm/sha/js.inc +0 -0
- data/js/comm/sha/sha.js +432 -0
- data/js/comm/values/value/js.inc +0 -0
- data/js/comm/values/value/value.js +182 -0
- data/js/comm/values/valuematrix/js.inc +0 -0
- data/js/comm/values/valuematrix/valuematrix.js +138 -0
- data/js/controls/button/button.js +57 -0
- data/js/controls/button/js.inc +0 -0
- data/js/controls/button/themes/bright/button.css +89 -0
- data/js/controls/button/themes/bright/button.html +7 -0
- data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/bright/button_parts1.png +0 -0
- data/js/controls/button/themes/default/button.css +89 -0
- data/js/controls/button/themes/default/button.html +7 -0
- data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/default/button_parts1.png +0 -0
- data/js/controls/checkbox/checkbox.js +47 -0
- data/js/controls/checkbox/js.inc +0 -0
- data/js/controls/checkbox/themes/default/checkbox.css +69 -0
- data/js/controls/checkbox/themes/default/checkbox.html +5 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
- data/js/controls/datetime/calendar/calendar.js +197 -0
- data/js/controls/datetime/calendar/js.inc +0 -0
- data/js/controls/datetime/calendar/themes/default/calendar.css +108 -0
- data/js/controls/datetime/calendar/themes/default/calendar.html +9 -0
- data/js/controls/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/controls/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/controls/datetime/datetimevalue/datetimevalue.js +246 -0
- data/js/controls/datetime/datetimevalue/js.inc +0 -0
- data/js/controls/datetime/timesheet/js.inc +0 -0
- data/js/controls/datetime/timesheet/themes/default/timesheet.css +30 -0
- data/js/controls/datetime/timesheet/themes/default/timesheet.html +2 -0
- data/js/controls/datetime/timesheet/timesheet.js +182 -0
- data/js/controls/datetime/timesheet_item/js.inc +0 -0
- data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
- data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
- data/js/controls/datetime/timesheet_item/timesheet_item.js +247 -0
- data/js/controls/datetime/timesheet_item_edit/js.inc +0 -0
- data/js/controls/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +62 -0
- data/js/controls/dialogs/alert_sheet/js.inc +0 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +36 -0
- data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/sheet.js +83 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
- data/js/controls/imageview/imageview.js +108 -0
- data/js/controls/imageview/js.inc +0 -0
- data/js/controls/imageview/themes/default/blank.gif +0 -0
- data/js/controls/lists/checkboxlist/checkboxlist.js +170 -0
- data/js/controls/lists/checkboxlist/js.inc +0 -0
- data/js/controls/lists/listitems/js.inc +0 -0
- data/js/controls/lists/listitems/listitems.js +65 -0
- data/js/controls/lists/radiobuttonlist/js.inc +0 -0
- data/js/controls/lists/radiobuttonlist/radiobuttonlist.js +126 -0
- data/js/controls/passwordcontrol/js.inc +0 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +22 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
- data/js/controls/progress/progressbar/js.inc +0 -0
- data/js/controls/progress/progressbar/progressbar.js +36 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
- data/js/controls/progress/progressindicator/js.inc +0 -0
- data/js/controls/progress/progressindicator/progressindicator.js +43 -0
- data/js/controls/radiobutton/js.inc +0 -0
- data/js/controls/radiobutton/radiobutton.js +41 -0
- data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
- data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
- data/js/controls/sliders/slider/js.inc +0 -0
- data/js/controls/sliders/slider/slider.js +356 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
- data/js/controls/sliders/slider/themes/default/slider.css +108 -0
- data/js/controls/sliders/slider/themes/default/slider.html +5 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
- data/js/controls/sliders/vslider/js.inc +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
- data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
- data/js/controls/sliders/vslider/vslider.js +40 -0
- data/js/controls/stepper/js.inc +0 -0
- data/js/controls/stepper/stepper.js +212 -0
- data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
- data/js/controls/stepper/themes/default/stepper.css +14 -0
- data/js/controls/stepper/themes/default/stepper.html +2 -0
- data/js/controls/stepper/themes/default/stepper.png +0 -0
- data/js/controls/stringview/js.inc +0 -0
- data/js/controls/stringview/stringview.js +49 -0
- data/js/controls/stringview/themes/default/stringview.css +8 -0
- data/js/controls/stringview/themes/default/stringview.html +1 -0
- data/js/controls/tab/js.inc +0 -0
- data/js/controls/tab/tab.js +276 -0
- data/js/controls/tab/themes/bright/tab.css +76 -0
- data/js/controls/tab/themes/bright/tab.html +6 -0
- data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
- data/js/controls/tab/themes/default/tab.css +77 -0
- data/js/controls/tab/themes/default/tab.html +6 -0
- data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_parts1.png +0 -0
- data/js/controls/textarea/js.inc +0 -0
- data/js/controls/textarea/textarea.js +23 -0
- data/js/controls/textarea/themes/default/textarea.css +21 -0
- data/js/controls/textarea/themes/default/textarea.html +18 -0
- data/js/controls/textcontrol/js.inc +0 -0
- data/js/controls/textcontrol/textcontrol.js +372 -0
- data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
- data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
- data/js/controls/uploader/js.inc +0 -0
- data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
- data/js/controls/uploader/themes/default/uploader.css +108 -0
- data/js/controls/uploader/themes/default/uploader.html +27 -0
- data/js/controls/uploader/uploader.js +153 -0
- data/js/controls/validatorview/js.inc +0 -0
- data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
- data/js/controls/validatorview/themes/default/validator.png +0 -0
- data/js/controls/validatorview/themes/default/validatorview.css +0 -0
- data/js/controls/validatorview/themes/default/validatorview.html +0 -0
- data/js/controls/validatorview/validatorview.js +55 -0
- data/js/controls/window/js.inc +0 -0
- data/js/controls/window/themes/default/window.css +219 -0
- data/js/controls/window/themes/default/window.html +17 -0
- data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_active.png +0 -0
- data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
- data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_buttons.png +0 -0
- data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts1.png +0 -0
- data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts2.png +0 -0
- data/js/controls/window/window.js +284 -0
- data/js/core/class/class.js +317 -0
- data/js/core/class/js.inc +0 -0
- data/js/core/elem/elem.js +1376 -0
- data/js/core/elem/js.inc +0 -0
- data/js/core/event/event.js +1021 -0
- data/js/core/event/js.inc +0 -0
- data/js/core/iefix/ie_css_element.htc +5 -0
- data/js/core/iefix/ie_css_style.htc +5 -0
- data/js/core/iefix/iefix.js +359 -0
- data/js/core/iefix/js.inc +0 -0
- data/js/debugg/debugg.js +43 -0
- data/js/debugg/js.inc +0 -0
- data/js/foundation/application/application.js +209 -0
- data/js/foundation/application/js.inc +0 -0
- data/js/foundation/control/control.js +342 -0
- data/js/foundation/control/controldefaults/controldefaults.js +59 -0
- data/js/foundation/control/controldefaults/js.inc +0 -0
- data/js/foundation/control/dummyvalue/dummyvalue.js +50 -0
- data/js/foundation/control/dummyvalue/js.inc +0 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +494 -0
- data/js/foundation/control/dyncontrol/js.inc +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
- data/js/foundation/control/eventresponder/eventresponder.js +713 -0
- data/js/foundation/control/eventresponder/js.inc +0 -0
- data/js/foundation/control/js.inc +0 -0
- data/js/foundation/control/valueresponder/js.inc +0 -0
- data/js/foundation/control/valueresponder/valueresponder.js +77 -0
- data/js/foundation/geom/point/js.inc +0 -0
- data/js/foundation/geom/point/point.js +202 -0
- data/js/foundation/geom/rect/js.inc +0 -0
- data/js/foundation/geom/rect/rect.js +610 -0
- data/js/foundation/json_renderer/js.inc +0 -0
- data/js/foundation/json_renderer/json_renderer.js +231 -0
- data/js/foundation/system/js.inc +0 -0
- data/js/foundation/system/system.js +369 -0
- data/js/foundation/thememanager/js.inc +0 -0
- data/js/foundation/thememanager/thememanager.js +387 -0
- data/js/foundation/view/js.inc +0 -0
- data/js/foundation/view/markupview/js.inc +0 -0
- data/js/foundation/view/markupview/markupview.js +113 -0
- data/js/foundation/view/morphanimation/js.inc +0 -0
- data/js/foundation/view/morphanimation/morphanimation.js +236 -0
- data/js/foundation/view/view.js +1804 -0
- data/js/foundation/view/viewdefaults/js.inc +0 -0
- data/js/foundation/view/viewdefaults/viewdefaults.js +25 -0
- data/js/views/centerview/centerview.js +45 -0
- data/js/views/centerview/js.inc +0 -0
- data/js/views/inlineview/inlineview.js +14 -0
- data/js/views/inlineview/js.inc +0 -0
- data/js/views/scrollview/js.inc +0 -0
- data/js/views/scrollview/scrollview.js +39 -0
- data/lib/conf/default.rb +220 -0
- data/lib/conf/wizard.rb +303 -0
- data/lib/daemon/daemon.rb +293 -0
- data/lib/http/broker.rb +102 -0
- data/lib/http/rackup.rb +88 -0
- data/lib/http/request.rb +69 -0
- data/lib/http/response.rb +63 -0
- data/lib/plugins/gui_plugin.rb +129 -0
- data/lib/plugins/guiparser.rb +114 -0
- data/lib/plugins/plugin.rb +652 -0
- data/lib/plugins/plugin_plugins.rb +47 -0
- data/lib/plugins/plugin_sqlite_db.rb +72 -0
- data/lib/plugins/plugin_util.rb +96 -0
- data/lib/plugins/pluginmanager.rb +517 -0
- data/lib/plugins/servlet.rb +69 -0
- data/lib/session/msg.rb +291 -0
- data/lib/session/sessionmanager.rb +491 -0
- data/lib/session/sessionstorage.rb +314 -0
- data/lib/transporter/transporter.rb +254 -0
- data/lib/util/gzstring.rb +5 -0
- data/lib/values/hvalue.rb +323 -0
- data/lib/values/valuemanager.rb +152 -0
- data/plugins/client_pkg/client_pkg.rb +186 -0
- data/plugins/client_pkg/info.yaml +25 -0
- data/plugins/client_pkg/lib/client_pkg_build.rb +569 -0
- data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
- data/plugins/client_pkg/lib/client_pkg_serve.rb +210 -0
- data/plugins/client_pkg/log/build_log +0 -0
- data/plugins/index_html/img/loading.gif +0 -0
- data/plugins/index_html/img/riassence.gif +0 -0
- data/plugins/index_html/index_html.rb +150 -0
- data/plugins/index_html/tmpl/index.html +22 -0
- data/plugins/index_html/tmpl/startup_index.html +29 -0
- data/plugins/legacy/disabled +0 -0
- data/plugins/legacy/disabled- +0 -0
- data/plugins/legacy/info.yaml +22 -0
- data/plugins/legacy/legacy.rb +15 -0
- data/plugins/main/js/riassence_ns.js +87 -0
- data/plugins/main/main.rb +234 -0
- data/plugins/main/values.yaml +8 -0
- data/plugins/ticketservices/lib/common.rb +300 -0
- data/plugins/ticketservices/lib/favicon.rb +38 -0
- data/plugins/ticketservices/lib/file.rb +58 -0
- data/plugins/ticketservices/lib/img.rb +50 -0
- data/plugins/ticketservices/lib/objblob.rb +66 -0
- data/plugins/ticketservices/lib/rsrc.rb +34 -0
- data/plugins/ticketservices/lib/upload.rb +206 -0
- data/plugins/ticketservices/ticketservices.rb +268 -0
- data/var/db/.git_include +0 -0
- data/var/log/.git_include +0 -0
- data/var/run/.git_include +0 -0
- metadata +390 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
#--
|
|
2
|
+
## Riassence Framework
|
|
3
|
+
# Copyright 2008 Riassence Inc.
|
|
4
|
+
# http://riassence.com/
|
|
5
|
+
#
|
|
6
|
+
# You should have received a copy of the GNU General Public License along
|
|
7
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
8
|
+
##
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
# Use the default configuration:
|
|
12
|
+
require 'conf/default'
|
|
13
|
+
|
|
14
|
+
# Use rubygems to load rack
|
|
15
|
+
require 'rubygems'
|
|
16
|
+
require 'rack'
|
|
17
|
+
|
|
18
|
+
# Loads the selected web-server (default is 'thin')
|
|
19
|
+
require RSence.config[:http_server][:rack_require]
|
|
20
|
+
|
|
21
|
+
# Methods that return rack the selected handler
|
|
22
|
+
def rack_webrick_handler; Rack::Handler::WEBrick; end
|
|
23
|
+
def rack_ebb_handler; Rack::Handler::Ebb; end
|
|
24
|
+
def rack_thin_handler; Rack::Handler::Thin; end
|
|
25
|
+
def rack_mongrel_handler; Rack::Handler::Mongrel; end
|
|
26
|
+
def rack_unicorn_handler; Rack::Handler::Unicorn; end
|
|
27
|
+
def rack_rainbows_handler; Rack::Handler::Rainbows; end
|
|
28
|
+
|
|
29
|
+
# Selects the handler for Rack
|
|
30
|
+
RSence.config[:http_server][:rack_handler] = self.method({
|
|
31
|
+
'fuzed' => :rack_fuzed_handler,
|
|
32
|
+
'webrick' => :rack_webrick_handler,
|
|
33
|
+
'ebb' => :rack_ebb_handler,
|
|
34
|
+
'thin' => :rack_thin_handler,
|
|
35
|
+
'mongrel' => :rack_mongrel_handler,
|
|
36
|
+
'unicorn' => :rack_unicorn_handler,
|
|
37
|
+
'rainbows' => :rack_rainbows_handler
|
|
38
|
+
}[RSence.config[:http_server][:rack_require]]).call
|
|
39
|
+
|
|
40
|
+
# Debug mode switch. The debug mode is intended for developers, not production.
|
|
41
|
+
$DEBUG_MODE = RSence.config[:debug_mode]
|
|
42
|
+
|
|
43
|
+
# Transporter is the top-level handler for calls coming from the javascript COMM.Transporter.
|
|
44
|
+
require 'transporter/transporter'
|
|
45
|
+
|
|
46
|
+
## Broker routes requests to the correct handler
|
|
47
|
+
require 'http/broker'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
module RSence
|
|
51
|
+
|
|
52
|
+
# adapted from:
|
|
53
|
+
# http://snippets.dzone.com/posts/show/2265
|
|
54
|
+
|
|
55
|
+
require 'fileutils'
|
|
56
|
+
|
|
57
|
+
module Daemon
|
|
58
|
+
|
|
59
|
+
class Base
|
|
60
|
+
def self.pid_fn
|
|
61
|
+
RSence.config[:daemon][:pid_fn]
|
|
62
|
+
end
|
|
63
|
+
def self.log_fn
|
|
64
|
+
RSence.config[:daemon][:log_fn]
|
|
65
|
+
end
|
|
66
|
+
def self.daemonize
|
|
67
|
+
Controller.daemonize(self)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
module PidFile
|
|
72
|
+
def self.store(daemon, pid)
|
|
73
|
+
dir_path_pid = File.split( daemon.pid_fn )[0]
|
|
74
|
+
FileUtils.mkdir_p( dir_path_pid ) unless File.exists? dir_path_pid
|
|
75
|
+
File.open(daemon.pid_fn, 'w') {|f| f << pid}
|
|
76
|
+
end
|
|
77
|
+
def self.recall(daemon)
|
|
78
|
+
IO.read(daemon.pid_fn).to_i rescue nil
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
module Controller
|
|
83
|
+
|
|
84
|
+
def self.print_status(daemon)
|
|
85
|
+
is_running = self.status(daemon)
|
|
86
|
+
puts "Riassence Framework is #{'not ' unless is_running}running"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
## Status is not entirely reliable
|
|
90
|
+
def self.status(daemon)
|
|
91
|
+
if File.file?(daemon.pid_fn)
|
|
92
|
+
begin
|
|
93
|
+
pid = File.read(daemon.pid_fn).to_i
|
|
94
|
+
pid && Process.kill('USR2',pid)
|
|
95
|
+
return true
|
|
96
|
+
rescue Errno::ESRCH => e
|
|
97
|
+
return false
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
return false
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def self.open_log( outpath, errpath )
|
|
104
|
+
dir_path_out = File.split( outpath )[0]
|
|
105
|
+
FileUtils.mkdir_p( dir_path_out ) unless File.exists? dir_path_out
|
|
106
|
+
dir_path_err = File.split( outpath )[0]
|
|
107
|
+
FileUtils.mkdir_p( dir_path_err ) unless File.exists? dir_path_err
|
|
108
|
+
if File.exist?( outpath )
|
|
109
|
+
STDOUT.reopen( outpath, "a" )
|
|
110
|
+
else
|
|
111
|
+
STDOUT.reopen( outpath, "w" )
|
|
112
|
+
end
|
|
113
|
+
if File.exist?( errpath )
|
|
114
|
+
STDERR.reopen( errpath, "a" )
|
|
115
|
+
else
|
|
116
|
+
STDERR.reopen( errpath, "w" )
|
|
117
|
+
end
|
|
118
|
+
STDOUT.sync = true
|
|
119
|
+
STDERR.sync = true
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def self.log_io(daemon)
|
|
123
|
+
outpath = "#{daemon.log_fn}.stdout"
|
|
124
|
+
errpath = "#{daemon.log_fn}.stderr"
|
|
125
|
+
if $DEBUG_MODE
|
|
126
|
+
Thread.new do
|
|
127
|
+
puts "Waiting 2 seconds before switching output to log file #{outpath} and .../#{File.split(errpath)[1]}"
|
|
128
|
+
sleep 2
|
|
129
|
+
puts "Switching to stdin and stdout to log mode. Follow the log file to see further server output."
|
|
130
|
+
self.open_log( outpath, errpath )
|
|
131
|
+
end
|
|
132
|
+
else
|
|
133
|
+
self.open_log( outpath, errpath )
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.daemonize(daemon)
|
|
138
|
+
cmd = ARGV[0]
|
|
139
|
+
if ['i386-mingw32','x86-mingw32'].include? RUBY_PLATFORM
|
|
140
|
+
if cmd == 'start'
|
|
141
|
+
warn "Running on Microsoft Windows: unable to background. Using the run command instead of start"
|
|
142
|
+
cmd = 'run'
|
|
143
|
+
elsif cmd != 'run'
|
|
144
|
+
puts "Invalid command: #{cmd.inspect}. Windows supports only run and help."
|
|
145
|
+
exit
|
|
146
|
+
end
|
|
147
|
+
elsif not cmd or not %w[status start stop restart save run].include?( cmd )
|
|
148
|
+
puts "Invalid command. Please specify one of the following: run, start, stop, restart, status, save or help."
|
|
149
|
+
exit
|
|
150
|
+
end
|
|
151
|
+
case cmd
|
|
152
|
+
when 'run'
|
|
153
|
+
puts "Starting as a foreground process."
|
|
154
|
+
puts "Enter CTRL-C to stop."
|
|
155
|
+
self.start_fg(daemon)
|
|
156
|
+
when 'status'
|
|
157
|
+
self.print_status(daemon)
|
|
158
|
+
when 'start'
|
|
159
|
+
self.start(daemon)
|
|
160
|
+
when 'stop'
|
|
161
|
+
self.stop(daemon)
|
|
162
|
+
when 'restart'
|
|
163
|
+
self.stop(daemon,true)
|
|
164
|
+
self.start(daemon)
|
|
165
|
+
when 'save'
|
|
166
|
+
self.save(daemon)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
def self.start_fg(daemon)
|
|
170
|
+
['INT', 'TERM', 'KILL'].each do |signal|
|
|
171
|
+
Signal.trap(signal) do
|
|
172
|
+
puts "Got signal #{signal.inspect}"
|
|
173
|
+
daemon.stop
|
|
174
|
+
exit
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
daemon.start
|
|
178
|
+
exit
|
|
179
|
+
end
|
|
180
|
+
def self.start(daemon)
|
|
181
|
+
is_running = self.status(daemon)
|
|
182
|
+
if is_running
|
|
183
|
+
puts "Riassence Framework is already running. Try restart."
|
|
184
|
+
exit
|
|
185
|
+
elsif not is_running and File.file?(daemon.pid_fn)
|
|
186
|
+
puts "Stale pid file, removing.."
|
|
187
|
+
FileUtils.rm(daemon.pid_fn)
|
|
188
|
+
end
|
|
189
|
+
fork do
|
|
190
|
+
Process.setsid
|
|
191
|
+
exit if fork
|
|
192
|
+
PidFile.store(daemon, Process.pid)
|
|
193
|
+
Signal.trap('USR1') do
|
|
194
|
+
if @transporter != nil
|
|
195
|
+
@transporter.plugins.shutdown if @transporter.plugins
|
|
196
|
+
@transporter.sessions.shutdown if @transporter.session
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
Signal.trap('USR2') do
|
|
200
|
+
puts "Alive."
|
|
201
|
+
end
|
|
202
|
+
['INT', 'TERM', 'KILL'].each do |signal|
|
|
203
|
+
Signal.trap(signal) do
|
|
204
|
+
puts "Got signal #{signal.inspect}"
|
|
205
|
+
daemon.stop
|
|
206
|
+
exit
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
Signal.trap('HUP') {
|
|
210
|
+
daemon.restart
|
|
211
|
+
}
|
|
212
|
+
STDIN.reopen( "/dev/null" )
|
|
213
|
+
daemon.start
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
timeout = Time.now + 10
|
|
217
|
+
sleep 0.1 until self.status(daemon) or timeout < Time.now
|
|
218
|
+
|
|
219
|
+
if timeout < Time.now
|
|
220
|
+
puts "Riassence Framework did not start, please check the logfile."
|
|
221
|
+
else
|
|
222
|
+
puts "Riassence Framework is running now."
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
sleep 2.5 if $DEBUG_MODE
|
|
226
|
+
|
|
227
|
+
#Process.kill("USR2", File.read(daemon.pid_fn).to_i)
|
|
228
|
+
end
|
|
229
|
+
def self.save(daemon,is_restart=false)
|
|
230
|
+
if !File.file?(daemon.pid_fn)
|
|
231
|
+
puts "Pid file not found. Is Riassence Framework started?"
|
|
232
|
+
return if is_restart
|
|
233
|
+
exit
|
|
234
|
+
end
|
|
235
|
+
pid = File.read(daemon.pid_fn).to_i
|
|
236
|
+
begin
|
|
237
|
+
pid && Process.kill("USR1", pid)
|
|
238
|
+
puts "Session data saved."
|
|
239
|
+
rescue
|
|
240
|
+
puts "Error, no such pid (#{pid}) running"
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
def self.stop(daemon,is_restart=false)
|
|
244
|
+
self.save(daemon,is_restart)
|
|
245
|
+
if !File.file?(daemon.pid_fn)
|
|
246
|
+
puts "Pid file not found. Is Riassence Framework started?"
|
|
247
|
+
return if is_restart
|
|
248
|
+
exit
|
|
249
|
+
end
|
|
250
|
+
pid = PidFile.recall(daemon)
|
|
251
|
+
begin
|
|
252
|
+
pid && Process.kill("TERM", pid)
|
|
253
|
+
puts "Riassence Framework is stopped now."
|
|
254
|
+
rescue
|
|
255
|
+
puts "Error, no such pid (#{pid}) running"
|
|
256
|
+
end
|
|
257
|
+
FileUtils.rm(daemon.pid_fn)
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
class HTTPDaemon < Daemon::Base
|
|
263
|
+
def self.start
|
|
264
|
+
@transporter = Transporter.new
|
|
265
|
+
|
|
266
|
+
unless ARGV.include?('--log-fg')
|
|
267
|
+
Daemon::Controller.log_io(self)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# This is the main http handler instance:
|
|
271
|
+
@broker = Broker.start(
|
|
272
|
+
@transporter,
|
|
273
|
+
RSence.config[:http_server][:rack_handler],
|
|
274
|
+
RSence.config[:http_server][:bind_address],
|
|
275
|
+
RSence.config[:http_server][:port]
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
yield @broker if block_given?
|
|
279
|
+
|
|
280
|
+
end
|
|
281
|
+
def self.restart
|
|
282
|
+
self.stop
|
|
283
|
+
@broker = nil
|
|
284
|
+
self.start
|
|
285
|
+
end
|
|
286
|
+
def self.stop
|
|
287
|
+
@transporter.plugins.shutdown
|
|
288
|
+
@transporter.sessions.shutdown
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
end
|
|
293
|
+
|
data/lib/http/broker.rb
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#--
|
|
2
|
+
## Riassence Framework
|
|
3
|
+
# Copyright 2008 Riassence Inc.
|
|
4
|
+
# http://riassence.com/
|
|
5
|
+
#
|
|
6
|
+
# You should have received a copy of the GNU General Public License along
|
|
7
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
8
|
+
##
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module RSence
|
|
14
|
+
|
|
15
|
+
require 'rubygems'
|
|
16
|
+
require 'rack'
|
|
17
|
+
|
|
18
|
+
## Minimally WEBrick -compatible response object
|
|
19
|
+
require 'http/response'
|
|
20
|
+
|
|
21
|
+
## Minimally WEBrick -compatible request object
|
|
22
|
+
require 'http/request'
|
|
23
|
+
|
|
24
|
+
=begin
|
|
25
|
+
|
|
26
|
+
Broker routes requests to the proper request processing instance
|
|
27
|
+
|
|
28
|
+
=end
|
|
29
|
+
|
|
30
|
+
class Broker
|
|
31
|
+
|
|
32
|
+
def call(env)
|
|
33
|
+
request = Request.new(env)
|
|
34
|
+
response = Response.new
|
|
35
|
+
request_method = request.request_method.downcase
|
|
36
|
+
dispatcher = dispatcher_class.new( request, response )
|
|
37
|
+
dispatcher.send(request_method)
|
|
38
|
+
content_type = dispatcher.content_type
|
|
39
|
+
response.header['Content-Length'] = response.body.length.to_s unless response.header.has_key?('Content-Length')
|
|
40
|
+
return [response.status, response.header, response.body]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def dispatcher_class
|
|
44
|
+
@dispatcher ||= Class.new(self.class) do
|
|
45
|
+
attr_accessor :content_type
|
|
46
|
+
def initialize(request,response)
|
|
47
|
+
@request = request
|
|
48
|
+
@response = response
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.start( transporter, handler, host, port)
|
|
54
|
+
@@transporter = transporter
|
|
55
|
+
conf = ::RSence.config[:http_server][:latency]
|
|
56
|
+
if conf == 0
|
|
57
|
+
@@ping_sim = false
|
|
58
|
+
else
|
|
59
|
+
@@ping_sim = conf/1000.0
|
|
60
|
+
end
|
|
61
|
+
handler.run( Rack::Lint.new(self.new), :Host => host, :Port => port )
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.included(receiver)
|
|
65
|
+
receiver.extend( SingletonMethods )
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def not_found
|
|
69
|
+
puts "/404: #{@request.fullpath.inspect}" if $DEBUG_MODE
|
|
70
|
+
@response.status = 404
|
|
71
|
+
err404 = '<html><head><title>404 - Page Not Found</title></head><body>404 - Page Not Found</body></html>'
|
|
72
|
+
@response['content-type'] = 'text/html; charset=UTF-8'
|
|
73
|
+
@response['content-length'] = err404.length.to_s
|
|
74
|
+
@response.body = err404
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
## Post requests are always xhr requests
|
|
78
|
+
def post
|
|
79
|
+
|
|
80
|
+
puts "post: #{@request.fullpath}" if $DEBUG_MODE
|
|
81
|
+
|
|
82
|
+
sleep @@ping_sim if @@ping_sim
|
|
83
|
+
|
|
84
|
+
not_found unless @@transporter.servlet( :post, @request, @response )
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
## Get requests are different, depending on the uri requested
|
|
89
|
+
def get
|
|
90
|
+
|
|
91
|
+
puts "get: #{@request.fullpath}" if $DEBUG_MODE
|
|
92
|
+
|
|
93
|
+
sleep @@ping_sim if @@ping_sim
|
|
94
|
+
|
|
95
|
+
not_found unless @@transporter.servlet( :get, @request, @response )
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
data/lib/http/rackup.rb
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#--
|
|
2
|
+
## Riassence Framework
|
|
3
|
+
# Copyright 2008 Riassence Inc.
|
|
4
|
+
# http://riassence.com/
|
|
5
|
+
#
|
|
6
|
+
# You should have received a copy of the GNU General Public License along
|
|
7
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
8
|
+
##
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
if ARGV.include?('--root-path')
|
|
12
|
+
SERVER_PATH = ARGV[ARGV.index('--root-path')+1]
|
|
13
|
+
else
|
|
14
|
+
path = ::File.dirname(__FILE__)
|
|
15
|
+
exp_path = ::File.expand_path( path )
|
|
16
|
+
lib_path = ::File.split( exp_path )[0]
|
|
17
|
+
SERVER_PATH = ::File.split( lib_path )[0]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
$LOAD_PATH << SERVER_PATH
|
|
21
|
+
$LOAD_PATH << ::File.join( SERVER_PATH, 'lib' )
|
|
22
|
+
|
|
23
|
+
# Use the default configuration:
|
|
24
|
+
require 'conf/default'
|
|
25
|
+
|
|
26
|
+
# Debug mode switch. The debug mode is intended for developers, not production.
|
|
27
|
+
$DEBUG_MODE = RSence.config[:debug_mode]
|
|
28
|
+
|
|
29
|
+
ENV['RACK_ENV'] = 'production' unless $DEBUG_MODE
|
|
30
|
+
|
|
31
|
+
## Minimally WEBrick -compatible response object
|
|
32
|
+
require 'http/response'
|
|
33
|
+
|
|
34
|
+
## Minimally WEBrick -compatible request object
|
|
35
|
+
require 'http/request'
|
|
36
|
+
|
|
37
|
+
# Transporter is the top-level handler for calls coming from the javascript COMM.Transporter.
|
|
38
|
+
require 'transporter/transporter'
|
|
39
|
+
|
|
40
|
+
module RSence
|
|
41
|
+
module Broker
|
|
42
|
+
|
|
43
|
+
@@transporter = Transporter.new
|
|
44
|
+
|
|
45
|
+
def self.start
|
|
46
|
+
conf = ::RSence.config[:http_server][:latency]
|
|
47
|
+
if conf == 0
|
|
48
|
+
@@ping_sim = false
|
|
49
|
+
else
|
|
50
|
+
@@ping_sim = conf/1000.0
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def self.stop
|
|
55
|
+
@@transporter.plugins.shutdown
|
|
56
|
+
@@transporter.sessions.shutdown
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def self.call(env)
|
|
60
|
+
request = Request.new(env)
|
|
61
|
+
response = Response.new
|
|
62
|
+
request_method = request.request_method.downcase
|
|
63
|
+
if request_method == 'get'
|
|
64
|
+
puts "get: #{request.fullpath}" if $DEBUG_MODE
|
|
65
|
+
sleep @@ping_sim if @@ping_sim
|
|
66
|
+
not_found( request, response ) unless @@transporter.servlet( :get, request, response )
|
|
67
|
+
elsif request_method == 'post'
|
|
68
|
+
puts "post: #{request.fullpath}" if $DEBUG_MODE
|
|
69
|
+
sleep @@ping_sim if @@ping_sim
|
|
70
|
+
not_found( request, response ) unless @@transporter.servlet( :post, request, response )
|
|
71
|
+
else
|
|
72
|
+
puts "unsupported method: #{request_method.inspect}"
|
|
73
|
+
end
|
|
74
|
+
response.header['Content-Length'] = response.body.length.to_s unless response.header.has_key?('Content-Length')
|
|
75
|
+
return [response.status, response.header, response.body]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def not_found( request, response )
|
|
79
|
+
puts "/404: #{request.fullpath.inspect}" if $DEBUG_MODE
|
|
80
|
+
response.status = 404
|
|
81
|
+
err404 = '<html><head><title>404 - Page Not Found</title></head><body>404 - Page Not Found</body></html>'
|
|
82
|
+
response['content-type'] = 'text/html; charset=UTF-8'
|
|
83
|
+
response['content-length'] = err404.length.to_s
|
|
84
|
+
response.body = err404
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
end
|