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
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
+