rhosync 2.0.0.beta1

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 (200) hide show
  1. data/CHANGELOG +5 -0
  2. data/LICENSE +674 -0
  3. data/README.md +26 -0
  4. data/Rakefile +109 -0
  5. data/bench/bench +6 -0
  6. data/bench/benchapp/Rakefile +14 -0
  7. data/bench/benchapp/application.rb +13 -0
  8. data/bench/benchapp/config.ru +32 -0
  9. data/bench/benchapp/settings/license.key +1 -0
  10. data/bench/benchapp/settings/settings.yml +18 -0
  11. data/bench/benchapp/sources/mock_adapter.rb +55 -0
  12. data/bench/benchapp/sources/queue_mock_adapter.rb +2 -0
  13. data/bench/benchapp/vendor/rhosync/lib/rhosync.rb +7 -0
  14. data/bench/lib/bench/cli.rb +16 -0
  15. data/bench/lib/bench/logging.rb +18 -0
  16. data/bench/lib/bench/mock_client.rb +41 -0
  17. data/bench/lib/bench/result.rb +50 -0
  18. data/bench/lib/bench/runner.rb +44 -0
  19. data/bench/lib/bench/session.rb +65 -0
  20. data/bench/lib/bench/statistics.rb +56 -0
  21. data/bench/lib/bench/test_data.rb +55 -0
  22. data/bench/lib/bench/timer.rb +10 -0
  23. data/bench/lib/bench/utils.rb +49 -0
  24. data/bench/lib/bench.rb +128 -0
  25. data/bench/lib/testdata/100-data.txt +148 -0
  26. data/bench/lib/testdata/5-data.txt +11 -0
  27. data/bench/scripts/cud_script.rb +77 -0
  28. data/bench/scripts/helpers.rb +101 -0
  29. data/bench/scripts/query_md_script.rb +46 -0
  30. data/bench/scripts/query_script.rb +46 -0
  31. data/bench/spec/bench_spec_helper.rb +65 -0
  32. data/bench/spec/logging_spec.rb +19 -0
  33. data/bench/spec/mock_adapter_spec.rb +61 -0
  34. data/bench/spec/mock_client_spec.rb +64 -0
  35. data/bench/spec/result_spec.rb +59 -0
  36. data/bench/spec/utils_spec.rb +35 -0
  37. data/bin/rhosync +34 -0
  38. data/doc/protocol.html +1901 -0
  39. data/doc/public/css/print.css +29 -0
  40. data/doc/public/css/screen.css +257 -0
  41. data/doc/public/css/style.css +20 -0
  42. data/examples/simple/application.rb +13 -0
  43. data/examples/simple/sources/sample_adapter.rb +5 -0
  44. data/examples/simple/sources/simple_adapter.rb +5 -0
  45. data/examples/simple/vendor/rhosync/lib/rhosync.rb +7 -0
  46. data/generators/rhosync.rb +98 -0
  47. data/generators/templates/application/Rakefile +19 -0
  48. data/generators/templates/application/application.rb +27 -0
  49. data/generators/templates/application/config.ru +33 -0
  50. data/generators/templates/application/settings/license.key +1 -0
  51. data/generators/templates/application/settings/settings.yml +14 -0
  52. data/generators/templates/source/source_adapter.rb +49 -0
  53. data/lib/rhosync/api/create_client.rb +3 -0
  54. data/lib/rhosync/api/create_user.rb +7 -0
  55. data/lib/rhosync/api/delete_client.rb +5 -0
  56. data/lib/rhosync/api/delete_user.rb +5 -0
  57. data/lib/rhosync/api/get_api_token.rb +7 -0
  58. data/lib/rhosync/api/get_client_params.rb +3 -0
  59. data/lib/rhosync/api/get_db_doc.rb +7 -0
  60. data/lib/rhosync/api/get_license_info.rb +7 -0
  61. data/lib/rhosync/api/get_source_params.rb +3 -0
  62. data/lib/rhosync/api/list_client_docs.rb +12 -0
  63. data/lib/rhosync/api/list_clients.rb +3 -0
  64. data/lib/rhosync/api/list_source_docs.rb +10 -0
  65. data/lib/rhosync/api/list_sources.rb +15 -0
  66. data/lib/rhosync/api/list_users.rb +3 -0
  67. data/lib/rhosync/api/ping.rb +7 -0
  68. data/lib/rhosync/api/push_deletes.rb +6 -0
  69. data/lib/rhosync/api/push_objects.rb +6 -0
  70. data/lib/rhosync/api/reset.rb +10 -0
  71. data/lib/rhosync/api/set_db_doc.rb +8 -0
  72. data/lib/rhosync/api/set_refresh_time.rb +8 -0
  73. data/lib/rhosync/api/update_user.rb +4 -0
  74. data/lib/rhosync/api/upload_file.rb +4 -0
  75. data/lib/rhosync/api_token.rb +19 -0
  76. data/lib/rhosync/app.rb +69 -0
  77. data/lib/rhosync/bulk_data/bulk_data.rb +75 -0
  78. data/lib/rhosync/bulk_data/syncdb.index.schema +3 -0
  79. data/lib/rhosync/bulk_data/syncdb.schema +37 -0
  80. data/lib/rhosync/bulk_data.rb +2 -0
  81. data/lib/rhosync/client.rb +74 -0
  82. data/lib/rhosync/client_sync.rb +296 -0
  83. data/lib/rhosync/console/app/helpers/auth_helper.rb +18 -0
  84. data/lib/rhosync/console/app/helpers/extensions.rb +19 -0
  85. data/lib/rhosync/console/app/helpers/helpers.rb +52 -0
  86. data/lib/rhosync/console/app/public/main.css +7 -0
  87. data/lib/rhosync/console/app/public/text.txt +0 -0
  88. data/lib/rhosync/console/app/routes/auth.rb +29 -0
  89. data/lib/rhosync/console/app/routes/client.rb +32 -0
  90. data/lib/rhosync/console/app/routes/docs.rb +84 -0
  91. data/lib/rhosync/console/app/routes/home.rb +22 -0
  92. data/lib/rhosync/console/app/routes/user.rb +63 -0
  93. data/lib/rhosync/console/app/views/client.erb +30 -0
  94. data/lib/rhosync/console/app/views/doc.erb +56 -0
  95. data/lib/rhosync/console/app/views/docs.erb +29 -0
  96. data/lib/rhosync/console/app/views/index.erb +50 -0
  97. data/lib/rhosync/console/app/views/layout.erb +12 -0
  98. data/lib/rhosync/console/app/views/newuser.erb +17 -0
  99. data/lib/rhosync/console/app/views/ping.erb +28 -0
  100. data/lib/rhosync/console/app/views/result.erb +11 -0
  101. data/lib/rhosync/console/app/views/user.erb +32 -0
  102. data/lib/rhosync/console/app/views/users.erb +14 -0
  103. data/lib/rhosync/console/rhosync_api.rb +102 -0
  104. data/lib/rhosync/console/server.rb +27 -0
  105. data/lib/rhosync/credential.rb +9 -0
  106. data/lib/rhosync/document.rb +43 -0
  107. data/lib/rhosync/indifferent_access.rb +132 -0
  108. data/lib/rhosync/jobs/bulk_data_job.rb +104 -0
  109. data/lib/rhosync/jobs/ping_job.rb +19 -0
  110. data/lib/rhosync/jobs/source_job.rb +16 -0
  111. data/lib/rhosync/license.rb +79 -0
  112. data/lib/rhosync/lock_ops.rb +11 -0
  113. data/lib/rhosync/model.rb +410 -0
  114. data/lib/rhosync/ping/blackberry.rb +55 -0
  115. data/lib/rhosync/ping/iphone.rb +44 -0
  116. data/lib/rhosync/ping.rb +2 -0
  117. data/lib/rhosync/read_state.rb +27 -0
  118. data/lib/rhosync/server/views/index.erb +12 -0
  119. data/lib/rhosync/server.rb +242 -0
  120. data/lib/rhosync/source.rb +112 -0
  121. data/lib/rhosync/source_adapter.rb +95 -0
  122. data/lib/rhosync/source_sync.rb +245 -0
  123. data/lib/rhosync/store.rb +199 -0
  124. data/lib/rhosync/tasks.rb +151 -0
  125. data/lib/rhosync/user.rb +83 -0
  126. data/lib/rhosync/version.rb +3 -0
  127. data/lib/rhosync.rb +251 -0
  128. data/spec/api/api_helper.rb +44 -0
  129. data/spec/api/create_client_spec.rb +13 -0
  130. data/spec/api/create_user_spec.rb +16 -0
  131. data/spec/api/delete_client_spec.rb +13 -0
  132. data/spec/api/delete_user_spec.rb +18 -0
  133. data/spec/api/get_api_token_spec.rb +25 -0
  134. data/spec/api/get_client_params_spec.rb +18 -0
  135. data/spec/api/get_db_doc_spec.rb +21 -0
  136. data/spec/api/get_license_info_spec.rb +16 -0
  137. data/spec/api/get_source_params_spec.rb +26 -0
  138. data/spec/api/list_client_docs_spec.rb +33 -0
  139. data/spec/api/list_clients_spec.rb +23 -0
  140. data/spec/api/list_source_docs_spec.rb +26 -0
  141. data/spec/api/list_sources_spec.rb +27 -0
  142. data/spec/api/list_users_spec.rb +21 -0
  143. data/spec/api/ping_spec.rb +24 -0
  144. data/spec/api/push_deletes_spec.rb +16 -0
  145. data/spec/api/push_objects_spec.rb +27 -0
  146. data/spec/api/reset_spec.rb +22 -0
  147. data/spec/api/set_db_doc_spec.rb +20 -0
  148. data/spec/api/set_refresh_time_spec.rb +43 -0
  149. data/spec/api/update_user_spec.rb +31 -0
  150. data/spec/api/upload_file_spec.rb +26 -0
  151. data/spec/api_token_spec.rb +13 -0
  152. data/spec/app_spec.rb +20 -0
  153. data/spec/apps/rhotestapp/Rakefile +1 -0
  154. data/spec/apps/rhotestapp/application.rb +16 -0
  155. data/spec/apps/rhotestapp/config.ru +1 -0
  156. data/spec/apps/rhotestapp/settings/apple_fake_cert.pem +1 -0
  157. data/spec/apps/rhotestapp/settings/license.key +1 -0
  158. data/spec/apps/rhotestapp/settings/settings.yml +23 -0
  159. data/spec/apps/rhotestapp/sources/base_adapter.rb +9 -0
  160. data/spec/apps/rhotestapp/sources/sample_adapter.rb +66 -0
  161. data/spec/apps/rhotestapp/sources/simple_adapter.rb +39 -0
  162. data/spec/apps/rhotestapp/sources/sub_adapter.rb +7 -0
  163. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb +8 -0
  164. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb +1 -0
  165. data/spec/bulk_data/bulk_data_spec.rb +79 -0
  166. data/spec/client_spec.rb +58 -0
  167. data/spec/client_sync_spec.rb +377 -0
  168. data/spec/doc/base.html +72 -0
  169. data/spec/doc/doc_spec.rb +303 -0
  170. data/spec/doc/footer.html +4 -0
  171. data/spec/doc/header.html +30 -0
  172. data/spec/document_spec.rb +27 -0
  173. data/spec/generator/generator_spec.rb +53 -0
  174. data/spec/generator/generator_spec_helper.rb +8 -0
  175. data/spec/jobs/bulk_data_job_spec.rb +76 -0
  176. data/spec/jobs/ping_job_spec.rb +26 -0
  177. data/spec/jobs/source_job_spec.rb +25 -0
  178. data/spec/license_spec.rb +48 -0
  179. data/spec/model_spec.rb +269 -0
  180. data/spec/perf/bulk_data_perf_spec.rb +33 -0
  181. data/spec/perf/perf_spec_helper.rb +51 -0
  182. data/spec/perf/store_perf_spec.rb +28 -0
  183. data/spec/ping/blackberry_spec.rb +62 -0
  184. data/spec/ping/iphone_spec.rb +50 -0
  185. data/spec/read_state_spec.rb +25 -0
  186. data/spec/rhosync_spec.rb +43 -0
  187. data/spec/server/server_spec.rb +341 -0
  188. data/spec/source_adapter_spec.rb +114 -0
  189. data/spec/source_spec.rb +77 -0
  190. data/spec/source_sync_spec.rb +248 -0
  191. data/spec/spec_helper.rb +240 -0
  192. data/spec/store_spec.rb +149 -0
  193. data/spec/sync_states_spec.rb +101 -0
  194. data/spec/testdata/1000-data.txt +1414 -0
  195. data/spec/testdata/compressed/compress-data.txt +1 -0
  196. data/spec/testdata/upload1.txt +1 -0
  197. data/spec/testdata/upload2.txt +1 -0
  198. data/spec/user_spec.rb +79 -0
  199. data/tasks/redis.rake +134 -0
  200. metadata +545 -0
