oxidized-web 0.2.0 → 0.3.0

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.

Potentially problematic release.


This version of oxidized-web might be problematic. Click here for more details.

@@ -0,0 +1,15 @@
1
+ var number = 1;
2
+
3
+ function add_file_upload(){
4
+ number++;
5
+ document.getElementById('number').value = number;
6
+ var table = document.getElementById("files");
7
+ var row = table.insertRow(-1);
8
+ var group = row.insertCell(0);
9
+ group.id = "file";
10
+ var file = row.insertCell(1);
11
+ file.id = "file";
12
+ group.innerHTML = '<input type="text" name="group' + number +'" value="default">';
13
+ file.innerHTML = '<input type="file" name="file' + number +'" required >';
14
+
15
+ }
@@ -0,0 +1,69 @@
1
+ !=haml :head
2
+ %body
3
+ %h4
4
+ - node_full = ''
5
+ - if @info[:group] != ''
6
+ - node_full = "#{@info[:group] + '/' + @info[:node]}"
7
+ - else
8
+ - node_full = "#{@info[:node]}"
9
+ %a{:href=>url_for("/node/version?node_full=#{node_full}")} versions
10
+ \/ Diff version #{@info[:num]} - #{@info[:num2]} for Node
11
+ %span{:class=>'node_title'} #{@info[:node]}
12
+ - date_version = Time.parse @info[:date]
13
+ Date of version: #{date_version.strftime("%d-%m-%y at %r")}
14
+ %br
15
+ Number of lines changed:
16
+ %span{:class=>'added'}added #{@stat[0]}
17
+ %span{:class=>'deleted'}removed #{@stat[1]}
18
+ %br
19
+ %br
20
+ %form{ :action => "/node/version/diffs?node=#{@info[:node]}&group=#{@info[:group]}&oid=#{@info[:oid]}&date=#{@info[:date]}&num=#{@info[:num]}", :method => "post"}
21
+ %select{:name => "oid2", :id => "oid2"}
22
+ - diff2 = {}
23
+ - num = @oids_dates.count + 1
24
+ - next_id = false
25
+ - @oids_dates.each do |x|
26
+ %option{:value => x[:oid]} Version #{num -= 1} (#{time_from_now x[:date]})
27
+ - if (x[:oid].to_s == @info[:oid2]) || (next_id)
28
+ - diff2 = {:num => num, :date => x[:date]}
29
+ - next_id = false
30
+ - elsif (x[:oid].to_s == @info[:oid]) && !(@info[:oid2])
31
+ - next_id = true
32
+
33
+
34
+ %input{:type => "submit", :value => "Get diffs !"}
35
+ %br
36
+ %div{:class=>'old_version_title'} Version #{diff2[:num]} (#{time_from_now diff2[:date]})
37
+
38
+ %div{:class=>'new_version_title'} Version #{@info[:num]} (#{time_from_now @info[:date]})
39
+ %br
40
+ %div{:class=>'diffs_old', :id=>'Test'}
41
+ - @diff[:old_diff].each do |line|
42
+ - if /^\+.*/.match(line)
43
+ %div{:class=>'added',:id=>'Test'} #{line}
44
+
45
+ - elsif /^\-.*/.match(line)
46
+ %div{:class=>'deleted'} #{line}
47
+
48
+ - elsif /^@@\s.*@@.*$/.match(line)
49
+ %div{:class=>'diff-index', :id=>'Test'} #{line}
50
+ - elsif /^empty_line&nbsp;/.match(line)
51
+ - line.slice! "empty_line"
52
+ %div{:class=>'diff-empty'} #{line}
53
+ - else
54
+ %div #{line}
55
+ %div{:class=>'diffs_new'}
56
+ - @diff[:new_diff].each do |line|
57
+ - if /^\+.*/.match(line)
58
+ %div{:class=>'added'} #{line}
59
+
60
+ - elsif /^\-.*/.match(line)
61
+ %div{:class=>'deleted'} #{line}
62
+
63
+ - elsif /^@@\s.*@@.*$/.match(line)
64
+ %div{:class=>'diff-index'} #{line}
65
+ - elsif /^empty_line&nbsp;/.match(line)
66
+ - line.slice! "empty_line"
67
+ %div{:class=>'diff-empty'} #{line}
68
+ - else
69
+ %div #{line}
@@ -0,0 +1,41 @@
1
+ !=haml :head
2
+ %script{:src=>url_for('/scripts/script-migration.js')}
3
+ %body
4
+
5
+ %span{:id=>"migration_span"}
6
+ Here you can migrate from your Rancid to Oxidized.
7
+ %br
8
+ To do it, just execute te following actions :
9
+ %br
10
+ %br
11
+ %form(method="post" enctype="multipart/form-data")
12
+ %label{:for=>"path_new_file"} Set the path for your future equipement file in .db format
13
+ %br
14
+ %input{:type=>"text", :name=>"path_new_file", :value=>"Path/to_file/here.db"}
15
+ %br
16
+ %br
17
+ %label{:for=>"cloginrc"} Select your .cloginrc file, must be readeable
18
+ %input{:type=>"file", :name=>"cloginrc"}
19
+ %br
20
+ %label{:for=>"files"} Select all your router.db fies of rancid, and add their group (Click "Add file" if you have multiple files)
21
+ %table{:id=>"files", :name=>"files"}
22
+ %th{:id=>"file"} Group
23
+ %th{:id=>"file"} File
24
+ %tbody
25
+ %tr
26
+ %td{:id=>"file"}
27
+ %input{:type=>"text", :name=>"group1", :value=>"default"}
28
+ %td{:id=>"file"}
29
+ %input{:type=>"file", :name=>"file1", :required=>""}
30
+ %br
31
+ %input(type='button' value ='Add file' onclick="add_file_upload();")
32
+ %br
33
+ %br
34
+ %label{:for=>"upload_button"}Then Click "Migrate" to do your migration
35
+ %br
36
+ %input(type='submit' value='Migrate !' id="upload_button")
37
+ /
38
+ used to know the numbers of files router.db
39
+ %input(type='hidden' value='1' id='number' name='number')
40
+
41
+
@@ -1,22 +1,34 @@
1
1
  %script{:src=>url_for('/scripts/jquery-2.1.1.min.js')}
