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
data/lib/conf/argv.rb ADDED
@@ -0,0 +1,850 @@
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
+ # Includes the Signal Communication utility.
10
+ # Used to respond via special PID files in the run directory of the environment
11
+ require 'daemon/sigcomm'
12
+
13
+
14
+ module RSence
15
+
16
+ # @private Returns true, if platform fully supports POSIX standard signals.
17
+ def self.pid_support?
18
+ # true for non-windows
19
+ return (not ['i386-mingw32','x86-mingw32'].include?(RUBY_PLATFORM))
20
+ end
21
+
22
+ # @private ARGVParser is the "user interface" as a command-line argument parser.
23
+ # It parses the command-line arguments and sets up things accordingly.
24
+ class ARGVParser
25
+
26
+ # The RSence version string, read from the VERSION file in
27
+ # the root directory of RSence.
28
+ @@version = File.read( File.join( SERVER_PATH, 'VERSION' ) ).strip
29
+
30
+ # Makes various commands available depending on the platform.
31
+ # The status/start/stop/restart/save -commands depend on an operating
32
+ # system that fully implements POSIX standard signals.
33
+ # These are necessary to send signals to the background process.
34
+ if not RSence.pid_support?
35
+ @@cmds = [ :run, :initenv, :version, :help ]
36
+ else
37
+ @@cmds = [ :run, :status, :start, :stop, :restart, :save,
38
+ :initenv, :version, :help ]
39
+ end
40
+
41
+ help_avail_cmds = @@cmds.map{|cmd|cmd.to_s}.join("\n ")
42
+
43
+ # Load the strings from the strings file.
44
+ strs_path = File.join( SERVER_PATH, 'conf',
45
+ 'rsence_command_strings.yaml' )
46
+ strs_data = File.read( strs_path )
47
+ require 'erb'
48
+
49
+ strs_data = ERB.new( strs_data ).result( binding )
50
+
51
+ require 'yaml'
52
+ @@strs = YAML.load( strs_data )
53
+
54
+ @@strs[:help][:run] += @@strs[:help][:path]+@@strs[:help][:options]
55
+ @@strs[:help][:start] += @@strs[:help][:path]+@@strs[:help][:options]
56
+ @@strs[:help][:stop] += @@strs[:help][:path]+@@strs[:help][:options]
57
+ @@strs[:help][:restart] += @@strs[:help][:path]+@@strs[:help][:options]
58
+ @@strs[:help][:status] += @@strs[:help][:path]
59
+ @@strs[:help][:save] += @@strs[:help][:path]
60
+
61
+
62
+ # Returns true if one of the 'start' -type commands were supplied
63
+ # and the environment seems valid.
64
+ def startable?; @startable; end
65
+
66
+ # Parses an argument of the 'help' command
67
+ def parse_help_argv
68
+ if @argv.length >= 2
69
+ help_cmd = @argv[1].to_sym
70
+ else
71
+ help_cmd = :help_main
72
+ end
73
+ help( help_cmd )
74
+ exit
75
+ end
76
+
77
+ # Creates the default and initial @args hash.
78
+ def init_args
79
+ @args = {
80
+ :env_path => Dir.pwd,
81
+ :conf_files => [ ], # --conf
82
+ :debug => false, # -d --debug
83
+ :verbose => false, # -v --verbose
84
+ :log_fg => false, # -f --log-fg
85
+ :trace_js => false, # --trace-js
86
+ :trace_delegate => false, # --trace-delegate
87
+ :port => nil, # --port
88
+ :addr => nil, # --addr --bind
89
+ :server => nil, # --server
90
+ :reset_ses => false, # -r --reset-sessions
91
+ :autoupdate => false, # -a --auto-update
92
+ :latency => 0, # --latency
93
+ :say => false, # -S --say
94
+
95
+ # client_pkg (not supported yet)
96
+ :client_pkg_no_gzip => false, # --build-no-gzip
97
+ :client_pkg_no_obfuscation => false, # --build-no-obfuscation
98
+ :client_pkg_no_whitespace_removal => false, # --build-keep-whitespace
99
+ :client_pkg_quiet => true, # --build-verbose
100
+
101
+ }
102
+ end
103
+
104
+ # Main argument parser for all 'start' -type commands.
105
+ def parse_startup_argv
106
+ init_args
107
+ expect_option = false
108
+ option_name = false
109
+ if @argv.length >= 2
110
+ @argv[1..-1].each_with_index do |arg,i|
111
+ if expect_option
112
+ if [:port,:latency].include?(option_name) and arg.to_i.to_s != arg
113
+ puts ERB.new( @@strs[:messages][:invalid_option_expected_number] ).result( binding )
114
+ exit
115
+ elsif option_name == :conf_files
116
+ if not File.exists?( arg ) or not File.file?( arg )
117
+ puts ERB.new( @@strs[:messages][:no_such_configuration_file] ).result( binding )
118
+ exit
119
+ else
120
+ @args[:conf_files].push( arg )
121
+ end
122
+ else
123
+ @args[option_name] = arg
124
+ end
125
+ expect_option = false
126
+ else
127
+ if arg.start_with?('--')
128
+ if arg == '--profile'
129
+ true
130
+ elsif arg == '--debug'
131
+ set_debug
132
+ elsif arg == '--verbose'
133
+ set_verbose
134
+ elsif arg == '--log-fg'
135
+ set_log_fg
136
+ elsif arg == '--trace-js'
137
+ @args[:trace_js] = true
138
+ elsif arg == '--trace-delegate'
139
+ @args[:trace_delegate] = true
140
+ elsif arg == '--port'
141
+ expect_option = true
142
+ option_name = :port
143
+ elsif arg == '--addr'
144
+ expect_option = true
145
+ option_name = :addr
146
+ elsif arg == '--server'
147
+ expect_option = true
148
+ option_name = :server
149
+ elsif arg == '--conf' or arg == '--config'
150
+ expect_option = true
151
+ option_name = :conf_files
152
+ elsif arg == '--reset-sessions'
153
+ set_reset_ses
154
+ elsif arg == '--auto-update'
155
+ set_autoupdate
156
+ elsif arg == '--latency'
157
+ expect_option = true
158
+ option_name = :latency
159
+ elsif arg == '--say'
160
+ set_say
161
+ else
162
+ invalid_option(arg)
163
+ end
164
+ elsif arg.start_with?('-')
165
+ arg.split('')[1..-1].each do |chr|
166
+ if chr == 'd'
167
+ set_debug
168
+ elsif chr == 'v'
169
+ set_verbose
170
+ elsif chr == 'f'
171
+ set_log_fg
172
+ elsif chr == 'r'
173
+ set_reset_ses
174
+ elsif chr == 'a'
175
+ set_autoupdate
176
+ elsif chr == 'S'
177
+ set_say
178
+ else
179
+ invalid_option(arg,chr)
180
+ end
181
+ end
182
+ elsif valid_env?(arg)
183
+ @args[:env_path] = File.expand_path(arg)
184
+ @args[:conf_files].push( File.expand_path( File.join( arg, 'conf', 'config.yaml' ) ) )
185
+ else
186
+ invalid_env( arg )
187
+ end
188
+ end
189
+ end
190
+ if expect_option
191
+ puts ERB.new( @@strs[:messages][:no_value_for_option] ).result( binding )
192
+ exit
193
+ end
194
+ end
195
+ if valid_env?(@args[:env_path])
196
+ conf_file = File.expand_path( File.join( @args[:env_path], 'conf', 'config.yaml' ) )
197
+ @args[:conf_files].push( conf_file ) unless @args[:conf_files].include?( conf_file )
198
+ else
199
+ invalid_env
200
+ end
201
+ @startable = true
202
+ end
203
+
204
+ # Sets various debug-related options on.
205
+ def set_debug
206
+ @args[:debug] = true
207
+ @args[:verbose] = true
208
+ @args[:autoupdate] = true
209
+ @args[:client_pkg_no_obfuscation] = true
210
+ @args[:client_pkg_no_whitespace_removal] = true
211
+ @args[:client_pkg_quiet] = false
212
+ end
213
+
214
+ # Set the verbose argument on
215
+ def set_verbose
216
+ @args[:verbose] = true
217
+ end
218
+
219
+ # Set the foreground logging argument on
220
+ def set_log_fg
221
+ @args[:log_fg] = true
222
+ end
223
+
224
+ # Sets the session reset argument on
225
+ def set_reset_ses
226
+ @args[:reset_ses] = true
227
+ end
228
+
229
+ # Sets the auto-update argument on
230
+ def set_autoupdate
231
+ @args[:autoupdate] = true
232
+ end
233
+
234
+ # Sets the speech synthesis argument on
235
+ def set_say
236
+ @args[:say] = true
237
+ end
238
+
239
+ # Tests for a valid environment
240
+ def valid_env?( arg, quiet=false )
241
+
242
+ # Checks, if the top-level path exists and is a directory
243
+ path = File.expand_path( arg )
244
+ if not File.exists?( path )
245
+ puts ERB.new( @@strs[:messages][:no_such_directory] ).result( binding ) unless quiet
246
+ return false
247
+ elsif not File.directory?( path )
248
+ puts ERB.new( @@strs[:messages][:not_a_directory] ).result( binding ) unless quiet
249
+ return false
250
+ end
251
+
252
+ # Checks, if the conf path exists and is a directory
253
+ conf_path = File.join( path, 'conf' )
254
+ if not File.exists?( conf_path )
255
+ puts ERB.new( @@strs[:messages][:missing_conf_directory] ).result( binding ) unless quiet
256
+ return false
257
+ elsif not File.directory?( conf_path )
258
+ puts ERB.new( @@strs[:messages][:invalid_conf_directory] ).result( binding ) unless quiet
259
+ return false
260
+ end
261
+
262
+ # Checks, if the conf/config.yaml file exists and is a directory
263
+ conf_file = File.join( path, 'conf', 'config.yaml' )
264
+ if not File.exists?(conf_file)
265
+ puts ERB.new( @@strs[:messages][:missing_conf_file] ).result( binding ) unless quiet
266
+ return false
267
+ elsif not File.file?( conf_file )
268
+ puts ERB.new( @@strs[:messages][:invalid_conf_file_not_file] ).result( binding ) unless quiet
269
+ return false
270
+ end
271
+
272
+ # Checks, if the plugins path exists and is a directory
273
+ plugin_path = File.join( path, 'plugins' )
274
+ if not File.exists?( plugin_path )
275
+ warn ERB.new( @@strs[:messages][:warn_no_plugin_directory_in_project] ).result( binding ) if @args[:verbose]
276
+ elsif not File.directory?( plugin_path )
277
+ puts ERB.new( @@strs[:messages][:plugin_directory_not_a_directory] ).result( binding ) unless quiet
278
+ return false
279
+ end
280
+
281
+ # Checks (and automatically creates if missing) the run, db and log directories
282
+ ['run','log','db'].each do |dir_name|
283
+ dir_path = File.join( path, dir_name )
284
+ unless File.exists?( dir_path )
285
+ warn ERB.new( @@strs[:messages][:warn_no_directory_creating] ).result( binding ) if @args[:verbose]
286
+ Dir.mkdir( dir_path )
287
+ end
288
+ end
289
+ return true
290
+ end
291
+
292
+ # Error message when an invalid environment is encountered, exits.
293
+ def invalid_env( env_path=false )
294
+ env_path = @args[:env_path] unless env_path
295
+ puts ERB.new( @@strs[:messages][:invalid_environment] ).result( binding )
296
+ exit
297
+ end
298
+
299
+ # Error message when an invalid option is encountered, exits.
300
+ def invalid_option(arg,chr=false)
301
+ if chr
302
+ puts ERB.new( @@strs[:messages][:invalid_option_chr] ).result( binding )
303
+ else
304
+ puts ERB.new( @@strs[:messages][:invalid_option] ).result( binding )
305
+ end
306
+ exit
307
+ end
308
+
309
+ # Tests, if the port on addr responds or refuses the connection.
310
+ # Automatically replaces '0.0.0.0' with '127.0.0.1'
311
+ def test_port( port, addr='127.0.0.1' )
312
+ require 'socket'
313
+ begin
314
+ addr = '127.0.0.1' if addr == '0.0.0.0'
315
+ if RUBY_VERSION.to_f >= 1.9
316
+ sock = TCPSocket.open( addr, port )
317
+ else
318
+ sock = TCPsocket.open( addr, port )
319
+ end
320
+ sock.close
321
+ return true
322
+ rescue Errno::ECONNREFUSED
323
+ return false
324
+ rescue => e
325
+ warn e.inspect
326
+ return false
327
+ end
328
+ end
329
+
330
+ # Main argument parser for the status command, sends the INFO POSIX signal to the process, if running.
331
+ # Checks if the process responds on the port and address it's configured for.
332
+ def parse_status_argv
333
+ init_args
334
+ expect_option = false
335
+ option_name = false
336
+ if @argv.length >= 2
337
+ @argv[1..-1].each_with_index do |arg,i|
338
+ if expect_option
339
+ if [:port].include?(option_name) and arg.to_i.to_s != arg
340
+ puts ERB.new( @@strs[:messages][:invalid_option_expected_number] ).result( binding )
341
+ exit
342
+ elsif option_name == :conf_files
343
+ if not File.exists?( arg ) or not File.file?( arg )
344
+ puts ERB.new( @@strs[:messages][:no_such_configuration_file] ).result( binding )
345
+ exit
346
+ else
347
+ @args[:conf_files].push( arg )
348
+ end
349
+ else
350
+ @args[option_name] = arg
351
+ end
352
+ expect_option = false
353
+ else
354
+ if arg.start_with?('--')
355
+ if arg == '--debug'
356
+ set_debug
357
+ elsif arg == '--verbose'
358
+ set_verbose
359
+ elsif arg == '--port'
360
+ expect_option = true
361
+ option_name = :port
362
+ elsif arg == '--addr'
363
+ expect_option = true
364
+ option_name = :addr
365
+ elsif arg == '--conf' or arg == '--config'
366
+ expect_option = true
367
+ option_name = :conf_files
368
+ else
369
+ invalid_option(arg)
370
+ end
371
+ elsif arg.start_with?('-')
372
+ arg.split('')[1..-1].each do |chr|
373
+ if chr == 'd'
374
+ set_debug
375
+ elsif chr == 'v'
376
+ set_verbose
377
+ else
378
+ invalid_option(arg,chr)
379
+ end
380
+ end
381
+ elsif valid_env?(arg)
382
+ @args[:env_path] = File.expand_path(arg)
383
+ @args[:conf_files].push( File.expand_path( File.join( arg, 'conf', 'config.yaml' ) ) )
384
+ else
385
+ invalid_env( arg )
386
+ end
387
+ end
388
+ end
389
+ if expect_option
390
+ puts ERB.new( @@strs[:messages][:no_value_for_option] ).result( binding )
391
+ exit
392
+ end
393
+ end
394
+ if valid_env?(@args[:env_path])
395
+ conf_file = File.expand_path( File.join( @args[:env_path], 'conf', 'config.yaml' ) )
396
+ @args[:conf_files].push( conf_file ) unless @args[:conf_files].include?( conf_file )
397
+ else
398
+ invalid_env
399
+ end
400
+ require 'conf/default'
401
+ config = Configuration.new(@args).config
402
+ port = config[:http_server][:port]
403
+ addr = config[:http_server][:bind_address]
404
+ port_status = test_port( port, addr )
405
+ if RSence.pid_support?
406
+ pid_fn = config[:daemon][:pid_fn]
407
+ if File.exists?( pid_fn )
408
+ pid = File.read( pid_fn ).to_i
409
+ pid_status = RSence::SIGComm.wait_signal_response(
410
+ pid, pid_fn, 'INFO', 3
411
+ )
412
+ else
413
+ warn @@strs[:messages][:no_pid_file] if @args[:verbose]
414
+ pid_status = nil
415
+ end
416
+ else
417
+ warn @@strs[:messages][:no_pid_support] if @args[:verbose]
418
+ pid_status = nil
419
+ end
420
+ if RSence.pid_support?
421
+ if pid_status == nil
422
+ puts @@strs[:messages][:no_pid]
423
+ elsif pid_status == false
424
+ if port_status
425
+ puts ERB.new( @@strs[:messages][:no_process_running_but_something_responds] ).result( binding )
426
+ else
427
+ puts ERB.new( @@strs[:messages][:no_process_running_and_nothing_responds] ).result( binding )
428
+ end
429
+ else
430
+ if port_status
431
+ puts ERB.new( @@strs[:messages][:process_running_and_responds] ).result( binding )
432
+ else
433
+ puts ERB.new( @@strs[:messages][:process_running_but_nothing_responds] ).result( binding )
434
+ end
435
+ end
436
+ end
437
+ end
438
+
439
+ # Main argument parser for the save command. Sends the USR1 POSIX signal to the process, if running.
440
+ def parse_save_argv
441
+ init_args
442
+ expect_option = false
443
+ option_name = false
444
+ if @argv.length >= 2
445
+ @argv[1..-1].each_with_index do |arg,i|
446
+ if expect_option
447
+ if option_name == :conf_files
448
+ if not File.exists?( arg ) or not File.file?( arg )
449
+ puts ERB.new( @@strs[:messages][:no_such_configuration_file] ).result( binding )
450
+ exit
451
+ else
452
+ @args[:conf_files].push( arg )
453
+ end
454
+ else
455
+ @args[option_name] = arg
456
+ end
457
+ expect_option = false
458
+ else
459
+ if arg.start_with?('--')
460
+ if arg == '--debug'
461
+ set_debug
462
+ elsif arg == '--verbose'
463
+ set_verbose
464
+ elsif arg == '--conf' or arg == '--config'
465
+ expect_option = true
466
+ option_name = :conf_files
467
+ else
468
+ invalid_option(arg)
469
+ end
470
+ elsif arg.start_with?('-')
471
+ arg.split('')[1..-1].each do |chr|
472
+ if chr == 'd'
473
+ set_debug
474
+ elsif chr == 'v'
475
+ set_verbose
476
+ else
477
+ invalid_option(arg,chr)
478
+ end
479
+ end
480
+ elsif valid_env?(arg)
481
+ @args[:env_path] = File.expand_path(arg)
482
+ @args[:conf_files].push( File.expand_path( File.join( arg, 'conf', 'config.yaml' ) ) )
483
+ else
484
+ invalid_env( arg )
485
+ end
486
+ end
487
+ end
488
+ if expect_option
489
+ puts ERB.new( @@strs[:messages][:no_value_for_option] ).result( binding )
490
+ exit
491
+ end
492
+ end
493
+ if valid_env?(@args[:env_path])
494
+ conf_file = File.expand_path( File.join( @args[:env_path], 'conf', 'config.yaml' ) )
495
+ @args[:conf_files].push( conf_file ) unless @args[:conf_files].include?( conf_file )
496
+ else
497
+ invalid_env
498
+ end
499
+ require 'conf/default'
500
+ config = Configuration.new(@args).config
501
+ if RSence.pid_support?
502
+ pid_fn = config[:daemon][:pid_fn]
503
+ if File.exists?( pid_fn )
504
+ pid = File.read( pid_fn ).to_i
505
+ saving_message = @@strs[:messages][:saving_message]
506
+ pid_status = RSence::SIGComm.wait_signal_response(
507
+ pid, pid_fn, 'USR2', 30, saving_message, '.', 0.1, true
508
+ )
509
+ else
510
+ warn @@strs[:messages][:no_pid_file] if @args[:verbose]
511
+ pid_status = nil
512
+ end
513
+ else
514
+ warn @@strs[:messages][:no_pid_support] if @args[:verbose]
515
+ pid_status = nil
516
+ end
517
+ if RSence.pid_support?
518
+ if pid_status == nil
519
+ puts @@strs[:messages][:no_pid_unable_to_save]
520
+ elsif pid_status == false
521
+ puts @@strs[:messages][:no_process_running]
522
+ else
523
+ puts @@strs[:messages][:session_data_saved]
524
+ end
525
+ end
526
+ end
527
+
528
+ # asks y/n and returns booleans,
529
+ # the default tells if which one is for just enter
530
+ def yesno(default=false)
531
+ if default
532
+ question = "Y/n? "
533
+ else
534
+ question = "y/N? "
535
+ end
536
+ print question
537
+ answer = $stdin.gets.strip.downcase[0]
538
+ answer = answer.chr if answer
539
+ if answer == 'n'
540
+ return false
541
+ elsif answer == 'y'
542
+ return true
543
+ elsif answer == nil
544
+ return default
545
+ else
546
+ return nil
547
+ end
548
+ end
549
+
550
+ # The initenv command and its parser. Asks questions about the environment before doing anything else.
551
+ def parse_initenv_argv
552
+ init_args
553
+ expect_option = false
554
+ option_name = false
555
+ valid_env = false
556
+ interactive = true
557
+ create_blank = false
558
+ if @argv.length >= 2
559
+ @argv[1..-1].each_with_index do |arg,i|
560
+ if expect_option
561
+ if [:port].include?(option_name) and arg.to_i.to_s != arg
562
+ puts ERB.new( @@strs[:messages][:invalid_option_expected_number] ).result( binding )
563
+ exit
564
+ else
565
+ @args[option_name] = arg
566
+ end
567
+ expect_option = false
568
+ else
569
+ if arg.start_with?('--')
570
+ if arg == '--port'
571
+ expect_option = true
572
+ option_name = :port
573
+ elsif arg == '--addr'
574
+ expect_option = true
575
+ option_name = :addr
576
+ elsif arg == '--server'
577
+ expect_option = true
578
+ option_name = :server
579
+ elsif arg == '--title'
580
+ expect_option = true
581
+ option_name = :title
582
+ elsif arg == '--database'
583
+ expect_option = true
584
+ option_name = :db
585
+ elsif arg == '--uri-prefix'
586
+ expect_option = true
587
+ option_name = :base_url
588
+ elsif arg == '--blank'
589
+ create_blank = true
590
+ elsif arg == '--non-interactive'
591
+ interactive = false
592
+ else
593
+ invalid_option(arg)
594
+ end
595
+ elsif arg.start_with?('-')
596
+ arg.split('')[1..-1].each do |chr|
597
+ if chr == 'q'
598
+ interactive = false
599
+ end
600
+ end
601
+ else
602
+ @args[:env_path] = File.expand_path(arg)
603
+ end
604
+ end
605
+ end
606
+ if expect_option
607
+ puts ERB.new( @@strs[:messages][:no_value_for_option] ).result( binding )
608
+ exit
609
+ end
610
+ end
611
+ if valid_env?(@args[:env_path],true)
612
+ puts @@strs[:initenv][:env_already_initialized]
613
+ exit
614
+ end
615
+ conf_file = File.expand_path( File.join( @args[:env_path], 'conf', 'config.yaml' ) )
616
+ if File.exists?(@args[:env_path])
617
+ if Dir.entries(@args[:env_path]).length > 2 # [ '.', '..' ]
618
+ puts ERB.new( @@strs[:initenv][:env_not_empty] ).result( binding )
619
+ exit
620
+ end
621
+ end
622
+
623
+ require 'conf/default'
624
+ default_config = Configuration.new(@args,true).config
625
+
626
+ config = {
627
+ :base_url => (@args[:base_url] or default_config[:base_url]),
628
+ :http_server => {
629
+ :port => (@args[:port] or default_config[:http_server][:port]),
630
+ :bind_address => (@args[:addr] or default_config[:http_server][:bind_address]),
631
+ :rack_require => (@args[:server] or default_config[:http_server][:rack_require])
632
+ },
633
+ :index_html => {
634
+ :title => (@args[:title] or default_config[:index_html][:title])
635
+ },
636
+ :database => {
637
+ :ses_db => (@args[:db] or default_config[:database][:ses_db])
638
+ }
639
+ }
640
+ Signal.trap 'INT' do
641
+ puts
642
+ puts "Configuration aborted."
643
+ exit
644
+ end
645
+ if interactive
646
+ answers_ok = false
647
+ until answers_ok
648
+ puts ERB.new( @@strs[:initenv][:creating_env] ).result( binding )
649
+
650
+ require 'highline/import'
651
+
652
+ say @@strs[:initenv][:enter_title]
653
+ str_project_title = @@strs[:initenv][:project_title]
654
+ config[:index_html][:title] = ask( str_project_title ) do |q|
655
+ q.default = config[:index_html][:title]
656
+ end
657
+
658
+ say @@strs[:initenv][:enter_db_url]
659
+ str_db_url = @@strs[:initenv][:db_url]
660
+ config[:database][:ses_db] = ask(str_db_url) do |q|
661
+ q.default = config[:database][:ses_db]
662
+ end
663
+
664
+ say @@strs[:initenv][:enter_http_port]
665
+ str_http_port = @@strs[:initenv][:http_port]
666
+ config[:http_server][:port] = ask(str_http_port) do |q|
667
+ q.default = config[:http_server][:port]
668
+ end
669
+
670
+ say @@strs[:initenv][:enter_tcp_ip]
671
+ str_tcp_ip = @@strs[:initenv][:tcp_ip]
672
+ config[:http_server][:bind_address] = ask(str_tcp_ip) do |q|
673
+ q.default = config[:http_server][:bind_address]
674
+ end
675
+
676
+ say @@strs[:initenv][:enter_root_dir]
677
+ str_root_dir = @@strs[:initenv][:root_dir]
678
+ config[:base_url] = ask(str_root_dir) do |q|
679
+ q.default = config[:base_url]
680
+ end
681
+
682
+ test_url = "http://#{config[:http_server][:bind_address]}:#{config[:http_server][:port]}#{config[:base_url]}"
683
+ say ERB.new( @@strs[:initenv][:config_summary] ).result( binding )
684
+ print @@strs[:initenv][:confirm_config]
685
+ answers_ok = yesno(true)
686
+ end
687
+ else
688
+ test_url = "http://#{config[:http_server][:bind_address]}:#{config[:http_server][:port]}#{config[:base_url]}"
689
+ end
690
+
691
+ puts @@strs[:initenv][:creating_dirs]
692
+ env_dir = @args[:env_path]
693
+ require 'fileutils'
694
+ FileUtils.mkdir_p( env_dir ) unless File.exists?( env_dir )
695
+ conf_dir = File.expand_path( 'conf', env_dir )
696
+ Dir.mkdir( conf_dir )
697
+ db_dir = File.expand_path( 'db', env_dir )
698
+ Dir.mkdir( db_dir )
699
+ log_dir = File.expand_path( 'log', env_dir )
700
+ Dir.mkdir( log_dir )
701
+ plugins_dir = File.expand_path( 'plugins', env_dir )
702
+ Dir.mkdir( plugins_dir )
703
+ run_dir = File.expand_path( 'run', env_dir )
704
+ Dir.mkdir( run_dir )
705
+ unless create_blank
706
+ welcome_plugin_dir = File.join( SERVER_PATH, 'setup', 'welcome' )
707
+ welcome_plugin_dst = File.join( plugins_dir, 'welcome' )
708
+ puts ERB.new( @@strs[:initenv][:installing_welcome_plugin] ).result( binding )
709
+ FileUtils.cp_r( welcome_plugin_dir, welcome_plugin_dst )
710
+ end
711
+ puts @@strs[:initenv][:creating_files]
712
+ conf_file = File.join( conf_dir, 'config.yaml' )
713
+ File.open( conf_file, 'w' ) {|f| f.write( YAML.dump( config ) ) }
714
+ readme_file = File.join( env_dir, 'README' )
715
+ File.open( readme_file, 'w' ) {|f| f.write( ERB.new( @@strs[:initenv][:readme] ).result( binding ) ) }
716
+ version_file = File.join( env_dir, 'VERSION' )
717
+ File.open( version_file, 'w' ) {|f| f.write( "RSence Environment Version #{version.to_f}" ) }
718
+ puts ERB.new( @@strs[:initenv][:congratulations] ).result( binding )
719
+ exit
720
+ end
721
+
722
+ # Main parser for the help command
723
+ def help( cmd )
724
+ cmd.to_sym! if cmd.class != Symbol
725
+ puts @@strs[:help][:head]
726
+ if @@strs[:help].has_key?(cmd)
727
+ puts @@strs[:help][cmd]
728
+ else
729
+ puts @@strs[:help][:help_main]
730
+ end
731
+ puts @@strs[:help][:tail]
732
+ end
733
+
734
+ # Returns the version of RSence
735
+ def version
736
+ @@version
737
+ end
738
+
739
+ # Returns the command the process was started with.
740
+ def cmd
741
+ @cmd
742
+ end
743
+
744
+ # Returns the parsed optional arguments
745
+ def args
746
+ @args
747
+ end
748
+
749
+ # Top-level argument parser, checks for command and calls sub-parser, if valid command.
750
+ def parse_argv
751
+ if @argv.empty?
752
+ puts @@strs[:help][:help_help]
753
+ exit
754
+ else
755
+ cmd = @argv[0].to_sym
756
+ cmd = :help if [:h, :'-h', :'--help', :'-help'].include? cmd
757
+ end
758
+ if @@cmds.include?(cmd)
759
+ @cmd = cmd
760
+ if cmd == :help
761
+ parse_help_argv
762
+ elsif cmd == :version
763
+ puts version
764
+ exit
765
+ elsif [:run,:start,:stop,:restart].include? cmd
766
+ parse_startup_argv
767
+ elsif cmd == :status
768
+ parse_status_argv
769
+ elsif cmd == :save
770
+ parse_save_argv
771
+ elsif cmd == :initenv
772
+ parse_initenv_argv
773
+ end
774
+ else
775
+ puts @@strs[:help][:unknown] + cmd.to_s.inspect
776
+ puts @@strs[:help][:help_help]
777
+ exit
778
+ end
779
+ end
780
+
781
+ # Entry point for ARGV parsing
782
+ def parse( argv )
783
+ @argv = argv
784
+ @startable = false
785
+ parse_argv
786
+ end
787
+
788
+ # The constructor sets the @startable flag as false. Use the #parse method with ARGV as the argument to start parsing the ARGV.
789
+ def initialize
790
+ @startable = false
791
+ end
792
+
793
+ end
794
+
795
+ # @private This accessor enables RSence.argv method, which returns the ARGVParser instance
796
+ def self.argv; @@argv_parser; end
797
+
798
+ # @private This accessor enables RSence.cmd method, which returns the command the process was started with.
799
+ def self.cmd; @@argv_parser.cmd; end
800
+
801
+ # Command line options parsed
802
+ # @return [Hash] Parsed command-line options:
803
+ # *Key* (Symbol):: *Value*
804
+ # +:env_path+:: (String) The directory of the environment.
805
+ # +:conf_files+:: (Array of Strings) Additional configuration files given with the +--conf+ command-line option. Default is +[]+.
806
+ # +:debug+:: (true or false) True, if the +-d+ or +--debug+ command-line option was given. Default is false.
807
+ # +:verbose+:: (true or false) True, if the +-v+ or +--verbose+ command-line option was given. Default is false.
808
+ # +:log_fg+:: (true or false) True, if the +-f+ or +--log-fg+ command-line option was given. Default is false.
809
+ # +:trace_js+:: (true or false) True, if the +--trace-js+ command-line option was given. Default is false.
810
+ # +:trace_delegate+:: (true or false) True, if the +--trace-delegate+ command-line option was given. Default is false.
811
+ # +:port+:: (String or nil) The TCP port number given with the +--port+ command-line option. Default is nil.
812
+ # +:addr+:: (String or nil) The TCP bind address given with the +--addr+ command-line option. Default is nil.
813
+ # +:server+:: (String or nil) The Rack http server handler given with the +--server+ command-line option. Default is nil.
814
+ # +:reset_ses+:: (true or false) True, if the +-r+ or +--reset-sessions+ command-line option was given. Default is false.
815
+ # +:autoupdate+:: (true or false) True, if the +-a+ or +--auto-update+ command-line option was given. Default is false.
816
+ # +:latency+:: (Number) Amount of milliseconds to sleep in each request given with the +--latency+ command-line option. Default is 0.
817
+ # +:say+:: (true or false) True, if the +-S+ or +--say+ command-line option was given. Default is false.
818
+ def self.args; @@argv_parser.args; end
819
+
820
+ # @private This accessor enables RSence.startable? method, which returns true if a start-type command was given.
821
+ def self.startable?; @@argv_parser.startable?; end
822
+
823
+ # @return [String] The version of RSence
824
+ def self.version; @@argv_parser.version; end
825
+
826
+ # @private This accessor enables RSence.startup method, which starts RSence.
827
+ def self.startup
828
+ puts "Loading configuration..." if self.args[:verbose]
829
+ # Use the default configuration:
830
+ require 'conf/default'
831
+ @@config = Configuration.new(self.args).config
832
+
833
+ # RSence runtime configuration data
834
+ # @return [Hash] the active configuration structure as defined by the {file:default_conf default configuration} and overridden by local configuration files.
835
+ def self.config
836
+ @@config
837
+ end
838
+ ## Riassence Daemon controls
839
+ require 'daemon/daemon'
840
+ puts "Starting RSence..." if self.args[:verbose]
841
+ daemon = HTTPDaemon.new
842
+ daemon.daemonize!
843
+ end
844
+
845
+ # @private The ARGVParser instance and its startup
846
+ @@argv_parser = ARGVParser.new
847
+ @@argv_parser.parse( ARGV )
848
+
849
+ end
850
+