rhoconnect 3.1.2 → 3.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (248) hide show
  1. data/CHANGELOG.md +14 -2
  2. data/CREDITS +151 -10
  3. data/Gemfile +16 -5
  4. data/Gemfile.lock +58 -23
  5. data/Rakefile +70 -50
  6. data/bench/bench_runner.rb +2 -2
  7. data/bench/benchapp/Gemfile +6 -0
  8. data/bench/benchapp/Gemfile.lock +5 -0
  9. data/bench/benchapp/config.ru +2 -0
  10. data/bench/lib/bench/cli.rb +2 -0
  11. data/bench/lib/bench/distr_runner.rb +3 -2
  12. data/bench/lib/bench/runner.rb +1 -1
  13. data/bench/lib/bench.rb +10 -1
  14. data/bench/run_bench.sh +1 -1
  15. data/bench/scripts/test_query_script.rb +2 -1
  16. data/bench/spec/bench_spec_helper.rb +1 -0
  17. data/bin/rhoconnect +9 -27
  18. data/bin/rhoconnect-benchmark +10 -1
  19. data/commands/commands/dtach_commands/dtach_about.rb +6 -0
  20. data/commands/commands/dtach_commands/dtach_install.rb +30 -0
  21. data/commands/commands/redis_commands/redis_about.rb +6 -0
  22. data/commands/commands/redis_commands/redis_attach.rb +6 -0
  23. data/commands/commands/redis_commands/redis_download.rb +33 -0
  24. data/commands/commands/redis_commands/redis_install.rb +26 -0
  25. data/commands/commands/redis_commands/redis_make.rb +9 -0
  26. data/commands/commands/redis_commands/redis_restart.rb +7 -0
  27. data/commands/commands/redis_commands/redis_runner.rb +67 -0
  28. data/commands/commands/redis_commands/redis_start.rb +6 -0
  29. data/commands/commands/redis_commands/redis_startbg.rb +6 -0
  30. data/commands/commands/redis_commands/redis_stop.rb +6 -0
  31. data/commands/commands/rhoconnect/attach.rb +7 -0
  32. data/commands/commands/rhoconnect/clean_start.rb +9 -0
  33. data/commands/commands/rhoconnect/config.rb +15 -0
  34. data/commands/commands/rhoconnect/console.rb +15 -0
  35. data/commands/commands/rhoconnect/console_helper.rb +3 -0
  36. data/commands/commands/rhoconnect/create_user.rb +18 -0
  37. data/commands/commands/rhoconnect/delete_device.rb +9 -0
  38. data/commands/commands/rhoconnect/delete_user.rb +8 -0
  39. data/commands/commands/rhoconnect/flushdb.rb +14 -0
  40. data/commands/commands/rhoconnect/get_token.rb +25 -0
  41. data/commands/commands/rhoconnect/reset.rb +16 -0
  42. data/commands/commands/rhoconnect/reset_refresh.rb +11 -0
  43. data/commands/commands/rhoconnect/restart.rb +7 -0
  44. data/commands/commands/rhoconnect/secret.rb +11 -0
  45. data/commands/commands/rhoconnect/set_admin_password.rb +26 -0
  46. data/commands/commands/rhoconnect/spec.rb +15 -0
  47. data/commands/commands/rhoconnect/start.rb +18 -0
  48. data/commands/commands/rhoconnect/startbg.rb +34 -0
  49. data/commands/commands/rhoconnect/startdebug.rb +35 -0
  50. data/commands/commands/rhoconnect/stop.rb +11 -0
  51. data/commands/commands/rhoconnect/war.rb +32 -0
  52. data/commands/commands/rhoconnect/web.rb +7 -0
  53. data/commands/execute.rb +35 -0
  54. data/commands/generators/app.rb +6 -0
  55. data/commands/generators/source.rb +6 -0
  56. data/commands/utilities/dtach_installed.rb +10 -0
  57. data/doc/benchmarks-running.txt +5 -0
  58. data/doc/command-line.txt +216 -27
  59. data/doc/heroku-addon.txt +1 -1
  60. data/doc/preparing-production.txt +20 -1
  61. data/doc/public/cli.txt +191 -0
  62. data/doc/push-backend-setup.txt +148 -0
  63. data/doc/push-client-setup.txt +61 -0
  64. data/doc/push-server-setup.txt +91 -0
  65. data/doc/push.txt +8 -137
  66. data/doc/rest-api.txt +96 -0
  67. data/doc/settings.txt +1 -1
  68. data/doc/supported-platforms.txt +2 -1
  69. data/doc/tutorial.txt +6 -4
  70. data/examples/simple/Gemfile +39 -0
  71. data/examples/simple/Rakefile +7 -12
  72. data/examples/simple/config.ru +16 -31
  73. data/examples/simple/settings/settings.yml +5 -4
  74. data/examples/simple/sources/product.rb +51 -0
  75. data/generators/templates/application/Gemfile +7 -0
  76. data/generators/templates/application/Rakefile +5 -18
  77. data/generators/templates/application/config.ru +11 -19
  78. data/install.sh +24 -49
  79. data/installer/unix-like/create_texts.rb +71 -123
  80. data/installer/unix-like/post_install.sh +3 -0
  81. data/installer/unix-like/post_uninstall.sh +2 -0
  82. data/installer/unix-like/pre_install.sh +5 -3
  83. data/installer/unix-like/pre_uninstall.sh +14 -6
  84. data/installer/unix-like/rho_connect_install_checkers.rb +1 -1
  85. data/installer/unix-like/rho_connect_install_constants.rb +6 -10
  86. data/installer/unix-like/rho_connect_install_debian.rb +2 -2
  87. data/installer/unix-like/rho_connect_install_dnd.rb +2 -5
  88. data/installer/unix-like/rho_connect_install_installers.rb +15 -23
  89. data/installer/unix-like/rho_connect_install_yum.rb +2 -2
  90. data/installer/utils/constants.rb +4 -4
  91. data/installer/utils/create_sha1.rb +1 -1
  92. data/installer/utils/nix_install_test.rb +32 -31
  93. data/installer/utils/nix_installation.rake +1 -1
  94. data/installer/utils/package_upload/repos.rake +34 -30
  95. data/installer/utils/package_upload/s3_upload.rb +3 -3
  96. data/lib/rhoconnect/api/source/fast_delete.rb +10 -0
  97. data/lib/rhoconnect/api/source/fast_insert.rb +10 -0
  98. data/lib/rhoconnect/api/source/fast_update.rb +10 -0
  99. data/lib/rhoconnect/api/source/get_source_params.rb +1 -1
  100. data/lib/rhoconnect/api/source/list_sources.rb +2 -2
  101. data/lib/rhoconnect/api/source/save_adapter.rb +1 -1
  102. data/lib/rhoconnect/api/source/update_source_params.rb +6 -0
  103. data/lib/rhoconnect/async.rb +82 -0
  104. data/lib/rhoconnect/bulk_data/bulk_data.rb +5 -1
  105. data/lib/rhoconnect/client_sync.rb +18 -3
  106. data/lib/rhoconnect/console/rhoconnect_api.rb +2 -2
  107. data/lib/rhoconnect/console/server.rb +5 -32
  108. data/lib/rhoconnect/console.rb +2 -2
  109. data/lib/rhoconnect/graph_helper.rb +225 -0
  110. data/lib/rhoconnect/jobs/bulk_data_job.rb +24 -2
  111. data/lib/rhoconnect/server.rb +31 -11
  112. data/lib/rhoconnect/source.rb +10 -5
  113. data/lib/rhoconnect/source_sync.rb +32 -2
  114. data/lib/rhoconnect/tasks.rb +19 -108
  115. data/lib/rhoconnect/test_methods.rb +20 -0
  116. data/lib/rhoconnect/utilities.rb +118 -0
  117. data/lib/rhoconnect/version.rb +1 -1
  118. data/lib/rhoconnect/web-console/controllers/admins.js +245 -0
  119. data/lib/rhoconnect/web-console/models/adapter.js +53 -0
  120. data/lib/rhoconnect/web-console/models/client.js +105 -0
  121. data/lib/rhoconnect/web-console/models/doc.js +113 -0
  122. data/lib/rhoconnect/web-console/models/session.js +40 -0
  123. data/lib/rhoconnect/web-console/models/source.js +115 -0
  124. data/lib/rhoconnect/web-console/models/stats.js +84 -0
  125. data/lib/rhoconnect/web-console/models/user.js +111 -0
  126. data/lib/rhoconnect/web-console/public/backbone.js +1432 -0
  127. data/lib/rhoconnect/web-console/public/bootstrap.css +3990 -0
  128. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/excanvas.min.js +0 -0
  129. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.barRenderer.min.js +0 -0
  130. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.canvasAxisLabelRenderer.js +0 -0
  131. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.canvasAxisTickRenderer.js +0 -0
  132. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.canvasTextRenderer.js +0 -0
  133. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.categoryAxisRenderer.min.js +0 -0
  134. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.cursor.js +0 -0
  135. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.dateAxisRenderer.js +0 -0
  136. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.dateAxisRenderer.min.js +0 -0
  137. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jqplot.pointLabels.min.js +0 -0
  138. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jquery-1.4.2.min.js +0 -0
  139. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jquery.jqplot.min.css +0 -0
  140. data/lib/rhoconnect/{console/app → web-console}/public/jqplot/jquery.jqplot.min.js +0 -0
  141. data/lib/rhoconnect/web-console/public/jquery-1.7.1.min.js +154 -0
  142. data/lib/rhoconnect/web-console/public/rhoconnect-web.js +15 -0
  143. data/lib/rhoconnect/web-console/public/underscore.js +999 -0
  144. data/lib/rhoconnect/web-console/server.rb +55 -0
  145. data/lib/rhoconnect/web-console/templates/index.erb +90 -0
  146. data/lib/rhoconnect/web-console/templates/jqplot.erb +60 -0
  147. data/lib/rhoconnect/web-console/views/api_token.js +16 -0
  148. data/lib/rhoconnect/web-console/views/doc.js +63 -0
  149. data/lib/rhoconnect/web-console/views/edit_user.js +43 -0
  150. data/lib/rhoconnect/web-console/views/home.js +56 -0
  151. data/lib/rhoconnect/web-console/views/index.js +63 -0
  152. data/lib/rhoconnect/web-console/views/new_ping.js +58 -0
  153. data/lib/rhoconnect/web-console/views/new_user.js +29 -0
  154. data/lib/rhoconnect/web-console/views/server_doc.js +103 -0
  155. data/lib/rhoconnect/web-console/views/set_adapter.js +38 -0
  156. data/lib/rhoconnect/web-console/views/settings.js +53 -0
  157. data/lib/rhoconnect/web-console/views/show_device.js +56 -0
  158. data/lib/rhoconnect/web-console/views/show_user.js +38 -0
  159. data/lib/rhoconnect/web-console/views/source_docs.js +30 -0
  160. data/lib/rhoconnect/web-console/views/stats.js +69 -0
  161. data/lib/rhoconnect/web-console/views/users.js +20 -0
  162. data/lib/rhoconnect.rb +2 -1
  163. data/rhoconnect.gemspec +3 -1
  164. data/spec/api/application/rhoconnect_api_spec.rb +3 -5
  165. data/spec/api/source/fast_delete_spec.rb +27 -0
  166. data/spec/api/source/fast_insert_spec.rb +28 -0
  167. data/spec/api/source/fast_update_spec.rb +51 -0
  168. data/spec/api/source/get_source_params_spec.rb +1 -0
  169. data/spec/api/source/update_source_params_spec.rb +24 -0
  170. data/spec/async_spec.rb +19 -0
  171. data/spec/client_sync_spec.rb +19 -2
  172. data/spec/javascripts/PlayerSpec.js +58 -0
  173. data/spec/javascripts/admins_routes_spec.js +117 -0
  174. data/spec/javascripts/admins_spec.js +27 -0
  175. data/spec/javascripts/doc_view_spec.js +37 -0
  176. data/spec/javascripts/edit_user_view_spec.js +44 -0
  177. data/spec/javascripts/helpers/SpecHelper.js +9 -0
  178. data/spec/javascripts/helpers/jasmine-jquery.js +305 -0
  179. data/spec/javascripts/helpers/jasmine-sinon.js +43 -0
  180. data/spec/javascripts/helpers/sinon-1.3.2.js +3551 -0
  181. data/spec/javascripts/home_view_spec.js +39 -0
  182. data/spec/javascripts/index_view_spec.js +42 -0
  183. data/spec/javascripts/new_ping_view_spec.js +48 -0
  184. data/spec/javascripts/new_user_view_spec.js +42 -0
  185. data/spec/javascripts/server_doc_view_spec.js +39 -0
  186. data/spec/javascripts/set_adapter_view_spec.js +32 -0
  187. data/spec/javascripts/show_device_view_spec.js +41 -0
  188. data/spec/javascripts/show_user_view_spec.js +46 -0
  189. data/spec/javascripts/source_docs_view_spec.js +36 -0
  190. data/spec/javascripts/support/jasmine.yml +79 -0
  191. data/spec/javascripts/support/jasmine_config.rb +23 -0
  192. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  193. data/spec/javascripts/users_view_spec.js +35 -0
  194. data/spec/jobs/bulk_data_job_spec.rb +10 -2
  195. data/spec/perf/bulk_data_perf_spec.rb +1 -0
  196. data/spec/server/server_spec.rb +3 -1
  197. data/spec/source_sync_spec.rb +14 -1
  198. data/spec/spec_helper.rb +51 -0
  199. data/spec/store_spec.rb +6 -0
  200. data/spec/test_methods_spec.rb +11 -0
  201. data/tasks/redis.rake +3 -1
  202. metadata +172 -64
  203. data/doc/contributing.txt +0 -60
  204. data/lib/rhoconnect/console/app/helpers/auth_helper.rb +0 -22
  205. data/lib/rhoconnect/console/app/helpers/extensions.rb +0 -19
  206. data/lib/rhoconnect/console/app/helpers/helpers.rb +0 -57
  207. data/lib/rhoconnect/console/app/public/ThickBox.css +0 -649
  208. data/lib/rhoconnect/console/app/public/home.css +0 -431
  209. data/lib/rhoconnect/console/app/public/images/foot_logo_rhoconnect.png +0 -0
  210. data/lib/rhoconnect/console/app/public/images/header_halo.jpg +0 -0
  211. data/lib/rhoconnect/console/app/public/images/land_separator.gif +0 -0
  212. data/lib/rhoconnect/console/app/public/images/landing_header.jpg +0 -0
  213. data/lib/rhoconnect/console/app/public/images/logo_rhoconnect.png +0 -0
  214. data/lib/rhoconnect/console/app/public/images/tabs_separator.png +0 -0
  215. data/lib/rhoconnect/console/app/public/main.css +0 -7
  216. data/lib/rhoconnect/console/app/public/reset.css +0 -76
  217. data/lib/rhoconnect/console/app/public/style.css +0 -2201
  218. data/lib/rhoconnect/console/app/public/text.txt +0 -0
  219. data/lib/rhoconnect/console/app/routes/adapter.rb +0 -28
  220. data/lib/rhoconnect/console/app/routes/auth.rb +0 -29
  221. data/lib/rhoconnect/console/app/routes/client.rb +0 -31
  222. data/lib/rhoconnect/console/app/routes/docs.rb +0 -145
  223. data/lib/rhoconnect/console/app/routes/heroku.rb +0 -19
  224. data/lib/rhoconnect/console/app/routes/home.rb +0 -63
  225. data/lib/rhoconnect/console/app/routes/timing.rb +0 -242
  226. data/lib/rhoconnect/console/app/routes/user.rb +0 -122
  227. data/lib/rhoconnect/console/app/views/adapter.erb +0 -16
  228. data/lib/rhoconnect/console/app/views/client.erb +0 -30
  229. data/lib/rhoconnect/console/app/views/content.erb +0 -14
  230. data/lib/rhoconnect/console/app/views/doc.erb +0 -8
  231. data/lib/rhoconnect/console/app/views/docdata.erb +0 -28
  232. data/lib/rhoconnect/console/app/views/docs.erb +0 -30
  233. data/lib/rhoconnect/console/app/views/edituser.erb +0 -13
  234. data/lib/rhoconnect/console/app/views/headermenu.erb +0 -40
  235. data/lib/rhoconnect/console/app/views/home.erb +0 -24
  236. data/lib/rhoconnect/console/app/views/index.erb +0 -58
  237. data/lib/rhoconnect/console/app/views/jqplot.erb +0 -52
  238. data/lib/rhoconnect/console/app/views/layout.erb +0 -153
  239. data/lib/rhoconnect/console/app/views/login.erb +0 -26
  240. data/lib/rhoconnect/console/app/views/newuser.erb +0 -17
  241. data/lib/rhoconnect/console/app/views/ping.erb +0 -40
  242. data/lib/rhoconnect/console/app/views/result.erb +0 -11
  243. data/lib/rhoconnect/console/app/views/rightboxlinks.erb +0 -15
  244. data/lib/rhoconnect/console/app/views/select_doc.erb +0 -17
  245. data/lib/rhoconnect/console/app/views/upload_doc.erb +0 -23
  246. data/lib/rhoconnect/console/app/views/user.erb +0 -29
  247. data/lib/rhoconnect/console/app/views/users.erb +0 -19
  248. data/lib/rhoconnect/server/views/index.erb +0 -13