2
2
  %script{:src=>url_for('/scripts/jquery.dataTables.min.js')}
3
3
  %script{:src=>url_for('/scripts/dataTables.bootstrap.js')}
4
+ %script{:src=>url_for('/scripts/dataTables.colVis.js')}
4
5
  %link{:rel=>'stylesheet', :href=>url_for('/css/dataTables.bootstrap.css')}
6
+ %link{:rel=>'stylesheet', :href=>url_for('/css/dataTables.colVis.css')}
5
7
  :javascript
6
8
  $(function() {
7
9
  $('#nodesTable').dataTable({
8
- "dom": '<"H"flr>tip',
9
- "lengthMenu": [[50, 250, 500, -1], [50, 250, 500, "All"]]
10
+ dom: 'C<"clear">lfrtip',
11
+ "lengthMenu": [[50, 250, 500, -1], [50, 250, 500, "All"]],
12
+ columnDefs: [
13
+ { visible: false, targets: 1 },
14
+ {type: "string", targets: 3}
15
+ ],
16
+ colVis: {
17
+ exclude: [ 0, 5 ]
18
+ }
10
19
  });
11
20
  });
12
21
  %div{:class=>'row tbl-header'}
13
22
  %div{:class=>'col-xs-12 col-md-2'}
14
23
  %h4 nodes /
15
- %div{:class=>'col-xs-12 col-md-10'}
16
- %a{:class=>"btn btn-default tbl-action col-xs-12 col-md-2 col-md-offset-10", :id=>"reload", :href=>url_for("/nodes")}
17
- %span{:class=>"glyphicon glyphicon-repeat"}
18
- Refresh
24
+ %button{:onclick => "location.href='/migration'" }
25
+ %span migration
19
26
  %div{:class=>'row'}
27
+ %div{:class=>'refresh-div'}
28
+ %form
29
+ %button{:class => "ColVis_Button", :type => "button", :onclick => "history.go();"}
30
+ %span{:class=>"glyphicon glyphicon-repeat"}
31
+ Refresh
20
32
  %table{:id=>'nodesTable', :class=>'table table-responsive tablesorter'}
21
33
  %thead
22
34
  %tr
@@ -25,8 +37,8 @@
25
37
  %th Group
26
38
  %th Last Status
27
39
  %th Last Update
28
- %th Config
29
- %th Update
40
+ %th Actions
41
+
30
42
  %tbody
