rsence-pre 2.1.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
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
+