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,5 +1,13 @@
|
|
1
1
|
%head
|
2
|
+
%meta{charset: 'utf-8'}
|
3
|
+
%meta{'meta-equiv': 'X-UA-Compatible', content: 'IE=edge'}
|
4
|
+
%meta{name: 'viewport', content: 'width=device-width, initial-scale=1'}
|
2
5
|
%title oxidized
|
3
|
-
%link{:
|
4
|
-
%link{:
|
5
|
-
%link{:
|
6
|
+
%link{rel: 'stylesheet', href: url_for('/css/bootstrap.min.css')}
|
7
|
+
%link{rel: 'stylesheet', href: url_for('/css/oxidized.css')}
|
8
|
+
%link{rel: 'shortcut icon', href: url_for('/images/favicon.ico')}
|
9
|
+
%link{rel: 'stylesheet', href: url_for('/css/dataTables.colVis.css')}
|
10
|
+
%link{rel: 'stylesheet', href: url_for('/css/dataTables.bootstrap.css')}
|
11
|
+
%link{rel: 'stylesheet', href: url_for('/css/buttons.bootstrap.min.css')}
|
12
|
+
%script{src: url_for('/scripts/jquery-2.1.1.min.js')}
|
13
|
+
|
@@ -1,11 +1,44 @@
|
|
1
|
-
|
1
|
+
!!! 5
|
2
|
+
%html{lang: 'en'}
|
2
3
|
!=haml :head
|
3
4
|
%body
|
4
|
-
%
|
5
|
-
|
6
|
-
|
7
|
-
%
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
%nav.navbar.navbar-default.navbar-static-top{role: 'navigation'}
|
6
|
+
.container-fluid
|
7
|
+
.navbar-header
|
8
|
+
%button.navbar-toggle.collapsed{type: 'button',
|
9
|
+
'data-toggle': 'collapse',
|
10
|
+
'data-target': '#ox-nav',
|
11
|
+
'aria-expanded': 'false'}
|
12
|
+
%span.sr-only Toggle Navigation
|
13
|
+
%span.icon-bar
|
14
|
+
%span.icon-bar
|
15
|
+
%span.icon-bar
|
16
|
+
%a.navbar-brand{href: url_for('/')}
|
17
|
+
%img{src: url_for('/images/oxidizing_40px.png')} Oxidized
|
18
|
+
|
19
|
+
.collapse.navbar-collapse#ox-nav
|
20
|
+
%ul.nav.navbar-nav
|
21
|
+
%li{class: request.path_info == '/nodes/stats' ? 'active' : ''}
|
22
|
+
%a.navbar-link{href: url_for('/nodes/stats')} Stats
|
23
|
+
|
24
|
+
%li{class: request.path_info == '/migration' ? 'active' : ''}
|
25
|
+
%a.navbar-link{href: url_for('/migration')} Migration
|
26
|
+
|
27
|
+
%form.navbar-form.navbar-right{role: 'search',
|
28
|
+
action: '/nodes/conf_search',
|
29
|
+
method: 'post'}
|
30
|
+
.form-group#to_search_in_config{name: 'to_search_in_config'}
|
31
|
+
%input.form-control.input-sm{type: 'text',
|
32
|
+
name: 'search_in_conf_textbox',
|
33
|
+
placeholder: 'Search in Configs'}
|
34
|
+
%button.btn.btn-primary.btn-sm{type: 'submit'}
|
35
|
+
%span.glyphicon.glyphicon-search
|
36
|
+
|
37
|
+
.container-fluid
|
11
38
|
=yield
|
39
|
+
%script{src: url_for('/scripts/bootstrap.min.js')}
|
40
|
+
%script{src: url_for('/scripts/jquery.dataTables.min.js')}
|
41
|
+
%script{src: url_for('/scripts/dataTables.bootstrap.js')}
|
42
|
+
%script{src: url_for('/scripts/dataTables.colVis.js')}
|
43
|
+
%script{src: url_for('/scripts/oxidized.js')}
|
44
|
+
|
@@ -1,41 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
%
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
%
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
%
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
%
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
1
|
+
%h2
|
2
|
+
RANCID to Oxidized
|
3
|
+
%small router.db and Group Migration
|
4
|
+
%form.form-horizontal{method: 'post', enctype: 'multipart/form-data',
|
5
|
+
role: 'form'}
|
6
|
+
.form-group
|
7
|
+
%label.col-sm-3{for: 'path_new_file'}
|
8
|
+
Oxidized router.db Path
|
9
|
+
.col-sm-3
|
10
|
+
%input.form-control{type: 'text', name: 'path_new_file',
|
11
|
+
placeholder: 'Path/to_file/here.db'}
|
12
|
+
.form-group
|
13
|
+
%label.col-sm-3{for: 'clogrinc'} .cloginrc File
|
14
|
+
.col-sm-3
|
15
|
+
.input-group
|
16
|
+
%input.form-control{type: 'text'}
|
17
|
+
%span.input-group-btn
|
18
|
+
%span.btn.btn-default.btn-file
|
19
|
+
%input{type: 'file', name: 'cloginrc'}
|
20
|
+
Browse
|
21
|
+
|
22
|
+
.form-group
|
23
|
+
.col-sm-12
|
24
|
+
.row
|
25
|
+
%label.col-sm-3.label-control RANCID router.db File
|
26
|
+
%label.col-sm-3.label-control Device Group
|
27
|
+
.col-sm-12#rancid_routerdbs
|
28
|
+
.row#rancidDb1
|
29
|
+
.col-sm-3
|
30
|
+
.input-group
|
31
|
+
%input.form-control{type: 'text'}
|
32
|
+
%span.input-group-btn
|
33
|
+
%span.btn.btn-default.btn-file
|
34
|
+
%input#file1{type: 'file', name: 'file1', required: ''}
|
35
|
+
Browse
|
36
|
+
.col-sm-3
|
37
|
+
%input.form-control#group1{type: 'text', name: 'group1',
|
38
|
+
value: 'default'}
|
39
|
+
.row
|
40
|
+
.col-sm-3
|
41
|
+
%button.btn.btn-default#add{type: 'button'} Add More
|
42
|
+
|
43
|
+
.form-group
|
44
|
+
.col-sm-12
|
45
|
+
%button.btn.btn-primary#upload_button{type: 'submit'} Migrate!
|
46
|
+
|
@@ -1,16 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
%
|
14
|
-
|
15
|
-
|
16
|
-
|
1
|
+
.row
|
2
|
+
.col-sm-12
|
3
|
+
%h4
|
4
|
+
%a{href: url_for('/nodes')} nodes
|
5
|
+
%span /
|
6
|
+
=@data[:name]
|
7
|
+
|
8
|
+
%a{title: 'configuration', href: url_for("/node/fetch/#{@data[:full_name]}")}
|
9
|
+
%span.glyphicon.glyphicon-cloud-download{style: 'color: #000; font-size: 14px;'}
|
10
|
+
%a{title: 'versions',
|
11
|
+
href: url_for("/node/version?node_full=#{@data[:full_name]}")}
|
12
|
+
%img{src: url_for('/images/versioning_18px.png')}
|
13
|
+
%a{title: 'update', href: url_for("/node/next/#{@data[:full_name]}")}
|
14
|
+
%span.glyphicon.glyphicon-repeat{style: 'color: #000; font-size: 14px;'}
|
15
|
+
- out = '';PP.pp(@data,out)
|
16
|
+
%pre
|
17
|
+
= preserve "#{out}"
|
18
|
+
|
@@ -1,70 +1,67 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
%
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
.row.tbl-header
|
2
|
+
.col-xs-12.col-md-2
|
3
|
+
%h4 nodes /
|
4
|
+
|
5
|
+
.row
|
6
|
+
.pull-right
|
7
|
+
%form
|
8
|
+
%button.ColVis_Button{type: 'button', onclick: 'history.go();'}
|
9
|
+
%span.glyphicon.glyphicon-repeat Refresh
|
10
|
+
|
11
|
+
.table-responsive
|
12
|
+
%table.table.table-striped.table-hover.table-condensed#nodesTable
|
13
|
+
%thead
|
14
|
+
%tr
|
15
|
+
%th Name
|
16
|
+
%th IP
|
17
|
+
%th Model
|
18
|
+
%th Group
|
19
|
+
%th Last Status
|
20
|
+
%th Last Update
|
21
|
+
%th Actions
|
22
|
+
|
23
|
+
%tbody
|
24
|
+
- trclass = %w(even odd)
|
25
|
+
- @data.sort_by{|e|e[:name]}.each do |node|
|
26
|
+
- klass = trclass.rotate!.first
|
27
|
+
%tr{class: "#{klass} ox-status-#{node[:status]}"}
|
28
|
+
%td
|
29
|
+
%a{href: url_for("/node/show/#{node[:name]}")} #{node[:name]}
|
30
|
+
%td= node[:ip]
|
31
|
+
%td= node[:model]
|
32
|
+
%td= node[:group]
|
33
|
+
%td
|
34
|
+
%div{title: node[:status], class: node[:status]}
|
35
|
+
%span{style: 'visibility: hidden'}#{node[:status]}
|
36
|
+
%td.time= node[:time]
|
37
|
+
%td
|
38
|
+
%a{title: 'configuration',
|
39
|
+
href: url_for("/node/fetch/#{node[:full_name]}")}
|
40
|
+
%span.glyphicon.glyphicon-cloud-download
|
41
|
+
|
42
|
+
%a{title: 'versions',
|
43
|
+
href: url_for("/node/version?node_full=#{node[:full_name]}")}
|
44
|
+
%img{src: url_for('/images/versioning_18px.png')}
|
45
|
+
|
46
|
+
%a{title: 'update', href: url_for("/node/next/#{node[:full_name]}")}
|
47
|
+
%span.glyphicon.glyphicon-repeat
|
48
|
+
|
7
49
|
:javascript
|
8
50
|
$(function() {
|
9
51
|
$('#nodesTable').dataTable({
|
10
52
|
dom: 'C<"clear">lfrtip',
|
11
53
|
"lengthMenu": [[50, 250, 500, -1], [50, 250, 500, "All"]],
|
12
|
-
columnDefs: [
|
13
|
-
|
14
|
-
|
15
|
-
|
54
|
+
columnDefs: [{
|
55
|
+
visible: false,
|
56
|
+
targets: 1
|
57
|
+
}, {
|
58
|
+
type: "string",
|
59
|
+
targets: 3
|
60
|
+
}],
|
16
61
|
colVis: {
|
17
|
-
|
18
|
-
|
62
|
+
exclude: [0, 5]
|
63
|
+
}
|
19
64
|
});
|
20
65
|
});
|
21
|
-
%div{:class=>'row tbl-header'}
|
22
|
-
%div{:class=>'col-xs-12 col-md-2'}
|
23
|
-
%h4 nodes /
|
24
|
-
%button{:onclick => "location.href='/migration'" }
|
25
|
-
%span migration
|
26
|
-
%form{ :action => "/nodes/conf_search", :method => "post"}
|
27
|
-
%div{:name => "to_search_in_config", :id => "to_search_in_config"}
|
28
|
-
%input{:type => "submit", :value => "Search in confs"}
|
29
|
-
%input{:type => "text", :name => "search_in_conf_textbox"}
|
30
|
-
|
31
|
-
|
32
|
-
%div{:class=>'row'}
|
33
|
-
%div{:class=>'refresh-div'}
|
34
|
-
%form
|
35
|
-
%button{:class => "ColVis_Button", :type => "button", :onclick => "history.go();"}
|
36
|
-
%span{:class=>"glyphicon glyphicon-repeat"}
|
37
|
-
Refresh
|
38
|
-
%table{:id=>'nodesTable', :class=>'table table-responsive tablesorter'}
|
39
|
-
%thead
|
40
|
-
%tr
|
41
|
-
%th Name
|
42
|
-
%th IP
|
43
|
-
%th Model
|
44
|
-
%th Group
|
45
|
-
%th Last Status
|
46
|
-
%th Last Update
|
47
|
-
%th Actions
|
48
66
|
|
49
|
-
|
50
|
-
-trclass = %w(even odd)
|
51
|
-
-@data.sort_by{|e|e[:name]}.each do |node|
|
52
|
-
-klass = trclass.rotate!.first
|
53
|
-
%tr{:class=>"#{klass} ox-status-#{node[:status]}"}
|
54
|
-
%td
|
55
|
-
%a{:href => url_for("/node/show/#{node[:name]}") } #{node[:name]}
|
56
|
-
%td= node[:ip]
|
57
|
-
%td= node[:model]
|
58
|
-
%td= node[:group]
|
59
|
-
%td
|
60
|
-
%div{:title=>node[:status], :class=>node[:status]}
|
61
|
-
%td= node[:time]
|
62
|
-
%td
|
63
|
-
%a{:title => "configuration", :href => url_for("/node/fetch/#{node[:full_name]}") }
|
64
|
-
%span{:class=>'glyphicon glyphicon-cloud-download'}
|
65
|
-
|
66
|
-
%a{:title => "versions", :href => url_for("/node/version?node_full=#{node[:full_name]}") }
|
67
|
-
%img{:src=>url_for('/images/versioning_18px.png')}
|
68
|
-
|
69
|
-
%a{:title => "update", :href => url_for("/node/next/#{node[:full_name]}") }
|
70
|
-
%span{:class=>'glyphicon glyphicon-repeat'}
|
67
|
+
|
@@ -1,4 +1,4 @@
|
|
1
|
-
body
|
1
|
+
body
|
2
2
|
font-size: 14px
|
3
3
|
|
4
4
|
.ox-nav
|
@@ -17,33 +17,9 @@ body table
|
|
17
17
|
.table a, .table a:visited
|
18
18
|
color: #000
|
19
19
|
|
20
|
-
.tbl-header
|
21
|
-
margin: 20px -20px
|
22
|
-
|
23
|
-
|
24
|
-
.tablesorter-headerAsc .tablesorter-header-inner
|
25
|
-
display: inline-block
|
26
|
-
border-bottom: 1px dotted #333
|
27
|
-
|
28
|
-
.tablesorter-headerDesc .tablesorter-header-inner
|
29
|
-
display: inline-block
|
30
|
-
border-bottom: 1px solid #333
|
31
|
-
|
32
20
|
tr.ox-status-no_connection
|
33
21
|
background-color: #fcf8e3
|
34
22
|
|
35
|
-
input#search
|
36
|
-
border-color: 0 !important
|
37
|
-
border: none !important
|
38
|
-
box-shadow: 0 !important
|
39
|
-
border-bottom: 1px dotted #000 !important
|
40
|
-
-webkit-box-shadow: none !important
|
41
|
-
border-radius: 0 !important
|
42
|
-
width: 150px
|
43
|
-
|
44
|
-
input#search .focused
|
45
|
-
border-bottom: 1px dotted #FFA600 !important
|
46
|
-
|
47
23
|
.added
|
48
24
|
background-color: #DBFFDB
|
49
25
|
|
@@ -52,28 +28,28 @@ input#search .focused
|
|
52
28
|
|
53
29
|
.diff-index
|
54
30
|
background-color: #FFFF99
|
55
|
-
|
31
|
+
|
56
32
|
.diff-empty
|
57
|
-
background-color: #F0F0F0
|
58
|
-
|
33
|
+
background-color: #F0F0F0
|
34
|
+
|
59
35
|
.diffs
|
60
36
|
background-color: FAFAFA
|
61
37
|
border: 2px solid #ccc
|
62
38
|
border-radius: 5px
|
63
39
|
padding: 3px
|
64
|
-
|
40
|
+
font-family: Consolas, "Lucida Console", monospace
|
41
|
+
white-space: pre
|
42
|
+
|
65
43
|
.diffs_old
|
66
44
|
@extend .diffs
|
67
45
|
float: left
|
68
46
|
width: 49%
|
69
|
-
white-space: nowrap
|
70
47
|
overflow: auto
|
71
48
|
|
72
49
|
.diffs_new
|
73
50
|
@extend .diffs
|
74
51
|
margin-left: 51%
|
75
52
|
width: 49%
|
76
|
-
white-space: nowrap
|
77
53
|
overflow: auto
|
78
54
|
|
79
55
|
.node_title
|
@@ -88,11 +64,6 @@ input#search .focused
|
|
88
64
|
margin-left: 51%
|
89
65
|
font-weight: bold
|
90
66
|
|
91
|
-
.refresh-div
|
92
|
-
float: right
|
93
|
-
padding-left: 5px
|
94
|
-
|
95
|
-
|
96
67
|
.status
|
97
68
|
float: right
|
98
69
|
width: 15px
|
@@ -101,10 +72,11 @@ input#search .focused
|
|
101
72
|
margin-right: 70%
|
102
73
|
margin-bottom: 0px
|
103
74
|
border-radius: 2px
|
75
|
+
|
104
76
|
.success
|
105
77
|
@extend .status
|
106
78
|
background-color: #64FE2E
|
107
|
-
|
79
|
+
|
108
80
|
.no_connection
|
109
81
|
@extend .status
|
110
82
|
background-color: #FF0000
|
@@ -113,24 +85,28 @@ input#search .focused
|
|
113
85
|
background-color: #58ACFA
|
114
86
|
|
115
87
|
a:hover
|
116
|
-
text-decoration: none
|
88
|
+
text-decoration: none
|
89
|
+
|
90
|
+
.btn-file
|
91
|
+
position: relative
|
92
|
+
overflow: hidden
|
93
|
+
|
94
|
+
.btn-file > input[type=file]
|
95
|
+
position: absolute
|
96
|
+
top: 0
|
97
|
+
right: 0
|
98
|
+
min-width: 100%
|
99
|
+
min-height: 100%
|
100
|
+
font-size: 100px
|
101
|
+
text-align: right
|
102
|
+
filter: alpha(opacity=0)
|
103
|
+
opacity: 0
|
104
|
+
outline: none
|
105
|
+
background: white
|
106
|
+
cursor: inherit
|
107
|
+
display: block
|
108
|
+
|
109
|
+
@-moz-document url-prefix()
|
110
|
+
fieldset
|
111
|
+
display: table-cell
|
117
112
|
|
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
|
134
|
-
|
135
|
-
div#to_search_in_config
|
136
|
-
padding-top: 5px
|