31
43
  -trclass = %w(even odd)
32
44
  -@data.sort_by{|e|e[:name]}.each do |node|
@@ -36,11 +48,15 @@
36
48
  %a{:href => url_for("/node/show/#{node[:name]}") } #{node[:name]}
37
49
  %td= node[:ip]
38
50
  %td= node[:group]
39
- %td= node[:status]
51
+ %td
52
+ %div{:title=>node[:status], :class=>node[:status]}
40
53
  %td= node[:time]
41
54
  %td
42
- %a{:href => url_for("/node/fetch/#{node[:full_name]}") }
55
+ %a{:title => "configuration", :href => url_for("/node/fetch/#{node[:full_name]}") }
43
56
  %span{:class=>'glyphicon glyphicon-cloud-download'}
44
- %td
45
- %a{:href => url_for("/node/next/#{node[:full_name]}") }
46
- %span{:class=>'glyphicon glyphicon-repeat'}
57
+ &nbsp;&nbsp;
58
+ %a{:title => "versions", :href => url_for("/node/version?node_full=#{node[:full_name]}") }
59
+ %img{:src=>url_for('/images/versioning_18px.png')}
60
+ &nbsp;&nbsp;
61
+ %a{:title => "update", :href => url_for("/node/next/#{node[:full_name]}") }
62
+ %span{:class=>'glyphicon glyphicon-repeat'}
@@ -43,3 +43,91 @@ input#search
43
43
 
44
44
  input#search .focused
45
45
  border-bottom: 1px dotted #FFA600 !important
46
+
47
+ .added
48
+ background-color: #DBFFDB
49
+
50
+ .deleted
51
+ background-color: #FFDDDD
52
+
53
+ .diff-index
54
+ background-color: #FFFF99
55
+
56
+ .diff-empty
57
+ background-color: #F0F0F0
58
+
59
+ .diffs
60
+ background-color: FAFAFA
61
+ border: 2px solid #ccc
62
+ border-radius: 5px
63
+ padding: 3px
64
+
65
+ .diffs_old
66
+ @extend .diffs
67
+ float: left
68
+ width: 49%
69
+ white-space: nowrap
70
+ overflow: auto
71
+
72
+ .diffs_new
73
+ @extend .diffs
74
+ margin-left: 51%
75
+ width: 49%
76
+ white-space: nowrap
77
+ overflow: auto
78
+
79
+ .node_title
80
+ @extend .diffs
81
+ border-radius: 0px
82
+
83
+ .old_version_title
84
+ float: left
85
+ width: 49%
86
+ font-weight: bold
87
+ .new_version_title
88
+ margin-left: 51%
89
+ font-weight: bold
90
+
91
+ .refresh-div
92
+ float: right
93
+ padding-left: 5px
94
+
95
+
96
+ .status
97
+ float: right
98
+ width: 15px
99
+ height: 15px
100
+ border: 1px solid
101
+ margin-right: 70%
102
+ margin-bottom: 0px
103
+ border-radius: 2px
104
+ .success
105
+ @extend .status
106
+ background-color: #64FE2E
107
+
108
+ .no_connection
109
+ @extend .status
110
+ background-color: #FF0000
111
+ .never
112
+ @extend .status
113
+ background-color: #58ACFA
114
+
115
+ a:hover
116
+ text-decoration: none
117
+
118
+ #migration_span
119
+ font-size: 20px
120
+ font-weight: bold
121
+
122
+ table#files
123
+ width: 70%
124
+ border: 1px solid
125
+
126
+ th#file
127
+ width: 50%
128
+ height: 30px
129
+ text-align: center
130
+
131
+ td#file
132
+ @extend th#file
133
+ padding: 15px
@@ -0,0 +1,19 @@
1
+ !=haml :head
2
+ %body
3
+ %h4
4
+ - if @info[:group] != ''
5
+ %a{:href=>url_for("/node/version?node_full=#{@info[:group] + '/' + @info[:node]}")} versions
6
+ - else
7
+ %a{:href=>url_for("/node/version?node_full=#{@info[:node]}")} versions
8
+ \/ version #{@info[:num]} for Node
9
+ %span{:class=>'node_title'} #{@info[:node]}
10
+
11
+ - date_version = Time.parse @info[:date]
12
+ Date of version: #{date_version.strftime("%d-%m-%y at %r")}
13
+ %br
14
+ %br
15
+ %div{:class=>'diffs'}
16
+ - @data.each_line do |line|
17
+ %div #{line}
18
+
19
+
@@ -0,0 +1,54 @@
1
+ %script{:src=>url_for('/scripts/jquery-2.1.1.min.js')}
2
+ %script{:src=>url_for('/scripts/jquery.dataTables.min.js')}
3
+ %script{:src=>url_for('/scripts/dataTables.bootstrap.js')}
4
+ %script{:src=>url_for('/scripts/dataTables.colVis.js')}
5
+ %link{:rel=>'stylesheet', :href=>url_for('/css/dataTables.bootstrap.css')}
6
+ %link{:rel=>'stylesheet', :href=>url_for('/css/dataTables.colVis.css')}
7
+ :javascript
8
+ $(function() {
9
+ $('#versionsTable').dataTable({
10
+ dom: 'C<"clear">lfrtip',
11
+ "order": [[ 0, "desc" ]],
12
+ colVis: {
13
+ exclude: [ 2 ]
14
+ }
15
+ });
16
+ });
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 Actions
36
+
37
+ %tbody
38
+ -trclass = %w(even odd)
39
+ - nb = @data.count + 1
40
+ - @data.each do |x|
41
+ %tr
42
+ %td
43
+ #{nb -= 1}
44
+ %td
45
+ #{time_from_now x[:date]}
46
+ %td
47
+ %a{:title => "configuration", :href => url_for("/node/version/view?node=#{@node}&group=#{@group}&oid=#{x[:oid]}&date=#{x[:date]}&num=#{nb}") }
48
+ %span{:class=>'glyphicon glyphicon-cloud-download'}
49
+ &nbsp;&nbsp;
50
+ %a{:title => "diff", :href => url_for("/node/version/diffs?node=#{@node}&group=#{@group}&oid=#{x[:oid]}&date=#{x[:date]}&num=#{nb}") }
51
+ %img{:src=>url_for('/images/diff_15x17.png')}
52
+
53
+
54
+
@@ -4,6 +4,8 @@ require 'sinatra/url_for'
4
4
  require 'haml'