@@ -0,0 +1,18 @@
1
+ class RhosyncConsole::Server
2
+ helpers do
3
+
4
+ def login_required
5
+ session[:token].nil?
6
+ end
7
+
8
+ def report_error(message)
9
+ session[:errors] = [] if session[:errors].nil?
10
+ session[:errors] << message
11
+ end
12
+
13
+ def verify_presence_of(param,message)
14
+ report_error(message) if params[param].nil? or params[param].length == 0
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ class Hash
2
+ public
3
+ def symbolize_keys
4
+ hash = {}
5
+ self.each do |key, value|
6
+ hash[(key.to_sym rescue key) || key] = value
7
+ end
8
+ hash
9
+ end
10
+ end
11
+
12
+ class String
13
+ public
14
+ def ends_with?(str)
15
+ str = str.to_str
16
+ tail = self[-str.length, str.length]
17
+ tail == str
18
+ end
19
+ end
@@ -0,0 +1,52 @@
1
+ class RhosyncConsole::Server
2
+ helpers do
3
+ def url(*path_parts)
4
+ [ path_prefix, path_parts ].join("/").squeeze('/')
5
+ end
6
+ alias_method :u, :url
7
+
8
+ def path_prefix
9
+ request.env['SCRIPT_NAME']
10
+ end
11
+
12
+ def is_errors?
13
+ session[:errors] and session[:errors].size > 0
14
+ end
15
+
16
+ def show_errors
17
+ return '' unless session[:errors]
18
+ res = []
19
+ session[:errors].each do |error|
20
+ res << "<p style=\"color:#800\">#{error}</p>"
21
+ end
22
+ session[:errors] = nil
23
+ res.join
24
+ end
25
+
26
+ def handle_api_error(error_message)
27
+ begin
28
+ yield
29
+ rescue RestClient::Exception => re
30
+ session[:errors] ||= []
31
+ if re.response.body.nil? or re.response.body.length == 0
32
+ session[:errors] << "#{error_message}: [#{re.http_code}] #{re.message}"
33
+ else
34
+ session[:errors] << "#{error_message}: #{re.response.body}"
35
+ end
36
+ rescue Exception => e
37
+ session[:errors] ||= []
38
+ session[:errors] << "#{error_message}: #{e.message}"
39
+ end
40
+ end
41
+
42
+ def doc_params
43
+ doc_params = "source_id=#{CGI.escape(params[:source_id])}&user_id=#{CGI.escape(params[:user_id])}"
44
+ doc_params += "&device_id=#{CGI.escape(params[:device_id])}" if params[:device_id]
45
+ doc_params
46
+ end
47
+
48
+ def doc_is_string
49
+ params[:dbkey].ends_with?('token') or params[:dbkey].ends_with?('size')
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,7 @@
1
+ .panel {
2
+ margin: 10px 0;
3
+ }
4
+
5
+ .nav_button {
6
+ display:block;
7
+ }
File without changes
@@ -0,0 +1,29 @@
1
+ class RhosyncConsole::Server
2
+ post '/login' do
3
+ begin
4
+ session[:server] = params[:server]
5
+ session[:app_name] = APP_NAME
6
+ session[:login] = params[:login]
7
+ session[:errors] = nil
8
+
9
+ verify_presence_of :server, "Server is not provaided."
10
+ verify_presence_of :app_name, "Application name is not provaided."
11
+ verify_presence_of :login, "Login is not provaided."
12
+
13
+ unless session[:errors]
14
+ session[:token] = RhosyncApi::get_token(params[:server],params[:login],params[:password])
15
+ end
16
+ rescue Exception => e
17
+ session[:token] = nil
18
+ report_error("Can't login to Rhosync server.")
19
+ #puts e.message + "\n" + e.backtrace.join("\n")
20
+ end
21
+ redirect url('/'), 303
22
+ end
23
+
24
+ get '/logout' do
25
+ session[:token] = nil
26
+ redirect url('/'), 303
27
+ end
28
+
29
+ end
@@ -0,0 +1,32 @@
1
+ class RhosyncConsole::Server
2
+
3
+ get '/device/create' do
4
+ session[:errors] = nil
5
+ handle_api_error("Can't create new device") do
6
+ RhosyncApi::create_client(session[:server],
7
+ session[:app_name],session[:token],params[:user_id])
8
+ end
9
+ redirect url("/user?user_id=#{CGI.escape(params[:user_id])}"), 303
10
+ end
11
+
12
+ get '/device' do
13
+ @attributes = []
14
+ handle_api_error("Can't load list of device attributes") do
15
+ @attributes = RhosyncApi::get_client_params(session[:server],session[:app_name],session[:token],params[:device_id])
16
+ end
17
+ @sources = []
18
+ handle_api_error("Can't load list of sources") do
19
+ @sources = RhosyncApi::list_sources(session[:server],session[:app_name],session[:token],:all)
20
+ end
21
+ erb :client
22
+ end
23
+
24
+ get '/device/delete' do
25
+ handle_api_error("Can't delete device #{params[:device_id]}") do
26
+ RhosyncApi::delete_client(session[:server],session[:app_name],session[:token],
27
+ params[:user_id],params[:device_id])
28
+ end
29
+ redirect url(session[:errors] ? "/device?user_id=#{CGI.escape(params[:user_id])}&device_id=#{CGI.escape(params[:device_id])}" :
30
+ "/user?user_id=#{CGI.escape(params[:user_id])}"), 303
31
+ end
32
+ end
@@ -0,0 +1,84 @@
1
+ class RhosyncConsole::Server
2
+ get '/docs' do
3
+ @src_params = []
4
+ handle_api_error("Can't load list of source attributes") do
5
+ @src_params = RhosyncApi::get_source_params(session[:server],
6
+ session[:app_name],session[:token],params[:source_id])
7
+ end
8
+ @docs = []
9
+ @docs_name = ''
10
+ @back_href = ''
11
+ @doc_params = doc_params
12
+ handle_api_error("Can't load list of the documents") do
13
+ if params[:device_id]
14
+ @docs_name = "device #{params[:device_id]}"
15
+ @back_href = url("device?user_id=#{CGI.escape(params[:user_id])}&device_id=#{CGI.escape(params[:device_id])}")
16
+ @docs = RhosyncApi::list_client_docs(session[:server],
17
+ session[:app_name],session[:token],params[:source_id],params[:device_id])
18
+ else
19
+ if params[:user_id]=='*'
20
+ @docs_name = "app partition"
21
+ @back_href = url('/')
22
+ else
23
+ @docs_name = "user #{params[:user_id]} partition"
24
+ @back_href = url("user?user_id=#{CGI.escape(params[:user_id])}")
25
+ end
26
+ @docs = RhosyncApi::list_source_docs(session[:server],
27
+ session[:app_name],session[:token],params[:source_id],params[:user_id])
28
+ end
29
+ end
30
+ erb :docs
31
+ end
32
+
33
+ get '/doc' do
34
+ @data = {}
35
+ @is_string = doc_is_string
36
+ handle_api_error("Can't load document") do
37
+ @data = RhosyncApi::get_db_doc(session[:server],
38
+ session[:token],params[:dbkey],@is_string ? :string : '')
39
+ end
40
+ @back_params = "source_id=#{CGI.escape(params[:source_id])}&user_id=#{CGI.escape(params[:user_id])}"
41
+ @back_params += "&device_id=#{CGI.escape(params[:device_id])}" if params[:device_id]
42
+ @back_href = url("docs?#{doc_params}")
43
+ erb :doc
44
+ end
45
+
46
+ get '/doc/clear' do
47
+ is_string = doc_is_string
48
+ handle_api_error("Can't clear document") do
49
+ RhosyncApi::set_db_doc(session[:server],session[:token],params[:dbkey],
50
+ is_string ? '' : {}, is_string ? :string : '')
51
+ end
52
+ @result_name = "Clear result"
53
+ @status = "Successfully cleared: [#{CGI.unescape(params[:dbkey])}]"
54
+ @back_href = url("doc?#{doc_params}&dbkey=#{CGI.escape(params[:dbkey])}")
55
+ erb :result
56
+ end
57
+
58
+ post '/doc/upload' do
59
+ if params[:string]
60
+ handle_api_error("Can't upload document") do
61
+ RhosyncApi::set_db_doc(session[:server],session[:token],CGI.unescape(params[:doc]),params[:string],:string)
62
+ end
63
+ else
64
+ unless params[:file] &&
65
+ (tmpfile = params[:file][:tempfile]) &&
66
+ (name = params[:file][:filename])
67
+ report_error "No file selected"
68
+ else
69
+ data = []
70
+ while blk = tmpfile.read(65536)
71
+ data << blk
72
+ end
73
+ handle_api_error("Can't upload document #{name.inspect}") do
74
+ RhosyncApi::set_db_doc(session[:server],session[:token],CGI.unescape(params[:doc]),JSON.parse(data.join))
75
+ end
76
+ end
77
+ end
78
+ @result_name = "Upload result"
79
+ @status = "Successfully uploadad data to: [#{CGI.unescape(params[:doc])}]"
80
+ @back_href = url("doc?#{doc_params}&dbkey=#{params[:doc]}")
81
+ erb :result
82
+ end
83
+
84
+ end
@@ -0,0 +1,22 @@
1
+ class RhosyncConsole::Server
2
+ get '/' do
3
+ unless login_required
4
+ @license = nil
5
+ handle_api_error("Can't get license information") do
6
+ @license = RhosyncApi::get_license_info(session[:server],session[:token])
7
+ end
8
+ @sources = nil
9
+ handle_api_error("Can't load list of application partition sources") do
10
+ @sources = RhosyncApi::list_sources(session[:server],session[:app_name],session[:token],:app)
11
+ end
12
+ end
13
+ erb :index
14
+ end
15
+
16
+ get '/reset' do
17
+ handle_api_error("Can't reset server") do
18
+ RhosyncApi::reset(session[:server],session[:token])
19
+ end
20
+ redirect url('/'), 303
21
+ end
22
+ end
@@ -0,0 +1,63 @@
1
+ class RhosyncConsole::Server
2
+ get '/users' do
3
+ @users = []
4
+ handle_api_error("Can't load list of users") do
5
+ @users = RhosyncApi::list_users(
6
+ session[:server],session[:app_name],session[:token])
7
+ end
8
+ erb :users
9
+ end
10
+
11
+ get '/user/new' do
12
+ erb :newuser
13
+ end
14
+
15
+ post '/user/create' do
16
+ session[:errors] = nil
17
+ verify_presence_of :login, "Login is not provaided."
18
+ unless session[:errors]
19
+ handle_api_error("Can't create new user") do
20
+ RhosyncApi::create_user(session[:server],
21
+ session[:app_name],session[:token],params[:login],params[:password])
22
+ end
23
+ end
24
+ redirect url(session[:errors] ? '/user/new' : '/users'), 303
25
+ end
26
+
27
+ get '/user' do
28
+ @devices = []
29
+ handle_api_error("Can't load list of devices") do
30
+ @devices = RhosyncApi::list_clients(
31
+ session[:server],session[:app_name],session[:token],params[:user_id])
32
+ end
33
+ @sources = []
34
+ handle_api_error("Can't load list of user partition sources") do
35
+ @sources = RhosyncApi::list_sources(session[:server],session[:app_name],session[:token],:user)
36
+ end
37
+ erb :user
38
+ end
39
+
40
+ get '/user/delete' do
41
+ handle_api_error("Can't delete user #{params[:user_id]}") do
42
+ RhosyncApi::delete_user(session[:server],session[:app_name],session[:token],params[:user_id])
43
+ end
44
+ redirect url(session[:errors] ? "/user?user_id=#{CGI.escape(params[:user_id])}" : '/users'), 303
45
+ end
46
+
47
+ get '/user/ping' do
48
+ @sources = []
49
+ handle_api_error("Can't load list of user partition sources") do
50
+ @sources = RhosyncApi::list_sources(session[:server],session[:app_name],session[:token],:all)
51
+ end
52
+ erb :ping
53
+ end
54
+
55
+ post '/user/ping' do
56
+ params[:sources] = params[:sources].split(',')
57
+ handle_api_error("Error while pinging") do
58
+ RhosyncApi::ping(session[:server],session[:token],params[:user_id],params)
59
+ end
60
+ user = CGI.escape(params[:user_id])
61
+ redirect url(session[:errors] ? "/user/ping?user_id=#{user}" : "/user?user_id=#{user}"), 303
62
+ end
63
+ end
@@ -0,0 +1,30 @@
1
+ <h1>Device: <%=params[:device_id]%></h1>
2
+ <%=show_errors%>
3
+ <a href="<%=url("user?user_id=#{CGI.escape(params[:user_id])}")%>" class='nav_button'>Back</a>
4
+ <a href='<%=url("device/delete?user_id=#{CGI.escape(params[:user_id])}&device_id=#{CGI.escape(params[:device_id])}")%>' class='nav_button'>
5
+ Delete device
6
+ </a>
7
+
8
+ <h2>Device attributes</h2>
9
+ <div class='panel'>
10
+ <table>
11
+ <%@attributes.each do |attrib|%>
12
+ <%if attrib['name'] != 'rho__id' and attrib['value'] and attrib['value'].size > 0%>
13
+ <tr>
14
+ <td><%=attrib['name']%>:</td>
15
+ <td><%=attrib['value']%></td>
16
+ </tr>
17
+ <%end%>
18
+ <%end%>
19
+ </table>
20
+ </div>
21
+
22
+ <h2>Device documents for source:</h2>
23
+
24
+ [
25
+ <%@sources.each_index do |i|%>
26
+ <a href="<%=url("docs?source_id=#{@sources[i]}&device_id=#{CGI.escape(params[:device_id])}&user_id=#{CGI.escape(params[:user_id])}")%>">
27
+ <%=i==0?'':','%>"<%=@sources[i]%>"
28
+ </a>
29
+ <%end%>
30
+ ]
@@ -0,0 +1,56 @@
1
+ <h1>Document [<%= params[:dbkey]%>]</h1>
2
+ <%=show_errors%>
3
+ <div class='panel'>
4
+ <a href='<%= @back_href%>' class='nav_button'>Back</a>
5
+ </div>
6
+ <h2>Upload document</h2>
7
+ <div class='panel'>
8
+ <form action='<%=url("doc/upload?#{@back_params}")%>' method='post' enctype="multipart/form-data">
9
+ <input type='hidden' name='doc' value='<%= "#{CGI.escape(params[:dbkey])}"%>'/>
10
+ <table>
11
+ <%if @is_string%>
12
+ <tr>
13
+ <td>Token string:</td>
14
+ <td><input type='text' name='string' value=''/></td>
15
+ </tr>
16
+ <%else%>
17
+ <tr>
18
+ <td>Data (hash of hashes in json):</td>
19
+ <td><input type='file' name='file' value=''/></td>
20
+ </tr>
21
+ <%end%>
22
+ <tr>
23
+ <td></td>
24
+ <td><input type='submit' value='Submit'/></td>
25
+ </tr>
26
+ </table>
27
+ </form>
28
+ </div>
29
+ <h2>Data</h2>
30
+ <div class='panel'>
31
+ <%if @data.size > 0%>
32
+ <div class='panel'>
33
+ <a href='<%=url("doc/clear?#{@back_params}&dbkey=#{CGI.escape(params[:dbkey])}")%>' class='nav_button'>Clear document</a>
34
+ </div>
35
+ <%if @is_string%>
36
+ <p>[<%=@data%>]</p>
37
+ <%else%>
38
+ <table>
39
+ <%@data.each do |obj_id,obj|%>
40
+ <tr>
41
+ <td colspan=3>[<%=obj_id%>]</td>
42
+ </tr>
43
+ <%obj.each do |attrib,value|%>
44
+ <tr>
45
+ <td></td>
46
+ <td><%=attrib%>:</td>
47
+ <td><%=value%></td>
48
+ </tr>
49
+ <%end%>
50
+ <%end%>
51
+ </table>
52
+ <%end%>
53
+ <%else%>
54
+ <p>Document is empty</p>
55
+ <%end%>
56
+ </div>
@@ -0,0 +1,29 @@
1
+ <h1><%=params[:source_id]%></h1>
2
+ <%=show_errors%>
3
+ <div class='panel'>
4
+ <a href='<%= @back_href%>' class='nav_button'>Back</a>
5
+ </div>
6
+ <h2>Source attributes</h2>
7
+ <div class='panel'>
8
+ <table>
9
+ <%@src_params.each do |attrib|%>
10
+ <%if attrib['name'] != 'rho__id' and attrib['value'] and attrib['value'].size > 0%>
11
+ <tr>
12
+ <td><%=attrib['name']%>:</td>
13
+ <td><%=attrib['value']%></td>
14
+ </tr>
15
+ <%end%>
16
+ <%end%>
17
+ </table>
18
+ </div>
19
+ <h2>Documents for <%=@docs_name%></h2>
20
+ <div class='panel'>
21
+ <table>
22
+ <%@docs.each do |name,dbkey|%>
23
+ <tr>
24
+ <td>:<%=name%></td>
25
+ <td><a href='<%=url("doc?dbkey=#{CGI.escape(dbkey)}&#{@doc_params}")%>' class='nav_button'><%=dbkey%></a></td>
26
+ </tr>
27
+ <%end%>
28
+ </table>
29
+ </div>
@@ -0,0 +1,50 @@
1
+ <%if not login_required %>
2
+ <h1>Application</h1>
3
+ <%if is_errors? or @sources.nil? %>
4
+ <%= show_errors%>
5
+ <%end%>
6
+ <%unless @license.nil? %>
7
+ <%="Licensed to #{@license['licensee']} on #{@license['issued']}, available #{@license['available']} of #{@license['seats']} devices"%>
8
+ <%end%>
9
+ <div class='panel'>
10
+ <a href="<%=url('logout')%>" class='nav_button'>Logout</a>
11
+ </div>
12
+ <div class='panel'>
13
+ <a href="<%=url('reset')%>" class='nav_button'>Reset</a>
14
+ </div>
15
+ <div class='panel'>
16
+ <a href="<%=url('users')%>" class='nav_button'>Application users</a>
17
+ </div>
18
+ <h2>App partition sources</h2>
19
+ <div class='panel'>
20
+ <%unless @sources.nil? %>
21
+ [
22
+ <%@sources.each_index do |i|%>
23
+ <a href="<%=url("docs?source_id=#{@sources[i]}&user_id=*")%>"><%=i==0?'':','%>"<%=@sources[i]%>"</a>
24
+ <%end%>
25
+ ]
26
+ <%end%>
27
+ </div>
28
+ <% else %>
29
+ <h1>Login</h1>
30
+ <%=show_errors%>
31
+ <form action="<%=url('login')%>" method='POST'>
32
+ <input type="hidden" name='app_name' value='application'/>
33
+ <table>
34
+ <tr>
35
+ <td>Server:</td>
36
+ <td><input name='server' value='<%=session[:server] || 'http://localhost:9292'%>' size=64/></td>
37
+ </tr>
38
+ <tr>
39
+ <td>Login:</td>
40
+ <td><input name='login' value='<%=session[:login] || ''%>'/></td>
41
+ </tr>
42
+ <tr>
43
+ <td>Password:</td>
44
+ <td><input name='password' value=''/></td>
45
+ </tr>
46
+ </table>
47
+ <br/>
48
+ <input type='submit' value='Submit'/>
49
+ </form>
50
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>Rhosync Console</title>
7
+ <link rel="stylesheet" href="<%=url('main.css')%>" type="text/css" media="screen" />
8
+ </head>
9
+ <body>
10
+ <%= yield%>
11
+ <body>
12
+ </html>
@@ -0,0 +1,17 @@
1
+ <h1>New user</h1>
2
+ <%=show_errors%>
3
+ <form action="<%=url('/user/create')%>" method='POST'>
4
+ <table>
5
+ <tr>
6
+ <td>Login:</td>
7
+ <td><input name='login'/></td>
8
+ </tr>
9
+ <tr>
10
+ <td>Password:</td>
11
+ <td><input name='password'/></td>
12
+ </tr>
13
+ </table>
14
+ <br/>
15
+ <input type='submit' value='Add'/>
16
+ <a href="<%=url('users')%>">Back</a>
17
+ </form>
@@ -0,0 +1,28 @@
1
+ <h1>Ping <%=params[:user_id]%></h1>
2
+ <%=show_errors%>
3
+ <form method="POST" action="<%=url('user/ping')%>">
4
+ <input type="hidden" name="user_id" value="<%=params[:user_id]%>">
5
+ <table>
6
+ <tr>
7
+ <td>Message:</td>
8
+ <td><input type="text" name="message" value="push message" size=64/></td>
9
+ </tr>
10
+ <tr>
11
+ <td>Sources:</td>
12
+ <td><input type="text" name="sources" value="<%=@sources.join(',')%>" size=64/></td>
13
+ </tr>
14
+ <tr>
15
+ <td>Badge:</td>
16
+ <td><input type="text" name="badge" value="1" /></td>
17
+ </tr>
18
+ <tr>
19
+ <td>Sound:</td>
20
+ <td><input type="text" name="sound" value="welcome.mp3" /></td>
21
+ </tr>
22
+ <tr>
23
+ <td>Vibrate:</td>
24
+ <td><input type="text" name="vibrate" value="2" />(seconds)</td>
25
+ </tr>
26
+ </table>
27
+ <input type="submit" value="Ping!"/>
28
+ </form>
@@ -0,0 +1,11 @@
1
+ <h1><%=@result_name%></h1>
2
+ <div class='panel'>
3
+ <%if is_errors?%>
4
+ <%=show_errors%>
5
+ <%else%>
6
+ <p><%=@status%></p>
7
+ <%end%>
8
+ </div>
9
+ <div class='panel'>
10
+ <a href='<%= @back_href%>' class='nav_button'>Back</a>
11
+ </div>
@@ -0,0 +1,32 @@
1
+ <h1>User: <%=params[:user_id]%></h1>
2
+ <%=show_errors%>
3
+ <div class="panel">
4
+ <a href="<%=url('users')%>" class='nav_button'>Back</a>
5
+ </div>
6
+ <div class="panel">
7
+ <a href='<%=url("user/delete?user_id=#{CGI.escape(params[:user_id])}")%>' class='nav_button'>Delete user</a>
8
+ </div>
9
+ <div class="panel">
10
+ <a href='<%=url("user/ping?user_id=#{CGI.escape(params[:user_id])}")%>' class='nav_button'>Ping User</a>
11
+ </div>
12
+ <h2>User partition sources</h2>
13
+
14
+ [
15
+ <%@sources.each_index do |i|%>
16
+ <a href="<%=url("docs?source_id=#{@sources[i]}&user_id=#{CGI.escape(params[:user_id])}")%>"><%=i==0?'':','%>"<%=@sources[i]%>"</a>
17
+ <%end%>
18
+ ]
19
+
20
+ <h2>Registered Devices</h2>
21
+
22
+ <a href="<%=url("device/create?user_id=#{CGI.escape(params[:user_id])}")%>" class='nav_button'>Create Device</a>
23
+
24
+ <div class="panel">
25
+ [
26
+ <%@devices.each_index do |i|%>
27
+ <a href="<%=url("device?user_id=#{CGI.escape(params[:user_id])}&device_id=#{CGI.escape(@devices[i])}")%>">
28
+ <%=i==0?'':','%>"<%=@devices[i]%>"
29
+ </a>
30
+ <%end%>
31
+ ]
32
+ </div>
@@ -0,0 +1,14 @@
1
+ <h1>Users</h1>
2
+ <a href="<%=url('/')%>" class='nav_button'>Back</a>
3
+ <a href="<%=url('user/new')%>" class='nav_button'>Create User</a>
4
+
5
+ <h2>Registered users</h2>
6
+ <%if is_errors?%>
7
+ <%= show_errors%>
8
+ <%else%>
9
+ [
10
+ <%@users.each_index do |i|%>
11
+ <a href="<%=url("user?user_id=#{CGI.escape(@users[i])}")%>"><%=i==0?'':','%>"<%=@users[i]%>"</a>
12
+ <%end%>
13
+ ]
14
+ <%end%>