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.
Files changed (313) hide show
  1. data/.yardopts +10 -0
  2. data/INSTALL.rdoc +330 -0
  3. data/LICENSE.txt +622 -0
  4. data/README.rdoc +98 -0
  5. data/VERSION +1 -0
  6. data/bin/rsence +25 -0
  7. data/bin/rsence-pre +25 -0
  8. data/conf/default_conf.yaml +346 -0
  9. data/conf/default_strings.yaml +76 -0
  10. data/conf/rsence_command_strings.yaml +444 -0
  11. data/docs/ExampleGuiPlugin.rdoc +193 -0
  12. data/docs/JavascriptBundles.rdoc +0 -0
  13. data/docs/PluginBundleInfo.rdoc +173 -0
  14. data/docs/PluginBundles.rdoc +96 -0
  15. data/docs/Values.rdoc +163 -0
  16. data/js/comm/autosync/autosync.js +17 -0
  17. data/js/comm/autosync/js.inc +0 -0
  18. data/js/comm/comm.js +203 -0
  19. data/js/comm/js.inc +0 -0
  20. data/js/comm/jsloader/js.inc +0 -0
  21. data/js/comm/jsloader/jsloader.js +112 -0
  22. data/js/comm/queue/js.inc +0 -0
  23. data/js/comm/queue/queue.js +184 -0
  24. data/js/comm/session/js.inc +0 -0
  25. data/js/comm/session/session.js +52 -0
  26. data/js/comm/sessionwatcher/js.inc +0 -0
  27. data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
  28. data/js/comm/transporter/js.inc +0 -0
  29. data/js/comm/transporter/transporter.js +261 -0
  30. data/js/comm/urlresponder/js.inc +0 -0
  31. data/js/comm/urlresponder/urlresponder.js +149 -0
  32. data/js/comm/values/js.inc +0 -0
  33. data/js/comm/values/values.js +433 -0
  34. data/js/controls/button/button.js +72 -0
  35. data/js/controls/button/js.inc +0 -0
  36. data/js/controls/button/themes/bright/button.css +89 -0
  37. data/js/controls/button/themes/bright/button.html +7 -0
  38. data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
  39. data/js/controls/button/themes/bright/button_parts1.png +0 -0
  40. data/js/controls/button/themes/default/button.css +89 -0
  41. data/js/controls/button/themes/default/button.html +7 -0
  42. data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
  43. data/js/controls/button/themes/default/button_parts1.png +0 -0
  44. data/js/controls/checkbox/checkbox.js +49 -0
  45. data/js/controls/checkbox/js.inc +0 -0
  46. data/js/controls/checkbox/themes/default/checkbox.css +69 -0
  47. data/js/controls/checkbox/themes/default/checkbox.html +5 -0
  48. data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
  49. data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
  50. data/js/controls/dialogs/alert_sheet/alert_sheet.js +63 -0
  51. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  52. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -0
  53. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  54. data/js/controls/dialogs/sheet/js.inc +0 -0
  55. data/js/controls/dialogs/sheet/sheet.js +84 -0
  56. data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
  57. data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
  58. data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
  59. data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
  60. data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
  61. data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
  62. data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
  63. data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
  64. data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
  65. data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
  66. data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
  67. data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
  68. data/js/controls/imageview/imageview.js +109 -0
  69. data/js/controls/imageview/js.inc +0 -0
  70. data/js/controls/imageview/themes/default/blank.gif +0 -0
  71. data/js/controls/passwordcontrol/js.inc +0 -0
  72. data/js/controls/passwordcontrol/passwordcontrol.js +23 -0
  73. data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  74. data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
  75. data/js/controls/progress/progressbar/js.inc +0 -0
  76. data/js/controls/progress/progressbar/progressbar.js +40 -0
  77. data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
  78. data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
  79. data/js/controls/progress/progressindicator/js.inc +0 -0
  80. data/js/controls/progress/progressindicator/progressindicator.js +44 -0
  81. data/js/controls/radiobutton/js.inc +0 -0
  82. data/js/controls/radiobutton/radiobutton.js +43 -0
  83. data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
  84. data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
  85. data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
  86. data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
  87. data/js/controls/sliders/slider/js.inc +0 -0
  88. data/js/controls/sliders/slider/slider.js +357 -0
  89. data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
  90. data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
  91. data/js/controls/sliders/slider/themes/default/slider.css +108 -0
  92. data/js/controls/sliders/slider/themes/default/slider.html +5 -0
  93. data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
  94. data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
  95. data/js/controls/sliders/vslider/js.inc +0 -0
  96. data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
  97. data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
  98. data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
  99. data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
  100. data/js/controls/sliders/vslider/vslider.js +41 -0
  101. data/js/controls/stepper/js.inc +0 -0
  102. data/js/controls/stepper/stepper.js +213 -0
  103. data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
  104. data/js/controls/stepper/themes/default/stepper.css +14 -0
  105. data/js/controls/stepper/themes/default/stepper.html +2 -0
  106. data/js/controls/stepper/themes/default/stepper.png +0 -0
  107. data/js/controls/stringview/js.inc +0 -0
  108. data/js/controls/stringview/stringview.js +49 -0
  109. data/js/controls/stringview/themes/default/stringview.css +8 -0
  110. data/js/controls/stringview/themes/default/stringview.html +1 -0
  111. data/js/controls/tab/js.inc +0 -0
  112. data/js/controls/tab/tab.js +280 -0
  113. data/js/controls/tab/themes/bright/tab.css +76 -0
  114. data/js/controls/tab/themes/bright/tab.html +6 -0
  115. data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
  116. data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
  117. data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
  118. data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
  119. data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
  120. data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
  121. data/js/controls/tab/themes/default/tab.css +77 -0
  122. data/js/controls/tab/themes/default/tab.html +6 -0
  123. data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
  124. data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
  125. data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
  126. data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
  127. data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
  128. data/js/controls/tab/themes/default/tab_parts1.png +0 -0
  129. data/js/controls/textarea/js.inc +0 -0
  130. data/js/controls/textarea/textarea.js +24 -0
  131. data/js/controls/textarea/themes/default/textarea.css +21 -0
  132. data/js/controls/textarea/themes/default/textarea.html +18 -0
  133. data/js/controls/textcontrol/js.inc +0 -0
  134. data/js/controls/textcontrol/textcontrol.js +374 -0
  135. data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
  136. data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
  137. data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
  138. data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
  139. data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
  140. data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
  141. data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
  142. data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
  143. data/js/controls/uploader/js.inc +0 -0
  144. data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
  145. data/js/controls/uploader/themes/default/uploader.css +108 -0
  146. data/js/controls/uploader/themes/default/uploader.html +27 -0
  147. data/js/controls/uploader/uploader.js +154 -0
  148. data/js/controls/validatorview/js.inc +0 -0
  149. data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
  150. data/js/controls/validatorview/themes/default/validator.png +0 -0
  151. data/js/controls/validatorview/themes/default/validatorview.css +0 -0
  152. data/js/controls/validatorview/themes/default/validatorview.html +0 -0
  153. data/js/controls/validatorview/validatorview.js +62 -0
  154. data/js/controls/window/js.inc +0 -0
  155. data/js/controls/window/themes/default/window.css +219 -0
  156. data/js/controls/window/themes/default/window.html +17 -0
  157. data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
  158. data/js/controls/window/themes/default/window_bg_active.png +0 -0
  159. data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
  160. data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
  161. data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
  162. data/js/controls/window/themes/default/window_buttons.png +0 -0
  163. data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
  164. data/js/controls/window/themes/default/window_parts1.png +0 -0
  165. data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
  166. data/js/controls/window/themes/default/window_parts2.png +0 -0
  167. data/js/controls/window/window.js +286 -0
  168. data/js/core/class/class.js +318 -0
  169. data/js/core/class/js.inc +0 -0
  170. data/js/core/elem/elem.js +1383 -0
  171. data/js/core/elem/js.inc +0 -0
  172. data/js/core/event/event.js +153 -0
  173. data/js/core/event/js.inc +0 -0
  174. data/js/core/iefix/ie_css_element.htc +5 -0
  175. data/js/core/iefix/ie_css_style.htc +5 -0
  176. data/js/core/iefix/iefix.js +359 -0
  177. data/js/core/iefix/js.inc +0 -0
  178. data/js/core/rsence_ns/js.inc +0 -0
  179. data/js/core/rsence_ns/rsence_ns.js +21 -0
  180. data/js/datetime/calendar/calendar.js +198 -0
  181. data/js/datetime/calendar/js.inc +0 -0
  182. data/js/datetime/calendar/themes/default/calendar.css +108 -0
  183. data/js/datetime/calendar/themes/default/calendar.html +9 -0
  184. data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
  185. data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  186. data/js/datetime/datetimevalue/datetimevalue.js +247 -0
  187. data/js/datetime/datetimevalue/js.inc +0 -0
  188. data/js/datetime/timesheet/js.inc +0 -0
  189. data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
  190. data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
  191. data/js/datetime/timesheet/timesheet.js +183 -0
  192. data/js/datetime/timesheet_item/js.inc +0 -0
  193. data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
  194. data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
  195. data/js/datetime/timesheet_item/timesheet_item.js +248 -0
  196. data/js/datetime/timesheet_item_edit/js.inc +0 -0
  197. data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
  198. data/js/foundation/application/application.js +208 -0
  199. data/js/foundation/application/js.inc +0 -0
  200. data/js/foundation/control/control.js +339 -0
  201. data/js/foundation/control/controldefaults/controldefaults.js +56 -0
  202. data/js/foundation/control/controldefaults/js.inc +0 -0
  203. data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
  204. data/js/foundation/control/dummyvalue/js.inc +0 -0
  205. data/js/foundation/control/dyncontrol/dyncontrol.js +500 -0
  206. data/js/foundation/control/dyncontrol/js.inc +0 -0
  207. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
  208. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
  209. data/js/foundation/control/eventresponder/eventresponder.js +750 -0
  210. data/js/foundation/control/eventresponder/js.inc +0 -0
  211. data/js/foundation/control/js.inc +0 -0
  212. data/js/foundation/control/valuematrix/js.inc +0 -0
  213. data/js/foundation/control/valuematrix/valuematrix.js +135 -0
  214. data/js/foundation/control/valueresponder/js.inc +0 -0
  215. data/js/foundation/control/valueresponder/valueresponder.js +79 -0
  216. data/js/foundation/eventmanager/eventmanager.js +991 -0
  217. data/js/foundation/eventmanager/js.inc +0 -0
  218. data/js/foundation/geom/point/js.inc +0 -0
  219. data/js/foundation/geom/point/point.js +202 -0
  220. data/js/foundation/geom/rect/js.inc +0 -0
  221. data/js/foundation/geom/rect/rect.js +651 -0
  222. data/js/foundation/json_renderer/js.inc +0 -0
  223. data/js/foundation/json_renderer/json_renderer.js +246 -0
  224. data/js/foundation/system/js.inc +0 -0
  225. data/js/foundation/system/system.js +381 -0
  226. data/js/foundation/thememanager/js.inc +0 -0
  227. data/js/foundation/thememanager/thememanager.js +393 -0
  228. data/js/foundation/value/js.inc +0 -0
  229. data/js/foundation/value/value.js +183 -0
  230. data/js/foundation/view/js.inc +0 -0
  231. data/js/foundation/view/markupview/js.inc +0 -0
  232. data/js/foundation/view/markupview/markupview.js +114 -0
  233. data/js/foundation/view/morphanimation/js.inc +0 -0
  234. data/js/foundation/view/morphanimation/morphanimation.js +237 -0
  235. data/js/foundation/view/view.js +1812 -0
  236. data/js/foundation/view/viewdefaults/js.inc +0 -0
  237. data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
  238. data/js/lists/checkboxlist/checkboxlist.js +171 -0
  239. data/js/lists/checkboxlist/js.inc +0 -0
  240. data/js/lists/listitems/js.inc +0 -0
  241. data/js/lists/listitems/listitems.js +88 -0
  242. data/js/lists/propertylist/js.inc +0 -0
  243. data/js/lists/propertylist/propertylist.js +326 -0
  244. data/js/lists/radiobuttonlist/js.inc +0 -0
  245. data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
  246. data/js/util/reloadapp/js.inc +0 -0
  247. data/js/util/reloadapp/reloadapp.js +152 -0
  248. data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
  249. data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
  250. data/js/util/sha/js.inc +0 -0
  251. data/js/util/sha/sha.js +426 -0
  252. data/js/views/centerview/centerview.js +75 -0
  253. data/js/views/centerview/js.inc +0 -0
  254. data/js/views/inlineview/inlineview.js +15 -0
  255. data/js/views/inlineview/js.inc +0 -0
  256. data/js/views/scrollview/js.inc +0 -0
  257. data/js/views/scrollview/scrollview.js +40 -0
  258. data/lib/conf/argv.rb +850 -0
  259. data/lib/conf/default.rb +219 -0
  260. data/lib/daemon/daemon.rb +387 -0
  261. data/lib/daemon/sigcomm.rb +64 -0
  262. data/lib/http/broker.rb +150 -0
  263. data/lib/http/rackup.rb +91 -0
  264. data/lib/http/request.rb +66 -0
  265. data/lib/http/response.rb +65 -0
  266. data/lib/plugins/dependencies.rb +285 -0
  267. data/lib/plugins/gui_plugin.rb +160 -0
  268. data/lib/plugins/guiparser.rb +123 -0
  269. data/lib/plugins/plugin.rb +438 -0
  270. data/lib/plugins/plugin_base.rb +162 -0
  271. data/lib/plugins/plugin_plugins.rb +81 -0
  272. data/lib/plugins/plugin_sqlite_db.rb +98 -0
  273. data/lib/plugins/pluginmanager.rb +635 -0
  274. data/lib/plugins/plugins.rb +169 -0
  275. data/lib/plugins/servlet.rb +108 -0
  276. data/lib/rsence.rb +32 -0
  277. data/lib/session/msg.rb +327 -0
  278. data/lib/session/sessionmanager.rb +522 -0
  279. data/lib/session/sessionstorage.rb +340 -0
  280. data/lib/transporter/transporter.rb +263 -0
  281. data/lib/util/gzstring.rb +9 -0
  282. data/lib/util/ruby19_fixes.rb +18 -0
  283. data/lib/values/hvalue.rb +378 -0
  284. data/lib/values/valuemanager.rb +172 -0
  285. data/plugins/client_pkg/client_pkg.rb +157 -0
  286. data/plugins/client_pkg/info.yaml +25 -0
  287. data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
  288. data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
  289. data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -0
  290. data/plugins/index_html/img/loading.gif +0 -0
  291. data/plugins/index_html/img/riassence.gif +0 -0
  292. data/plugins/index_html/index_html.rb +120 -0
  293. data/plugins/index_html/info.yaml +18 -0
  294. data/plugins/index_html/tmpl/index.html +15 -0
  295. data/plugins/main/info.yaml +18 -0
  296. data/plugins/main/js/main.js +84 -0
  297. data/plugins/main/main.rb +255 -0
  298. data/plugins/main/values.yaml +8 -0
  299. data/plugins/ticket/info.yaml +21 -0
  300. data/plugins/ticket/lib/common.rb +392 -0
  301. data/plugins/ticket/lib/favicon.rb +39 -0
  302. data/plugins/ticket/lib/file.rb +58 -0
  303. data/plugins/ticket/lib/img.rb +50 -0
  304. data/plugins/ticket/lib/objblob.rb +66 -0
  305. data/plugins/ticket/lib/rsrc.rb +34 -0
  306. data/plugins/ticket/lib/upload.rb +236 -0
  307. data/plugins/ticket/ticket.rb +333 -0
  308. data/setup/welcome/gui/welcome.yaml +92 -0
  309. data/setup/welcome/info.yaml +13 -0
  310. data/setup/welcome/text/welcome.html +9 -0
  311. data/setup/welcome/values.yaml +9 -0
  312. data/setup/welcome/welcome.rb +54 -0
  313. metadata +407 -0
@@ -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
+