rsence-pre 2.1.0.1.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/.yardopts +10 -0
- data/INSTALL.rdoc +330 -0
- data/LICENSE.txt +622 -0
- data/README.rdoc +98 -0
- data/VERSION +1 -0
- data/bin/rsence +25 -0
- data/bin/rsence-pre +25 -0
- data/conf/default_conf.yaml +346 -0
- data/conf/default_strings.yaml +76 -0
- data/conf/rsence_command_strings.yaml +444 -0
- data/docs/ExampleGuiPlugin.rdoc +193 -0
- data/docs/JavascriptBundles.rdoc +0 -0
- data/docs/PluginBundleInfo.rdoc +173 -0
- data/docs/PluginBundles.rdoc +96 -0
- data/docs/Values.rdoc +163 -0
- data/js/comm/autosync/autosync.js +17 -0
- data/js/comm/autosync/js.inc +0 -0
- data/js/comm/comm.js +203 -0
- data/js/comm/js.inc +0 -0
- data/js/comm/jsloader/js.inc +0 -0
- data/js/comm/jsloader/jsloader.js +112 -0
- data/js/comm/queue/js.inc +0 -0
- data/js/comm/queue/queue.js +184 -0
- data/js/comm/session/js.inc +0 -0
- data/js/comm/session/session.js +52 -0
- data/js/comm/sessionwatcher/js.inc +0 -0
- data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
- data/js/comm/transporter/js.inc +0 -0
- data/js/comm/transporter/transporter.js +261 -0
- data/js/comm/urlresponder/js.inc +0 -0
- data/js/comm/urlresponder/urlresponder.js +149 -0
- data/js/comm/values/js.inc +0 -0
- data/js/comm/values/values.js +433 -0
- data/js/controls/button/button.js +72 -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 +49 -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/dialogs/alert_sheet/alert_sheet.js +63 -0
- data/js/controls/dialogs/alert_sheet/js.inc +0 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -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 +84 -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 +109 -0
- data/js/controls/imageview/js.inc +0 -0
- data/js/controls/imageview/themes/default/blank.gif +0 -0
- data/js/controls/passwordcontrol/js.inc +0 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +23 -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 +40 -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 +44 -0
- data/js/controls/radiobutton/js.inc +0 -0
- data/js/controls/radiobutton/radiobutton.js +43 -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 +357 -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 +41 -0
- data/js/controls/stepper/js.inc +0 -0
- data/js/controls/stepper/stepper.js +213 -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 +280 -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 +24 -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 +374 -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 +154 -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 +62 -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 +286 -0
- data/js/core/class/class.js +318 -0
- data/js/core/class/js.inc +0 -0
- data/js/core/elem/elem.js +1383 -0
- data/js/core/elem/js.inc +0 -0
- data/js/core/event/event.js +153 -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/core/rsence_ns/js.inc +0 -0
- data/js/core/rsence_ns/rsence_ns.js +21 -0
- data/js/datetime/calendar/calendar.js +198 -0
- data/js/datetime/calendar/js.inc +0 -0
- data/js/datetime/calendar/themes/default/calendar.css +108 -0
- data/js/datetime/calendar/themes/default/calendar.html +9 -0
- data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/datetime/datetimevalue/datetimevalue.js +247 -0
- data/js/datetime/datetimevalue/js.inc +0 -0
- data/js/datetime/timesheet/js.inc +0 -0
- data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
- data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
- data/js/datetime/timesheet/timesheet.js +183 -0
- data/js/datetime/timesheet_item/js.inc +0 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
- data/js/datetime/timesheet_item/timesheet_item.js +248 -0
- data/js/datetime/timesheet_item_edit/js.inc +0 -0
- data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
- data/js/foundation/application/application.js +208 -0
- data/js/foundation/application/js.inc +0 -0
- data/js/foundation/control/control.js +339 -0
- data/js/foundation/control/controldefaults/controldefaults.js +56 -0
- data/js/foundation/control/controldefaults/js.inc +0 -0
- data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
- data/js/foundation/control/dummyvalue/js.inc +0 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +500 -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 +750 -0
- data/js/foundation/control/eventresponder/js.inc +0 -0
- data/js/foundation/control/js.inc +0 -0
- data/js/foundation/control/valuematrix/js.inc +0 -0
- data/js/foundation/control/valuematrix/valuematrix.js +135 -0
- data/js/foundation/control/valueresponder/js.inc +0 -0
- data/js/foundation/control/valueresponder/valueresponder.js +79 -0
- data/js/foundation/eventmanager/eventmanager.js +991 -0
- data/js/foundation/eventmanager/js.inc +0 -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 +651 -0
- data/js/foundation/json_renderer/js.inc +0 -0
- data/js/foundation/json_renderer/json_renderer.js +246 -0
- data/js/foundation/system/js.inc +0 -0
- data/js/foundation/system/system.js +381 -0
- data/js/foundation/thememanager/js.inc +0 -0
- data/js/foundation/thememanager/thememanager.js +393 -0
- data/js/foundation/value/js.inc +0 -0
- data/js/foundation/value/value.js +183 -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 +114 -0
- data/js/foundation/view/morphanimation/js.inc +0 -0
- data/js/foundation/view/morphanimation/morphanimation.js +237 -0
- data/js/foundation/view/view.js +1812 -0
- data/js/foundation/view/viewdefaults/js.inc +0 -0
- data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
- data/js/lists/checkboxlist/checkboxlist.js +171 -0
- data/js/lists/checkboxlist/js.inc +0 -0
- data/js/lists/listitems/js.inc +0 -0
- data/js/lists/listitems/listitems.js +88 -0
- data/js/lists/propertylist/js.inc +0 -0
- data/js/lists/propertylist/propertylist.js +326 -0
- data/js/lists/radiobuttonlist/js.inc +0 -0
- data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
- data/js/util/reloadapp/js.inc +0 -0
- data/js/util/reloadapp/reloadapp.js +152 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/util/sha/js.inc +0 -0
- data/js/util/sha/sha.js +426 -0
- data/js/views/centerview/centerview.js +75 -0
- data/js/views/centerview/js.inc +0 -0
- data/js/views/inlineview/inlineview.js +15 -0
- data/js/views/inlineview/js.inc +0 -0
- data/js/views/scrollview/js.inc +0 -0
- data/js/views/scrollview/scrollview.js +40 -0
- data/lib/conf/argv.rb +850 -0
- data/lib/conf/default.rb +219 -0
- data/lib/daemon/daemon.rb +387 -0
- data/lib/daemon/sigcomm.rb +64 -0
- data/lib/http/broker.rb +150 -0
- data/lib/http/rackup.rb +91 -0
- data/lib/http/request.rb +66 -0
- data/lib/http/response.rb +65 -0
- data/lib/plugins/dependencies.rb +285 -0
- data/lib/plugins/gui_plugin.rb +160 -0
- data/lib/plugins/guiparser.rb +123 -0
- data/lib/plugins/plugin.rb +438 -0
- data/lib/plugins/plugin_base.rb +162 -0
- data/lib/plugins/plugin_plugins.rb +81 -0
- data/lib/plugins/plugin_sqlite_db.rb +98 -0
- data/lib/plugins/pluginmanager.rb +635 -0
- data/lib/plugins/plugins.rb +169 -0
- data/lib/plugins/servlet.rb +108 -0
- data/lib/rsence.rb +32 -0
- data/lib/session/msg.rb +327 -0
- data/lib/session/sessionmanager.rb +522 -0
- data/lib/session/sessionstorage.rb +340 -0
- data/lib/transporter/transporter.rb +263 -0
- data/lib/util/gzstring.rb +9 -0
- data/lib/util/ruby19_fixes.rb +18 -0
- data/lib/values/hvalue.rb +378 -0
- data/lib/values/valuemanager.rb +172 -0
- data/plugins/client_pkg/client_pkg.rb +157 -0
- data/plugins/client_pkg/info.yaml +25 -0
- data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
- data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
- data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -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 +120 -0
- data/plugins/index_html/info.yaml +18 -0
- data/plugins/index_html/tmpl/index.html +15 -0
- data/plugins/main/info.yaml +18 -0
- data/plugins/main/js/main.js +84 -0
- data/plugins/main/main.rb +255 -0
- data/plugins/main/values.yaml +8 -0
- data/plugins/ticket/info.yaml +21 -0
- data/plugins/ticket/lib/common.rb +392 -0
- data/plugins/ticket/lib/favicon.rb +39 -0
- data/plugins/ticket/lib/file.rb +58 -0
- data/plugins/ticket/lib/img.rb +50 -0
- data/plugins/ticket/lib/objblob.rb +66 -0
- data/plugins/ticket/lib/rsrc.rb +34 -0
- data/plugins/ticket/lib/upload.rb +236 -0
- data/plugins/ticket/ticket.rb +333 -0
- data/setup/welcome/gui/welcome.yaml +92 -0
- data/setup/welcome/info.yaml +13 -0
- data/setup/welcome/text/welcome.html +9 -0
- data/setup/welcome/values.yaml +9 -0
- data/setup/welcome/welcome.rb +54 -0
- metadata +407 -0
data/lib/conf/default.rb
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
## RSence
|
2
|
+
# Copyright 2008 Riassence Inc.
|
3
|
+
# http://riassence.com/
|
4
|
+
#
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
7
|
+
##
|
8
|
+
|
9
|
+
|
10
|
+
require 'rubygems'
|
11
|
+
require 'rack'
|
12
|
+
require 'yaml'
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
require 'util/ruby19_fixes' if RUBY_VERSION.to_f >= 1.9
|
17
|
+
|
18
|
+
|
19
|
+
module RSence
|
20
|
+
|
21
|
+
|
22
|
+
# Configuration handles config files and such.
|
23
|
+
class Configuration
|
24
|
+
|
25
|
+
# Combines the Arrays `target` and `source` recursively.
|
26
|
+
# @param [Array] target Gets merged with `source`
|
27
|
+
# @param [Array] source Has its items pushed to `target` unless an identical item already exists in `target`. If an item class is a Hash, then uses {#hash_merge} to combine them.
|
28
|
+
def array_merge( target, source )
|
29
|
+
source.each do |item|
|
30
|
+
unless target.include?(item)
|
31
|
+
if item.class == Array
|
32
|
+
sub_arr = []
|
33
|
+
array_merge( sub_arr, item )
|
34
|
+
target.push( sub_arr )
|
35
|
+
elsif item.class == Hash
|
36
|
+
sub_hash = {}
|
37
|
+
hash_merge( sub_hash, item )
|
38
|
+
target.push( sub_hash )
|
39
|
+
else
|
40
|
+
target.push( item )
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Combines the Hashes `target` and `source` recursively.
|
47
|
+
# @param [Hash] target Gets merged with `source`
|
48
|
+
# @param [Hash] source Has its items merged to `target` unless a key with an identical value already exists in `target`. If an item class is Array, then uses {#array_merge} to combine them.
|
49
|
+
def hash_merge( target, source )
|
50
|
+
source.each do |key,item|
|
51
|
+
if not target.has_key?key or target[key] != item
|
52
|
+
if item.class == Array
|
53
|
+
target[key] = [] unless target.has_key?(key)
|
54
|
+
array_merge( target[key], item )
|
55
|
+
elsif item.class == Hash
|
56
|
+
target[key] = {} unless target.has_key?key
|
57
|
+
hash_merge( target[key], item )
|
58
|
+
else
|
59
|
+
target[key] = item
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# @param args A parsed structure of the command-line arguments.
|
66
|
+
# @param dont_expand_path Is reserved for special cases, when Configuration is used without running RSence.
|
67
|
+
def initialize( args, dont_expand_path=false )
|
68
|
+
|
69
|
+
## Paths for log and pid files
|
70
|
+
pidpath = File.join( args[:env_path], 'run' )
|
71
|
+
logpath = File.join( args[:env_path], 'log' )
|
72
|
+
|
73
|
+
# The default configuration path, this one is distributed with the system.
|
74
|
+
yaml_conf_path = File.join( SERVER_PATH, 'conf', 'default_conf.yaml' )
|
75
|
+
|
76
|
+
# Parses the default configuration from yaml first.
|
77
|
+
# This is used as the basis for overriding the defaults in various other config files.
|
78
|
+
config = YAML.load( File.read( yaml_conf_path ) )
|
79
|
+
|
80
|
+
# The default strings for various messages, this one is distributed with the system.
|
81
|
+
yaml_strings_path = File.join( SERVER_PATH, 'conf', 'default_strings.yaml' )
|
82
|
+
strings = YAML.load( File.read( yaml_strings_path ) )
|
83
|
+
|
84
|
+
# Transporter-specific strings are set.
|
85
|
+
config[:transporter_conf][:messages] = strings[:messages][:transporter]
|
86
|
+
|
87
|
+
# Makes the distribution 'js' directory containing the client core the
|
88
|
+
# first client package source directory.
|
89
|
+
config[:client_pkg][:src_dirs].unshift( File.join( SERVER_PATH, 'js' ) )
|
90
|
+
|
91
|
+
# The distributed standard plugins are in this directory.
|
92
|
+
default_plugins_path = File.join( SERVER_PATH, 'plugins' )
|
93
|
+
unless config[:plugin_paths].include? default_plugins_path
|
94
|
+
config[:plugin_paths].push( default_plugins_path )
|
95
|
+
end
|
96
|
+
|
97
|
+
# Paths to add to $LOAD_PATH after all configuration files are read.
|
98
|
+
lib_paths = []
|
99
|
+
|
100
|
+
# List of configuration files to look for.
|
101
|
+
local_config_file_paths = [
|
102
|
+
File.join(SERVER_PATH,'conf','local_conf.yaml'),
|
103
|
+
'/etc/rsence/config.yaml',
|
104
|
+
File.expand_path('~/.rsence/config.yaml'),
|
105
|
+
File.join( File.split( SERVER_PATH )[0], 'conf', 'local_conf.yaml' )
|
106
|
+
]
|
107
|
+
|
108
|
+
# Add the additional config files optionally specified in ARGVParser
|
109
|
+
args[:conf_files].each do |conf_file|
|
110
|
+
local_config_file_paths.push( conf_file )
|
111
|
+
end
|
112
|
+
|
113
|
+
# Loads the configuration files
|
114
|
+
local_config_file_paths.each do |local_config_file_path|
|
115
|
+
if File.exists? local_config_file_path and File.file? local_config_file_path
|
116
|
+
if local_config_file_path.end_with? '.yaml'
|
117
|
+
puts "loading config file: #{local_config_file_path}" if args[:verbose]
|
118
|
+
local_conf = YAML.load( File.read( local_config_file_path ) )
|
119
|
+
unless local_conf.class == Hash
|
120
|
+
warn "invalid configuration file: #{local_config_file_path.inspect}"
|
121
|
+
next
|
122
|
+
end
|
123
|
+
hash_merge( config, local_conf )
|
124
|
+
else
|
125
|
+
warn "Only Yaml configuration files are supported."
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Adds the plugins directory of the environment
|
131
|
+
# to the configuration automatically
|
132
|
+
env_plugins_path = File.expand_path( 'plugins', args[:env_path] )
|
133
|
+
unless config[:plugin_paths].include? env_plugins_path
|
134
|
+
config[:plugin_paths].push( env_plugins_path )
|
135
|
+
end
|
136
|
+
|
137
|
+
# At this point, configuration files are read and ready.
|
138
|
+
|
139
|
+
puts "plugin paths: #{config[:plugin_paths].inspect}" if args[:debug]
|
140
|
+
|
141
|
+
# Override configuration options with command-line-options.
|
142
|
+
config[:trace] = true if args[:trace_js]
|
143
|
+
config[:debug_mode] = true if args[:debug]
|
144
|
+
config[:http_server][:latency] = args[:latency]
|
145
|
+
config[:http_server][:port] = args[:port] if args[:port]
|
146
|
+
config[:http_server][:bind_address] = args[:addr] if args[:addr]
|
147
|
+
config[:http_server][:rack_require] = args[:server] if args[:server]
|
148
|
+
config[:session_conf][:reset_sessions] = true if args[:reset_ses]
|
149
|
+
|
150
|
+
config[:client_pkg][:no_obfuscation] = true if args[:client_pkg_no_obfuscation]
|
151
|
+
config[:client_pkg][:no_whitespace_removal] = true if args[:client_pkg_no_whitespace_removal]
|
152
|
+
|
153
|
+
# Sets the default pid and log paths used by the HTTPDaemon
|
154
|
+
config[:daemon][:pid_fn] = File.join(pidpath, "rsence.pid") unless config[:daemon].has_key?(:pid_fn)
|
155
|
+
config[:daemon][:log_fn] = File.join(logpath, "rsence") unless config[:daemon].has_key?(:log_fn)
|
156
|
+
|
157
|
+
# Check database path for sqlite databases.
|
158
|
+
if config[:database][:ses_db].start_with?('sqlite://') and not dont_expand_path
|
159
|
+
db_url = File.expand_path( config[:database][:ses_db].split('sqlite://')[1], args[:env_path] )
|
160
|
+
config[:database][:ses_db] = "sqlite://#{db_url}"
|
161
|
+
end
|
162
|
+
|
163
|
+
# Sets the various standard url prefixes:
|
164
|
+
[ ## POST-requests
|
165
|
+
# broker_key # default_uri
|
166
|
+
# The default responder for transporter requests.
|
167
|
+
[ :x, File.join(config[:base_url],'x') ],
|
168
|
+
# The default responder for cookie-enabled "handshake" transporter requests
|
169
|
+
[ :hello, File.join(config[:base_url],'hello') ],
|
170
|
+
# The default responder for file uploads
|
171
|
+
[ :u, File.join(config[:base_url],'U') ],
|
172
|
+
|
173
|
+
## GET-requests
|
174
|
+
# broker_key # default_uri
|
175
|
+
# The default address of built javascript and theme packages
|
176
|
+
[ :h, File.join(config[:base_url],'H/') ],
|
177
|
+
# The default address of the ticketserve :img -category
|
178
|
+
[ :i, File.join(config[:base_url],'i/') ],
|
179
|
+
# The default address of the ticketserve :rsrc -category
|
180
|
+
[ :d, File.join(config[:base_url],'d/') ],
|
181
|
+
# The default address of the ticketserve :file -category
|
182
|
+
[ :f, File.join(config[:base_url],'f/') ],
|
183
|
+
# The default address of the ticketserve :blobobj -category
|
184
|
+
[ :b, File.join(config[:base_url],'b/') ],
|
185
|
+
# The default address of the favicon
|
186
|
+
[ :favicon, '/favicon.ico' ],
|
187
|
+
# The default address of the "empty" iframe of uploader
|
188
|
+
[ :uploader_iframe, File.join(config[:base_url],'U/iframe_html') ],
|
189
|
+
].each do |broker_key, default_uri|
|
190
|
+
unless config[:broker_urls].has_key?( broker_key )
|
191
|
+
config[:broker_urls][broker_key] = default_uri
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
if RUBY_VERSION.to_f >= 1.9
|
196
|
+
# The encodings mess up compression when using ruby1.9
|
197
|
+
warn "Disabling gzip support for ruby 1.9" if args[:debug]
|
198
|
+
config[:no_gzip] = true
|
199
|
+
end
|
200
|
+
|
201
|
+
# The default address of the index_html plugin
|
202
|
+
unless config[:index_html].has_key?(:respond_address)
|
203
|
+
config[:index_html][:respond_address] = File.join(config[:base_url])
|
204
|
+
end
|
205
|
+
|
206
|
+
## Uses the lib paths as search paths
|
207
|
+
lib_paths += config[:lib_paths] if config.has_key?(:lib_paths)
|
208
|
+
lib_paths.each do |lib_path|
|
209
|
+
lib_path = File.expand_path( lib_path, args[:env_path] ) if lib_path.start_with? './'
|
210
|
+
$LOAD_PATH << lib_path
|
211
|
+
end
|
212
|
+
@config = config
|
213
|
+
end
|
214
|
+
|
215
|
+
attr_reader :config
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
@@ -0,0 +1,387 @@
|
|
1
|
+
## RSence
|
2
|
+
# Copyright 2008 Riassence Inc.
|
3
|
+
# http://riassence.com/
|
4
|
+
#
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
7
|
+
##
|
8
|
+
|
9
|
+
|
10
|
+
# Use rubygems to load rack
|
11
|
+
require 'rubygems'
|
12
|
+
|
13
|
+
# Transporter is the top-level handler for calls coming from the javascript COMM.Transporter.
|
14
|
+
require 'transporter/transporter'
|
15
|
+
|
16
|
+
# Broker routes requests to the correct handler
|
17
|
+
require 'http/broker'
|
18
|
+
|
19
|
+
|
20
|
+
module RSence
|
21
|
+
|
22
|
+
# @private The process id of the launch process (usually the PID of the 'rsence' command)
|
23
|
+
@@launch_pid = Process.pid
|
24
|
+
|
25
|
+
# @private Returns the pid of the process when starting up.
|
26
|
+
# PID is different for the forked child process or processes
|
27
|
+
def self.launch_pid
|
28
|
+
return @@launch_pid
|
29
|
+
end
|
30
|
+
|
31
|
+
# @private The Controller module handles the daemonizing
|
32
|
+
# operations of the process referred to as +daemon+
|
33
|
+
module Daemon
|
34
|
+
|
35
|
+
# Writes the process id to disk, the pid_fn method of the daemon contains
|
36
|
+
# the name of the pid file.
|
37
|
+
def self.write_pid( daemon, pid )
|
38
|
+
File.open( daemon.pid_fn, 'w' ) do |pidfile|
|
39
|
+
pidfile.write( pid )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Reads the process id from disk, the pid_fn method of the daemon contains
|
44
|
+
# the name of the pid file. Returns nil on errors.
|
45
|
+
def self.read_pid( daemon )
|
46
|
+
File.read( daemon.pid_fn ).to_i rescue nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.responds?( daemon )
|
50
|
+
wait_signal_response( daemon, 'INFO' )
|
51
|
+
end
|
52
|
+
|
53
|
+
# Reads the pid file and calls the process.
|
54
|
+
# Returns true if the process responds, false otherwise (no process)
|
55
|
+
def self.status( daemon )
|
56
|
+
pid = read_pid( daemon )
|
57
|
+
return nil if not pid
|
58
|
+
return responds?( daemon )
|
59
|
+
end
|
60
|
+
|
61
|
+
# Redirects standard input and errors to the log files
|
62
|
+
def self.start_logging( daemon )
|
63
|
+
outpath = "#{daemon.log_fn}.stdout"
|
64
|
+
errpath = "#{daemon.log_fn}.stderr"
|
65
|
+
STDOUT.reopen( outpath, (File.exist?( outpath ) ? 'a' : 'w') )
|
66
|
+
STDOUT.sync = true
|
67
|
+
STDERR.reopen( errpath, (File.exist?( errpath ) ? 'a' : 'w') )
|
68
|
+
STDERR.sync = true
|
69
|
+
end
|
70
|
+
|
71
|
+
# Writes a signal response file containing the pid.
|
72
|
+
def self.write_signal_response( daemon, signal )
|
73
|
+
pid = Process.pid.to_s
|
74
|
+
pid_fn = daemon.pid_fn
|
75
|
+
RSence::SIGComm.write_signal_response( pid, pid_fn, signal )
|
76
|
+
end
|
77
|
+
|
78
|
+
# Removes a signal response file.
|
79
|
+
def self.delete_signal_response( daemon, signal )
|
80
|
+
pid_fn = daemon.pid_fn
|
81
|
+
RSence::SIGComm.delete_signal_response( pid_fn )
|
82
|
+
end
|
83
|
+
|
84
|
+
# Waits for a signal response.
|
85
|
+
def self.wait_signal_response( daemon, signal, timeout = 10,
|
86
|
+
debug_pre = false, debug_suf = false, sleep_secs = 0.2 )
|
87
|
+
pid = read_pid( daemon )
|
88
|
+
pid_fn = daemon.pid_fn
|
89
|
+
return RSence::SIGComm.wait_signal_response( pid, pid_fn, signal, timeout, debug_pre, debug_suf, sleep_secs )
|
90
|
+
end
|
91
|
+
|
92
|
+
# Signal trapping for windows.
|
93
|
+
# The only supported POSIX signal trappable seems to be INT (CTRL-C).
|
94
|
+
def self.trap_windows_signals( daemon )
|
95
|
+
['INT'].each do | signal |
|
96
|
+
Signal.trap( signal ) do
|
97
|
+
puts "RSence killed with signal #{signal.inspect}" if RSence.args[:verbose]
|
98
|
+
daemon.usr1
|
99
|
+
daemon.stop
|
100
|
+
puts "Shutdown complete."
|
101
|
+
exit
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Traps common POSIX signals
|
107
|
+
def self.trap_signals( daemon )
|
108
|
+
|
109
|
+
# Triggered with 'kill -USR1 `cat rsence.pid`'
|
110
|
+
Signal.trap( 'USR1' ) do
|
111
|
+
daemon.usr1
|
112
|
+
write_signal_response( daemon, 'USR1' )
|
113
|
+
end
|
114
|
+
Signal.trap( 'USR2' ) do
|
115
|
+
daemon.usr2
|
116
|
+
write_signal_response( daemon, 'USR2' )
|
117
|
+
end
|
118
|
+
# Signal.trap( 'PWR' ) do
|
119
|
+
# daemon.pwr
|
120
|
+
# write_signal_response( daemon, 'PWR' )
|
121
|
+
# end
|
122
|
+
Signal.trap( 'ALRM' ) do
|
123
|
+
daemon.alrm
|
124
|
+
write_signal_response( daemon, 'ALRM' )
|
125
|
+
end
|
126
|
+
Signal.trap( 'INFO' ) do
|
127
|
+
daemon.info
|
128
|
+
write_signal_response( daemon, 'INFO' )
|
129
|
+
end
|
130
|
+
['INT', 'TERM', 'KILL'].each do | signal |
|
131
|
+
Signal.trap( signal ) do
|
132
|
+
puts "RSence killed with signal #{signal.inspect}" if RSence.args[:verbose]
|
133
|
+
daemon.usr1
|
134
|
+
daemon.stop
|
135
|
+
delete_stale_pids( daemon )
|
136
|
+
write_signal_response( daemon, signal )
|
137
|
+
puts "Shutdown complete."
|
138
|
+
exit
|
139
|
+
end
|
140
|
+
end
|
141
|
+
Signal.trap('HUP') do
|
142
|
+
daemon.stop
|
143
|
+
daemon.start
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Removes all pid files that were left around if a process died unexpectedly.
|
148
|
+
def self.delete_stale_pids( daemon )
|
149
|
+
( pid_fn_path, pid_fn_name ) = File.split( daemon.pid_fn )
|
150
|
+
Dir.entries( pid_fn_path ).each do | item_fn |
|
151
|
+
item_path = File.join( pid_fn_path, item_fn )
|
152
|
+
if item_fn.start_with?( pid_fn_name ) and File.file?( item_path )
|
153
|
+
puts "Stale pid file (#{item_fn}), removing.." if RSence.args[:verbose]
|
154
|
+
File.delete( item_path )
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Creates pid file and traps signal.
|
160
|
+
def self.init_pid( daemon )
|
161
|
+
if RSence.pid_support?
|
162
|
+
is_running = status( daemon )
|
163
|
+
if is_running
|
164
|
+
puts "RSence is already running."
|
165
|
+
puts "Stop the existing process first: see 'rsence help stop'"
|
166
|
+
if RSence.launch_pid != Process.pid
|
167
|
+
Process.kill( 'INT', RSence.launch_pid )
|
168
|
+
end
|
169
|
+
exit
|
170
|
+
elsif not is_running
|
171
|
+
delete_stale_pids( daemon )
|
172
|
+
end
|
173
|
+
trap_signals( daemon )
|
174
|
+
pid = Process.pid
|
175
|
+
write_pid( daemon, pid )
|
176
|
+
return pid
|
177
|
+
else
|
178
|
+
trap_windows_signals( daemon )
|
179
|
+
return false
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Inits the pid, signals and then starts the server in the foreground
|
184
|
+
def self.run( daemon )
|
185
|
+
init_pid( daemon )
|
186
|
+
daemon.run
|
187
|
+
exit
|
188
|
+
end
|
189
|
+
|
190
|
+
# Inits the pid, signals and then starts the daemon in
|
191
|
+
# the background and waits until the daemon sends the TERM signal.
|
192
|
+
def self.start( daemon )
|
193
|
+
fork do
|
194
|
+
exit if fork
|
195
|
+
init_pid( daemon )
|
196
|
+
daemon.start
|
197
|
+
end
|
198
|
+
Signal.trap('INT') do
|
199
|
+
puts "RSence startup failed. Please inspect the log and/or run in debug mode."
|
200
|
+
exit
|
201
|
+
end
|
202
|
+
Signal.trap('TERM') do
|
203
|
+
puts "RSence is online at http://#{daemon.addr}:#{daemon.port}/"
|
204
|
+
exit
|
205
|
+
end
|
206
|
+
sleep 1 while true
|
207
|
+
end
|
208
|
+
|
209
|
+
# Sends the PWR signal to the process, which in turn
|
210
|
+
# calls the save method of the daemon.
|
211
|
+
def self.save( daemon )
|
212
|
+
status_ = status( daemon )
|
213
|
+
if status_
|
214
|
+
if wait_signal_response( daemon, 'PWR', 10, 'saving.', 'saved', 0.3 )
|
215
|
+
puts "Session data saved."
|
216
|
+
else
|
217
|
+
puts "Warning: saving timed out! Session data not saved."
|
218
|
+
end
|
219
|
+
elsif status_ == false
|
220
|
+
puts "Warning, no such process (#{pid}) running: unable to save."
|
221
|
+
elsif status_ == nil
|
222
|
+
puts "No pid file: unable to save."
|
223
|
+
else
|
224
|
+
throw "Unexpected process status: #{status_.inspect}"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# Sends the TERM signal to the process, which in turn
|
229
|
+
# calls the stop method of the daemon
|
230
|
+
def self.stop( daemon )#,is_restart=false)
|
231
|
+
status_ = status( daemon )
|
232
|
+
if status_
|
233
|
+
if wait_signal_response( daemon, 'TERM', 10, 'killing.', 'killed', 0.3 )
|
234
|
+
puts "RSence is terminated now."
|
235
|
+
else
|
236
|
+
puts "Warning: termination timed out!"
|
237
|
+
puts "RSence might still be running, please ensure manually."
|
238
|
+
end
|
239
|
+
elsif status_ == false
|
240
|
+
puts "Warning, no such process (#{read_pid(daemon)}) running."
|
241
|
+
elsif status_ == nil
|
242
|
+
puts "Warning, no pid file (process not running)."
|
243
|
+
else
|
244
|
+
throw "Unexpected process status: #{status_.inspect}"
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
# Main entry point called from the daemon process passing +self+ as +daemon+.
|
249
|
+
def self.daemonize( daemon )
|
250
|
+
|
251
|
+
# Uses the command-line tool command to decide what to do.
|
252
|
+
case RSence.cmd
|
253
|
+
when :run
|
254
|
+
run( daemon )
|
255
|
+
when :start
|
256
|
+
start( daemon )
|
257
|
+
when :stop
|
258
|
+
stop( daemon )
|
259
|
+
when :restart
|
260
|
+
stop( daemon )
|
261
|
+
start( daemon )
|
262
|
+
when :save
|
263
|
+
save( daemon )
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
end
|
268
|
+
|
269
|
+
# @private Simple process control, constructed here and called from Daemon::Controller
|
270
|
+
class HTTPDaemon
|
271
|
+
|
272
|
+
# RSence top-level run handler. Almost identical to start.
|
273
|
+
def run
|
274
|
+
|
275
|
+
puts "Starting as a foreground process." if RSence.args[:verbose]
|
276
|
+
puts "Press CTRL-C to terminate."
|
277
|
+
|
278
|
+
@transporter = Transporter.new
|
279
|
+
|
280
|
+
conf = RSence.config[:http_server]
|
281
|
+
|
282
|
+
unless RSence.args[:log_fg]
|
283
|
+
Daemon.start_logging( self )
|
284
|
+
end
|
285
|
+
|
286
|
+
# This is the main http handler instance:
|
287
|
+
@broker = Broker.start(
|
288
|
+
@transporter,
|
289
|
+
conf
|
290
|
+
)
|
291
|
+
|
292
|
+
end
|
293
|
+
|
294
|
+
# Returns the pid file path.
|
295
|
+
def pid_fn
|
296
|
+
RSence.config[:daemon][:pid_fn]
|
297
|
+
end
|
298
|
+
|
299
|
+
# Returns the log path.
|
300
|
+
def log_fn
|
301
|
+
RSence.config[:daemon][:log_fn]
|
302
|
+
end
|
303
|
+
|
304
|
+
# Returns the configured bind address
|
305
|
+
def addr
|
306
|
+
RSence.config[:http_server][:bind_address]
|
307
|
+
end
|
308
|
+
|
309
|
+
# Returns the configured port.
|
310
|
+
def port
|
311
|
+
RSence.config[:http_server][:port]
|
312
|
+
end
|
313
|
+
|
314
|
+
# Called by Controller#start, contains RSence-specific operations
|
315
|
+
def start
|
316
|
+
|
317
|
+
@transporter = Transporter.new
|
318
|
+
|
319
|
+
conf = RSence.config[:http_server]
|
320
|
+
|
321
|
+
unless RSence.args[:log_fg]
|
322
|
+
Daemon.start_logging( self )
|
323
|
+
STDIN.reopen( "/dev/null" )
|
324
|
+
end
|
325
|
+
|
326
|
+
Process.setsid
|
327
|
+
|
328
|
+
# This is the main http handler instance:
|
329
|
+
@broker = Broker.start(
|
330
|
+
@transporter,
|
331
|
+
conf
|
332
|
+
)
|
333
|
+
yield @broker
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
# Called by Controller#stop, contains RSence-specific operations
|
338
|
+
def stop
|
339
|
+
@transporter.shutdown
|
340
|
+
end
|
341
|
+
|
342
|
+
# # Called on PWR signals (save data)
|
343
|
+
# def pwr
|
344
|
+
# save
|
345
|
+
# end
|
346
|
+
|
347
|
+
# Called on INFO signals ("Alive?")
|
348
|
+
def info
|
349
|
+
puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- RSence version #{RSence.version} is running."
|
350
|
+
end
|
351
|
+
|
352
|
+
# Called on ALRM signals (save data, reload all plugins manually)
|
353
|
+
def alrm
|
354
|
+
save
|
355
|
+
@transporter.plugins.shutdown
|
356
|
+
@transporter.plugins.init_bundles!
|
357
|
+
end
|
358
|
+
|
359
|
+
# Called on usr1 signals (updates bundles manually, like the regular intervals of the -a switch and forces client to be rebuilt)
|
360
|
+
def usr1
|
361
|
+
@transporter.plugins.update_bundles!
|
362
|
+
# @transporter.plugins.client_pkg.rebuild_client
|
363
|
+
end
|
364
|
+
|
365
|
+
# Called on USR2 signals
|
366
|
+
def usr2
|
367
|
+
save
|
368
|
+
end
|
369
|
+
|
370
|
+
# Save state
|
371
|
+
def save
|
372
|
+
puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- Saving state..."
|
373
|
+
transporter_state = @transporter.online?
|
374
|
+
@transporter.online = false
|
375
|
+
@transporter.plugins.delegate(:flush)
|
376
|
+
@transporter.sessions.store_sessions
|
377
|
+
@transporter.online = transporter_state
|
378
|
+
puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- State saved."
|
379
|
+
end
|
380
|
+
|
381
|
+
# Main entry point, daemonizes itself using Controller.
|
382
|
+
def daemonize!
|
383
|
+
Daemon.daemonize( self )
|
384
|
+
end
|
385
|
+
|
386
|
+
end
|
387
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
## RSence
|
2
|
+
# Copyright 2010 Riassence Inc.
|
3
|
+
# http://riassence.com/
|
4
|
+
#
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
7
|
+
##
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
module RSence
|
12
|
+
|
13
|
+
# @private RSence async signal communication handler, uses temporary files for communication.
|
14
|
+
# Utilized by ARGVParser and Daemon.
|
15
|
+
module SIGComm
|
16
|
+
def self.delete_signal_response( pid_fn )
|
17
|
+
sig_fn = pid_fn+'.response.'+signal
|
18
|
+
if File.file?( sig_fn )
|
19
|
+
File.delete( sig_fn )
|
20
|
+
end
|
21
|
+
end
|
22
|
+
def self.write_signal_response( pid, pid_fn, signal )
|
23
|
+
sig_fn = pid_fn+'.response.'+signal
|
24
|
+
File.open(sig_fn,'w') do |file|
|
25
|
+
file.write( pid.to_s )
|
26
|
+
end
|
27
|
+
end
|
28
|
+
def self.wait_signal_response( pid, pid_fn, signal, timeout = 10,
|
29
|
+
debug_pre = false, debug_suf = false,
|
30
|
+
sleep_secs = 0.2, verbose=nil )
|
31
|
+
sig_fn = pid_fn+'.response.'+signal
|
32
|
+
verbose = RSence.args[:verbose] if verbose == nil
|
33
|
+
begin
|
34
|
+
if verbose and debug_pre
|
35
|
+
print debug_pre
|
36
|
+
end
|
37
|
+
File.delete( sig_fn ) if File.exists?( sig_fn )
|
38
|
+
status = Process.kill( signal, pid )
|
39
|
+
time_out = Time.now + timeout
|
40
|
+
until (time_out < Time.now) or File.exists?( sig_fn )
|
41
|
+
if verbose
|
42
|
+
print "."
|
43
|
+
STDOUT.flush
|
44
|
+
end
|
45
|
+
sleep sleep_secs
|
46
|
+
end
|
47
|
+
if File.file?( sig_fn )
|
48
|
+
sig_pid = File.read( sig_fn ).to_i
|
49
|
+
if sig_pid != pid
|
50
|
+
puts "Warning, signal PID mismatch. Expected #{pid}, got #{sig_pid}"
|
51
|
+
end
|
52
|
+
File.delete( sig_fn )
|
53
|
+
else
|
54
|
+
puts "Warning, signal response file disappeared! Expected #{sig_fn}"
|
55
|
+
end
|
56
|
+
puts debug_suf if verbose and debug_suf
|
57
|
+
return true
|
58
|
+
rescue Errno::ESRCH
|
59
|
+
return false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|