oxidized-web 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of oxidized-web might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.codeclimate.yml +31 -0
- data/.rubocop.yml +5 -0
- data/Rakefile +3 -3
- data/lib/oxidized/web.rb +2 -2
- data/lib/oxidized/web/mig.rb +33 -33
- data/lib/oxidized/web/public/css/buttons.bootstrap.min.css +1 -0
- data/lib/oxidized/web/public/scripts/bootstrap.min.js +6 -0
- data/lib/oxidized/web/public/scripts/oxidized.js +76 -0
- data/lib/oxidized/web/views/conf_search.haml +29 -36
- data/lib/oxidized/web/views/diffs.haml +82 -67
- data/lib/oxidized/web/views/head.haml +11 -3
- data/lib/oxidized/web/views/layout.haml +41 -8
- data/lib/oxidized/web/views/migration.haml +46 -41
- data/lib/oxidized/web/views/node.haml +18 -16
- data/lib/oxidized/web/views/nodes.haml +58 -61
- data/lib/oxidized/web/views/sass/oxidized.sass +33 -57
- data/lib/oxidized/web/views/stats.haml +97 -18
- data/lib/oxidized/web/views/version.haml +21 -18
- data/lib/oxidized/web/views/versions.haml +45 -54
- data/lib/oxidized/web/webapp.rb +38 -32
- data/oxidized-web.gemspec +6 -6
- metadata +22 -9
- data/lib/oxidized/web/public/css/oxidized.sass +0 -45
- data/lib/oxidized/web/views/default.haml +0 -4
- data/lib/oxidized/web/views/oxidized.sass +0 -45
- data/lib/oxidized/web/views/sass/bootstrap.min.css +0 -5
@@ -1,23 +1,102 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
.row.tbl-header
|
2
|
+
.col-xs-12
|
3
|
+
%h4
|
4
|
+
%a{href: url_for('/nodes')} nodes
|
5
|
+
\/ stats
|
6
|
+
|
7
|
+
.row
|
8
|
+
.pull-right
|
9
|
+
%button.ColVis_Button{type: 'button', onclick: 'history.go();'}
|
10
|
+
%span.glyphicon.glyphicon-repeat Refresh
|
11
|
+
|
12
|
+
.table-responsive
|
13
|
+
%table.table.table-condensed.table-striped.table-hover#statsTable
|
14
|
+
%caption
|
15
|
+
%span Node Statistics
|
16
|
+
|
6
17
|
%thead
|
7
18
|
%tr
|
8
19
|
%th Name
|
9
|
-
%th
|
20
|
+
%th Total Runs
|
21
|
+
%th Total Failures
|
22
|
+
%th Failure Rate
|
23
|
+
%th Average Run Time
|
24
|
+
%th Last Status
|
25
|
+
%th Last Update
|
26
|
+
%th Last Failure
|
27
|
+
|
10
28
|
%tbody
|
11
|
-
|
12
|
-
-
|
13
|
-
|
14
|
-
-
|
15
|
-
-
|
16
|
-
-
|
17
|
-
|
29
|
+
- @data.map do |node, stats|
|
30
|
+
- status = 'no_connection'
|
31
|
+
- successes = 0
|
32
|
+
- failures = 0
|
33
|
+
- avg_success_time = 0
|
34
|
+
- avg_failure_time = 0
|
35
|
+
- avg_time = 0
|
36
|
+
- row_class = ''
|
37
|
+
|
38
|
+
- if stats[:success]
|
39
|
+
- last_success = stats[:success].last[:end]
|
40
|
+
- successes = stats[:success].length
|
41
|
+
- avg_success_time = stats[:success].collect {|x| x[:time]}
|
42
|
+
- avg_success_time = avg_success_time.inject {|sum, x| sum + x}
|
43
|
+
- avg_success_time /= successes
|
44
|
+
|
45
|
+
- if stats[:no_connection]
|
46
|
+
- last_failure = stats[:no_connection].last[:end]
|
47
|
+
- failures = stats[:no_connection].length
|
48
|
+
- avg_failure_time = stats[:no_connection].collect {|x| x[:time]}
|
49
|
+
- avg_failure_time = avg_failure_time.inject {|sum, x| sum + x}
|
50
|
+
- avg_failure_time /= failures
|
51
|
+
|
52
|
+
- if avg_success_time > 0 && avg_failure_time > 0
|
53
|
+
- avg_time = (avg_success_time + avg_failure_time) / 2
|
54
|
+
- elsif avg_success_time > 0
|
55
|
+
- avg_time = avg_success_time
|
56
|
+
- elsif avg_failure_time > 0
|
57
|
+
- avg_time = avg_failure_time
|
58
|
+
- avg_time = "#{'%.2f' % avg_time}" unless avg_time == 'Unknown'
|
59
|
+
|
60
|
+
- if last_success && last_failure
|
61
|
+
- status = last_success > last_failure ? 'success' : 'no_connection'
|
62
|
+
- elsif last_success
|
63
|
+
- status = 'success'
|
64
|
+
- last_failure = 'never'
|
65
|
+
- else
|
66
|
+
- last_success = 'never'
|
67
|
+
|
68
|
+
- total_runs = successes + failures
|
69
|
+
- failure_rate = (failures / total_runs.to_f) * 100
|
70
|
+
- row_class = 'warning' if failure_rate >= 50
|
71
|
+
- row_class = 'danger' if failure_rate >= 75
|
72
|
+
|
73
|
+
%tr{class: row_class}
|
18
74
|
%td= node
|
19
|
-
%td=
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
75
|
+
%td= total_runs
|
76
|
+
%td= failures
|
77
|
+
%td #{'%.2f' % failure_rate}%
|
78
|
+
%td #{'%.2f' % avg_time}s
|
79
|
+
%td
|
80
|
+
%div{title: status, class: status}
|
81
|
+
%td.time= last_success
|
82
|
+
%td.time= last_failure
|
83
|
+
|
84
|
+
:javascript
|
85
|
+
$(function() {
|
86
|
+
$('#statsTable').dataTable({
|
87
|
+
dom: 'C<"clear">lfrtip',
|
88
|
+
"lengthMenu": [[50, 250, 500, -1], [50, 250, 500, "All"]],
|
89
|
+
columnDefs: [{
|
90
|
+
visible: false,
|
91
|
+
targets: 1
|
92
|
+
}, {
|
93
|
+
type: "string",
|
94
|
+
targets: 3
|
95
|
+
}],
|
96
|
+
colVis: {
|
97
|
+
exclude: [0, 5]
|
98
|
+
}
|
99
|
+
});
|
100
|
+
});
|
101
|
+
|
102
|
+
|
@@ -1,19 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
1
|
+
.row
|
2
|
+
.col-sm-12
|
3
|
+
%h4
|
4
|
+
- if @info[:group] != ''
|
5
|
+
- params = "node_full=#{@info[:group] + '/' + @info[:node]}"
|
6
|
+
- else
|
7
|
+
- params = "node_full=#{@info[:node]}"
|
8
|
+
%a{href: url_for("/node/version?#{params}")} versions
|
9
|
+
\/ version #{@info[:num]} for Node
|
10
|
+
%span.node_title #{@info[:node]}
|
11
|
+
.row
|
12
|
+
.col-sm-12
|
13
|
+
- date_version = Time.parse @info[:date]
|
14
|
+
Date of version:
|
15
|
+
%span.time #{date_version.strftime('%Y-%m-%d %H:%M:%S %Z')}
|
16
|
+
|
17
|
+
.row
|
18
|
+
.col-sm-12
|
19
|
+
.diffs
|
20
|
+
- @data.each_line do |line|
|
21
|
+
%div> #{line}
|
18
22
|
|
19
|
-
|
@@ -1,60 +1,51 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
%
|
4
|
-
%
|
5
|
-
|
6
|
-
%
|
1
|
+
.row.tbl-header
|
2
|
+
.col-xs-12
|
3
|
+
%h4
|
4
|
+
%a{href: url_for('/nodes')} nodes
|
5
|
+
\/ Versions for Node
|
6
|
+
%span.node_title #{@node}
|
7
|
+
|
8
|
+
.row
|
9
|
+
.pull-right
|
10
|
+
%form
|
11
|
+
%button.ColVis_Button{type: 'button', onclick: 'history.go();'}
|
12
|
+
%span.glyphicon.glyphicon-repeat Refresh
|
13
|
+
.table-responsive
|
14
|
+
%table.table.table-condensed.table-striped.table-hover#versionsTable
|
15
|
+
%thead
|
16
|
+
%tr
|
17
|
+
%th Version
|
18
|
+
%th Dates
|
19
|
+
%th Author
|
20
|
+
%th Message
|
21
|
+
%th Actions
|
22
|
+
|
23
|
+
%tbody
|
24
|
+
- nb = @data.count + 1
|
25
|
+
- @data.each do |x|
|
26
|
+
%tr
|
27
|
+
%td #{nb -= 1}
|
28
|
+
%td #{time_from_now x[:date]}
|
29
|
+
%td #{x[:author][:name]}
|
30
|
+
%td #{x[:message]}
|
31
|
+
%td
|
32
|
+
- params = "node=#{@node}&group=#{@group}&oid=#{x[:oid]}"
|
33
|
+
- params = "#{params}&date=#{x[:date]}&num=#{nb}"
|
34
|
+
%a{title: 'configuration',
|
35
|
+
href: url_for("/node/version/view?#{params}")}
|
36
|
+
%span.glyphicon.glyphicon-cloud-download
|
37
|
+
|
38
|
+
%a{title: 'diff', href: url_for("/node/version/diffs?#{params}")}
|
39
|
+
%img{src: url_for('/images/diff_15x17.png')}
|
40
|
+
|
7
41
|
:javascript
|
8
42
|
$(function() {
|
9
43
|
$('#versionsTable').dataTable({
|
10
44
|
dom: 'C<"clear">lfrtip',
|
11
|
-
"order": [[
|
12
|
-
columnDefs: [
|
13
|
-
|
14
|
-
|
45
|
+
"order": [[0, "desc"]],
|
46
|
+
columnDefs: [{
|
47
|
+
visible: false,
|
48
|
+
targets: [2, 3]
|
49
|
+
}]
|
15
50
|
});
|
16
51
|
});
|
17
|
-
%div{:class=>'row tbl-header'}
|
18
|
-
%div{:class=>'col-xs-12 '}
|
19
|
-
%h4
|
20
|
-
%a{:href=>url_for('/nodes')} nodes
|
21
|
-
\/ Versions for Node
|
22
|
-
%span{:class=>'node_title'} #{@node}
|
23
|
-
|
24
|
-
%div{:class=>'row'}
|
25
|
-
%div{:class=>'refresh-div'}
|
26
|
-
%form
|
27
|
-
%button{:class => "ColVis_Button", :type => "button", :onclick => "history.go();"}
|
28
|
-
%span{:class=>"glyphicon glyphicon-repeat"}
|
29
|
-
Refresh
|
30
|
-
%table{:id=>'versionsTable', :class=>'table table-responsive tablesorter'}
|
31
|
-
%thead
|
32
|
-
%tr
|
33
|
-
%th Version
|
34
|
-
%th Dates
|
35
|
-
%th Author
|
36
|
-
%th Message
|
37
|
-
%th Actions
|
38
|
-
|
39
|
-
%tbody
|
40
|
-
-trclass = %w(even odd)
|
41
|
-
- nb = @data.count + 1
|
42
|
-
- @data.each do |x|
|
43
|
-
%tr
|
44
|
-
%td
|
45
|
-
#{nb -= 1}
|
46
|
-
%td
|
47
|
-
#{time_from_now x[:date]}
|
48
|
-
%td
|
49
|
-
#{x[:author][:name]}
|
50
|
-
%td
|
51
|
-
#{x[:message]}
|
52
|
-
%td
|
53
|
-
%a{:title => "configuration", :href => url_for("/node/version/view?node=#{@node}&group=#{@group}&oid=#{x[:oid]}&date=#{x[:date]}&num=#{nb}") }
|
54
|
-
%span{:class=>'glyphicon glyphicon-cloud-download'}
|
55
|
-
|
56
|
-
%a{:title => "diff", :href => url_for("/node/version/diffs?node=#{@node}&group=#{@group}&oid=#{x[:oid]}&date=#{x[:date]}&num=#{nb}") }
|
57
|
-
%img{:src=>url_for('/images/diff_15x17.png')}
|
58
|
-
|
59
|
-
|
60
|
-
|
data/lib/oxidized/web/webapp.rb
CHANGED
@@ -9,7 +9,7 @@ module Oxidized
|
|
9
9
|
module API
|
10
10
|
class WebApp < Sinatra::Base
|
11
11
|
helpers Sinatra::UrlForHelper
|
12
|
-
set :public_folder, Proc.new { File.join(root,
|
12
|
+
set :public_folder, Proc.new { File.join(root, 'public') }
|
13
13
|
|
14
14
|
get '/' do
|
15
15
|
redirect url_for('/nodes')
|
@@ -46,14 +46,14 @@ module Oxidized
|
|
46
46
|
end
|
47
47
|
|
48
48
|
post '/nodes/conf_search' do
|
49
|
-
@to_research = params[:search_in_conf_textbox]
|
49
|
+
@to_research = Regexp.new params[:search_in_conf_textbox]
|
50
50
|
nodes_list = nodes.list.map
|
51
51
|
@nodes_match = []
|
52
52
|
nodes_list.each do |n|
|
53
53
|
node, @json = route_parse n[:name]
|
54
54
|
config = nodes.fetch node, n[:group]
|
55
|
-
if config
|
56
|
-
@nodes_match.push({:
|
55
|
+
if config[@to_research]
|
56
|
+
@nodes_match.push({ node: n[:name], full_name: n[:full_name] })
|
57
57
|
end
|
58
58
|
end
|
59
59
|
out :conf_search
|
@@ -116,12 +116,12 @@ module Oxidized
|
|
116
116
|
out :node
|
117
117
|
end
|
118
118
|
|
119
|
-
#redirect to the web page for rancid - oxidized migration
|
119
|
+
# redirect to the web page for rancid - oxidized migration
|
120
120
|
get '/migration' do
|
121
121
|
out :migration
|
122
122
|
end
|
123
123
|
|
124
|
-
#get the files send
|
124
|
+
# get the files send
|
125
125
|
post '/migration' do
|
126
126
|
number = params[:number].to_i
|
127
127
|
cloginrc_file = params['cloginrc'][:tempfile]
|
@@ -131,27 +131,26 @@ module Oxidized
|
|
131
131
|
|
132
132
|
i = 1
|
133
133
|
while i <= number do
|
134
|
-
router_db_files.push({:
|
135
|
-
i = i+1
|
134
|
+
router_db_files.push({ file: params["file#{i}"][:tempfile], group: params["group#{i}"] })
|
135
|
+
i = i + 1
|
136
136
|
end
|
137
137
|
|
138
138
|
migration = Mig.new(router_db_files, cloginrc_file, path_new_file)
|
139
139
|
migration.go_rancid_migration
|
140
|
-
redirect url_for(
|
141
|
-
|
140
|
+
redirect url_for('//nodes')
|
142
141
|
end
|
143
142
|
|
144
143
|
get '/css/*.css' do
|
145
144
|
sass "sass/#{params[:splat].first}".to_sym
|
146
145
|
end
|
147
146
|
|
148
|
-
#show the lists of versions for a node
|
147
|
+
# show the lists of versions for a node
|
149
148
|
get '/node/version.?:format?' do
|
150
149
|
@data = nil
|
151
150
|
@group = nil
|
152
151
|
@node = nil
|
153
152
|
node_full = params[:node_full]
|
154
|
-
if node_full.include?
|
153
|
+
if node_full.include? '/'
|
155
154
|
node_full = node_full.split('/')
|
156
155
|
@group = node_full[0]
|
157
156
|
@node = node_full[1]
|
@@ -163,19 +162,26 @@ module Oxidized
|
|
163
162
|
out :versions
|
164
163
|
end
|
165
164
|
|
166
|
-
#show the blob of a version
|
165
|
+
# show the blob of a version
|
167
166
|
get '/node/version/view.?:format?' do
|
168
167
|
node, @json = route_parse :node
|
169
|
-
@info = {
|
168
|
+
@info = {
|
169
|
+
node: node,
|
170
|
+
group: params[:group],
|
171
|
+
oid: params[:oid],
|
172
|
+
date: params[:date],
|
173
|
+
num: params[:num]
|
174
|
+
}
|
175
|
+
|
170
176
|
@data = nodes.get_version node, @info[:group], @info[:oid]
|
171
177
|
out :version
|
172
178
|
end
|
173
179
|
|
174
|
-
#show diffs between 2 version
|
180
|
+
# show diffs between 2 version
|
175
181
|
get '/node/version/diffs' do
|
176
182
|
node, @json = route_parse :node
|
177
183
|
@data = nil
|
178
|
-
@info = {:
|
184
|
+
@info = {node: node, group: params[:group], oid: params[:oid], date: params[:date], num: params[:num], num2: (params[:num].to_i - 1)}
|
179
185
|
group = nil
|
180
186
|
if @info[:group] != ''
|
181
187
|
group = @info[:group]
|
@@ -197,25 +203,25 @@ module Oxidized
|
|
197
203
|
else
|
198
204
|
@data = nodes.get_diff node, @info[:group], @info[:oid], nil
|
199
205
|
end
|
200
|
-
@stat = [
|
206
|
+
@stat = ['null', 'null']
|
201
207
|
if @data != 'no diffs' && @data != nil
|
202
208
|
@stat = @data[:stat]
|
203
209
|
@data = @data[:patch]
|
204
210
|
else
|
205
|
-
@data =
|
211
|
+
@data = 'no available'
|
206
212
|
end
|
207
213
|
@diff = diff_view @data
|
208
214
|
out :diffs
|
209
215
|
end
|
210
216
|
|
211
|
-
#used for diff between 2 distant commit
|
217
|
+
# used for diff between 2 distant commit
|
212
218
|
post '/node/version/diffs' do
|
213
219
|
redirect url_for("/node/version/diffs?node=#{params[:node]}&group=#{params[:group]}&oid=#{params[:oid]}&date=#{params[:date]}&num=#{params[:num]}&oid2=#{params[:oid2]}")
|
214
220
|
end
|
215
221
|
|
216
222
|
private
|
217
223
|
|
218
|
-
def out template
|
224
|
+
def out template = :default
|
219
225
|
if @json or params[:format] == 'json'
|
220
226
|
if @data.is_a?(String)
|
221
227
|
json @data.lines
|
@@ -226,7 +232,7 @@ module Oxidized
|
|
226
232
|
content_type :text
|
227
233
|
@data
|
228
234
|
else
|
229
|
-
haml template, :
|
235
|
+
haml template, layout: true
|
230
236
|
end
|
231
237
|
end
|
232
238
|
|
@@ -248,12 +254,12 @@ module Oxidized
|
|
248
254
|
[e.join('.'), json]
|
249
255
|
end
|
250
256
|
|
251
|
-
#give the time enlapsed between now and a date
|
257
|
+
# give the time enlapsed between now and a date
|
252
258
|
def time_from_now date
|
253
259
|
if date
|
254
|
-
#if the + is missing
|
255
|
-
unless date.include?
|
256
|
-
date.insert(21,
|
260
|
+
# if the + is missing
|
261
|
+
unless date.include? '+'
|
262
|
+
date.insert(21, '+')
|
257
263
|
end
|
258
264
|
date = DateTime.parse date
|
259
265
|
now = DateTime.now
|
@@ -262,7 +268,7 @@ module Oxidized
|
|
262
268
|
hh, mm = mm.divmod(60)
|
263
269
|
dd, hh = hh.divmod(24)
|
264
270
|
if dd > 0
|
265
|
-
|
271
|
+
date = "#{dd} days #{hh} hours ago"
|
266
272
|
elsif hh > 0
|
267
273
|
date = "#{hh} hours #{mm} min ago"
|
268
274
|
else
|
@@ -272,7 +278,7 @@ module Oxidized
|
|
272
278
|
date
|
273
279
|
end
|
274
280
|
|
275
|
-
#method the give diffs in separate view (the old and the new) as in github
|
281
|
+
# method the give diffs in separate view (the old and the new) as in github
|
276
282
|
def diff_view diff
|
277
283
|
old_diff = []
|
278
284
|
new_diff = []
|
@@ -295,20 +301,20 @@ module Oxidized
|
|
295
301
|
break
|
296
302
|
end
|
297
303
|
if (/^\-.*/.match(old_diff[i])) && !(/^\+.*/.match(new_diff[i]))
|
298
|
-
#tag removed latter to add color syntax
|
304
|
+
# tag removed latter to add color syntax
|
299
305
|
insert = 'empty_line'
|
300
|
-
#ugly way to avoid asymmetry if at display the line takes 2 line on the screen
|
306
|
+
# ugly way to avoid asymmetry if at display the line takes 2 line on the screen
|
301
307
|
insert = " \n"
|
302
|
-
new_diff.insert(i,insert)
|
308
|
+
new_diff.insert(i, insert)
|
303
309
|
length_n += 1
|
304
310
|
elsif !(/^\-.*/.match(old_diff[i])) && (/^\+.*/.match(new_diff[i]))
|
305
311
|
insert = 'empty_line'
|
306
312
|
insert = " \n"
|
307
|
-
old_diff.insert(i,insert)
|
313
|
+
old_diff.insert(i, insert)
|
308
314
|
length_o += 1
|
309
315
|
end
|
310
316
|
end
|
311
|
-
{:
|
317
|
+
{ old_diff: old_diff, new_diff: new_diff }
|
312
318
|
end
|
313
319
|
end
|
314
320
|
end
|