5
5
  require 'sass'
6
6
  require 'pp'
7
+ require 'pp'
8
+ require 'oxidized/web/mig'
7
9
  module Oxidized
8
10
  module API
9
11
  class WebApp < Sinatra::Base
@@ -84,11 +86,104 @@ module Oxidized
84
86
  @data = nodes.show node
85
87
  out :node
86
88
  end
89
+
90
+ #redirect to the web page for rancid - oxidized migration
91
+ get '/migration' do
92
+ out :migration
93
+ end
94
+
95
+ #get the files send
96
+ post '/migration' do
97
+ number = params[:number].to_i
98
+ cloginrc_file = params['cloginrc'][:tempfile]
99
+ path_new_file = params['path_new_file']
100
+
101
+ router_db_files = Array.new
102
+
103
+ i = 1
104
+ while i <= number do
105
+ router_db_files.push({:file=>(params["file"+i.to_s][:tempfile]), :group=>params["group"+i.to_s]})
106
+ i = i+1
107
+ end
87
108
 
109
+ migration = Mig.new(router_db_files, cloginrc_file, path_new_file)
110
+ migration.go_rancid_migration
111
+ redirect url_for("//nodes")
112
+
113
+ end
114
+
88
115
  get '/css/*.css' do
89
116
  sass "sass/#{params[:splat].first}".to_sym
90
117
  end
91
118
 