@@ -0,0 +1,55 @@
1
+ require 'sinatra/base'
2
+ require 'erb'
3
+ require 'json'
4
+ require 'rhoconnect/graph_helper'
5
+
6
+ module RhoconnectConsole
7
+ class << self
8
+ ROOT_DIR = File.dirname(File.expand_path(__FILE__)) unless defined? ROOT_DIR
9
+ def root_path(*args)
10
+ File.join(ROOT_DIR, *args)
11
+ end
12
+ end
13
+
14
+ class Server < Sinatra::Base
15
+ set :views, RhoconnectConsole.root_path('templates')
16
+ set :public_folder, RhoconnectConsole.root_path
17
+ set :static, true
18
+ use Rack::Session::Cookie
19
+ HEROKU_NAV = ENV['INSTANCE_ID'] ? RestClient.get('http://nav.heroku.com/v1/providers/header') : nil
20
+ before do
21
+ headers['Expires'] = 'Sun, 19 Nov 1978 05:00:00 GMT'
22
+ headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
23
+ headers['Pragma'] = 'no-cache'
24
+ end
25
+ include GraphHelper
26
+
27
+ get '/' do
28
+ #if heroku instance single sign will already have logged in a have token in session
29
+ @token = session[:token] if ENV['INSTANCE_ID']
30
+ @heroku = RestClient.get('http://nav.heroku.com/v1/providers/header') if @token
31
+ @version = Rhoconnect::VERSION
32
+ @domain = ENV['RHODES_URL'] || request.host_with_port
33
+ @domain += "/application" if @domain
34
+ erb :index
35
+ end
36
+
37
+
38
+ post "/get_user_graph" do
39
+ count_graph('timing/usercount', "User Count", "Users", "users")
40
+ end
41
+
42
+ post '/source_timing' do
43
+ source_timing(params)
44
+ end
45
+
46
+ post '/http_timing' do
47
+ http_timing(params)
48
+ end
49
+
50
+ post '/device_count' do
51
+ count_graph('timing/devicecount', "Device Count", "Devices", "clients")
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,90 @@
1
+ <!DOCTYPE html>
2
+ <head>
3
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4
+ <title>RhoConnect Console</title>
5
+
6
+ <link rel="stylesheet" href='public/bootstrap.css' type="text/css" media="screen" />
7
+ <script language="javascript" type="text/javascript" src='public/jquery-1.7.1.min.js'></script>
8
+ <script language="javascript" type="text/javascript" src='public/underscore.js'></script>
9
+ <script language="javascript" type="text/javascript" src='public/backbone.js'></script>
10
+ <script language="javascript" type="text/javascript" src='public/rhoconnect-web.js'></script>
11
+ <script language="javascript" type="text/javascript" src='controllers/admins.js'></script>
12
+ <script language="javascript" type="text/javascript" src='views/index.js'></script>
13
+ <script language="javascript" type="text/javascript" src='views/home.js'></script>
14
+ <script language="javascript" type="text/javascript" src='views/source_docs.js'></script>
15
+ <script language="javascript" type="text/javascript" src='views/doc.js'></script>
16
+ <script language="javascript" type="text/javascript" src='views/set_adapter.js'></script>
17
+ <script language="javascript" type="text/javascript" src='views/server_doc.js'></script>
18
+ <script language="javascript" type="text/javascript" src='views/users.js'></script>
19
+ <script language="javascript" type="text/javascript" src='views/new_user.js'></script>
20
+ <script language="javascript" type="text/javascript" src='views/show_user.js'></script>
21
+ <script language="javascript" type="text/javascript" src='views/show_device.js'></script>
22
+ <script language="javascript" type="text/javascript" src='views/new_ping.js'></script>
23
+ <script language="javascript" type="text/javascript" src='views/edit_user.js'></script>
24
+ <script language="javascript" type="text/javascript" src='views/settings.js'></script>
25
+ <script language="javascript" type="text/javascript" src='views/api_token.js'></script>
26
+ <script language="javascript" type="text/javascript" src='views/stats.js'></script>
27
+ <script language="javascript" type="text/javascript" src='models/session.js'></script>
28
+ <script language="javascript" type="text/javascript" src='models/source.js'></script>
29
+ <script language="javascript" type="text/javascript" src='models/doc.js'></script>
30
+ <script language="javascript" type="text/javascript" src='models/adapter.js'></script>
31
+ <script language="javascript" type="text/javascript" src='models/user.js'></script>
32
+ <script language="javascript" type="text/javascript" src='models/client.js'></script>
33
+ <script language="javascript" type="text/javascript" src='models/stats.js'></script>
34
+ </head>
35
+ <body>
36
+ <input id='token' type='hidden' value='<%=@token%>'>
37
+ <input id='domain' type='hidden' value='<%=@domain%>'>
38
+ <div id='heroku_nav'><%=@heroku%></div>
39
+ <div id='nav_menu' class="navbar navbar-fixed-top" style="<%@heroku ? 'display:none' : 'display:block'%>">
40
+ <div class='navbar-inner'>
41
+ <div class='container'>
42
+ <div class="brand">
43
+ RhoConnect
44
+ </div>
45
+ <ul class='nav pull-right'>
46
+ <li class=""><a href="/resque/" >Resque</a></li>
47
+ <li class="active"><a href="#" >Console</a></li>
48
+ <li><a href='http://docs.rhomobile.com/rhoconnect/introduction' target='_blank'>Docs</a></li>
49
+ <li><a id='logout' style='display:none' href="#logout">Logout</a></li>
50
+ <li><a id='login' href="#">Login</a></li>
51
+ </ul>
52
+ </div><!-- END container -->
53
+ </div><!-- END nav inner -->
54
+ </div><!-- END navbar -->
55
+ <div class='container'>
56
+ <!-- secondary nav after login -->
57
+ <div id='secondary-nav' class='span12' style='display:none;margin-top:50px;margin-left:0'>
58
+ <ul class='nav nav-tabs'>
59
+ <li id='info_home'><a href='#'>Home</a></li>
60
+ <li id='server_doc'><a href='#docselect'>Server Doc</a></li>
61
+ <li id='users'><a href='#users'>Users</a></li>
62
+ <li id='settings'><a href='#settings'>Settings</a></li>
63
+ <% if Rhoconnect.stats == true%>
64
+ <li id='stats'><a href='#stats'>Statistics</a></li>
65
+ <% end %>
66
+ </ul>
67
+ </div>
68
+ <div class='span12' style='margin-left:0'>
69
+ <!-- content goes here -->
70
+ <div id='main_content'>
71
+ </div>
72
+ <!-- content ends here -->
73
+ </div>
74
+ </div>
75
+ <!--END row -->
76
+ <div class='container'>
77
+ <hr>
78
+ <footer>
79
+ <div class="pull-left">
80
+ RhoConnect
81
+ <p>© <a href="http://www.rhomobile.com/">Rhomobile</a> All rights reserved.</p>
82
+ </div>
83
+ <div class="pull-right">
84
+ <div id='license_info'></div>
85
+ RhoConnect v<%=@version%>
86
+ </div>
87
+ </footer>
88
+ </div>
89
+ </body>
90
+ </html>
@@ -0,0 +1,60 @@
1
+ <!--[if IE]><script language="javascript" type="text/javascript" src="public/jqplot/excanvas.js"></script><![endif]-->
2
+ <script language="javascript" type="text/javascript" src="public/jqplot/jquery.jqplot.min.js"></script>
3
+ <script language="javascript" type="text/javascript" src="public/jqplot/jqplot.categoryAxisRenderer.min.js"></script>
4
+ <script language="javascript" type="text/javascript" src="public/jqplot/jqplot.dateAxisRenderer.js"></script>
5
+ <script language="javascript" type="text/javascript" src="public/jqplot/jqplot.canvasTextRenderer.js"></script>
6
+ <script language="javascript" type="text/javascript" src="public/jqplot/jqplot.canvasAxisLabelRenderer.js"></script>
7
+ <script language="javascript" type="text/javascript" src="public/jqplot/jqplot.canvasAxisTickRenderer.js"></script>
8
+ <script language="javascript" type="text/javascript" src="public/jqplot/jqplot.cursor.js"></script>
9
+ <style type='text/css'>
10
+ .jqplot-yaxis-label{
11
+ left:-20px !important;
12
+ }
13
+ </style>
14
+
15
+ <%
16
+ @sources.uniq!
17
+ s = nil
18
+ if @displayname.nil?
19
+ s = @sources[0]
20
+ else
21
+ @sources.each { |source| s = source if source['name'] == @displayname }
22
+ end
23
+ %>
24
+ <% if s.nil? or s['data'].length < 1 %>
25
+ <center>No data for <b><%= s.nil? ? "" : s['name'] %></b></center><br/><br/>
26
+ <% else %>
27
+ <div id="chartdiv" style="height:295px;width:670px; display:none;"></div>
28
+ <%end%>
29
+ <%
30
+ def fix_json(instring)
31
+ outstring = instring.gsub(/"/,"'")
32
+ outstring = outstring.gsub(/('.*?enderer'):'(.*?)'/,'\1:\2')
33
+ outstring
34
+ end
35
+
36
+ %>
37
+
38
+ <% if @displayname.nil? %>
39
+ <script type="text/javascript">
40
+ document.getElementById('chartdiv').style.display = '';plot = $.jqplot('chartdiv',<%=@sources[0]['data'].to_json.gsub(/"/,"'")%>,<%=fix_json(@sources[0]['options'].to_json)%>); plot.redraw();
41
+ </script>
42
+ <%end%>
43
+
44
+ <br/>
45
+
46
+
47
+
48
+ <% if @sources.length > 1%>
49
+ <ul id='source-list' class='nav nav-pills' style='margin-left:35px'>
50
+ <% @sources.each do |source| %>
51
+ <% if @displayname == source['name'] %>
52
+ <script type="text/javascript">
53
+ document.getElementById('chartdiv').style.display = '';plot = $.jqplot('chartdiv',<%=source['data'].to_json.gsub(/"/,"'")%>,<%=fix_json(source['options'].to_json)%>); plot.redraw();
54
+ </script>
55
+ <% end %>
56
+ <li class="<%=source['name'] == @displayname ? 'active' : ''%>">
57
+ <a id='<%=@graph_t == 'http' ? "http_timing" : "source_timing_display"%>' style="margin-right:5px"><%= source['name'] %></a></li>
58
+ <% end%>
59
+ </ul>
60
+ <% end %>
@@ -0,0 +1,16 @@
1
+ App.Views.ApiToken = Backbone.View.extend({
2
+
3
+ initialize: function() {
4
+ this.render();
5
+ },
6
+
7
+ render: function() {
8
+ session = new Session()
9
+ $('#secondary-nav').css('display','block');
10
+ out = "<h3>API Token</h3>"
11
+ out += "<code>"+ session.getApiKey() +"</code>"
12
+
13
+ $(this.el).html(out);
14
+ $('#settings_main').html(this.el);
15
+ }
16
+ });
@@ -0,0 +1,63 @@
1
+ App.Views.Doc = Backbone.View.extend({
2
+ events: {
3
+ "click a#clear" : "clear"
4
+ },
5
+
6
+ initialize: function() {
7
+ var dbkey = this.model.get('dbkey');
8
+ this.render(dbkey);
9
+ this.model.get_doc(dbkey,'none');
10
+ },
11
+
12
+ clear: function(e){
13
+ e.preventDefault();
14
+ dbkey = this.model.get('dbkey');
15
+ var dt = 'hash';
16
+ var data = [];
17
+ if(dbkey.search(/token/i) > 0 || dbkey.search(/size/i) > 0){
18
+ dt = 'string';
19
+ data = '';
20
+ }
21
+ var self = this;
22
+ $.ajax({
23
+ type: 'POST',
24
+ url: '/api/source/set_db_doc',
25
+ data: {api_token : this.model.get('api_token'), doc : dbkey, data : data, data_type : dt},
26
+ success: function(){
27
+ data = "<tr><th colspan=3><h3 style='display:inline'>Data</h3><div class='pull-right'>" +
28
+ "<a class='btn btn-danger'>clear document</a></div></th></tr>" +
29
+ "<tr><td></td></tr>";
30
+ $('#docdata-table').find("tr:gt(0)").remove();
31
+ $('#docdata-table tr:last').after(data);
32
+ self.delegateEvents();
33
+ },
34
+ error: function(resp){
35
+ if(resp.status == 422){
36
+ new App.Views.Index()
37
+ }
38
+ $('#docalert')[0].innerHTML = resp.responseText;
39
+ $('#docalert').css('display','block');
40
+ }
41
+ })
42
+ },
43
+
44
+
45
+ render: function(dbkey) {
46
+ $('#secondary-nav').css('display','block');
47
+ out = "<div class='page-header well'><h2>Document&nbsp;"+dbkey+"</h2></div>";
48
+ out += "<div id='docalert' class='alert alert-error' style='display:none'></div>";
49
+ out += "<form class='form-horizontal' action='#doc/upload?#{@back_params}' method='post' enctype='multipart/form-data'>";
50
+ out += "<input type='hidden' name='doc' value='"+dbkey+"'/>";
51
+ out += "<input type='text' name='string' value='' placeholder='Upload token string' class='input-xlarge'/>";
52
+ out += "<input type='submit' value='Submit' class='btn btn-primary' style='margin-left:10px'>";
53
+ out += "</form>";
54
+ out += "<form 'string_s' class='form-horizontal'>";
55
+ out += "<input type='text' name='data' value='' class='input-xlarge' placeholder='Upload string'/>";
56
+ out += "<input type='submit' value='Submit' class='btn btn-primary' style='margin-left:10px'>";
57
+ out += "</form>";
58
+ out += "<table id='docdata-table' class='table table-bordered'><tr></tr></table>";
59
+
60
+ $(this.el).html(out);
61
+ $('#main_content').html(this.el);
62
+ }
63
+ });
@@ -0,0 +1,43 @@
1
+ App.Views.EditUser = Backbone.View.extend({
2
+
3
+ events: {
4
+ "submit form" : "edit"
5
+ },
6
+
7
+ initialize: function() {
8
+ this.render();
9
+ },
10
+
11
+ edit: function(e){
12
+ e.preventDefault();
13
+ var session = new Session()
14
+ var password = $("#password2").val();
15
+ $.ajax({
16
+ type: 'POST',
17
+ url: '/api/user/update_user',
18
+ data: {api_token : session.getApiKey(), attributes : {login : 'rhoadmin', password : password}},
19
+ success: function(){
20
+ //router.navigate("users", true);
21
+ },
22
+ error: function(resp){
23
+ if(resp.status == 422){
24
+ new App.Views.Index()
25
+ }
26
+ $('#settings-alert')[0].innerHTML = resp.responseText;
27
+ $('#settings-alert').css('display','block');
28
+ }
29
+ })
30
+ },
31
+
32
+ render: function() {
33
+ $('#secondary-nav').css('display','block');
34
+ out = "<h3>Change Admin Password</h3>"
35
+ out += "<form>"
36
+ out += "<input id='password2' type='password' name='password' value='' placeholder='Enter new password' style='margin:0'/>"
37
+ out += "<input type='submit' class='btn btn-primary' value='Save' style='margin-left:10px'/>"
38
+ out += "</form>"
39
+
40
+ $(this.el).html(out);
41
+ $('#settings_main').html(this.el);
42
+ }
43
+ });
@@ -0,0 +1,56 @@
1
+ App.Views.Home = Backbone.View.extend({
2
+
3
+ events: {
4
+ "click a#reset" : "reset"
5
+ },
6
+
7
+ initialize: function() {
8
+ var domain = $('input#domain').val();
9
+ this.model.set('partition_type','app')
10
+ this.model.save({
11
+ error: function(model,resp)
12
+ {
13
+ if(resp.status == 422){
14
+ new App.Views.Index()
15
+ }
16
+ }
17
+ });
18
+ this.model.fetch({
19
+ error: function(model,resp)
20
+ {
21
+ if(resp.status == 422){
22
+ new App.Views.Index()
23
+ }
24
+ }
25
+ });
26
+ this.render(domain);
27
+ },
28
+
29
+ reset: function(){
30
+ var session = new Session();
31
+ if(confirm("Are you sure you want to reset?")){
32
+ session.reset()
33
+ }
34
+ },
35
+
36
+ render: function(domain) {
37
+ $('#secondary-nav').css('display','block');
38
+ //out = "<div class='page-header well'><h1>Home</h1></div>"
39
+ out = "<div id='home-alert' class='alert alert-error' style='display:none'></div>"
40
+ out += "<div class='alert alert-info' style='padding:10px 0 30px 0'>"
41
+ //out += "<div class='container'>"
42
+ out += "<div id='license' style='padding-left:5px' class='pull-left'></div>"
43
+ out += "<div class='pull-right'>"
44
+ out += "<div class='reset-status' style='display:inline;'><span class='' style='margin-right:5px'></span></div>"
45
+ out += "<a id='reset' class='btn btn-danger'>Reset</a>"
46
+ out += "</div></div>"
47
+ out += "<div class='span4'>"
48
+ out += "<table id='source-table' class='table table-bordered'><thead><tr><th><h3>App partition sources</h3></th></tr></thead>"
49
+ out += "</table></div>"
50
+ out += "<div class='span4 pull-right'><h3>Sync Server URL</h3><code style='margin:0'>http://"+domain+"</code></br>";
51
+ out += "<em style='margin-top:5px'>Paste this url into your client app configuration to sync with this RhoConnect instance.</em></div>"
52
+ $(this.el).html(out);
53
+ $('#main_content').html(this.el);
54
+ return this
55
+ }
56
+ });
@@ -0,0 +1,63 @@
1
+ App.Views.Index = Backbone.View.extend({
2
+
3
+ events: {
4
+ "submit form" : "login"
5
+ },
6
+
7
+ initialize: function() {
8
+ this.render();
9
+ },
10
+
11
+ login: function(e) {
12
+ e.preventDefault();
13
+ var login = $('#loginindex').val();
14
+ var password = $("#password").val();
15
+ $.ajax({
16
+ type: 'POST',
17
+ url: '/api/admin/login',
18
+ data: {login:login,password:password},
19
+ success: function(resp){
20
+ var session = new Session();
21
+ session.setAuthenticated(true);
22
+ session.setApiKey(resp);
23
+ $('#login').css('display','inline');
24
+ router.navigate('#home',true)
25
+ },
26
+ error: function(resp){
27
+ if(resp.status == 422){
28
+ new App.Views.Index()
29
+ }
30
+ $('#home-alert').css('display','block');
31
+ $('#home-alert')[0].innerHTML = resp.responseText;
32
+ }
33
+ })
34
+ },
35
+
36
+ render: function () {
37
+ $('#secondary-nav').css('display','none');
38
+ out = "<div class='page-header well' style='margin-top:60px'><h1>Login</h1></div>";
39
+ out += "<div id='home-alert' class='alert alert-error' style='display:none'></div>";
40
+ out += "<form id='index-form'>";
41
+ out += "<table class='table table-bordered'>";
42
+ out += "<tr><td><input id='loginindex' type='text' name='login' class='input-xlarge' value='rhoadmin' placeholder='rhoadmin'/></td></tr>";
43
+ out += "<tr><td><input id='password' type='password' name='password' class='input-xlarge' value='' placeholder='Enter Password'/></td></tr>";
44
+ out += "<tr><td colspan=2><input type='submit' class='btn btn-primary' value='Login'/></td></tr>";
45
+ out += "</table></form>";
46
+
47
+ $(this.el).html(out);
48
+ $('#main_content').html(this.el);
49
+ }
50
+ });
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
@@ -0,0 +1,58 @@
1
+ App.Views.NewPing = Backbone.View.extend({
2
+
3
+ events:{
4
+ "submit form" : "ping"
5
+ },
6
+
7
+ initialize: function() {
8
+ var name = this.model.get('name');
9
+ this.render(name);
10
+ this.model.new_ping(name);
11
+ if(name == undefined)
12
+ this.model.get_users('ping');
13
+ },
14
+
15
+ ping: function(e) {
16
+ e.preventDefault();
17
+ var users = $('#pinguser').val().split(',');
18
+ var message = $('#pingmessage').val();
19
+ var vibrate = $('#pingvibrate').val();
20
+ var sound = $('#pingsound').val();
21
+ var badge = $('#pingbadge').val();
22
+ var sources = $('#sources').val().split(',');
23
+
24
+ $.ajax({
25
+ type: 'POST',
26
+ url: '/api/client/ping',
27
+ data: {api_token : this.model.get('api_token'), user_id : users, message : message, vibrate : vibrate, badge : badge, sources : sources},
28
+ success: function(){
29
+ router.navigate("users", true);
30
+ },
31
+ error: function(resp){
32
+ if(resp.status == 422){
33
+ new App.Views.Index()
34
+ }
35
+ $('#ping-alert')[0].innerHTML = resp.responseText;
36
+ $('#ping-alert').css('display','block');
37
+ }
38
+ })
39
+ },
40
+
41
+ render: function(name) {
42
+ $('#secondary-nav').css('display','block');
43
+ out = "<div class='page-header well'><h2>Ping User/s</h2></div>";
44
+ out += "<div id='ping-alert' class='alert alert-error' style='display:none'></div>";
45
+ out += "<form><table id='users_table' class='table table-bordered'>";
46
+ out += "<input id='pinguser' type='hidden' name='user_id' value='"+name+"' class='input-xlarge' />";
47
+ out += "<tr><td>Message:</td><td><input id='pingmessage' type='text' name='message' value='push message' class='input-xlarge' /></td></tr>";
48
+ out += "<tr><td>Sources</td><td><input type='text' name='sources' id='sources' value='' class='input-xlarge'/></td></tr>";
49
+ out += "<tr><td>Sound</td><td><input id='pingsound' type='text' name='badge' value='welcome.mp3' class='input-medium'/></td></tr>";
50
+ out += "<tr><td>Badge</td><td><input id='pingbadge' type='text' name='badge' value='1' class='input-small'/></td></tr>";
51
+ out += "<tr><td>Vibrate</td><td><input id='pingvibrate' type='text' name='vibrate' value='2' class='input-small'/>&nbsp;(seconds)</td></tr>"
52
+ out += "<tr><td colspan=2><input type='submit' class='btn btn-primary' value='Ping!' /></td></tr>"
53
+ out += "</table></form>";
54
+
55
+ $(this.el).html(out);
56
+ $('#main_content').html(this.el);
57
+ }
58
+ });
@@ -0,0 +1,29 @@
1
+ App.Views.NewUser = Backbone.View.extend({
2
+
3
+ events: {
4
+ "submit form" : "create_user"
5
+ },
6
+
7
+ initialize: function() {
8
+ this.render();
9
+ },
10
+
11
+ create_user: function(e) {
12
+ e.preventDefault();
13
+ this.model.create_user();
14
+ },
15
+
16
+ render: function() {
17
+ $('#secondary-nav').css('display','block');
18
+ out = "<div class='page-header well'><h2>New user</h2></div>";
19
+ out += "<div id='newuser-alert' class='alert alert-error' style='display:none'></div>";
20
+ out += "<form>"
21
+ out += "<input id='new-login' type='text' name='login' placeholder='login' style='margin:0'/>";
22
+ out += "<input id='new-password' type='password' name='password' placeholder='password' style='margin:0 0 0 10px'/>";
23
+ out += "<input type='submit' class='btn btn-primary' value='Add' style='margin:0 0 0 10px'/>"
24
+ out += "</form>";
25
+
26
+ $(this.el).html(out);
27
+ $('#main_content').html(this.el);
28
+ }
29
+ });
@@ -0,0 +1,103 @@
1
+ App.Views.ServerDoc = Backbone.View.extend({
2
+
3
+ events: {
4
+ "submit form#string_s" : "upload_string",
5
+ "submit form#db_key_form" : "query",
6
+ "click a#clear" : "clear"
7
+ },
8
+
9
+ initialize: function(dbkey) {
10
+ this.render("");
11
+ },
12
+
13
+ clear: function(e){
14
+ e.preventDefault();
15
+ dbkey = this.model.get('dbkey');
16
+ var self = this;
17
+ $.ajax({
18
+ type: 'POST',
19
+ url: '/api/source/set_db_doc',
20
+ data: {api_token : this.model.get('api_token'), doc : dbkey, data : '', data_type : 'string'},
21
+ success: function(){
22
+ data = "<tr><th colspan=3><h3 style='display:inline'>Data</h3><div class='pull-right'>" +
23
+ "<a class='btn btn-danger'>clear document</a></div></th></tr>" +
24
+ "<tr><td></td></tr>";
25
+ $('#docdata-table').find("tr:gt(0)").remove();
26
+ $('#docdata-table tr:last').after(data);
27
+ self.delegateEvents();
28
+ },
29
+ error: function(resp){
30
+ if(resp.status == 422){
31
+ new App.Views.Index()
32
+ }
33
+ $('#doc-alert')[0].innerHTML = resp.responseText;
34
+ $('#doc-alert').css('display','block');
35
+ }
36
+ })
37
+ },
38
+
39
+ upload_string: function(e){
40
+ e.preventDefault();
41
+ var self = this;
42
+ $(".upload-status")[0].firstChild.className = "label label-warning";
43
+ $(".upload-status")[0].firstChild.innerHTML = "loading...";
44
+ $(".upload-status").css("visibility","visible");
45
+ var doc = $('#input_key').val();
46
+ var data = $("#data").val();
47
+ $.ajax({
48
+ type: 'POST',
49
+ url: '/api/source/set_db_doc',
50
+ data: {api_token : this.model.get('api_token'), doc : doc, data : data, data_type : 'string'},
51
+ success: function(){
52
+ $(".upload-status")[0].firstChild.className = "label label-success";
53
+ $(".upload-status")[0].firstChild.innerHTML = "success";
54
+
55
+ data = "<tr><th colspan=3><h3 style='display:inline'>Data</h3><div class='pull-right'>" +
56
+ "<a id='clear' class='btn btn-danger'>clear document</a></div></th></tr>" +
57
+ "<tr><td id='doc_data'>" + data+ "</td></tr>";
58
+ $('#docdata-table').find("tr:gt(0)").remove();
59
+ $('#docdata-table tr:last').after(data);
60
+ self.delegateEvents();
61
+ },
62
+ error: function(resp){
63
+ if(resp.status == 422){
64
+ new App.Views.Index()
65
+ }
66
+ $(".upload-status")[0].firstChild.className = "label label-danger";
67
+ $(".upload-status")[0].firstChild.innerHTML = "error";
68
+ $('#doc-alert')[0].innerHTML = resp.responseText;
69
+ $('#doc-alert').css('display','block');
70
+ }
71
+ })
72
+ },
73
+
74
+ query: function(e){
75
+ e.preventDefault();
76
+ var dbkey = $('#input_key').val();
77
+ this.render(dbkey);
78
+ $(".query-status")[0].firstChild.className = "label label-warning";
79
+ $(".query-status")[0].firstChild.innerHTML = "loading...";
80
+ $(".query-status").css("visibility","visible");
81
+ this.model.get_doc(dbkey,'string');
82
+ this.delegateEvents();
83
+ },
84
+
85
+ render: function(dbkey) {
86
+ $('#secondary-nav').css('display','block');
87
+ out = "<div class='page-header well'><h2>Document&nbsp;"+dbkey+"</h2></div>";
88
+ out += "<div id='docalert' class='alert alert-error' style='display:none'></div>";
89
+ out += "<form id='db_key_form' class='form-horizontal'>";
90
+ out += "<input id='input_key' type='text' name='dbkey' value='"+dbkey+"' class='input-xlarge' placeholder='Enter DB key'/>";
91
+ out += "<input type='submit' value='Submit' class='btn btn-primary' style='margin-left:10px'><div class='query-status' style='display:inline;margin-left:10px;visibility:hidden'><span class=''></span></div>";
92
+ out += "</form>";
93
+ if(dbkey != ""){
94
+ out += "<form id='string_s' class='form-horizontal'>";
95
+ out += "<input id='data' type='text' name='data' value='' class='input-xlarge' placeholder='Upload String'/>";
96
+ out += "<input type='submit' value='Submit' class='btn btn-primary' style='margin-left:10px'><div class='upload-status' style='display:inline;margin-left:10px;visibility:hidden'><span class=''></span></div>";
97
+ out += "</form>";
98
+ out += "<table id='docdata-table' class='table table-bordered'><tr></tr></table>";
99
+ }
100
+ $(this.el).html(out);
101
+ $('#main_content').html(this.el);
102
+ }
103
+ });