rhosync 2.0.8 → 2.0.9
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.
- data/CHANGELOG +9 -0
- data/Rakefile +1 -5
- data/doc/protocol.html +397 -156
- data/lib/rhosync/console/app/public/ThickBox.css +649 -0
- data/lib/rhosync/console/app/public/home.css +433 -0
- data/lib/rhosync/console/app/public/images/header_halo copy.jpg +0 -0
- data/lib/rhosync/console/app/public/images/header_halo.jpg +0 -0
- data/lib/rhosync/console/app/public/images/land_separator.gif +0 -0
- data/lib/rhosync/console/app/public/images/landing_header.jpg +0 -0
- data/lib/rhosync/console/app/public/images/logo_rhosync.png +0 -0
- data/lib/rhosync/console/app/public/images/rhomobile_rhohub_logo.png +0 -0
- data/lib/rhosync/console/app/public/images/tabs_separator.png +0 -0
- data/lib/rhosync/console/app/public/reset.css +76 -0
- data/lib/rhosync/console/app/public/style.css +2201 -0
- data/lib/rhosync/console/app/routes/auth.rb +1 -1
- data/lib/rhosync/console/app/routes/client.rb +1 -1
- data/lib/rhosync/console/app/routes/docs.rb +98 -55
- data/lib/rhosync/console/app/routes/home.rb +47 -8
- data/lib/rhosync/console/app/routes/timing.rb +26 -0
- data/lib/rhosync/console/app/routes/user.rb +58 -21
- data/lib/rhosync/console/app/views/client.erb +2 -2
- data/lib/rhosync/console/app/views/content.erb +14 -0
- data/lib/rhosync/console/app/views/docdata.erb +1 -1
- data/lib/rhosync/console/app/views/docs.erb +2 -2
- data/lib/rhosync/console/app/views/headermenu.erb +41 -0
- data/lib/rhosync/console/app/views/home.erb +22 -0
- data/lib/rhosync/console/app/views/index.erb +1 -1
- data/lib/rhosync/console/app/views/layout.erb +82 -7
- data/lib/rhosync/console/app/views/login.erb +26 -0
- data/lib/rhosync/console/app/views/newuser.erb +1 -1
- data/lib/rhosync/console/app/views/result.erb +1 -1
- data/lib/rhosync/console/app/views/rightboxlinks.erb +15 -0
- data/lib/rhosync/console/app/views/select_doc.erb +1 -3
- data/lib/rhosync/console/app/views/user.erb +3 -6
- data/lib/rhosync/console/app/views/users.erb +2 -4
- data/lib/rhosync/console/server.rb +6 -0
- data/lib/rhosync/jobs/bulk_data_job.rb +17 -4
- data/lib/rhosync/ping/android.rb +38 -0
- data/lib/rhosync/ping.rb +2 -1
- data/lib/rhosync/server/views/index.erb +3 -0
- data/lib/rhosync/server.rb +25 -6
- data/lib/rhosync/source_sync.rb +14 -6
- data/lib/rhosync/stats/middleware.rb +22 -0
- data/lib/rhosync/stats/record.rb +83 -0
- data/lib/rhosync/version.rb +1 -1
- data/lib/rhosync.rb +4 -2
- data/spec/ping/android_spec.rb +45 -0
- data/spec/rhosync_spec.rb +1 -0
- data/spec/server/server_spec.rb +8 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +4 -3
- data/spec/stats/middleware_spec.rb +32 -0
- data/spec/stats/record_spec.rb +71 -0
- metadata +31 -7
- data/lib/rhosync/monitoring/record.rb +0 -28
- data/spec/monitoring/record_spec.rb +0 -21
@@ -8,7 +8,7 @@ class RhosyncConsole::Server
|
|
8
8
|
session[:server] = params[:connect] == 'direct' ? nil : params[:server]
|
9
9
|
|
10
10
|
#verify_presence_of :server, "Server is not provaided."
|
11
|
-
verify_presence_of :login, "Login is not
|
11
|
+
verify_presence_of :login, "Login is not provided."
|
12
12
|
|
13
13
|
unless session[:errors]
|
14
14
|
session[:token] = RhosyncApi::get_token(session[:server],params[:login],params[:password])
|
@@ -1,74 +1,117 @@
|
|
1
1
|
class RhosyncConsole::Server
|
2
|
-
|
3
|
-
@
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
def docs_render_page(contenturl)
|
3
|
+
@currentpage = "Console"
|
4
|
+
@initialcontent = contenturl
|
5
|
+
@pagetitle = "Rhosync Console" #H1 title
|
6
|
+
@locals = {
|
7
|
+
:div => "main_box",
|
8
|
+
:links => [
|
9
|
+
{ :url => url('/homepage'), :title => 'Info' },
|
10
|
+
{ :url => url('/doc/select'), :selected => true, :title => 'Server Document' },
|
11
|
+
{ :url => url('/users'), :title => 'Users' }
|
12
|
+
]
|
13
|
+
}
|
14
|
+
erb :content
|
15
|
+
end
|
16
|
+
|
17
|
+
def hash_to_params(inhash)
|
18
|
+
outstring = "?"
|
19
|
+
inhash.each do |k,v|
|
20
|
+
outstring << "#{k}=#{CGI.escape(v)}&"
|
7
21
|
end
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
outstring
|
23
|
+
end
|
24
|
+
|
25
|
+
get '/docs' do
|
26
|
+
if params[:xhr] or request.xhr?
|
27
|
+
|
28
|
+
@src_params = []
|
29
|
+
handle_api_error("Can't load list of source attributes") do
|
30
|
+
@src_params = RhosyncApi::get_source_params(
|
31
|
+
session[:server],session[:token],params[:source_id])
|
32
|
+
end
|
33
|
+
@docs = []
|
34
|
+
@docs_name = ''
|
35
|
+
@back_href = ''
|
36
|
+
@doc_params = doc_params
|
37
|
+
handle_api_error("Can't load list of the documents") do
|
38
|
+
if params[:device_id]
|
39
|
+
@docs_name = "device #{params[:device_id]}"
|
40
|
+
@back_href = url("device?user_id=#{CGI.escape(params[:user_id])}&device_id=#{CGI.escape(params[:device_id])}")
|
41
|
+
@docs = RhosyncApi::list_client_docs(session[:server],session[:token],params[:source_id],params[:device_id])
|
42
|
+
else
|
43
|
+
if params[:user_id]=='*'
|
44
|
+
@docs_name = "app partition"
|
45
|
+
@back_href = url('/')
|
46
|
+
else
|
47
|
+
@docs_name = "user #{params[:user_id]} partition"
|
48
|
+
@back_href = url("user?user_id=#{CGI.escape(params[:user_id])}")
|
49
|
+
end
|
50
|
+
@docs = RhosyncApi::list_source_docs(session[:server],
|
51
|
+
session[:token],params[:source_id],params[:user_id])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
erb :docs, :layout => false
|
55
|
+
else
|
56
|
+
docs_render_page url("/docs" + hash_to_params(params))
|
57
|
+
|
28
58
|
end
|
29
|
-
erb :docs
|
30
59
|
end
|
31
60
|
|
32
61
|
get '/doc/select' do
|
33
|
-
if params[:
|
34
|
-
|
35
|
-
|
62
|
+
if params[:xhr] or request.xhr?
|
63
|
+
if params[:dbkey].nil?
|
64
|
+
@dbkey = ''
|
65
|
+
@data = {}
|
66
|
+
else
|
67
|
+
@dbkey = params[:dbkey]
|
68
|
+
@is_string = doc_is_string
|
69
|
+
handle_api_error("Can't load document") do
|
70
|
+
@data = RhosyncApi::get_db_doc(session[:server],
|
71
|
+
session[:token],params[:dbkey],@is_string ? :string : '')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
erb :select_doc, :layout => false
|
36
75
|
else
|
37
|
-
|
38
|
-
|
76
|
+
docs_render_page url("/doc/select" + hash_to_params(params))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
get '/doc' do
|
81
|
+
if params[:xhr] or request.xhr?
|
82
|
+
|
83
|
+
@data = {}
|
84
|
+
@is_string = doc_is_string
|
39
85
|
handle_api_error("Can't load document") do
|
40
86
|
@data = RhosyncApi::get_db_doc(session[:server],
|
41
87
|
session[:token],params[:dbkey],@is_string ? :string : '')
|
42
88
|
end
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
@is_string = doc_is_string
|
50
|
-
handle_api_error("Can't load document") do
|
51
|
-
@data = RhosyncApi::get_db_doc(session[:server],
|
52
|
-
session[:token],params[:dbkey],@is_string ? :string : '')
|
89
|
+
@back_params = "source_id=#{CGI.escape(params[:source_id])}&user_id=#{CGI.escape(params[:user_id])}"
|
90
|
+
@back_params += "&device_id=#{CGI.escape(params[:device_id])}" if params[:device_id]
|
91
|
+
@back_href = url("docs?#{doc_params}")
|
92
|
+
erb :doc, :layout => false
|
93
|
+
else
|
94
|
+
docs_render_page url("/doc" + hash_to_params(params))
|
53
95
|
end
|
54
|
-
|
55
|
-
@back_params += "&device_id=#{CGI.escape(params[:device_id])}" if params[:device_id]
|
56
|
-
@back_href = url("docs?#{doc_params}")
|
57
|
-
erb :doc
|
96
|
+
|
58
97
|
end
|
59
98
|
|
60
99
|
get '/doc/clear' do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
100
|
+
if params[:xhr] or request.xhr?
|
101
|
+
is_string = doc_is_string
|
102
|
+
handle_api_error("Can't clear document") do
|
103
|
+
RhosyncApi::set_db_doc(session[:server],session[:token],params[:dbkey],
|
104
|
+
is_string ? '' : {}, is_string ? :string : '')
|
105
|
+
end
|
106
|
+
@result_name = "Clear result"
|
107
|
+
@status = "Successfully cleared: [#{CGI.unescape(params[:dbkey])}]"
|
108
|
+
@back_href = params[:user_id] ?
|
109
|
+
url("doc?#{doc_params}&dbkey=#{CGI.escape(params[:dbkey])}") :
|
110
|
+
url("doc/select?dbkey=#{CGI.escape(params[:dbkey])}")
|
111
|
+
erb :result, :layout => false
|
112
|
+
else
|
113
|
+
docs_render_page url("/doc/clear" + hash_to_params(params))
|
65
114
|
end
|
66
|
-
@result_name = "Clear result"
|
67
|
-
@status = "Successfully cleared: [#{CGI.unescape(params[:dbkey])}]"
|
68
|
-
@back_href = params[:user_id] ?
|
69
|
-
url("doc?#{doc_params}&dbkey=#{CGI.escape(params[:dbkey])}") :
|
70
|
-
url("doc/select?dbkey=#{CGI.escape(params[:dbkey])}")
|
71
|
-
erb :result
|
72
115
|
end
|
73
116
|
|
74
117
|
post '/doc/upload' do
|
@@ -1,16 +1,55 @@
|
|
1
1
|
class RhosyncConsole::Server
|
2
2
|
get '/' do
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
if params[:xhr] or request.xhr?
|
4
|
+
if login_required
|
5
|
+
redirect url('/loginpage')
|
6
|
+
else
|
7
|
+
redirect url('/homepage')
|
7
8
|
end
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
else
|
10
|
+
@currentpage = "Console" #which page in menu
|
11
|
+
if login_required
|
12
|
+
@pagetitle = "Login" #H1 title
|
13
|
+
@initialcontent = url('/loginpage')
|
14
|
+
|
15
|
+
@locals = {
|
16
|
+
:div => "main_box",
|
17
|
+
:links => [
|
18
|
+
# { :url => url('/timing/bydevice'), :selected => true, :title => 'By Device' },
|
19
|
+
# { :url => url('/timing/bysource'), :title => 'By Source' }
|
20
|
+
]
|
21
|
+
}
|
22
|
+
else
|
23
|
+
@pagetitle = "Rhosync Console" #H1 title
|
24
|
+
@initialcontent = url('/homepage')
|
25
|
+
|
26
|
+
@locals = {
|
27
|
+
:div => "main_box",
|
28
|
+
:links => [
|
29
|
+
{ :url => url('/homepage'), :selected => true, :title => 'Info' },
|
30
|
+
{ :url => url('/doc/select'), :title => 'Server Document' },
|
31
|
+
{ :url => url('/users'), :title => 'Users' }
|
32
|
+
]
|
33
|
+
}
|
11
34
|
end
|
35
|
+
erb :content
|
12
36
|
end
|
13
|
-
|
37
|
+
end
|
38
|
+
|
39
|
+
get '/loginpage' do
|
40
|
+
erb :login, :layout => :false
|
41
|
+
end
|
42
|
+
|
43
|
+
get '/homepage' do
|
44
|
+
@license = nil
|
45
|
+
handle_api_error("Can't get license information") do
|
46
|
+
@license = RhosyncApi::get_license_info(session[:server],session[:token])
|
47
|
+
end
|
48
|
+
@sources = nil
|
49
|
+
handle_api_error("Can't load list of application partition sources") do
|
50
|
+
@sources = RhosyncApi::list_sources(session[:server],session[:token],:app)
|
51
|
+
end
|
52
|
+
erb :home, :layout => false
|
14
53
|
end
|
15
54
|
|
16
55
|
get '/reset' do
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class RhosyncConsole::Server
|
2
|
+
get '/timing' do
|
3
|
+
@currentpage = "Timing"
|
4
|
+
@pagetitle = "Timing" #H1 title
|
5
|
+
|
6
|
+
@initialcontent = url('/timing/bydevice')
|
7
|
+
|
8
|
+
@locals = {
|
9
|
+
:div => "main_box",
|
10
|
+
:links => [
|
11
|
+
{ :url => url('/timing/bydevice'), :selected => true, :title => 'By Device' },
|
12
|
+
{ :url => url('/timing/bysource'), :title => 'By Source' }
|
13
|
+
]
|
14
|
+
}
|
15
|
+
|
16
|
+
erb :content
|
17
|
+
end
|
18
|
+
|
19
|
+
get '/timing/bydevice' do
|
20
|
+
"testing device"
|
21
|
+
end
|
22
|
+
|
23
|
+
get '/timing/bysource' do
|
24
|
+
"testing source<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>"
|
25
|
+
end
|
26
|
+
end
|
@@ -1,19 +1,44 @@
|
|
1
1
|
class RhosyncConsole::Server
|
2
|
+
def render_page(contenturl)
|
3
|
+
@currentpage = "Console"
|
4
|
+
@initialcontent = contenturl
|
5
|
+
@pagetitle = "Rhosync Console" #H1 title
|
6
|
+
@locals = {
|
7
|
+
:div => "main_box",
|
8
|
+
:links => [
|
9
|
+
{ :url => url('/homepage'), :title => 'Info' },
|
10
|
+
{ :url => url('/doc/select'), :title => 'Server Document' },
|
11
|
+
{ :url => url('/users'), :selected => true, :title => 'Users' }
|
12
|
+
]
|
13
|
+
}
|
14
|
+
erb :content
|
15
|
+
end
|
16
|
+
|
2
17
|
get '/users' do
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
18
|
+
if params[:xhr] or request.xhr?
|
19
|
+
@users = []
|
20
|
+
handle_api_error("Can't load list of users") do
|
21
|
+
@users = RhosyncApi::list_users(session[:server],session[:token])
|
22
|
+
end
|
23
|
+
erb :users, :layout => false
|
24
|
+
|
25
|
+
else
|
26
|
+
render_page url("/users")
|
27
|
+
end
|
8
28
|
end
|
9
29
|
|
10
30
|
get '/user/new' do
|
11
|
-
|
31
|
+
if params[:xhr] or request.xhr?
|
32
|
+
erb :newuser, :layout => false
|
33
|
+
else
|
34
|
+
render_page url("/user/new")
|
35
|
+
end
|
36
|
+
|
12
37
|
end
|
13
38
|
|
14
39
|
post '/user/create' do
|
15
40
|
session[:errors] = nil
|
16
|
-
verify_presence_of :login, "Login is not
|
41
|
+
verify_presence_of :login, "Login is not provided."
|
17
42
|
unless session[:errors]
|
18
43
|
handle_api_error("Can't create new user") do
|
19
44
|
RhosyncApi::create_user(session[:server],
|
@@ -24,16 +49,22 @@ class RhosyncConsole::Server
|
|
24
49
|
end
|
25
50
|
|
26
51
|
get '/user' do
|
27
|
-
|
28
|
-
|
29
|
-
@devices =
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@sources =
|
35
|
-
|
36
|
-
|
52
|
+
if params[:xhr] or request.xhr?
|
53
|
+
|
54
|
+
@devices = []
|
55
|
+
handle_api_error("Can't load list of devices") do
|
56
|
+
@devices = RhosyncApi::list_clients(
|
57
|
+
session[:server],session[:token],params[:user_id])
|
58
|
+
end
|
59
|
+
@sources = []
|
60
|
+
handle_api_error("Can't load list of user partition sources") do
|
61
|
+
@sources = RhosyncApi::list_sources(session[:server],session[:token],:user)
|
62
|
+
end
|
63
|
+
erb :user, :layout => false
|
64
|
+
else
|
65
|
+
params[:user_id] = CGI::escape(params[:user_id]) if params[:user_id]
|
66
|
+
render_page url("/user?user_id=#{params[:user_id]}")
|
67
|
+
end
|
37
68
|
end
|
38
69
|
|
39
70
|
get '/user/delete' do
|
@@ -44,11 +75,17 @@ class RhosyncConsole::Server
|
|
44
75
|
end
|
45
76
|
|
46
77
|
get '/user/ping' do
|
47
|
-
|
48
|
-
|
49
|
-
@sources =
|
78
|
+
if params[:xhr] or request.xhr?
|
79
|
+
|
80
|
+
@sources = []
|
81
|
+
handle_api_error("Can't load list of user partition sources") do
|
82
|
+
@sources = RhosyncApi::list_sources(session[:server],session[:token],:all)
|
83
|
+
end
|
84
|
+
erb :ping, :layout => false
|
85
|
+
else
|
86
|
+
render_page url("/user/ping?user_id=#{CGI.escape(params[:user_id])}")
|
50
87
|
end
|
51
|
-
|
88
|
+
|
52
89
|
end
|
53
90
|
|
54
91
|
post '/user/ping' do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<h1>Device: <%=params[:device_id]%></h1>
|
2
2
|
<%=show_errors%>
|
3
|
-
<a href="<%=url("user?user_id=#{CGI.escape(params[:user_id])}")%>" class='nav_button'>Back</a>
|
3
|
+
<a href="javascript:void(0);" onclick="loadXMLDoc('<%=url("user?user_id=#{CGI.escape(params[:user_id])}")%>','main_box');" class='nav_button'>Back</a>
|
4
4
|
<a href='<%=url("device/delete?user_id=#{CGI.escape(params[:user_id])}&device_id=#{CGI.escape(params[:device_id])}")%>' class='nav_button'>
|
5
5
|
Delete device
|
6
6
|
</a>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
[
|
25
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])}")%>">
|
26
|
+
<a href='javascript:void(0);' onclick="loadXMLDoc('<%=url("docs?source_id=#{@sources[i]}&device_id=#{CGI.escape(params[:device_id])}&user_id=#{CGI.escape(params[:user_id])}")%>','main_box');">
|
27
27
|
<%=i==0?'':','%>"<%=@sources[i]%>"
|
28
28
|
</a>
|
29
29
|
<%end%>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<h1><%=@pagetitle%></h1>
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
<div id="left" >
|
6
|
+
<div class="boxes" id="main_box">
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<%= erb(:rightboxlinks, :layout => false, :locals => @locals)%>
|
11
|
+
|
12
|
+
<script type="text/javascript">
|
13
|
+
loadXMLDoc('<%= @initialcontent %>','main_box');
|
14
|
+
</script>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class='panel'>
|
3
3
|
<%if @data.size > 0%>
|
4
4
|
<div class='panel'>
|
5
|
-
<a href='<%=url("doc/clear?#{@back_params}&dbkey=#{CGI.escape(params[:dbkey])}")%>' class='nav_button'>Clear document</a>
|
5
|
+
<a href='javascript:void(0);' onclick="loadXMLDoc('<%=url("doc/clear?#{@back_params}&dbkey=#{CGI.escape(params[:dbkey])}")%>','main_box');" class='nav_button'>Clear document</a>
|
6
6
|
</div>
|
7
7
|
<%if @is_string%>
|
8
8
|
<p>[<%=@data%>]</p>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<h1><%=params[:source_id]%></h1>
|
2
2
|
<%=show_errors%>
|
3
3
|
<div class='panel'>
|
4
|
-
<a href='<%= @back_href%>' class='nav_button'>Back</a>
|
4
|
+
<a href='javascript:void(0);' onclick="loadXMLDoc('<%= @back_href%>','main_box');" class='nav_button'>Back</a>
|
5
5
|
</div>
|
6
6
|
<h2>Source attributes</h2>
|
7
7
|
<div class='panel'>
|
@@ -22,7 +22,7 @@
|
|
22
22
|
<%@docs.each do |name,dbkey|%>
|
23
23
|
<tr>
|
24
24
|
<td>:<%=name%></td>
|
25
|
-
<td><a href='<%=url("doc?dbkey=#{CGI.escape(dbkey)}&#{@doc_params}")%>' class='nav_button'><%=dbkey%></a></td>
|
25
|
+
<td><a href='javascript:void(0);' onclick="loadXMLDoc('<%=url("doc?dbkey=#{CGI.escape(dbkey)}&#{@doc_params}")%>','main_box');" class='nav_button'><%=dbkey%></a></td>
|
26
26
|
</tr>
|
27
27
|
<%end%>
|
28
28
|
</table>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<ul>
|
2
|
+
<% currentpage = "Console" if currentpage.nil? %>
|
3
|
+
<% if currentpage == "Resque" %>
|
4
|
+
<li id="current"><a href="/resque" class="current">Resque</a></li>
|
5
|
+
<% else %>
|
6
|
+
<li ><a href="/resque" >Resque</a></li>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% if currentpage == "Console" %>
|
10
|
+
<li id="current"><a href="<%=url("")%>" class="current">Console</a></li>
|
11
|
+
<% else %>
|
12
|
+
<li ><a href="<%=url("")%>" >Console</a></li>
|
13
|
+
<% end %>
|
14
|
+
<!--
|
15
|
+
<% if currentpage == "Timing" %>
|
16
|
+
<li id="current"><a href="<%=url("timing")%>" class="current">Timing</a></li>
|
17
|
+
<% else %>
|
18
|
+
<li ><a href="<%=url("timing")%>" class="">Timing</a></li>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<% if currentpage == "Storage" %>
|
22
|
+
<li id="current"><a href="/pricing" class="current">Storage</a></li>
|
23
|
+
<% else %>
|
24
|
+
<li ><a href="/pricing" class="">Storage</a></li>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<% if currentpage == "Counts" %>
|
28
|
+
<li id="current"><a href="/pricing" class="current">Counts</a></li>
|
29
|
+
<% else %>
|
30
|
+
<li ><a href="/pricing" class="">Counts</a></li>
|
31
|
+
<% end %>
|
32
|
+
-->
|
33
|
+
<li class="separator">
|
34
|
+
<img src="/console/images/tabs_separator.png"/>
|
35
|
+
</li>
|
36
|
+
<% if session[:token] != nil %>
|
37
|
+
<li><a href="<%=url("logout")%>" class="logout">Logout</a></li>
|
38
|
+
<% else %>
|
39
|
+
<li><a href="<%=url("")%>" class="login">Login</a></li>
|
40
|
+
<% end %>
|
41
|
+
</ul>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%if is_errors? or @sources.nil? %>
|
2
|
+
<%= show_errors%>
|
3
|
+
<%end%>
|
4
|
+
<%unless @license.nil? %>
|
5
|
+
<%="Licensed to #{@license['licensee']} on #{@license['issued']}, available #{@license['available']} of #{@license['seats']} devices"%>
|
6
|
+
<%end%>
|
7
|
+
|
8
|
+
<div class='panel'>
|
9
|
+
<a href="<%=url('reset')%>" class='nav_button' onclick="return confirm('Are you sure? Resetting will remove all data. It will also return an error code to all existing devices when they connect!')">Reset</a>
|
10
|
+
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<h2>App partition sources</h2>
|
14
|
+
<div class='panel'>
|
15
|
+
<%unless @sources.nil? %>
|
16
|
+
[
|
17
|
+
<%@sources.each_index do |i|%>
|
18
|
+
<a href='javascript:void(0);' onclick="loadXMLDoc('<%=url("docs?source_id=#{@sources[i]}&user_id=*")%>','main_box');"><%=i==0?'':','%>"<%=@sources[i]%>"</a>
|
19
|
+
<%end%>
|
20
|
+
]
|
21
|
+
<%end%>
|
22
|
+
</div>
|
@@ -1,12 +1,87 @@
|
|
1
1
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
-
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
3
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
4
|
<head>
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
+
<link rel="stylesheet" href="<%=url('reset.css')%>" type="text/css" media="screen" />
|
9
|
+
<link rel="stylesheet" href="<%=url('home.css')%>" type="text/css" media="screen" />
|
10
|
+
<link rel="stylesheet" href="<%=url('style.css')%>" type="text/css" media="screen" />
|
11
|
+
<link rel="stylesheet" href="<%=url('ThickBox.css')%>" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
|
14
|
+
function loadXMLDoc(url,id)
|
15
|
+
{
|
16
|
+
if(url.indexOf('?') != -1) {
|
17
|
+
url = url + "&xhr=true";
|
18
|
+
} else {
|
19
|
+
url = url + "?xhr=true";
|
20
|
+
}
|
21
|
+
if (window.XMLHttpRequest)
|
22
|
+
{// code for IE7+, Firefox, Chrome, Opera, Safari
|
23
|
+
xmlhttp=new XMLHttpRequest();
|
24
|
+
|
25
|
+
xmlhttp.open("GET",url,false);
|
26
|
+
xmlhttp.send(null);
|
27
|
+
if (xmlhttp.responseText != null)
|
28
|
+
{
|
29
|
+
element = document.getElementById(id);
|
30
|
+
if (element != null)
|
31
|
+
{
|
32
|
+
element.innerHTML=xmlhttp.responseText;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
function switch_tab(elem)
|
39
|
+
{
|
40
|
+
if(document.getElementById('link1') != null)document.getElementById('link1').className = "no_class";
|
41
|
+
if(document.getElementById('link2') != null)document.getElementById('link2').className = "no_class";
|
42
|
+
if(document.getElementById('link3') != null)document.getElementById('link3').className = "no_class";
|
43
|
+
if(document.getElementById('link4') != null)document.getElementById('link4').className = "no_class";
|
44
|
+
if(document.getElementById('link5') != null)document.getElementById('link5').className = "no_class";
|
45
|
+
if(document.getElementById('link6') != null)document.getElementById('link6').className = "no_class";
|
46
|
+
if(document.getElementById('link7') != null)document.getElementById('link7').className = "no_class";
|
47
|
+
document.getElementById(elem).className = "selected";
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
</script>
|
52
|
+
|
8
53
|
</head>
|
9
|
-
|
10
|
-
|
11
|
-
|
54
|
+
<body>
|
55
|
+
<div class="container">
|
56
|
+
<div class="wrapper">
|
57
|
+
<div class="header">
|
58
|
+
<div class="logos">
|
59
|
+
<a href="" class="logo_rhomobile">RhoMobile</a>
|
60
|
+
<a href="" class="logo_rhohub">RhoHub</a>
|
61
|
+
</div>
|
62
|
+
<div id="menu">
|
63
|
+
<%= erb(:headermenu,:layout => false, :locals => {:currentpage => @currentpage})%>
|
64
|
+
</div>
|
65
|
+
<div class="header_landing">
|
66
|
+
<div class="col_1">
|
67
|
+
<%= yield%>
|
68
|
+
</div><!--END col_1 -->
|
69
|
+
<div class="land_separator"></div>
|
70
|
+
</div><!--END header_landing -->
|
71
|
+
<div style="float:left">
|
72
|
+
<%unless login_required %>
|
73
|
+
<% license = {}
|
74
|
+
handle_api_error("Can't get license information") do
|
75
|
+
license = RhosyncApi::get_license_info(session[:server],session[:token])
|
76
|
+
end
|
77
|
+
%>
|
78
|
+
<%="Licensed to #{license['licensee']}: #{license['available']}/#{license['seats']} devices available"%>
|
79
|
+
<%end%>
|
80
|
+
<br/>Rhosync v<%=Rhosync::VERSION%><br/>
|
81
|
+
</div>
|
82
|
+
</div><!--END header -->
|
83
|
+
</div><!--END wrapper -->
|
84
|
+
</div><!-- END container -->
|
85
|
+
|
86
|
+
</body>
|
12
87
|
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<form action="<%=url('login')%>" method='POST'>
|
2
|
+
<table>
|
3
|
+
<tr>
|
4
|
+
<td>Connect to RhoSync:</td>
|
5
|
+
<td>
|
6
|
+
<input type="radio" name="connect" value="direct"
|
7
|
+
<%= 'checked' if session[:connect] == 'direct' or session[:connect].nil?%>> Directly</input><br>
|
8
|
+
<input type="radio" name="connect" value="remote" <%= 'checked' if session[:connect] == 'remote'%>> Using REST API</input><br>
|
9
|
+
</td>
|
10
|
+
</tr>
|
11
|
+
<tr>
|
12
|
+
<td>REST Server address:</td>
|
13
|
+
<td><input name='server' value='<%=session[:server_url] || 'http://localhost:9292'%>' size=64/></td>
|
14
|
+
</tr>
|
15
|
+
<tr>
|
16
|
+
<td>Login:</td>
|
17
|
+
<td><input name='login' value='<%=session[:login] || 'rhoadmin'%>'/></td>
|
18
|
+
</tr>
|
19
|
+
<tr>
|
20
|
+
<td>Password:</td>
|
21
|
+
<td><input name='password' type='password' value=''/></td>
|
22
|
+
</tr>
|
23
|
+
</table>
|
24
|
+
<br/>
|
25
|
+
<input type='submit' value='Submit'/>
|
26
|
+
</form>
|