119
+ #show the lists of versions for a node
120
+ get '/node/version' do
121
+ @data = nil
122
+ @group = nil
123
+ @node = nil
124
+ node_full = params[:node_full]
125
+ if node_full.include? "/"
126
+ node_full = node_full.split('/')
127
+ @group = node_full[0]
128
+ @node = node_full[1]
129
+ @data = nodes.version @node, @group
130
+ else
131
+ @node = node_full
132
+ @data = nodes.version @node, nil
133
+ end
134
+ out :versions
135
+ end
136
+
137
+ #show the blob of a version
138
+ get '/node/version/view' do
139
+ node, @json = route_parse :node
140
+ @info = {:node => node, :group => params[:group],:oid => params[:oid],:date => params[:date],:num => params[:num]}
141
+ @data = nodes.get_version node, @info[:group], @info[:oid]
142
+ out :version
143
+ end
144
+
145
+ #show diffs between 2 version
146
+ get '/node/version/diffs' do
147
+ node, @json = route_parse :node
148
+ @data = nil
149
+ @info = {:node => node, :group => params[:group],:oid => params[:oid],:date => params[:date],:num => params[:num], :num2 => (params[:num].to_i - 1)}
150
+ group = nil
151
+ if @info[:group] != ''
152
+ group = @info[:group]
153
+ end
154
+ @oids_dates = nodes.version node, group
155
+ if params[:oid2]
156
+ @info[:oid2] = params[:oid2]
157
+ oid2 = nil
158
+ num = @oids_dates.count + 1
159
+ @oids_dates.each do |x|
160
+ num -= 1
161
+ if x[:oid].to_s == params[:oid2]
162
+ oid2 = x[:oid]
163
+ @info[:num2] = num
164
+ break
165
+ end
166
+ end
167
+ @data = nodes.get_diff node, @info[:group], @info[:oid], oid2
168
+ else
169
+ @data = nodes.get_diff node, @info[:group], @info[:oid], nil
170
+ end
171
+ @stat = ["null","null"]
172
+ if @data != 'no diffs' && @data != nil
173
+ @stat = @data[:stat]
174
+ @data = @data[:patch]
175
+ else
176
+ @data = "no available"
177
+ end
178
+ @diff = diff_view @data
179
+ out :diffs
180
+ end
181
+
182
+ #used for diff between 2 distant commit
183
+ post '/node/version/diffs' do
184
+ redirect url_for("/node/version/diffs?node=#{params[:node]}&group=#{params[:group]}&oid=#{params[:oid]}&date=#{params[:date]}&num=#{params[:num]}&oid2=#{params[:oid2]}")
185
+ end
186
+
92
187
  private
93
188
 
94
189
  def out template=:default
@@ -115,6 +210,69 @@ module Oxidized
115
210
  end
116
211
  [e.join('.'), json]
117
212
  end
213
+
214
+ #give the time enlapsed between now and a date
215
+ def time_from_now date
216
+ if date
217
+ #if the + is missing
218
+ unless date.include? "+"
219
+ date.insert(21, "+")
220
+ end
221
+ date = DateTime.parse date
222
+ now = DateTime.now
223
+ t = ((now - date) * 24 * 60 * 60).to_i
224
+ mm, ss = t.divmod(60)
225
+ hh, mm = mm.divmod(60)
226
+ dd, hh = hh.divmod(24)
227
+ if dd > 0
228
+ date = "#{dd} days #{hh} hours ago"
229
+ elsif hh > 0
230
+ date = "#{hh} hours #{mm} min ago"
231
+ else
232
+ date = "#{mm} min #{ss} sec ago"
233
+ end
234
+ end
235
+ date
236
+ end
237
+
238
+ #method the give diffs in separate view (the old and the new) as in github
239
+ def diff_view diff
240
+ old_diff = []
241
+ new_diff = []
242
+
243
+ diff.each_line do |line|
244
+ if /^\+/.match(line)
245
+ new_diff.push(line)
246
+ elsif /^\-/.match(line)
247
+ old_diff.push(line)
248
+ else
249
+ new_diff.push(line)
250
+ old_diff.push(line)
251
+ end
252
+ end
253
+
254
+ length_o = old_diff.count
255
+ length_n = new_diff.count
256
+ for i in 0..[length_o, length_n].max
257
+ if i > [length_o, length_n].min
258
+ break
259
+ end
260
+ if (/^\-.*/.match(old_diff[i])) && !(/^\+.*/.match(new_diff[i]))
261
+ #tag removed latter to add color syntax
262
+ insert = 'empty_line'
263
+ #ugly way to avoid asymmetry if at display the line takes 2 line on the screen
264
+ insert = "&nbsp;\n"
265
+ new_diff.insert(i,insert)
266
+ length_n += 1
267
+ elsif !(/^\-.*/.match(old_diff[i])) && (/^\+.*/.match(new_diff[i]))
268
+ insert = 'empty_line'
269
+ insert = "&nbsp;\n"
270
+ old_diff.insert(i,insert)
271
+ length_o += 1
272
+ end
273
+ end
274
+ both_diff = {:old_diff => old_diff, :new_diff => new_diff}
275
+ end
118
276
  end
119
277
  end
120
278
  end