9 <meta content=
"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
11 <link rel=
"stylesheet"
12 href=
"/static/AdminLTE-2.3.7/bootstrap/css/bootstrap.min.css">
13 <link rel=
"stylesheet"
14 href=
"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
15 <link rel=
"stylesheet"
16 href=
"https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css">
17 <link rel=
"stylesheet"
18 href=
"/static/AdminLTE-2.3.7/dist/css/AdminLTE.min.css">
19 <link rel=
"stylesheet"
20 href=
"/static/AdminLTE-2.3.7/dist/css/skins/skin-blue.min.css">
21 <link rel=
"stylesheet"
22 href=
"/static/AdminLTE-2.3.7/plugins/datatables/jquery.dataTables.css">
24 <script src=
"/static/AdminLTE-2.3.7/plugins/jQuery/jquery-2.2.3.min.js"></script>
25 <script src=
"/static/AdminLTE-2.3.7/plugins/sparkline/jquery.sparkline.min.js"></script>
27 <script src=
"/static/rivets.bundled.min.js"></script>
28 <script src=
"/static/underscore-min.js"></script>
30 <script src=
"/static/AdminLTE-2.3.7/bootstrap/js/bootstrap.min.js"></script>
31 <script src=
"/static/AdminLTE-2.3.7/dist/js/app.min.js"></script>
32 <script src=
"/static/AdminLTE-2.3.7/plugins/datatables/jquery.dataTables.min.js"></script>
34 <script src=
"https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
35 <script src=
"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script>
40 $(document).ready(function(){
41 var toplevel_data = {{ toplevel_data }};
42 var refresh_interval =
5000;
44 var refresh = function() {
45 $.get(
"/toplevel_data", function(data) {
46 _.extend(toplevel_data, data);
47 setTimeout(refresh, refresh_interval);
54 templateDelimiters: [
"{",
"}"]
57 rivets.formatters.health_color = function(status_str) {
58 if (status_str ==
"HEALTH_OK") {
59 return
"color: #00bb00;";
60 } else if (status_str ==
"HEALTH_WARN") {
61 return
"color: #FFC200;";
62 } else if (status_str ==
"HEALTH_ERR") {
63 return
"color: #ff0000;"
67 rivets.formatters.health_ok = function(status_str) {
68 if (status_str ==
"HEALTH_OK") {
75 var truncate = function(n, max_width) {
76 var stringized = n.toString();
77 var parts = stringized.split(
".");
78 if (parts.length ==
1) {
82 var fractional_digits = max_width - parts[
0].length -
1;
83 if (fractional_digits <=
0) {
84 // No width available for the fractional part, drop
85 // it and the decimal point
88 return stringized.substring(
0, max_width);
93 var format_number = function(n, divisor, units) {
97 while (Math.floor(n / (divisor**unit)).toString().length
> width -
1) {
103 truncated_float = truncate((n / Math.pow(divisor, unit)).toString(), width);
105 truncated_float = truncate(n, width);
108 return truncated_float + units[unit];
111 rivets.formatters.dimless = function(n){
112 return format_number(n,
1000, [' ', 'k', 'M', 'G', 'T', 'P'])
114 rivets.formatters.dimless_binary = function(n){
115 return format_number(n,
1024, ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB']);
118 rivets.formatters.block_health_color = function(rbd_mirroring) {
119 if (rbd_mirroring.errors
> 0) {
120 return
"color: #ff0000";
121 } else if (rbd_mirroring.warnings
> 0) {
122 return
"color: #ffc200";
127 rivets.formatters.short_version = function(version) {
128 // Expect
"ceph version 1.2.3-g9asdasd (as98d7a0s8d7)"
129 var result = /ceph version\s+([^ ]+)\s+\(.+\)/.exec(version);
131 // Return the
"1.2.3-g9asdasd" part
134 // Unexpected format, pass it through
140 /* This is useful if you need to display some alternative text
141 * when a collection is empty using rv-hide */
142 rivets.formatters.length = function(val) {
146 rivets.formatters.hide_count_box = function(value) {
148 return (isNaN(value) || value ==
0)
151 rivets.bind($(
"#health"), toplevel_data);
152 rivets.bind($(
"section.sidebar"), toplevel_data);
153 setTimeout(refresh, refresh_interval);
157 <link rel=
"shortcut icon" href=
"http://ceph.com/wp-content/themes/ceph/favicon.ico">
158 <link rel=
"shortcut icon" href=
"/static/favicon.ico">
162 background-color: #
222d32;
167 background-color: #
222d32;
172 border-top-color: #b8c7ce;
180 background-color: #
222d32;
184 background-color: #
222d32;
188 background-color: #
222d32;
193 background-color: #
424d52;
203 font-family: monospace;
204 background-color: #
333;
208 .nav-tabs
>li.active
>a {
209 background-color: #
424d52;
226 table.ceph-chartbox {
236 .dataTables_wrapper .dataTables_filter {
240 .dataTables_wrapper .dataTables_filter input {
244 .dataTables_wrapper tbody td {
245 background-color: #
424d52;
249 .dataTables_wrapper .dataTables_paginate .ellipsis {
250 color: #ddd !important
253 .dataTables_wrapper .dataTables_paginate .paginate_button {
254 color: #ddd !important
257 .dataTables_wrapper .dataTables_paginate .paginate_button.disabled {
258 color: #
424d52 !important
262 background-color: #
222d32;
265 .nav-tabs-custom
>.nav-tabs
>li{
268 .nav-tabs-custom
>.nav-tabs
>li
>a{
269 border-bottom-color: transparent;
272 .nav-tabs-custom
>.nav-tabs
>li.active
>a{
273 background-color: #
424d52;
276 .nav-tabs-custom
>.nav-tabs
>li.active:hover
>a{
277 background-color: #
66777f;
280 .nav-tabs-custom
>.tab-content {
281 background-color: #
424d52;
289 <body class=
"hold-transition sidebar-mini sidebar-collapse">
290 <div class=
"wrapper">
293 <header class=
"main-header">
295 <a href=
"/" class=
"logo">
296 <span class=
"logo-lg">
297 <img src=
"/static/Ceph_Logo_Standard_RGB_White_120411_fa.png"
298 width=
"123px" height=
"34px"/>
300 <span class=
"logo-mini">
301 <img src=
"/static/logo-mini.png"
302 width=
"34px" height=
"34px"/>
306 <!-- Header Navbar -->
307 <nav class=
"navbar navbar-static-top" role=
"navigation">
308 <!-- Sidebar toggle button-->
309 <a href=
"#" class=
"sidebar-toggle" data-toggle=
"offcanvas"
311 <span class=
"sr-only">Toggle navigation
</span>
314 <div id=
"health" style=
"font-size: 18px; padding: 12px 12px;">
315 <span rv-hide=
"health_status | health_ok" >
316 <span rv-style=
"health_status | health_color">
322 <!-- Navbar Right Menu -->
323 <div class=
"navbar-custom-menu">
324 <ul class=
"nav navbar-nav">
330 <!-- Left side column. contains the logo and sidebar -->
331 <aside class=
"main-sidebar skin-blue">
333 <!-- sidebar: style can be found in sidebar.less -->
334 <section class=
"sidebar">
335 <!-- Sidebar Menu -->
336 <ul class=
"sidebar-menu">
337 <!-- Optionally, you can add icons to the links -->
338 <li class=
"{%if path_info=='/' or path_info.startswith('/health')%}active{%endif%}">
340 <i class=
"fa fa-heartbeat" rv-style=
"health_status | health_color"></i>
341 <span>Cluster health
</span></a>
343 <li class=
"treeview{%if path_info.startswith(('/server', '/osd'))%} active{%endif%}">
344 <a href=
"#"><i class=
"fa fa-server"></i> <span>Cluster
</span>
345 <span class=
"pull-right-container">
346 <i class=
"fa fa-angle-left pull-right"></i>
349 <ul class=
"treeview-menu menu-open">
351 <a href=
"/servers">Servers
</a>
354 <a href=
"/osd">OSDs
</a>
358 <li class=
"treeview{%if path_info.startswith('/rbd')%} active{%endif%}">
360 <i class=
"fa fa-hdd-o" rv-style=
"rbd_mirroring | block_health_color"></i> <span>Block
</span>
361 <span class=
"pull-right-container">
362 <i class=
"fa fa-angle-left pull-right"></i>
365 <ul class=
"treeview-menu menu-open">
367 <a href=
"/rbd_mirroring">
368 <i class=
"fa fa-exchange"></i> Mirroring
369 <span class=
"pull-right-container">
370 <small rv-hide=
"rbd_mirroring.warnings | hide_count_box" class=
"label pull-right bg-yellow">{rbd_mirroring.warnings}
</small>
371 <small rv-hide=
"rbd_mirroring.errors | hide_count_box" class=
"label pull-right bg-red">{rbd_mirroring.errors}
</small>
376 <a href=
"/rbd_iscsi">
377 <i class=
"fa fa-upload"></i> iSCSI
378 <span class=
"pull-right-container" />
381 <li class=
"treeview{%if path_info.startswith('/rbd_pool')%} active menu-open{%endif%}">
383 <i class=
"fa fa-dot-circle-o"></i> <span>Pools
</span>
384 <span class=
"pull-right-container">
385 <i class=
"fa fa-angle-left pull-right"></i>
388 <ul class=
"treeview-menu">
389 <li rv-each-pool=
"rbd_pools">
390 <a rv-href=
"pool.url"><i class=
"fa fa-circle-o"></i> {pool.name}
</a>
394 <li class=
"ceph-none-found" rv-hide=
"rbd_pools | length">None found
</li>
397 <li class=
"treeview{%if path_info.startswith(('/filesystem/', '/clients/'))%} active{%endif%}">
398 <a href=
"#"><i class=
"fa fa-folder"></i> <span>Filesystems
</span>
399 <span class=
"pull-right-container">
400 <i class=
"fa fa-angle-left pull-right"></i>
403 <ul class=
"treeview-menu menu-open">
404 <li rv-each-filesystem=
"filesystems">
405 <a rv-href=
"filesystem.url">{filesystem.name}
</a>
407 <li class=
"ceph-none-found" rv-hide=
"filesystems | length">None found
</li>
411 <!-- /.sidebar-menu -->
416 <div id=
"content" class=
"content-wrapper">
418 {% block content %}{% endblock %}
421 <!-- /.content-wrapper -->
424 <footer class=
"main-footer">
425 <!-- To the right -->
426 <div class=
"pull-right hidden-xs">
429 <!-- Default to the left -->
430 <strong>Copyright
© 2016 by Ceph Contributors.
</strong> Free software (LGPL
2.1)
433 <!-- Control Sidebar -->
434 <aside class=
"control-sidebar control-sidebar-dark">
435 <!-- Create the tabs -->
436 <ul class=
"nav nav-tabs nav-justified control-sidebar-tabs">
437 <li class=
"active"><a href=
"#control-sidebar-home-tab" data-toggle=
"tab"><i class=
"fa fa-home"></i></a></li>
438 <li><a href=
"#control-sidebar-settings-tab" data-toggle=
"tab"><i class=
"fa fa-gears"></i></a></li>
441 <div class=
"tab-content">
442 <!-- Home tab content -->
443 <div class=
"tab-pane active" id=
"control-sidebar-home-tab">
444 <h3 class=
"control-sidebar-heading">Recent Activity
</h3>
445 <ul class=
"control-sidebar-menu">
447 <a href=
"javascript::;">
448 <i class=
"menu-icon fa fa-birthday-cake bg-red"></i>
450 <div class=
"menu-info">
451 <h4 class=
"control-sidebar-subheading">Langdon's Birthday
</h4>
453 <p>Will be
23 on April
24th
</p>
458 <!-- /.control-sidebar-menu -->
460 <h3 class=
"control-sidebar-heading">Tasks Progress
</h3>
461 <ul class=
"control-sidebar-menu">
463 <a href=
"javascript::;">
464 <h4 class=
"control-sidebar-subheading">
465 Custom Template Design
466 <span class=
"pull-right-container">
467 <span class=
"label label-danger pull-right">70%
</span>
471 <div class=
"progress progress-xxs">
472 <div class=
"progress-bar progress-bar-danger" style=
"width: 70%"></div>
477 <!-- /.control-sidebar-menu -->
481 <!-- Stats tab content -->
482 <div class=
"tab-pane" id=
"control-sidebar-stats-tab">Stats Tab Content
</div>
484 <!-- Settings tab content -->
485 <div class=
"tab-pane" id=
"control-sidebar-settings-tab">
487 <h3 class=
"control-sidebar-heading">General Settings
</h3>
489 <div class=
"form-group">
490 <label class=
"control-sidebar-subheading">
492 <input type=
"checkbox" class=
"pull-right" checked
>
496 Some information about this general settings option
499 <!-- /.form-group -->
505 <!-- /.control-sidebar -->
506 <!-- Add the sidebar's background. This div must be placed
507 immediately after the control sidebar -->
508 <div class=
"control-sidebar-bg"></div>
518 <!-- Bootstrap 3.3.6 -->
520 <!-- AdminLTE App -->