[PATCH] [Ginger 0/4] Ginger Sidebar

1 view
Skip to first unread message

Aline Manera

unread,
Mar 2, 2017, 8:55:02 AM3/2/17
to Ginger Devel
This patch set changes the way the Ginger tabs are displayed.
Instead of launching multiple second level tabs, it launches only one (Settings)
which has a sidebar menu to navigate to the others tab content.

This patch set does not change any UI element. It only changes the way the Ginger
tab is displayed.

It is based on Samuel's patch sent last year.

Aline Manera (4):
Fix expand/collpase widget configuration in Network tab
Ginger sidebar
Move Audit features to a sidebar entry
Move System Modules to a sidebar entry

ui/config/tab-ext.xml | 25 +-
ui/css/ginger.css | 185 ++--
ui/css/src/ginger.scss | 3 +-
ui/css/src/modules/_administration.scss | 5 +
ui/css/src/modules/_sidebar.scss | 104 +++
ui/css/src/modules/_sysmodules.scss | 14 +-
ui/css/src/modules/_systemservices.scss | 20 +-
ui/js/host-admin.js | 1299 --------------------------
ui/js/host-audit.js | 1280 +++++++++++++++++++++++++
ui/js/host-sidebar.js | 204 ++++
ui/js/host-sysmodules.js | 25 +-
ui/js/host-system-services.js | 40 +-
ui/pages/i18n.json.tmpl | 3 +
ui/pages/tabs/host-admin.html.tmpl | 472 ----------
ui/pages/tabs/host-audit.html.tmpl | 518 ++++++++++
ui/pages/tabs/host-network.html.tmpl | 8 +-
ui/pages/tabs/host-sidebar.html.tmpl | 53 ++
ui/pages/tabs/host-sysmodules.html.tmpl | 101 ++
ui/pages/tabs/host-system-services.html.tmpl | 135 +--
19 files changed, 2467 insertions(+), 2027 deletions(-)
create mode 100644 ui/css/src/modules/_sidebar.scss
create mode 100644 ui/js/host-audit.js
create mode 100644 ui/js/host-sidebar.js
create mode 100644 ui/pages/tabs/host-audit.html.tmpl
create mode 100644 ui/pages/tabs/host-sidebar.html.tmpl
create mode 100644 ui/pages/tabs/host-sysmodules.html.tmpl

--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:55:02 AM3/2/17
to Ginger Devel
The System Services tab is not only for system services. It also handles
the System Modules features.

As those feature are not related, there is no reason to keep them
together.

This patch adds a new sidebar entry for System Modules and split the
code into 2 HTML files.

This patch does not change any UI element. It is just moving code around
to get the features separated into 2 different sidebar entries.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/css/ginger.css | 78 ++++------------
ui/css/src/modules/_sysmodules.scss | 14 ++-
ui/css/src/modules/_systemservices.scss | 20 ++--
ui/js/host-sysmodules.js | 25 ++++-
ui/js/host-system-services.js | 40 +-------
ui/pages/tabs/host-sysmodules.html.tmpl | 101 ++++++++++++++++++++
ui/pages/tabs/host-system-services.html.tmpl | 135 +++++----------------------
7 files changed, 186 insertions(+), 227 deletions(-)
create mode 100644 ui/pages/tabs/host-sysmodules.html.tmpl

diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index a11ba87..c1ecabe 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -2157,62 +2157,16 @@ hr {
background: transparent;
}

-#host-sysmodules-root-container .accordion {
- margin: 12px 20px 12px 60px;
- padding-bottom: 18px;
- border-bottom: 1px solid #eee;
- overflow: visible;
- clear: both;
-}
-
-#host-sysmodules-root-container .accordion:first-child {
- margin-top: 24px;
+#sysmodules-body .column-depends {
+ padding-left: 5px;
}

-#host-sysmodules-root-container .accordion > h3 {
- margin: 0;
- padding: 0;
- font-size: 26px;
- font-weight: 300;
- height: 44px;
- display: block;
-}
-
-#host-sysmodules-root-container .accordion > h3 a {
- color: #3a393b;
- text-decoration: none;
- display: block;
- padding: 6px 30px;
- margin-left: -30px;
- margin-right: -30px;
-}
-
-#host-sysmodules-root-container .accordion > h3 a span.accordion-icon {
- margin-left: -52px;
- vertical-align: middle;
- display: inline-block;
- font: normal normal normal 32px/1 FontAwesome;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
- color: #3a393b;
-}
-
-#host-sysmodules-root-container .accordion > h3 a[aria-expanded="false"] span.accordion-icon:before {
- content: "\f01a";
-}
-
-#host-sysmodules-root-container .accordion > h3 a[aria-expanded="true"] span.accordion-icon:before {
- content: "\f01b";
-}
-
-#host-sysmodules-root-container .accordion > h3 a span.accordion-text {
- margin-left: 23px;
- display: inline-block;
- vertical-align: middle;
+#sysmodules-body .column-version {
+ padding-left: 10px;
}

#sysmodules-content-area {
- padding: 0;
+ padding-bottom: 20px;
list-style-type: none;
}

@@ -2788,6 +2742,10 @@ form[name="ovsaddinterface"] {
height: 40px;
}

+#system-services-content-area {
+ padding-bottom: 20px;
+}
+
#system-services-content-area .well {
overflow-y: scroll;
border: 0;
@@ -2822,9 +2780,9 @@ form[name="ovsaddinterface"] {

@media (min-width: 780px) {
#system-services-content-area span.column-service-name {
- width: 20.2%;
- min-width: 20.2%;
- flex-basis: 20.2%;
+ width: 16.2%;
+ min-width: 16.2%;
+ flex-basis: 16.2%;
}
}

@@ -2879,18 +2837,18 @@ form[name="ovsaddinterface"] {
@media (min-width: 1302px) {
#system-services-content-area span.column-service-description {
display: inline-block;
- width: 28.4%;
- min-width: 28.4%;
- flex-basis: 28.4%;
+ width: 24.4%;
+ min-width: 24.4%;
+ flex-basis: 24.4%;
}
}

@media (min-width: 1540px) {
#system-services-content-area span.column-service-description {
display: inline-block;
- width: 33.4%;
- min-width: 33.4%;
- flex-basis: 33.4%;
+ width: 28.4%;
+ min-width: 28.4%;
+ flex-basis: 28.4%;
}
}

diff --git a/ui/css/src/modules/_sysmodules.scss b/ui/css/src/modules/_sysmodules.scss
index a96c903..f19a697 100644
--- a/ui/css/src/modules/_sysmodules.scss
+++ b/ui/css/src/modules/_sysmodules.scss
@@ -1,7 +1,7 @@
//
// Project Ginger
//
-// Copyright IBM Corp, 2016
+// Copyright IBM Corp, 2016-2017
//
// Code derived from Project Kimchi
//
@@ -27,14 +27,18 @@
margin: 0;
background: transparent;
}
+}

- .accordion {
- @include wok-accordion();
- }
+#sysmodules-body .column-depends {
+ padding-left: 5px;
+}
+
+#sysmodules-body .column-version {
+ padding-left: 10px;
}

#sysmodules-content-area {
- padding: 0;
+ padding-bottom: 20px;
list-style-type: none;
.li:nth-child(even) {
background-color: #fcfcfc;
diff --git a/ui/css/src/modules/_systemservices.scss b/ui/css/src/modules/_systemservices.scss
index 354f691..0f17495 100644
--- a/ui/css/src/modules/_systemservices.scss
+++ b/ui/css/src/modules/_systemservices.scss
@@ -20,6 +20,8 @@

#system-services-content-area {

+ padding-bottom: 20px;
+
.well {
overflow-y: scroll;
border: 0;
@@ -51,9 +53,9 @@
text-overflow: ellipsis;
display: inline-block;
@media (min-width: $screen-sm + 12) {
- width: 20.2%;
- min-width: 20.2%;
- flex-basis: 20.2%;
+ width: 16.2%;
+ min-width: 16.2%;
+ flex-basis: 16.2%;
}
}

@@ -103,16 +105,16 @@

@media (min-width: $screen-lg + 102) {
display: inline-block;
- width: 28.4%;
- min-width: 28.4%;
- flex-basis: 28.4%;
+ width: 24.4%;
+ min-width: 24.4%;
+ flex-basis: 24.4%;
}

@media (min-width: $screen-xlg) {
display: inline-block;
- width: 33.4%;
- min-width: 33.4%;
- flex-basis: 33.4%;
+ width: 28.4%;
+ min-width: 28.4%;
+ flex-basis: 28.4%;
}

@media (min-width: $screen-xlg + 140) {
diff --git a/ui/js/host-sysmodules.js b/ui/js/host-sysmodules.js
index ecc35b2..9017cfd 100644
--- a/ui/js/host-sysmodules.js
+++ b/ui/js/host-sysmodules.js
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp, 2016
+ * Copyright IBM Corp, 2016-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,6 +17,24 @@
*/

ginger.loadSysmodules = function() {
+ $('#rightCol > .wok-mask').show();
+
+ // Set height and panel scrollbars
+ var panelHeight = function() {
+ var viewportHeight = $(window).height();
+ $('.well', '#sysmodules-content-area').css({'height': viewportHeight - 300 +'px', 'overflow-y': 'scroll'});
+ };
+ panelHeight();
+
+ $(window).on('resize', function(){
+ panelHeight();
+ });
+
+ // System modules modal window
+ $('#load_sysmodules_button').on('click', function(event) {
+ wok.window.open('plugins/ginger/host-sysmodules-load.html');
+ });
+
ginger.getSysmodules(function(data) {
$("#sysmodules-body").empty();
for (var i = 0; i < data.length; i++) {
@@ -28,7 +46,7 @@ ginger.loadSysmodules = function() {

$("#sysmodules-body").append(tempNode);
$('#sysmodules-datagrid').removeClass('hidden');
- $('#sysmodules-content-area .wok-mask').fadeOut(300, function() {});
+ $('#rightCol > .wok-mask').fadeOut(300, function() {});

$(".btn-unload").on("click", function(event) {
event.preventDefault();
@@ -46,7 +64,7 @@ ginger.loadSysmodules = function() {
wok.confirm(settings, function() {
ginger.removeSysmodule(selectedModule, function() {
wok.message.success(i18n['GINSYS0013M'].replace("%1", '<strong>'+selectedModule+'</strong>'),'#sysmodules-alert-container',true);
- $('#sysmodules-content-area .wok-mask').fadeIn();
+ $('#rightCol > .wok-mask').fadeIn();
ginger.loadSysmodules();
$('body').animate({ scrollTop: 0 }, 1000);
}, function(err) {
@@ -443,5 +461,4 @@ ginger.toggleLoadButton = function(args) {
$("#loadButton").prop('disabled', false);
}
}
-
};
diff --git a/ui/js/host-system-services.js b/ui/js/host-system-services.js
index ef26964..f997307 100644
--- a/ui/js/host-system-services.js
+++ b/ui/js/host-system-services.js
@@ -17,41 +17,21 @@
*/

ginger.initSystemServices = function() {
+ $('#rightCol > .wok-mask').show();

// Set height and panel scrollbars
var panelHeight = function() {
var viewportHeight = $(window).height();
- $('.well', '#sysmodules-accordion, #system-services-accordion').css({'height': viewportHeight - 400 +'px', 'overflow-y': 'scroll'});
+ $('.well', '#system-services-content-area').css({'height': viewportHeight - 300 +'px', 'overflow-y': 'scroll'});
};
panelHeight();

- // Hide other collapses once one is clicked
-
- $("#gingerHostAdmin > div > h3 > a[data-toggle=collapse]").click(function(e){
- e.preventDefault();
- e.stopPropagation();
- $("#gingerHostAdmin > div > .panel-collapse.collapse.in").collapse("hide");
- $($(this).attr("href")).collapse("show");
- });
-
- // System modules call
- ginger.loadSysmodules();
ginger.loadSystemServices(ginger.buildSystemServicesUi);
ginger.systeServicesClickHandler();

- // System modules modal window
- $('#load_sysmodules_button').on('click', function(event) {
- wok.window.open('plugins/ginger/host-sysmodules-load.html');
- });
-
$(window).on('resize', function(){
panelHeight();
});
-
- $('.panel-group.accordion > h3 > a', '#sysmodules-accordion, #system-services-accordion').on('click', function(){
- panelHeight();
- });
-
};

ginger.systeServicesClickHandler = function() {
@@ -236,7 +216,7 @@ ginger.buildSystemServicesUi = function() {
$('#ovs_search_input').prop('disabled',false);
$('#system-services-datagrid').dataGrid({enableSorting: false});
$('#system-services-datagrid').removeClass('hidden');
- $('#system-services-content-area .wok-mask').fadeOut(300, function() {});
+ $('#rightCol > .wok-mask').fadeOut(300, function() {});

ginger.systemServicesOptions = {
valueNames: ['service-name-filter', 'service-loaded-filter', 'service-status-filter', 'service-description-filter']
@@ -246,7 +226,6 @@ ginger.buildSystemServicesUi = function() {
ginger.systemServicesFilterList.sort('service-name-filter', {
order: "asc"
});
- ginger.sysmoduleSearch();
};

ginger.updateFilterList = function(){
@@ -256,17 +235,4 @@ ginger.updateFilterList = function(){
order: "asc"
});
ginger.systemServicesFilterList.search($('#search_input_system_services').val());
- ginger.sysmoduleSearch();
};
-
-ginger.sysmoduleSearch = function(){
- ginger.systemServicesFilterList.on('searchComplete',function(){
- if(ginger.systemServicesFilterList.matchingItems.length == 0){
- $('#system-services-datagrid ul').addClass('hidden');
- $('#system-services-datagrid .no-matching-data').removeClass('hidden');
- } else {
- $('#system-services-datagrid ul').removeClass('hidden');
- $('#system-services-datagrid .no-matching-data').addClass('hidden');
- }
- });
-}
diff --git a/ui/pages/tabs/host-sysmodules.html.tmpl b/ui/pages/tabs/host-sysmodules.html.tmpl
new file mode 100644
index 0000000..e646e29
--- /dev/null
+++ b/ui/pages/tabs/host-sysmodules.html.tmpl
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2016
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+<script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+<script type="text/javascript" src="plugins/ginger/js/host-sysmodules.js"></script>
+</head>
+<body>
+ <div id="host-sysmodules-root-container" class="ginger">
+ <div class="container">
+ <div id="gingerHostSysModules" class="host-admin">
+ <div id="sysmodules-content-area">
+ <div id="sysmodules-alert-container"></div>
+ <div class="row grid-control">
+ <div class="sysmodules-actions btn-group" id="sysmodules-actions-area">
+ <button class="btn btn-primary load-modules-btn" type="button" id="load_sysmodules_button"><i class="fa fa-download"></i> $_("Load Modules")</button>
+ </div>
+ <div class="pull-right">
+ <label for="search_input" class="sr-only">$_("Filter System Modules"):</label>
+ <input type="text" class="filter form-control search" id="search_input" placeholder="$_("Filter")">
+ </div>
+ </div>
+ <div class="wok-datagrid" id="sysmodules-datagrid" role="grid">
+ <div class="wok-datagrid-header" role="row">
+ <span role="columnheader" class="column-name">$_("Name")</span><!--
+ --><span role="columnheader" class="column-depends">$_("Depends On")</span><!--
+ --><span role="columnheader" class="column-version">$_("Version")</span><!--
+ --><span role="columnheader" class="column-details">$_("Details")</span><!--
+ --><span role="columnheader" class="column-actions">
+ <span role="columnheader" class="sr-only">$_("Actions")</span><!--
+ --></span>
+ </div>
+ <div class="well">
+ <ul class="wok-datagrid-body list" id="sysmodules-body"></ul>
+ <div class="no-matching-data hidden">
+ <span role="row">$_("No result found")</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<script id="sysmodulesItem" type="html/text">
+ <li class="wok-datagrid-row" id="{name}" data-id="{name}" role="row">
+ <span role="gridcell" class="column-name name-filter" title="{name}">{name}</span><!--
+ --><span role="gridcell" class="column-depends depends-filter">{depends}</span><!--
+ --><span role="gridcell" class="column-version version-filter">{version}</span><!--
+ --><span role="gridcell" class="column-details">
+ <div class="arrow arrow-down" role="button"></div>
+ </span><!--
+ --><span role="gridcell" class="column-actions btn btn-link btn-unload"><i class="fa fa-upload"></i> $_("Unload")</span>
+ <div role="gridcell" class="sysmodules-details" style="display: none;">
+ <div role="grid" class="details-list"></div>
+ </div>
+ <div role="presentation" class="clear"></div>
+ </li>
+</script>
+<script id="detail-head" type="text/html">
+ <span role="row" class="column-{key}">
+ <span role="columnheader" class='header-{key}'>{title}</span>
+ <span role="gridcell" class='body-{key}'></span>
+ </span>
+</script>
+<script id="detail-body" type="text/html">
+ <span class="row-{index}">{object}</span>
+</script>
+<script id="detail-body-obj" type="text/html">
+ <span class="row-{index}">
+ <span class="col-key">{key}:</span>
+ <span class="col-value">{value}</span>
+ </span>
+</script>
+<script>
+ ginger.loadSysmodules();
+</script>
+<div id="modalWindow" class="modal fade host-modal sysmodules-modal ginger" tabindex="-1" role="dialog" aria-labelledby="sysmodulesModalLabel" aria-hidden="true"></div>
+</body>
+</html>
diff --git a/ui/pages/tabs/host-system-services.html.tmpl b/ui/pages/tabs/host-system-services.html.tmpl
index ed6fc8d..f2e37cb 100644
--- a/ui/pages/tabs/host-system-services.html.tmpl
+++ b/ui/pages/tabs/host-system-services.html.tmpl
@@ -25,92 +25,34 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<head>
<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
<script type="text/javascript" src="plugins/ginger/js/util.js"></script>
-<script type="text/javascript" src="plugins/ginger/js/host-sysmodules.js"></script>
<script type="text/javascript" src="plugins/ginger/js/host-system-services.js"></script>
</head>
<body>
- <div id="host-sysmodules-root-container" class="ginger">
+ <div id="host-system-services-root-container" class="ginger">
<div class="container">
- <div id="gingerHostAdmin" class="host-admin">
- <div class="panel-group accordion" id="system-services-accordion" role="tablist" aria-multiselectable="false">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#system-services-accordion" href="#system-services-content-area" aria-expanded="false" aria-controls="system-services-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text" id="system-services-header">$_("System Services Management")</span>
- </a>
- </h3>
- <div id="system-services-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="system-services-header">
- <div id="system-services-alert-container"></div>
- <div class="row grid-control">
- <div class="pull-right">
- <label for="search_input_system_services" class="sr-only">$_("Filter System Services"):</label>
- <input type="text" class="filter form-control search" id="search_input_system_services" placeholder="$_("Filter")">
- </div>
- </div>
- <div class="wok-datagrid" id="system-services-datagrid">
- <div class="wok-datagrid-header">
- <span class="column-service-name" data-placement="auto bottom" data-toggle="tooltip" title="$_('Name')">$_("Name")</span><!--
- --><span class="column-service-loaded" data-placement="auto bottom" data-toggle="tooltip" title="$_('Loaded')">$_("Loaded")</span><!--
- --><span class="column-service-status" data-placement="auto bottom" data-toggle="tooltip" title="$_('Status')">$_("Status")</span><!--
- --><span class="column-service-autostart" data-placement="auto bottom" data-toggle="tooltip" title="$_('Autostart')">$_("Autostart")</span><!--
- --><span class="column-service-details" data-placement="auto bottom" data-toggle="tooltip" title="$_('Details')">$_("Details")</span><!--
- --><span class="column-service-description" data-placement="auto bottom" data-toggle="tooltip" title="$_('Description')">$_("Description")</span><!--
- --><span class="column-service-actions" data-placement="auto bottom" data-toggle="tooltip" title="$_('Actions')"><span class="sr-only">$_("Actions")</span></span>
- </div>
- <div class="well">
- <ul class="wok-datagrid-body list" id="system-services-body"></ul>
- <div class="no-matching-data hidden">
- <span role="row">$_("No result found")</span>
- </div>
- </div>
-
- </div>
- <div class="wok-mask">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="panel-group accordion" id="sysmodules-accordion" role="tablist" aria-multiselectable="false">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#sysmodules-accordion" href="#sysmodules-content-area" aria-expanded="false" aria-controls="sysmodules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text" id="sysmodules-header">$_("System Modules Management")</span>
- </a>
- </h3>
- <div id="sysmodules-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="sysmodules-header">
+ <div id="gingerHostSystemServices" class="host-admin">
+ <div id="system-services-content-area">
+ <div id="system-services-alert-container"></div>
+ <div class="row grid-control">
+ <div class="pull-right">
+ <label for="search_input_system_services" class="sr-only">$_("Filter System Services"):</label>
+ <input type="text" class="filter form-control search" id="search_input_system_services" placeholder="$_("Filter")">
+ </div>
+ </div>
+ <div class="wok-datagrid" id="system-services-datagrid">
+ <div class="wok-datagrid-header">
+ <span class="column-service-name" data-placement="auto bottom" data-toggle="tooltip" title="$_('Name')">$_("Name")</span><!--
+ --><span class="column-service-loaded" data-placement="auto bottom" data-toggle="tooltip" title="$_('Loaded')">$_("Loaded")</span><!--
+ --><span class="column-service-status" data-placement="auto bottom" data-toggle="tooltip" title="$_('Status')">$_("Status")</span><!--
+ --><span class="column-service-autostart" data-placement="auto bottom" data-toggle="tooltip" title="$_('Autostart')">$_("Autostart")</span><!--
+ --><span class="column-service-details" data-placement="auto bottom" data-toggle="tooltip" title="$_('Details')">$_("Details")</span><!--
+ --><span class="column-service-description" data-placement="auto bottom" data-toggle="tooltip" title="$_('Description')">$_("Description")</span><!--
+ --><span class="column-service-actions" data-placement="auto bottom" data-toggle="tooltip" title="$_('Actions')"><span class="sr-only">$_("Actions")</span></span>
+ </div>
<div class="well">
- <div id="sysmodules-alert-container"></div>
- <div class="row grid-control">
- <div class="sysmodules-actions btn-group" id="sysmodules-actions-area">
- <button class="btn btn-primary load-modules-btn" type="button" id="load_sysmodules_button"><i class="fa fa-download"></i> $_("Load Modules")</button>
- </div>
- <div class="pull-right">
- <label for="search_input" class="sr-only">$_("Filter System Modules"):</label>
- <input type="text" class="filter form-control search" id="search_input" placeholder="$_("Filter")">
- </div>
- </div>
- <div class="wok-datagrid" id="sysmodules-datagrid" role="grid">
- <div class="wok-datagrid-header" role="row">
- <span role="columnheader" class="column-name">$_("Name")</span><!--
- --><span role="columnheader" class="column-depends">$_("Depends On")</span><!--
- --><span role="columnheader" class="column-version">$_("Version")</span><!--
- --><span role="columnheader" class="column-details">$_("Details")</span><!--
- --><span role="columnheader" class="column-actions">
- <span role="columnheader" class="sr-only">$_("Actions")</span><!--
- --></span>
- </div>
- <ul class="wok-datagrid-body list" id="sysmodules-body"></ul>
- </div>
- <div class="wok-mask">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
+ <ul class="wok-datagrid-body list" id="system-services-body"></ul>
+ <div class="no-matching-data hidden">
+ <span role="row">$_("No result found")</span>
</div>
</div>
</div>
@@ -118,36 +60,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
</div>
</div>
</div>
-<script id="sysmodulesItem" type="html/text">
- <li class="wok-datagrid-row" id="{name}" data-id="{name}" role="row">
- <span role="gridcell" class="column-name name-filter" title="{name}">{name}</span><!--
- --><span role="gridcell" class="column-depends depends-filter">{depends}</span><!--
- --><span role="gridcell" class="column-version version-filter">{version}</span><!--
- --><span role="gridcell" class="column-details">
- <div class="arrow arrow-down" role="button"></div>
- </span><!--
- --><span role="gridcell" class="column-actions btn btn-link btn-unload"><i class="fa fa-upload"></i> $_("Unload")</span>
- <div role="gridcell" class="sysmodules-details" style="display: none;">
- <div role="grid" class="details-list"></div>
- </div>
- <div role="presentation" class="clear"></div>
- </li>
-</script>
-<script id="detail-head" type="text/html">
- <span role="row" class="column-{key}">
- <span role="columnheader" class='header-{key}'>{title}</span>
- <span role="gridcell" class='body-{key}'></span>
- </span>
-</script>
-<script id="detail-body" type="text/html">
- <span class="row-{index}">{object}</span>
-</script>
-<script id="detail-body-obj" type="text/html">
- <span class="row-{index}">
- <span class="col-key">{key}:</span>
- <span class="col-value">{value}</span>
- </span>
-</script>
<script id="systemServicesItem" type="html/text">
<li class="wok-datagrid-row" id="{id}" data-id="{name}" role="row">
<span role="gridcell" class="column-service-name service-name-filter" title="{name}">{name}</span><!--
@@ -204,6 +116,5 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<script>
ginger.initSystemServices();
</script>
-<div id="modalWindow" class="modal fade host-modal sysmodules-modal ginger" tabindex="-1" role="dialog" aria-labelledby="sysmodulesModalLabel" aria-hidden="true"></div>
</body>
</html>
--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:55:02 AM3/2/17
to Ginger Devel
This patch launches only one tab (Settings) for Ginger plugin.
This tab has a sidebar menu which each entry represents a former Ginger tab
(Administration, Network, Storage, System Services).

This patch does not do any UI change in the tabs content. It only
changes the way the tab content is displayed.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
Signed-off-by: Samuel GuimarĂ£es <sguima...@gmail.com>
---
ui/config/tab-ext.xml | 25 +----
ui/css/ginger.css | 95 ++++++++++++++++-
ui/css/src/ginger.scss | 3 +-
ui/css/src/modules/_sidebar.scss | 104 +++++++++++++++++++
ui/js/host-sidebar.js | 194 +++++++++++++++++++++++++++++++++++
ui/pages/i18n.json.tmpl | 2 +
ui/pages/tabs/host-sidebar.html.tmpl | 53 ++++++++++
7 files changed, 451 insertions(+), 25 deletions(-)
create mode 100644 ui/css/src/modules/_sidebar.scss
create mode 100644 ui/js/host-sidebar.js
create mode 100644 ui/pages/tabs/host-sidebar.html.tmpl

diff --git a/ui/config/tab-ext.xml b/ui/config/tab-ext.xml
index 6e92641..330a92c 100644
--- a/ui/config/tab-ext.xml
+++ b/ui/config/tab-ext.xml
@@ -21,29 +21,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<tab>
<access role="admin" mode="admin" />
<access role="user" mode="none" />
- <title>Administration</title>
+ <title>Settings</title>
<order>30</order>
- <path>plugins/ginger/tabs/host-admin.html</path>
- </tab>
- <tab>
- <access role="admin" mode="admin" />
- <access role="user" mode="none" />
- <title>Network</title>
- <order>5</order>
- <path>plugins/ginger/tabs/host-network.html</path>
- </tab>
- <tab>
- <access role="admin" mode="admin" />
- <access role="user" mode="none" />
- <title>Storage</title>
- <order>10</order>
- <path>plugins/ginger/tabs/host-storage.html</path>
- </tab>
- <tab>
- <access role="admin" mode="admin" />
- <access role="user" mode="none" />
- <title>System Services</title>
- <order>25</order>
- <path>plugins/ginger/tabs/host-system-services.html</path>
+ <path>plugins/ginger/tabs/host-sidebar.html</path>
</tab>
</tabs-ext>
diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index a6495dd..412561c 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -1,6 +1,6 @@
@charset "UTF-8";
/*
- * Copyright IBM Corp, 2015-2016
+ * Copyright IBM Corp, 2015-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -159,6 +159,99 @@
border-color: -moz-use-text-color -moz-use-text-color #008abf;
}

+.affix-top,
+.affix {
+ position: static;
+}
+
+#leftCol {
+ float: left;
+}
+
+#sidebar .list-group-item {
+ padding: 0;
+}
+
+#sidebar .list-group-item > a {
+ color: #3a393b;
+ display: block;
+ font-weight: 700;
+ padding: 10px 15px;
+}
+
+#sidebar .list-group-item > a .fa {
+ display: none;
+}
+
+#sidebar .list-group-item.active,
+#sidebar .list-group-item.active:hover,
+#sidebar .list-group-item.active:focus {
+ z-index: 2;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+
+#sidebar .list-group-item.active > a,
+#sidebar .list-group-item.active:hover > a,
+#sidebar .list-group-item.active:focus > a {
+ color: #008abf;
+}
+
+#sidebar .list-group-item.active > a .fa,
+#sidebar .list-group-item.active:hover > a .fa,
+#sidebar .list-group-item.active:focus > a .fa {
+ display: block;
+ float: right;
+ margin-top: 3px;
+}
+
+#sidebar {
+ width: 278px;
+ margin-top: 6px;
+}
+
+#sidebar.affix-top {
+ position: static;
+ width: 240px;
+}
+
+#sidebar.affix {
+ margin-top: 0;
+ position: fixed;
+ width: 278px;
+ bottom: 6px;
+ top: 6px;
+ overflow: hidden;
+ overflow-y: auto;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ margin-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+#rightCol {
+ margin-top: 6px;
+ margin-left: 297px;
+}
+
+#rightCol nav.toolbar {
+ display: none;
+}
+
+#rightCol > .wok-mask {
+ top: 0;
+ left: 380px;
+}
+
+#rightCol > .row > div > .container {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ float: left;
+}
+
#administration-root-container .accordion {
margin: 12px 20px 12px 60px;
padding-bottom: 18px;
diff --git a/ui/css/src/ginger.scss b/ui/css/src/ginger.scss
index 19dc761..abd2d06 100644
--- a/ui/css/src/ginger.scss
+++ b/ui/css/src/ginger.scss
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp, 2015-2016
+ * Copyright IBM Corp, 2015-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -166,6 +166,7 @@
//
// Ginger and classes
// ----------------------------------------------------------------------------
+@import "modules/sidebar";
@import "modules/administration";
@import "modules/network";
@import "modules/storage";
diff --git a/ui/css/src/modules/_sidebar.scss b/ui/css/src/modules/_sidebar.scss
new file mode 100644
index 0000000..aa6c71d
--- /dev/null
+++ b/ui/css/src/modules/_sidebar.scss
@@ -0,0 +1,104 @@
+//
+// Project Ginger
+//
+// Copyright IBM Corp, 2017
+//
+// Code derived from Project Kimchi
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+.affix-top,
+.affix {
+ position: static;
+}
+
+#leftCol {
+ float: left;
+}
+
+#sidebar {
+ .list-group-item {
+ padding: 0;
+ }
+ .list-group-item > a {
+ color: $brand-primary;
+ display: block;
+ font-weight: 700;
+ padding: 10px 15px;
+ .fa {
+ display: none;
+ }
+ }
+ .list-group-item.active,
+ .list-group-item.active:hover,
+ .list-group-item.active:focus {
+ z-index: 2;
+ background-color: $list-group-hover-bg;
+ border-color: $list-group-border;
+ & > a {
+ color: #008abf;
+ .fa {
+ display: block;
+ float: right;
+ margin-top: 3px;
+ }
+ }
+ }
+}
+
+#sidebar {
+ width: 278px;
+ margin-top: 6px;
+}
+
+#sidebar.affix-top {
+ position: static;
+ width: 240px;
+}
+
+#sidebar.affix {
+ margin-top: 0;
+ position: fixed;
+ width: 278px;
+ bottom: 6px;
+ top: 6px;
+ overflow: hidden;
+ overflow-y: auto;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ margin-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+#rightCol {
+ margin-top: 6px;
+ margin-left: 297px;
+}
+
+#rightCol nav.toolbar {
+ display: none;
+}
+
+#rightCol > .wok-mask {
+ top: 0;
+ left: 380px;
+}
+
+#rightCol > .row > div > .container {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ float: left;
+}
diff --git a/ui/js/host-sidebar.js b/ui/js/host-sidebar.js
new file mode 100644
index 0000000..84465f8
--- /dev/null
+++ b/ui/js/host-sidebar.js
@@ -0,0 +1,194 @@
+/*
+ * Copyright IBM Corp, 2017
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ginger.sidebarObj = [
+ {
+ title: i18n['Administration'],
+ url: 'plugins/ginger/tabs/host-admin.html',
+ id: 'ginger-admin'
+ },
+ {
+ title: i18n['Network'],
+ url: 'plugins/ginger/tabs/host-network.html',
+ id: 'ginger-network'
+ },
+ {
+ title: i18n['Storage'],
+ url: 'plugins/ginger/tabs/host-storage.html',
+ id: 'ginger-storage'
+ },
+ {
+ title: i18n['System Services'],
+ url: 'plugins/ginger/tabs/host-system-services.html',
+ id: 'ginger-system-services'
+ },
+ {
+ title: i18n['System Modules'],
+ url: 'plugins/ginger/tabs/host-sysmodules.html',
+ id: 'ginger-system-modules'
+ }
+];
+
+Sidebar = function(el, obj) {
+ "use strict";
+ this.obj = obj;
+ this.el = el;
+ this.createSidebar();
+ this.clickHandlers();
+};
+
+Sidebar.prototype = (function() {
+ "use strict";
+ var THIS_PLUGIN = location.hash.split('/')[1];
+
+ var createSidebar = function() {
+ var el = this.el;
+ var obj = this.obj;
+ var listGroup = $('<ul class="list-group" id="sidebar" />').appendTo(el);
+ for (var i = 0; i < obj.length; i++) {
+ $('<li id="' + obj[i].id + '" class="list-group-item"><a href="' + obj[i].url + '">' + obj[i].title + ' <i class="fa fa-chevron-right"></i></a></li>').appendTo(listGroup);
+ }
+ };
+
+ var onSidebarRedirect = function(url) {
+ var link = $('#sidebar.list-group > li > a[href="' + url + '"]');
+ $('#sidebar.list-group > li').removeClass('active');
+
+ $(link).parent().addClass('active');
+ $(link).focus();
+
+ $('#rightCol .row').empty();
+ $('#rightCol > .wok-mask').show();
+
+ // Load page content.
+ loadPanel(url);
+ };
+
+ var loadPanel = function(url) {
+ // Get the page content through Ajax and render it.
+ url && $('#rightCol .row').load(url, function(responseText, textStatus, jqXHR) {
+ if (jqXHR['status'] === 401 || jqXHR['status'] === 303) {
+ var isSessionTimeout = jqXHR['responseText'].indexOf("sessionTimeout") != -1;
+ document.location.href = isSessionTimeout ? 'login.html?error=sessionTimeout' : 'login.html';
+ return;
+ } else if (status === "error") {
+ wok.message.error(xhr.status + " " + xhr.statusText, '#rightCol .row', true);
+ }
+ wok.cookie.set('lastPage', '/#plugins/ginger/tabs/host-sidebar')
+ wok.cookie.set('lastGingerPage', url)
+ }).promise()
+ .done(function() {
+ $('#rightCol > .wok-mask').hide();
+ });
+ };
+
+ var checkHash = function() {
+ var hashString = (location.hash && location.hash.substr(1));
+ var hashClick = location.hash.split('/')[1];
+ var hashPage = location.hash.split('/')[3];
+ if (hashPage === 'host-sidebar' && (THIS_PLUGIN === hashClick)) {
+ wok.topic('redirect').publish(hashString + '.html');
+ } else if (hashPage !== 'host-sidebar' && (THIS_PLUGIN === hashClick)) {
+ wok.topic('sidebarClicked').publish(hashString + '.html');
+ } else {
+ // Logs every datatable instance and destroys them to avoid warnings
+ var tables = $.fn.dataTable.tables();
+ if (tables.length){
+ $.each(tables, function(i, table) {
+ $(table).DataTable().clear().destroy();
+ });
+ }
+ wok.topic('sidebarClicked').unsubscribe(onSidebarRedirect);
+ wok.topic('redirect').publish(hashString + '.html');
+ }
+ }
+
+ var clickHandlers = function() {
+ wok.topic('sidebarClicked').subscribe(onSidebarRedirect);
+
+ /*
+ * If hash value is changed, then we know the user is intended to load
+ * another page.
+ */
+ window.onhashchange = checkHash;
+
+ $('#sidebar.list-group').on('click', 'a', function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var href = $(this).attr('href');
+ location.hash = href.substring(0, href.lastIndexOf('.'));
+ });
+ };
+
+ var triggerFirstAvailableOption = function() {
+ var el = this.el;
+ $('li > a', el).first().trigger('click');
+ }
+
+ return {
+ THIS_PLUGIN: THIS_PLUGIN,
+ createSidebar: createSidebar,
+ onSidebarRedirect: onSidebarRedirect,
+ loadPanel: loadPanel,
+ checkHash: checkHash,
+ clickHandlers: clickHandlers,
+ triggerFirstAvailableOption: triggerFirstAvailableOption
+ };
+})();
+
+ginger.initSidebar = function() {
+ var $sidebar = $('#sidebar');
+ var $leftCol = $('#leftCol');
+ var $content = $('#rightCol');
+ var $body = $(document.body);
+ var navHeight = $('.topbar').outerHeight(true) + 40;
+
+ var start = new Sidebar($leftCol, ginger.sidebarObj);
+ lastGingerPage = wok.cookie.get('lastGingerPage')
+ if (!lastGingerPage)
+ start.triggerFirstAvailableOption();
+ else
+ wok.topic('sidebarClicked').publish(lastGingerPage);
+
+ var checkScrollPosition = function() {
+ if ($(window).scrollTop() + $(window).height() > $(document).height() - 66) {
+ var $bottom = ($(window).scrollTop() + $(window).height()) - $(document).height();
+ $('#sidebar.affix').css('bottom', '66px');
+ } else {
+ $('#sidebar.affix').css('bottom', '6px');
+ }
+ };
+
+ /* activate sidebar */
+ if ($content.height() > $sidebar.height()) {
+ $sidebar.affix({
+ offset: {
+ top: 210
+ }
+ });
+
+ $body.scrollspy({
+ target: '#leftCol',
+ offset: navHeight
+ });
+
+ $(window).on("load resize scroll", function(e) {
+ checkScrollPosition();
+ });
+ }
+};
diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
index 6c4a8a1..aee124c 100644
--- a/ui/pages/i18n.json.tmpl
+++ b/ui/pages/i18n.json.tmpl
@@ -22,10 +22,12 @@
#silent _ = t.gettext
#silent _t = t.gettext
{
+ "Settings": "$_("Settings")",
"Administration": "$_("Administration")",
"Network": "$_("Network")",
"Storage": "$_("Storage")",
"System Modules": "$_("System Modules")",
+ "System Services": "$_("System Services")",
"Manual": "$_("Manual")",
"Automatic(DHCP)": "$_("Automatic(DHCP)")",
"Automatic": "$_("Automatic")",
diff --git a/ui/pages/tabs/host-sidebar.html.tmpl b/ui/pages/tabs/host-sidebar.html.tmpl
new file mode 100644
index 0000000..39384a2
--- /dev/null
+++ b/ui/pages/tabs/host-sidebar.html.tmpl
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2017
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+ <script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ <script type="text/javascript" src="plugins/ginger/js/host-sidebar.js"></script>
+</head>
+<body>
+ <div class="container">
+ <div id="gingerMainContent" class="row">
+ <div id="leftCol">
+ </div>
+ <div id="rightCol">
+ <div class="row"></div>
+ <div class="wok-mask">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<script type="text/javascript">
+ ginger.initSidebar();
+</script>
+</body>
+</html>
--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:55:03 AM3/2/17
to Ginger Devel
There are some elements which 2 settings for aria-expanded.
aria-expanded should be set to true when the widget is open (expanded) and,
in addition to that, the content should have the class "collapse in".
Otherwise, the expand icon will not reflect the right behavior.
When setting aria-expanded=false, only set the content class as "collapse".

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/pages/tabs/host-network.html.tmpl | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/ui/pages/tabs/host-network.html.tmpl b/ui/pages/tabs/host-network.html.tmpl
index f17d81b..7c7ceb1 100644
--- a/ui/pages/tabs/host-network.html.tmpl
+++ b/ui/pages/tabs/host-network.html.tmpl
@@ -43,7 +43,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<!-- Global Network Configuration Panel -->
<div class="panel-group network-ppc-enabled accordion" id="network-global-configuration-accordion" role="tablist" aria-multiselectable="true">
<h3>
- <a role="button" aria-expanded="true" data-toggle="collapse" data-parent="#network-global-accordion" href="#network-global-configuration-content-area" aria-expanded="true" aria-controls="network-global-configuration-content-area">
+ <a role="button" aria-expanded="false" data-toggle="collapse" data-parent="#network-global-accordion" href="#network-global-configuration-content-area" aria-controls="network-global-configuration-content-area">
<span class="accordion-icon"></span>
<span class="accordion-text" id="global-network-configuration-title">$_("Global Network Configuration")</span>
</a>
@@ -85,7 +85,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<!-- Redesigned Network Configuration Panel -->
<div class="panel-group network-ppc-enabled accordion" id="network-configuration-accordion" role="tablist" aria-multiselectable="true">
<h3>
- <a role="button" aria-expanded="true" data-toggle="collapse" data-parent="#network-configuration-accordion" href="#network-configuration-content-area" aria-expanded="false" aria-controls="network-configuration-content-area">
+ <a role="button" data-toggle="collapse" data-parent="#network-configuration-accordion" href="#network-configuration-content-area" aria-expanded="false" aria-controls="network-configuration-content-area">
<span class="accordion-icon"></span>
<span class="accordion-text" id="network-configuration-title">$_("Network Configuration")</span>
</a>
@@ -95,7 +95,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<div id="enable-sriov-progress-container" class="enable-sriov-status" style='display: none;'>
<div>
<h3>
- <a role="button" data-toggle="collapse" data-parent="#enable-sriov-progress-container" href="#status-sriov-container" aria-expanded="true" aria-controls="status-sriov-container">
+ <a role="button" data-toggle="collapse" data-parent="#enable-sriov-progress-container" href="#status-sriov-container" aria-expanded="false" aria-controls="status-sriov-container">
<i class="fa fa-chevron-down" role="presentation"></i>
$_("Enable SR-IOV Progress")
</a>
@@ -153,7 +153,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<script id="ovsBridgesPanel" type="text/html">
<div class='panel-group network-ppc-enabled accordion' id='ovsbridge-content-area-accordion' role='tablist' aria-multiselectable='true'>
<h3>
- <a role='button' aria-expanded='true' data-toggle='collapse' data-parent='#ovsbridge-content-area-accordion' href='#ovsbridge-content-area' aria-expanded='false' aria-controls='ovsbridge-content-area' class=''>
+ <a role='button' data-toggle='collapse' data-parent='#ovsbridge-content-area-accordion' href='#ovsbridge-content-area' aria-expanded='false' aria-controls='ovsbridge-content-area' class=''>
<span class='accordion-icon'></span>
<span class='accordion-text' id='#ovsbridge-title'>$_('OVS Bridges')</span>
</a>
--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:55:06 AM3/2/17
to Ginger Devel
There are 3 sections in the Administration tab related to Audit.
This patch adds a new sidebar entry (Audit) to accommodate all those audit
features.

This patch does not change any UI element. It is just moving code around
to get the features separated into a new sidebar entry.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/css/ginger.css | 12 +
ui/css/src/modules/_administration.scss | 5 +
ui/js/host-admin.js | 1299 -------------------------------
ui/js/host-audit.js | 1280 ++++++++++++++++++++++++++++++
ui/js/host-sidebar.js | 22 +-
ui/pages/i18n.json.tmpl | 1 +
ui/pages/tabs/host-admin.html.tmpl | 472 -----------
ui/pages/tabs/host-audit.html.tmpl | 518 ++++++++++++
8 files changed, 1832 insertions(+), 1777 deletions(-)
create mode 100644 ui/js/host-audit.js
create mode 100644 ui/pages/tabs/host-audit.html.tmpl

diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index 412561c..a11ba87 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -252,6 +252,7 @@
float: left;
}

+#audit-root-container .accordion,
#administration-root-container .accordion {
margin: 12px 20px 12px 60px;
padding-bottom: 18px;
@@ -260,10 +261,12 @@
clear: both;
}

+#audit-root-container .accordion:first-child,
#administration-root-container .accordion:first-child {
margin-top: 24px;
}

+#audit-root-container .accordion > h3,
#administration-root-container .accordion > h3 {
margin: 0;
padding: 0;
@@ -273,6 +276,7 @@
display: block;
}

+#audit-root-container .accordion > h3 a,
#administration-root-container .accordion > h3 a {
color: #3a393b;
text-decoration: none;
@@ -282,6 +286,7 @@
margin-right: -30px;
}

+#audit-root-container .accordion > h3 a span.accordion-icon,
#administration-root-container .accordion > h3 a span.accordion-icon {
margin-left: -52px;
vertical-align: middle;
@@ -292,20 +297,27 @@
color: #3a393b;
}

+#audit-root-container .accordion > h3 a[aria-expanded="false"] span.accordion-icon:before,
#administration-root-container .accordion > h3 a[aria-expanded="false"] span.accordion-icon:before {
content: "\f01a";
}

+#audit-root-container .accordion > h3 a[aria-expanded="true"] span.accordion-icon:before,
#administration-root-container .accordion > h3 a[aria-expanded="true"] span.accordion-icon:before {
content: "\f01b";
}

+#audit-root-container .accordion > h3 a span.accordion-text,
#administration-root-container .accordion > h3 a span.accordion-text {
margin-left: 23px;
display: inline-block;
vertical-align: middle;
}

+.filter {
+ padding-top: 5px;
+}
+
#sanadapters-ppc-content-area,
#sensors-ppc-content-area,
#backup-ppc-content-area,
diff --git a/ui/css/src/modules/_administration.scss b/ui/css/src/modules/_administration.scss
index c3dfc3a..2fcdeb5 100644
--- a/ui/css/src/modules/_administration.scss
+++ b/ui/css/src/modules/_administration.scss
@@ -17,12 +17,17 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
+#audit-root-container,
#administration-root-container {
.accordion {
@include wok-accordion();
}
}

+.filter {
+ padding-top: 5px;
+}
+
#sanadapters-ppc-content-area,
#sensors-ppc-content-area,
#backup-ppc-content-area,
diff --git a/ui/js/host-admin.js b/ui/js/host-admin.js
index d101c65..030e823 100644
--- a/ui/js/host-admin.js
+++ b/ui/js/host-admin.js
@@ -920,1302 +920,6 @@ ginger.initFirmware = function() {
};
};

-ginger.initAuditRules = function(){
- ginger.loadAuditRulesData();
- ginger.loadAuditlogsData();
- ginger.loadauditDispatcher();
-};
-
-ginger.loadAuditRulesData = function(){
- $(".rules-loader").show();
- ginger.getAuditRules(function(result) {
-
- if (result.length > 0) {
- var rows = "";
- $.each(result, function(index, rule){
- rows += "<tr><td>" + (index+1) + "</td>";
- if(rule.type=="System Call Rule"){
- type = i18n['GINAUDIT0078M'];
- }else if(rule.type=="Control Rule"){
- type = i18n['GINAUDIT0079M'];
- }else if(rule.type=="File System Rule"){
- type = i18n['GINAUDIT0080M'];
- }
- rows += "<td>" + type + "</td>";
- var ruleDetails = rule.rule;
- var titleValue = "";
- var syscallStartIndex = ruleDetails.indexOf("-S");
-
- if(ruleDetails.substring(syscallStartIndex,ruleDetails.indexOf("-F",syscallStartIndex)).split(",").length > 10) {
- titleValue=ruleDetails.replace(/.{70}/g,"$&"+"\n");
- }else {
- titleValue = ruleDetails;
- }
- rows += "<td class=\"content\" title=\""+titleValue+"\">" + ruleDetails + "</td>";
- rows += "<td style=\"text-align:center;\" class=\"details-control\"><span class=\"fa fa-chevron-down common-down fa-lg\"></span> </td>";
-
- if(rule.loaded=='yes'){
- rows +="<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-loaded-enable enabled\"> <i class=\"fa fa-power-off\"></i></span></td>"
- }else if(rule.loaded=='no'){
- rows +="<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-loaded-disable disabled\"> <i class=\"fa fa-power-off\"></i></span></td>";
- }else{
- rows +="<td style=\"text-align:center;\" class=\"loaded\">--</td>";
- }
-
- if(rule.persisted=='yes'){
- rows += "<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-persisted-enable enabled\"> <i class=\"fa fa-floppy-o\"></i></span></td>"
- }else if(rule.persisted=='no'){
- rows +="<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-persisted-disable disabled\"> <i class=\"fa fa-floppy-o\"></i></span></td>";
- }else{
- rows +="<td style=\"text-align:center;\" class=\"loaded\">--</td>";
- }
-
- if(rule.rule_info){
- rows += "<td>" + JSON.stringify(rule.rule_info) + "</td>";
- }else{
- rows += "<td></td>";
- }
- rows += "<td>" + rule.persisted + "</td>";
- rows += "<td>" + rule.loaded + "</td></tr>";
- });
- $("#audit-rules-table tbody").html(rows);
- }
-
- var auditRulesTable = $("#audit-rules-table").DataTable({
- columnDefs: [
- {
- "width":"10%", "targets" : 0
- },
- {
- "width":"15%", "targets" : 1
- },
- {
- "width":"45%", "targets" : 2
- },
- {
- "width":"10%", "targets" : 3
- },
- {
- "width":"10%", "targets" : 4
- },
- {
- "width":"10%", "targets" : 5
- },
- {
- orderable: false, targets: [3,4,5]
- },
- {
- visible : false, targets: [6,7,8]
- }
- ],
- autoWidth:false,
- "initComplete": function(settings, json) {
- wok.initCompleteDataTableCallback(settings);
- },
- "oLanguage": {
- "sEmptyTable": i18n['GINNET0063M']
- }
- });
- // Add event listener for opening and closing details
- $('#audit-rules-table tbody').on('click', 'td.details-control', function () {
- //,td span.fa
- var tr = $(this).closest('tr');
- var row = auditRulesTable.row( tr );
- var ruleInfo = (row.data()[6]!="")?JSON.parse(row.data()[6]):i18n['GINAUDIT0001M'];
-
- if (row.child.isShown()) {
- // This row is already open - close it
- row.child.hide();
- $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- tr.removeClass('shown');
- }else{
- // Open this row
- ginger.ruleDetailsPopulation(ruleInfo,row);
- $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
- tr.addClass('shown');
- $('.audit-rules-details',$("#audit-rules-table tbody")).closest("tr").css("color","black");
- }
- });
-
- //Row selection
- $('#audit-rules-table tbody').on('click', 'tr', function () {
- $(this).toggleClass("selected");
- });
-
- $(".rules-loader").hide();
- },function(err){
- $(".rules-loader").hide();
- wok.message.error(err.responseJSON.reason, '#alert-modal-audit-rules-container');
- });
-};
-$('#audit-rule-add-btn').click(function() {
- wok.window.open('plugins/ginger/host-admin-addAuditRule.html');
-});
-$('#Audit-Rule-Configure-btn').click(function() {
- wok.window.open('plugins/ginger/host-admin-ConfigAuditRule.html');
-});
-$('#Audit-Rule-Import-btn').click(function() {
- wok.window.open('plugins/ginger/host-admin-ImportAuditRule.html');
-});
-$('#Audit-Rule-Edit-btn').click(function() {
- var auditRulesTable = $('#audit-rules-table').DataTable();
- if (auditRulesTable.rows('.selected').data().length == 0 || auditRulesTable.rows('.selected').data().length > 1) {
- var settings = {
- content: i18n["GINAUDIT0030M"],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {}, function() {});
- } else {
- var selectedRowsData = auditRulesTable.rows('.selected').data();
- var ruleName,ruleValue;
- var persistcheck;
- var ruleCheck = "";
- $.each(selectedRowsData, function(index, value) {
- ruleName = value[1];
- ruleValue = value[2];
- persistcheck = value[7];
- });
- for (var i = 0; i < ruleValue.length; i++) {
- if (ruleValue[i] != " ") {
- ruleCheck = ruleCheck + ruleValue[i];
- } else{
- break;
- }
- }
- if(ruleCheck == "-e" || ruleCheck == "-D"){
- wok.message.error("Cant edit these rules", "#audit-message", true);
- } else{
- if (persistcheck == "no") {
- var settings = {
- content: i18n["GINAUDIT0031M"],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {}, function() {});
- } else {
- if(ruleName==i18n['GINAUDIT0078M']){
- ruleName = "System Call Rule";
- }else if(ruleName==i18n['GINAUDIT0079M']){
- ruleName = "Control Rule";
- }else if(ruleName==i18n['GINAUDIT0080M']){
- ruleName = "File System Rule";
- }
- if (ruleName == "File System Rule") {
- wok.window.open('plugins/ginger/host-admin-EditAuditRule.html');
- } else if (ruleName == "Control Rule") {
- wok.window.open('plugins/ginger/host-admin-editControlRule.html');
- } else if (ruleName == "System Call Rule") {
- wok.window.open('plugins/ginger/host-admin-editSystemRule.html');
- }
- }
- }
- }
-});
-$('#Audit-Rule-refresh-btn').on('click', function() {
- $('#audit-rules-table tbody').off();
- $("#audit-rules-table tbody").html("");
- $("#audit-rules-table").DataTable().destroy();
- ginger.loadAuditRulesData();
-});
-//delete Audit rules
-$('#audit-rule-delete-btn').on('click', function(event) {
- var auditRulesTable = $('#audit-rules-table').DataTable();
- if (auditRulesTable.rows('.selected').data().length == 0) {
- var settings = {
- content: i18n["GINAUDIT0021M"],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {}, function() {});
- } else {
- var selectedRowsData = auditRulesTable.rows('.selected').data();
- var selectedRowsDataLength = auditRulesTable.rows('.selected').data().length;
- var selectedRows = [];
- $.each(selectedRowsData, function(key, value) {
- selectedRows.push(value[2]);
- });
- var settings = {
- content: i18n["GINAUDIT0022M"] + '<br>' + selectedRows,
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {
- $.each(selectedRowsData, function(key, value) {
- if(value[1] == "Control Rule" && value[7] == "no" && value[8] == "yes"){
- wok.message.error(i18n["GINAUDIT0036M"]+' '+value[2], '#audit-message', true);
- selectedRowsDataLength = selectedRowsDataLength - 1;
- } else if(value[1] == "Control Rule" && (value[2] == "-D" || value[2].includes("-e"))){
- wok.message.error(i18n["GINAUDIT0039M"]+' '+value[2], '#audit-message', true);
- selectedRowsDataLength = selectedRowsDataLength - 1;
- } else {
- ginger.deleteAuditRule(value[2], function(result) {
- if(value[1] == "Control Rule"){
- wok.message.success(i18n["GINAUDIT0037M"]+' '+value[2], '#audit-message');
- selectedRowsDataLength = selectedRowsDataLength - 1;
- if(selectedRowsDataLength === 0){
- $('#Audit-Rule-refresh-btn').trigger('click');
- }
- } else{
- wok.message.success(i18n["GINAUDIT0023M"]+' '+value[2], '#audit-message');
- selectedRowsDataLength = selectedRowsDataLength - 1;
- if(selectedRowsDataLength === 0){
- $('#Audit-Rule-refresh-btn').trigger('click');
- }
- }
- }, function(error) {
- wok.message.error(error.responseJSON.reason, '#audit-message', true);
- selectedRowsDataLength = selectedRowsDataLength - 1;
- if(selectedRowsDataLength === 0){
- $('#Audit-Rule-refresh-btn').trigger('click');
- }
- });
- }
- if(selectedRowsDataLength === 0){
- $('#Audit-Rule-refresh-btn').trigger('click');
- }
- });
- });
- }
-});
-//audit load
-$('#Audit-Rule-Load-btn').on('click', function(event) {
- var auditRulesTable = $('#audit-rules-table').DataTable();
- if (auditRulesTable.rows('.selected').data().length == 0) {
- var settings = {
- content: i18n["GINAUDIT0021M"],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {}, function() {});
- } else {
- var selectedRowsData = auditRulesTable.rows('.selected').data();
- var selectedRows = [];
- $.each(selectedRowsData, function(key, value) {
- selectedRows.push(value[2]);
- });
- var settings = {
- content: i18n["GINAUDIT0024M"] + '<br>' + selectedRows,
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {
- $.each(selectedRows, function(index, value) {
- ginger.LoadAuditRule(value.replace('&lt;','<').replace('&gt;','>'), function(result) {
- wok.message.success(i18n["GINAUDIT0025M"]+' '+value, '#audit-message');
- }, function(error) {
- wok.message.error(error.responseJSON.reason, '#audit-message', true);
- })
- });
- setTimeout(function(){$('#Audit-Rule-refresh-btn').trigger('click')},500);
- });
- }
-});
-//unload rule
-$('#Audit-Rule-unload-btn').on('click', function(event) {
- var auditRulesTable = $('#audit-rules-table').DataTable();
- if (auditRulesTable.rows('.selected').data().length == 0) {
- var settings = {
- content: i18n["GINAUDIT0021M"],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {}, function() {});
- } else {
- var selectedRowsData = auditRulesTable.rows('.selected').data();
- var selectedRows = [];
- $.each(selectedRowsData, function(key, value) {
- selectedRows.push(value[2]);
- });
- var settings = {
- content: i18n["GINAUDIT0026M"] + '<br>' + selectedRows,
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {
- $.each(selectedRowsData, function(index, value) {
- if(value[1] == "Control Rule"){
- wok.message.error(i18n["GINAUDIT0038M"], '#audit-message', true);
- } else {
- ginger.UnLoadAuditRule(value[2].replace('&lt;','<').replace('&gt;','>'), function(result) {
- wok.message.success(i18n["GINAUDIT0027M"]+' '+value[2], '#audit-message');
- }, function(error) {
- wok.message.error(error.responseJSON.reason, '#audit-message', true);
- })
- }
- });
- setTimeout(function(){$('#Audit-Rule-refresh-btn').trigger('click')},500);
- });
- }
-});
-//persist audit
-$('#Audit-Rule-Persist-btn').on('click', function(event) {
- var auditRulesTable = $('#audit-rules-table').DataTable();
- if (auditRulesTable.rows('.selected').data().length == 0) {
- var settings = {
- content: i18n["GINAUDIT0021M"],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {}, function() {});
- } else {
- var selectedRowsData = auditRulesTable.rows('.selected').data();
- var selectedRows = [];
- $.each(selectedRowsData, function(key, value) {
- selectedRows.push(value[2]);
- });
- var settings = {
- content: i18n["GINAUDIT0028M"] + '<br>' + selectedRows,
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function() {
- $.each(selectedRows, function(key, value) {
- ginger.PersistAuditRule(value.replace('&lt;','<').replace('&gt;','>'), function(result) {
- wok.message.success(i18n["GINAUDIT0029M"]+' '+value, '#audit-message');
- }, function(error) {
- wok.message.error(error.responseJSON.reason, '#audit-message', true);
- })
- });
- setTimeout(function(){$('#Audit-Rule-refresh-btn').trigger('click')},500);
- });
- }
-});
-
-ginger.ruleDetailsPopulation = function(data , row){
- var text='';
- var value;
- var ruleDetails = '';
- if(typeof data === 'object'){
- $.each(data, function(key, obj) {
- value = obj;
- switch (key){
- case "action":
- text = i18n['GINAUDIT0002M'];
- break;
- case "filter":
- text = i18n['GINAUDIT0003M'];
- break;
- case "systemcall":
- text = i18n['GINAUDIT0004M'];
- if(value.length > 10) {
- value=value.toString().replace(/.{70}/g,"$&"+"\n");
- }
- break;
- case "field":
- text = i18n['GINAUDIT0005M'];
- if(value.length > 10) {
- value=value.toString().replace(/.{70}/g,"$&"+"\n");
- }
- break;
- case "key":
- text = i18n['GINAUDIT0006M'];
- break;
- default:
- text = key;
- }
-
- var detailsHtml = [
- '<div>',
- '<span class="column-'+key+'">',
- '<span class="header-'+key+'">'+text+'</span>',
- '<span class="row-'+key+'">'+value+'</span>',
- '</span>',
- '</div>'
-
- ].join('');
- ruleDetails+=detailsHtml;
- });
- row.child('<div class="audit-rules-details" style="display: block;"><div class="details-list">'+ruleDetails+'</div></div>').show();
-}else{
- ruleDetails = data;
- row.child('<div class="audit-rules-details" style="display: block;"><div class="noRuleInfo">'+ruleDetails+'</div></div>').show();
-}
-
-};
-
-ginger.loadAuditlogsData = function(){
- $(".logs-loader").show();
- ginger.getAuditLogs(function(result) {
- ginger.createAuditLogsTable(result);
- },function(err){
- $(".logs-loader").hide();
- wok.message.error(err.responseJSON.reason, '#alert-modal-audit-logs-container');
- });
-
- ginger.initFilterInfo();
- ginger.initSummaryInfo();
-
-};
-ginger.createAuditLogsTable = function(data){
- var rows = "";
- if (data.length > 0) {
- $.each(data, function(index, log){
- var logDetails = log['record'+(index+1)];
- if(logDetails){
- rows += "<tr><td>" + logDetails['Date and Time'] + "</td>";
- rows += "<td>" + logDetails['TYPE'] + "</td>";
- rows += "<td class=\"content\">" + logDetails['MSG']+ "</td>";
- rows += "<td style=\"text-align:center;\" class=\"details-control\"><span class=\"fa fa-chevron-down common-down fa-lg\"></span> </td></tr>";
- }
- });
- }
- $("#audit-logs-table tbody").html(rows);
-
- var auditLogsTable = $("#audit-logs-table").DataTable({
- columnDefs: [
- {
- "width":"15%", "targets" : 0
- },
- {
- "width":"15%", "targets" : 1
- },
- {
- "width":"60%", "targets" : 2
- },
- {
- "width":"10%", "targets" : 3
- },
- {
- orderable: false, targets: [3]
- }
- ],
- autoWidth:false,
- "dom": '<"row"<"log-report pull-left"><"log-filter pull-left"><"log-reset pull-left"><"col-sm-12 filter"<"pull-right"l><"pull-right"f>>><"row"<"col-sm-12"t>><"row"<"col-sm-6 pages"p><"col-sm-6 info"i>>',
- "initComplete": function(settings, json) {
- wok.initCompleteDataTableCallback(settings);
- var reportButton = '<button class="btn btn-primary pull-left" id="log-report-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogReport"><i class="fa fa-file-archive-o">&nbsp;</i> ' + i18n['GINAUDIT0008M'] + '</button>';
- var filterButton = '<button class="btn btn-primary" id="log-filter-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogFilter"><i class="fa fa-filter">&nbsp;</i>' + i18n['GINAUDIT0007M'] + '</button>';
- var resetButton = '<button class="btn btn-primary" id="log-reset-btn" aria-expanded="false"><i class="fa fa-undo">&nbsp;</i>' + i18n['GINAUDIT0019M'] + '</button>';
- $(".log-report").html(reportButton);
- $(".log-filter").append(filterButton);
- $(".log-reset").html(resetButton);
- },
- "oLanguage": {
- "sEmptyTable": i18n['GINAUDIT0012M']
- }
- });
-
- // Add event listener for opening and closing details
- $('#audit-logs-table tbody').off();
- $('#audit-logs-table tbody').on('click', 'td.details-control', function () {
- var tr = $(this).closest('tr');
- var row = auditLogsTable.row( tr );
- var logMessage = (row.data()[2]!="")?row.data()[2]:i18n['GINAUDIT0001M'];
- var dateTime = (row.data()[0]!="")?row.data()[0]:'';
- var type = (row.data()[1]!="")?row.data()[1]:'';
-
- $('.audit-log-details',$('#audit-logs-table tbody')).parent().remove();
- $('.fa-chevron-up',$('#audit-logs-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- if (row.child.isShown()) {
- // This row is already open - close it
- row.child.hide();
- $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- tr.removeClass('shown');
- }else{
- // Open this row
- row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+dateTime+'</dt><dd>'+i18n['GINAUDIT0013M']+'</dd><dt>'+type+'</dt><dd>'+i18n['GINAUDIT0014M']+'</dd><dt>'+logMessage+'</dt><dd>'+i18n['GINAUDIT0015M']+'</dd></dl></div>').show();
- $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
- tr.addClass('shown');
- $('.audit-log-details',$('#audit-logs-table tbody')).closest("tr").css("color","black");
- }
- });
-
- //Row selection
- $('#audit-logs-table tbody').on('click', 'tr', function () {
- if($(this).hasClass("selected")){
- $(this).removeClass("selected");
- } else{
- auditLogsTable.$('tr.selected').removeClass('selected');
- $(this).addClass("selected");
- }
- });
-
- $('#log-reset-btn').on('click', function(e) {
- $(".logs-loader").show();
- ginger.getAuditLogs(function(result){
- $("#audit-logs-table tbody").empty();
- $("#audit-logs-table").DataTable().destroy();
- ginger.createAuditLogsTable(result);
- },function(error){
- wok.message.error(data.responseJSON.reason,"#alert-modal-audit-logs-container");
- });
- });
- $(".logs-loader").hide();
-};
-ginger.loadauditDispatcher = function(){
- ginger.getDispatcherPlugin(function(result){
- ginger.createDispatcherPluginTable(result);
- },function(error){
- wok.message.error(data.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- ginger.getDispatcherDetails();
- ginger.getPluginDetails();
-};
-
-ginger.createDispatcherPluginTable = function(data){
- var rows = "";
- if (data.length > 0) {
- $.each(data, function(index, log){
- if(log){
- rows += "<tr><td>" + log['name'] + "</td>";
- if(log['details']['active'] == "yes"){
- active = i18n['GINNET0077M'];
- }else{
- active = i18n['GINNET0078M'];
- }
- rows += "<td>" + active + "</td>";
- rows += "<td style=\"text-align:center;\" class=\"details-control\"><span class=\"fa fa-chevron-down common-down fa-lg\"></span></td>";
- details = log['details'];
- if(details["active"] == "yes"){
- details["active"] = i18n['GINNET0077M'];
- }else{
- details["active"] = i18n['GINNET0078M'];
- }
- rows +="<td>" +JSON.stringify(details)+"</td></tr>";
- }
- });
- }
- $("#audit-disp-plugin-table tbody").html(rows);
-
- var auditDispPluginTable = $("#audit-disp-plugin-table").DataTable({
- columnDefs: [
- {
- orderable: false, targets: [2]
- },
- {
- visible : false, targets: [3]
- }
- ],
- autoWidth:false,
- "dom": '<"row"<"plugin-edit pull-left"><"#dispatcher.pull-left"><"refresh pull-left"><"status-value hidden"><"col-sm-12 filter"<"pull-right"l><"pull-right"f>>><"row"<"col-sm-12"t>><"row"<"col-sm-6 pages"p><"col-sm-6 info"i>>',
- "initComplete": function(settings, json) {
- wok.initCompleteDataTableCallback(settings);
- var editButton = '<button class="btn btn-primary" id="plugin-edit-btn" aria-expanded="false"><i class="fa fa-pencil-square-o">&nbsp;</i>' + i18n['GINNET0074M'] + '</button>';
- var refreshButton = '<button class="btn btn-primary" id="disp-refresh-btn" aria-expanded="false"><i class="fa fa-refresh">&nbsp;</i>' + i18n['GINIS00001M'] + '</button>';
-
- var actionButton = [{
- id: 'dispatch-status-btn'
- },
- {
- id: 'disp-settings-btn',
- class: 'fa fa-cogs',
- label: i18n['GINNET0012M']
- }];
-
- var actionListSettings = {
- panelID: 'dispatcher',
- buttons: actionButton,
- type: 'action'
- };
- ginger.createActionButtons(actionListSettings);
-
- $(".plugin-edit").append(editButton);
- $(".refresh").html(refreshButton);
- $("#action-dropdown-button-dispatcher").empty().append('<i class="fa fa-angle-double-down" style="padding-right:7px;"></i>'+i18n['GINAUDITDISP0012M']);
- $("#action-dropdown-button-dispatcher").css({'height':'38.7px','font-weight':'500','width':'auto','background-color':'#3a393b'});
-
- ginger.getAuditStatus(function(result){
- if(result['dispatcher']!=undefined){
- $("#dispatch-status-btn").empty().html('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
- $(".status-value").text('enabled');
- }else{
- $("#dispatch-status-btn").empty().html('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
- $(".status-value").text('disabled');
- }
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- })
- },
- "oLanguage": {
- "sEmptyTable": i18n['GINAUDIT0012M']
- }
- });
-
- // Add event listener for opening and closing details
- $('#audit-disp-plugin-table tbody').off();
- $('#audit-disp-plugin-table tbody').on('click', 'td.details-control', function () {
- var tr = $(this).closest('tr');
- var row = auditDispPluginTable.row( tr );
- var details = (row.data()[3]!="")?JSON.parse(row.data()[3]):i18n['GINAUDIT0001M'];
-
- $('.audit-log-details',$('#audit-disp-plugin-table tbody')).parent().remove();
- $('.fa-chevron-up',$('#audit-disp-plugin-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- if (row.child.isShown()) {
- // This row is already open - close it
- row.child.hide();
- $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- tr.removeClass('shown');
- }else{
- // Open this row
- var direction = (details['direction']!=undefined)?details['direction']:'--';
- var format = (details['format']!=undefined)?details['format']:'--';
- var args = (details['args']!=undefined)?details['args']:'--';
- var active = (details['active']!=undefined)?details['active']:'--';
- var path = (details['path']!=undefined)?details['path']:'--';
- var type = (details['type']!=undefined)?details['type']:'--';
-
- row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+
- direction+'</dt><dd>'+i18n['GINAUDITDISP0001M']+'</dd><dt>'+
- format+'</dt><dd>'+i18n['GINAUDITDISP0002M']+'</dd><dt>'+
- args+'</dt><dd>'+i18n['GINAUDITDISP0003M']+'</dd><dt>'+
- active+'</dt><dd>'+i18n['GINAUDITDISP0004M']+'</dd><dt>'+
- path+'</dt><dd>'+i18n['GINAUDITDISP0005M']+'</dd><dt>'+
- type+'</dt><dd>'+i18n['GINAUDITDISP0006M']+'</dd>'+
- '</dl></div>').show();
- $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
- tr.addClass('shown');
- $('.audit-log-details',$('#audit-disp-plugin-table tbody')).closest("tr").css('color','black');
- }
- });
-
-
- //Row selection
- $('#audit-disp-plugin-table tbody').on('click', 'tr', function () {
- if($(this).hasClass("selected")){
- $(this).removeClass("selected");
- }else{
- auditDispPluginTable.$('tr.selected').removeClass('selected');
- $(this).addClass("selected");
- }
- });
-
- $('#disp-refresh-btn').off();
- $('#disp-refresh-btn').on('click', function(e) {
- $(".dispatcher-loader").show();
- ginger.getDispatcherPlugin(function(result){
- $("#audit-disp-plugin-table tbody").empty();
- $("#audit-disp-plugin-table").DataTable().destroy();
- ginger.createDispatcherPluginTable(result);
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- });
-
- $("#dispatch-status-btn").off();
- $("#dispatch-status-btn").on('click',function(e){
- var getCurrentStatus = $(".status-value").text();
- var action = (getCurrentStatus=='enabled')?'disable':'enable';
- ginger.changeAuditDispatcherStatus(action,function(result){
- if(result['dispatcher']!=undefined){
- $("#dispatch-status-btn").empty().append('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
- wok.message.success(i18n['GINAUDITDISP0013M'],"#alert-modal-audit-dispatcher-container");
- $(".status-value").text('enabled');
- }else{
- $("#dispatch-status-btn").empty().append('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
- wok.message.success(i18n['GINAUDITDISP0014M'],"#alert-modal-audit-dispatcher-container");
- $(".status-value").text('disabled');
- }
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- });
-
- $("#plugin-edit-btn").off();
- $("#plugin-edit-btn").on('click',function(){
- var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
- if(selectedRowsData.length>0){
- $("#auditPluginDetails").modal("show");
- }else{
- var settings = {
- content: i18n['GINAUDITDISP0009M'],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function(){},function(){});
- }
- });
-
- $("#disp-settings-btn").off();
- $("#disp-settings-btn").on('click',function(){
- $("#auditDisprConf").modal("show");
- });
- $(".dispatcher-loader").hide();
-};
-
-ginger.getDispatcherDetails = function(){
- $('#auditDisprConf').on('show.bs.modal', function(event) {
-
- ginger.getDispatcherConfiguration(function(result){
- $("#overflowAction").val(result["overflow_action"]);
- $("#priorityBoost").val(result["priority_boost"]);
- $("#qDepth").val(result["q_depth"]);
- $("#maxRestarts").val(result["max_restarts"]);
- $("#nameFormat").val(result["name_format"]);
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
-
- $("#disp-conf-button-apply").on("click",function(){
- var params = {};
- params['overflow_action'] = $("#overflowAction").val();
- params['priority_boost'] = $("#priorityBoost").val();
- params['q_depth'] = $("#qDepth").val();
- params['max_restarts'] = $("#maxRestarts").val();
- params['name_format'] = $("#nameFormat").val();
-
- ginger.updateDispatcherConfiguration(params, function(result){
- $('#auditDisprConf').modal('hide');
- wok.message.success(i18n['GINAUDITDISP0007M'],"#alert-modal-audit-dispatcher-container");
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-disp-conf-container");
- });
- });
- });
-
- $('#auditDisprConf').on('hide.bs.modal', function(event) {
- $("#disp-conf-button-apply").off();
- });
-};
-
-ginger.getPluginDetails = function(){
- $('#auditPluginDetails').on('show.bs.modal', function(event) {
- var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
- var pluginDetails = selectedRowsData[0];
- var detailsInfo = JSON.parse(pluginDetails[3]);
- var pluginName = pluginDetails[0];
-
- $("#direction").val(detailsInfo['direction']);
- $("#format").val(detailsInfo['format']);
- $("#args").val(detailsInfo['args']);
- if(detailsInfo['active'] == i18n['GINNET0077M']){
- $("#active").val("yes");
- }else{
- $("#active").val("no");
- }
- $("#path").val(detailsInfo['path']);
- $("#type").val(detailsInfo['type']);
- $("#active").selectpicker();
- $('#active').selectpicker('refresh');
-
-
-
- $("#plugin-update-button-apply").on("click",function(){
- var params = {};
- params['direction'] = $("#direction").val();
- params['format'] = $("#format").val();
- params['args'] = $("#args").val();
- params['active'] = $("#active").val();
- params['path'] = $("#path").val();
- params['type'] = $("#type").val();
-
- ginger.updateDispatcherPlugin(pluginName, params, function(result){
- $('#auditPluginDetails').modal('hide');
- wok.message.success((i18n['GINAUDITDISP0008M']).replace("%1",pluginName),"#alert-modal-audit-dispatcher-container");
- $(".dispatcher-loader").show();
- ginger.getDispatcherPlugin(function(result){
- $("#audit-disp-plugin-table tbody").html("");
- $("#audit-disp-plugin-table").DataTable().destroy();
- ginger.createDispatcherPluginTable(result);
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-plugin-container");
- });
- });
- });
-
- $('#auditPluginDetails').on('hide.bs.modal', function(event) {
- $("#plugin-update-button-apply").off();
- });
-};
-
-ginger.populateFilterOptions = function(row){
- var optionsList =
- {'-a':i18n['GINAUDIFILTER0001M'],
- '--arch':i18n['GINAUDIFILTER0002M'],
- '-c':i18n['GINAUDIFILTER0003M'],
- '--debug':i18n['GINAUDIFILTER0004M'],
- '-e':i18n['GINAUDIFILTER0005M'],
- '-f':i18n['GINAUDIFILTER0006M'],
- '-gi':i18n['GINAUDIFILTER0007M'],
- '-hn':i18n['GINAUDIFILTER0008M'],
- '--just-one':i18n['GINAUDIFILTER0009M'],
- '-k':i18n['GINAUDIFILTER0010M'],
- '-m':i18n['GINAUDIFILTER0011M'],
- '-p':i18n['GINAUDIFILTER0012M'],
- '-pp':i18n['GINAUDIFILTER0013M'],
- '-r':i18n['GINAUDIFILTER0014M'],
- '-sc':i18n['GINAUDIFILTER0015M'],
- '--session':i18n['GINAUDIFILTER0016M'],
- '-sv':i18n['GINAUDIFILTER0017M'],
- '-te':i18n['GINAUDIFILTER0018M'],
- '-ts':i18n['GINAUDIFILTER0019M'],
- '-tm':i18n['GINAUDIFILTER0020M'],
- '-ui':i18n['GINAUDIFILTER0021M'],
- '-ul':i18n['GINAUDIFILTER0022M'],
- '-uu':i18n['GINAUDIFILTER0023M'],
- '-vm':i18n['GINAUDIFILTER0024M'],
- '-w':i18n['GINAUDIFILTER0025M'],
- '-x':i18n['GINAUDIFILTER0026M']};
-
- var filterField = $('.selectpicker',row);
- $.each(optionsList,function(key,value){
- filterField.append($("<option></option>")
- .attr("value", key.replace(/"/g, ""))
- .text(value.replace(/"/g, "")));
- });
- filterField.selectpicker();
-};
-
-ginger.populateReportOptions = function(row){
- var detailReportOptionsList =
- {'-au':i18n['GINAUDIREPORT0001M'],
- '-a':i18n['GINAUDIREPORT0002M'],
- '--comm':i18n['GINAUDIREPORT0003M'],
- '-c':i18n['GINAUDIREPORT0004M'],
- '-cr':i18n['GINAUDIREPORT0005M'],
- '-e':i18n['GINAUDIREPORT0006M'],
- '-f':i18n['GINAUDIREPORT0007M'],
- '-h':i18n['GINAUDIREPORT0008M'],
- '--integrity':i18n['GINAUDIREPORT0009M'],
- '-k':i18n['GINAUDIREPORT0010M'],
- '-l':i18n['GINAUDIREPORT0011M'],
- '-m':i18n['GINAUDIREPORT0012M'],
- '-ma':i18n['GINAUDIREPORT0013M'],
- '-n':i18n['GINAUDIREPORT0014M'],
- '-p':i18n['GINAUDIREPORT0015M'],
- '-r':i18n['GINAUDIREPORT0016M'],
- '-s':i18n['GINAUDIREPORT0017M'],
- '--success':i18n['GINAUDIREPORT0018M'],
- '-t':i18n['GINAUDIREPORT0019M'],
- '--tty':i18n['GINAUDIREPORT0020M'],
- '-tm':i18n['GINAUDIREPORT0021M'],
- '-u':i18n['GINAUDIREPORT0022M'],
- '--virt':i18n['GINAUDIREPORT0023M'],
- '-x':i18n['GINAUDIREPORT0024M']};
-
- var summaryReportOptionList = {'--failed':i18n['GINAUDIREPORT0025M'],
- '-nc':i18n['GINAUDIREPORT0026M'],
- '-te':i18n['GINAUDIREPORT0027M'],
- '-ts':i18n['GINAUDIREPORT0028M']};
-
- var type = $('#reportType').val();
-
- var optionsList = (type=='detailed')?detailReportOptionsList:summaryReportOptionList;
- var filterField = $('#log-report-fields',row);
-
- $.each(optionsList,function(key,value){
- filterField.append($("<option></option>")
- .attr("value", key.replace(/"/g, ""))
- .text(value.replace(/"/g, "")));
- });
- filterField.selectpicker();
-};
-
-ginger.initFilterInfo = function(){
- $('#auditlogFilter').on('show.bs.modal', function(event) {
- $('#log-filter-title').text(i18n['GINAUDIT0011M']);
- $('#log-path-info','#auditlogFilter').val("/var/log/audit/audit.log");
-
- var attachEvent = function(row) {
- $(".delete", row).on("click", function() {
- row.remove();
-
- if($('#newRow').children().length===0)
- $("#filterList",'#auditlogFilter').addClass('hidden');
- });
-
- ginger.populateFilterOptions(row);
-
- $('.selectpicker',row).change(function(){
- var inputRequiredFieldsList = ['-a','--arch','-c','-e','-f','-ga','-ge','-gi','-hn','-k','-m','-n','-o','-p','-pp','-sc','-se','--session','-su','-sv','-tm','-ua','-ue','-ui','-ul','-uu','-vm','-x'];
- var selectedValue = $(this).val();
-
- if(selectedValue=="-te" || selectedValue=="-ts" ){
- var textField = $('input[type=text]',row);
- if(textField.length!=0){
- var parentDiv = textField.parent();
- textField.remove();
- parentDiv.show();
- var selectOptionHtml = $.parseHTML('<select class="selectpicker col-md-12 timeOption">'+
- '<option value="now">'+i18n['GINAUDIREPORT0029M']+'</option>'+
- '<option value="recent">'+i18n['GINAUDIREPORT0030M']+'</option>'+
- '<option value="today">'+i18n['GINAUDIREPORT0031M']+'</option>'+
- '<option value="yesterday">'+i18n['GINAUDIREPORT0032M']+'</option>'+
- '<option value="this-week">'+i18n['GINAUDIREPORT0033M']+'</option>'+
- '<option value="week-ago">'+i18n['GINAUDIREPORT0034M']+'</option>'+
- '<option value="this-month">'+i18n['GINAUDIREPORT0035M']+'</option>'+
- '<option value="this-year">'+i18n['GINAUDIREPORT0036M']+'</option>'+
- '</select>');
- parentDiv.append(selectOptionHtml);
- $('.selectpicker',parentDiv).selectpicker();
- }
- }else if(inputRequiredFieldsList.indexOf(selectedValue)===-1){
- var textField = $('input[type=text]',row);
- if(textField.length==0){
- if($('.timeOption',row).length!=0){
- $('.timeOption',row).parent().append('<input type="text" class="form-control input" placeholder="'+i18n['GINAUDIT0010M']+'" />');
- $('.timeOption',row).remove();
- }
- }
- $('input[type=text]',row).val("").parent().hide();
- }else{
- var textField = $('input[type=text]',row);
- if(textField.length==0){
- if($('.timeOption',row).length!=0){
- $('.timeOption',row).parent().append('<input type="text" class="form-control input" placeholder="'+i18n['GINAUDIT0010M']+'" />');
- $('.timeOption',row).remove();
- }
- }
- textField.attr("disabled",false);
- $('input[type=text]',row).val("").parent().show();
- }
- });
- };
-
- $(".add-filter",'#auditlogFilter').on("click", function(e) {
- e.preventDefault();
- e.stopImmediatePropagation();
- $("#filterList").removeClass("hidden");
-
- var newNode = $.parseHTML('<div class="row" style="margin-bottom:5px;">'+
- '<div class="col-md-5">' +
- '<select class="selectpicker col-md-10" id="log-filter-fields">'+
- '</select>' +
- '</div>'+
- '<div class="col-md-5">'+
- '<input type="text" class="form-control input" placeholder="'+i18n['GINAUDIT0010M']+'" style="height:40px;"/>' +
- '</div>'+
- '<div class="col-md-2">'+
- '<span class="column-delete btn btn-link delete del-label" style="float:right;">' +
- '<i class="fa fa-trash"></i></span>' +
- '</div>'+
- '</div>'+
- '</div>');
-
- $('#newRow','#auditlogFilter').append(newNode);
- attachEvent($(newNode));
- });
-
- $('#log-filter-button-apply').on('click',function(){
- $(".logs-loader").show();
- $('.Audit-log-loader').show();
- var filterarray = [];
- var filtervaluearray = [];
- var filterarray_len,sortarray_len;
- var valuecheck,filtercheck;
- $('#newRow div.row','#auditlogFilter').each(function(){
- filterarray.push($('.selectpicker',$(this)).val());
- filtercheck = $('.selectpicker',$(this)).val();
- if(filtercheck == "-te" || filtercheck =="-ts"){
- filtervaluearray.push("eventfilter");
- } else if($('input[type=text]',$(this)).parent().css('display') != 'none'){
- filtervaluearray.push($('input[type=text]',$(this)).val());
- }
- });
- for (var i=0; i<filtervaluearray.length; i++){
- if(filtervaluearray[i].length == 0)
- valuecheck = 1;
- }
- filterarray_len = filterarray.length;
- var sortarray = $.unique(filterarray.sort()).sort();
- sortarray_len = sortarray.length;
- if(filterarray_len != sortarray_len){
- wok.message.error(i18n['GINAUDIFILTER0027M'],"#addfielderror-message");
- $('.Audit-log-loader').hide();
- } else if(valuecheck == 1){
- $('.Audit-log-loader').hide();
- wok.message.error(i18n['GINAUDIFILTER0028M'],"#addfielderror-message");
- } else {
- var params = '';
- var logFile= ($('#log-path-info',"#auditlogFilter").val()!='')?'-if '+ $('#log-path-info').val():'';
- params+=logFile;
-
- if($('input[type=checkbox]:checked',$('#auditlogFilter')).length!==0){
- params.length>0?params+=' -i':params+='-i';
- }
-
- $('#newRow div.row','#auditlogFilter').each(function(){
- var field = $('.selectpicker',$(this)).val();
- var value = "";
-
- if($('.timeOption',$(this)).length!=0){
- value = $('.timeOption',$(this)).find('option:selected').val();
- } else {
- value = $('input[type=text]',$(this)).val();
- }
- var inputRequiredFieldsList = ['-a','--arch','-c','-e','-f','-ga','-ge','-gi','-hn','-k','-m','-n','-o','-p','-pp','-sc','-se','--session','-su','-sv','-tm','-ua','-ue','-ui','-ul','-uu','-vm','-x'];
- if(inputRequiredFieldsList.indexOf(field)!=-1){
- if(value!=''){
- if(params.length>0){
- params+=" ";
- }
- params+=field+" "+value;
- }
- }else{
- if(params.length>0){
- params+=" ";
- }
- params+=field+(value!=''?(" "+value):'');
- }
-
- });
-
- if(params==''){
- ginger.getAuditLogs(function(result){
- reloadAuditLogs(result);
- },function(error){
- $('.Audit-log-loader').hide();
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
- });
- }else{
- ginger.filterAuditLogs(params,function(result){
- reloadAuditLogs(result);
- },function(error){
- $('.Audit-log-loader').hide();
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
- });
- }
-
- var reloadAuditLogs = function(result){
- $('#auditlogFilter').modal('hide');
- wok.message.success(i18n['GINAUDIT0016M'],"#alert-modal-audit-logs-container");
- $("#audit-logs-table tbody").empty();
- $("#audit-logs-table").DataTable().destroy();
- ginger.createAuditLogsTable(result);
- }
- }
- });
- });
-
- $('#auditlogFilter').on('hide.bs.modal', function(event) {
- $(".logs-loader").hide();
- $('.Audit-log-loader').hide();
- $('#log-path-info',$(this)).val('');
- $('#newRow',$(this)).empty();
- $('#interpret',$(this)).attr('checked',false);
- $('#log-filter-button-apply').off();
- $("#addfielderror-message").empty();
- $("#alert-modal-audit-filter-container").empty();
- });
-};
-
-ginger.initSummaryInfo = function(){
- $('#auditlogReport').on('show.bs.modal', function(event) {
- $("#reportType").selectpicker();
- $('#log-path-info','#auditlogReport').val("/var/log/audit/audit.log");
-
- var attachEvent = function(row) {
- $(".delete", row).on("click", function() {
- row.remove();
-
- if($('#newRow','#auditlogReport').children().length===0)
- $("#filterList",'#auditlogReport').addClass('hidden');
- });
-
- ginger.populateReportOptions(row);
-
- $('#log-report-fields.selectpicker',row).change(function(){
- var selectedValue = $(this).val();
- if(selectedValue=="-te" || selectedValue=="-ts" ){
-
- var optionDropdown = $('select.timeOption',row);
- optionDropdown.empty();
- var selectOptionHtml = $.parseHTML('<option value="now">'+i18n['GINAUDIREPORT0029M']+'</option>'+
- '<option value="recent">'+i18n['GINAUDIREPORT0030M']+'</option>'+
- '<option value="today">'+i18n['GINAUDIREPORT0031M']+'</option>'+
- '<option value="yesterday">'+i18n['GINAUDIREPORT0032M']+'</option>'+
- '<option value="this-week">'+i18n['GINAUDIREPORT0033M']+'</option>'+
- '<option value="week-ago">'+i18n['GINAUDIREPORT0034M']+'</option>'+
- '<option value="this-month">'+i18n['GINAUDIREPORT0035M']+'</option>'+
- '<option value="this-year">'+i18n['GINAUDIREPORT0036M']+'</option>');
- optionDropdown.append(selectOptionHtml);
- optionDropdown.selectpicker();
- $('.timeOption',row).show();
- }else{
- var optionDropdown = $('.timeOption',row);
- optionDropdown.hide();
- }
- });
- };
-
- $(".add-filter",'#auditlogReport').on("click", function(e) {
- e.preventDefault();
- e.stopImmediatePropagation();
- $("#filterList",'#auditlogReport').removeClass("hidden");
-
- var newNode = $.parseHTML('<div class="row" style="margin-bottom:5px;">'+
- '<div class="col-md-5">' +
- '<select class="selectpicker col-md-10" id="log-report-fields">'+
- '</select>' +
- '</div>'+
- '<div class="col-md-5">'+
- '<select class="selectpicker col-md-10 timeOption">'+
- '</select>' +
- '</div>'+
- '<div class="col-md-2">'+
- '<span class="column-delete btn btn-link delete del-label" style="float:right">' +
- '<i class="fa fa-trash"></i></span>' +
- '</div>'+
- '</div>'+
- '</div>');
-
- $('#newRow','#auditlogReport').append(newNode);
- attachEvent($(newNode));
- });
-
- $("#reportType").change(function(){
- $('#newRow','#auditlogReport').empty();
- $('#filterList','#auditlogReport').addClass('hidden');
- });
-
- $('#log-report-button-apply').on('click',function(e){
- e.preventDefault();
- e.stopImmediatePropagation();
- $('.report-loader').show();
- var reportarray = [];
- var reportarray_len,repsortarray_len;
- var filtercheck;
- $('#newRow div.row','#auditlogReport').each(function(){
- reportarray.push($('.selectpicker',$(this)).val());
- });
- reportarray_len = reportarray.length;
- var repsortarray = $.unique(reportarray.sort()).sort();
- repsortarray_len = repsortarray.length;
- if(reportarray_len != repsortarray_len){
- $('.report-loader').hide();
- wok.message.error(i18n['GINAUDIFILTER0029M'],"#Filterfielderror-message");
- $('#summaryreport').empty();
- } else {
- var params = '';
- var logFile= ($('#log-path-info','#auditlogReport').val()!='')?'-if '+ $('#log-path-info','#auditlogReport').val():'';
- params+=logFile;
-
- if($('input[type=checkbox]:checked',$('#auditlogReport')).length!==0){
- params.length>0?params+=' -i':params+='-i';
- }
-
- $('#newRow div.row','#auditlogReport').each(function(){
- if(params.length>0){
- params+=" ";
- }
- var field = $('.selectpicker',$(this)).val();
- var value = "";
-
- if($('.timeOption',$(this)).length!=0){
- value = $('.timeOption',$(this)).find('option:selected').val();
- }
- params+=field+(value!=undefined?(" "+value):'');
- });
-
- if(params==''){
- ginger.getAuditSummaryReport(function(result){
- populateReport(result);
- },function(error){
- $('.report-loader').hide();
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-report-container");
- $('#summaryreport').empty();
- })
- }else{
- ginger.getAuditReport(params,function(result){
- populateReport(result);
- },function(error){
- $('.report-loader').hide();
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-report-container");
- $('#summaryreport').empty();
- });
- }
-
- var populateReport = function(result){
- $('#report-details').removeClass("hidden").focus();
- $('#summaryreport').empty();
- var columnInfo = {};
- var summary = [];
-
- if(result.length>1){
- columnInfo = result[0]["column_info"];
- summary = result[1]["summary"];
- $("#report-graph-button").removeClass("hidden");
- }else{
- summary = result[0]["summary"];
- $("#report-graph-button").addClass("hidden");
- }
-
- var details = "";
- $.each(summary,function(index,info){
- if(info!=""){
- details+=info+"<br>";
- }
- });
-
- ginger.initGraphDetails(columnInfo);
- $('#summaryreport').append(details);
- $("#summaryReportPathInfo").html(i18n['GINAUDIT0017M']).removeClass('hidden');
- $('.report-loader').hide();
- }
- }
- });
-
- $("#report-download-button").on("click",function(e){
- var reportFilePath = '/data/logs/audit_summary_report.txt';
- window.open(reportFilePath, '_blank');
- });
- });
-
- $('#auditlogReport').on('hide.bs.modal', function(event) {
- $('#log-path-info',$(this)).val('');
- $('#newRow',$(this)).empty();
- $('#interpret',$(this)).attr('checked',false);
- $('#log-report-button-apply').off();
- $("#report-download-button").off();
- $("#report-graph-button").off();
- $('#summaryreport').empty();
- $('#summaryReportPathInfo').empty().hide();
- $("#report-details").addClass("hidden");
- $("#Filterfielderror-message").empty();
- $("#alert-modal-audit-report-container").empty();
- });
-};
-ginger.initGraphDetails = function(columnInfo){
- $('#reportGraph').on('show.bs.modal', function(event) {
- $("#graphPathInfo").addClass("hidden");
- $("#graph-name").val(i18n['GINAUDIT0020M']);
- $("#generate-report-graph-button").addClass("hidden");
- var graphColumns = $("#graphColumns");
- graphColumns.empty().selectpicker('destroy');
- $.each(columnInfo,function(key,value){
- graphColumns.append($("<option></option>")
- .attr("value",value)
- .text(key.replace(/"/g, "")));
- });
- graphColumns.selectpicker();
-
- var checkFields = function(){
- if($("#graphColumns").val()!=null && $("#graphColumns").val().length==2 && $("#graphFormat").val()!="" && $("#graph-name").val()!=""){
- $("#generate-report-graph-button").removeClass("hidden");
- }else{
- $("#generate-report-graph-button").addClass("hidden");
- }
- }
-
- $("#graphFormat").selectpicker();
-
- $("#graphColumns").change(function(e){
- checkFields();
- });
-
- $("#graph-name").keyup(function(e){
- checkFields();
- });
-
- $("#generate-report-graph-button").on('click',function(e){
- e.preventDefault();
- e.stopImmediatePropagation();
- $("#graph").empty();
- var columns = $("#graphColumns").val();
- var format = $("#graphFormat").val();
- var graphName = $("#graph-name").val();
- var params = graphName+","+columns.toString()+","+format;
- ginger.getReportGraph(params,function(result){
- var graphLocation = result[0]['Graph:'];
- $("#graphPathInfo").html(i18n['GINAUDIT0018M'].replace("%1",graphLocation).replace("data","var/lib/wok")).removeClass("hidden");
- window.open(graphLocation, '_blank');
- },function(error){
- wok.message.error(data.responseJSON.reason,"#alert-modal-audit-graph-container");
- });
- });
- });
-
- $('#reportGraph').on('hide.bs.modal', function(event) {
- $("#graphColumns").selectpicker('deselectAll');
- $("#graphColumns").selectpicker('destroy');
- $("#graphFormat").selectpicker('destroy');
- $("#graph-name").val('');
- $("#graph").empty();
- $("#generate-report-graph-button").off();
- });
- };
ginger.initAdmin = function() {
$(".content-area", "#gingerHostAdmin").css("height", "100%");
ginger.getCapabilities(function(result) {
@@ -2242,9 +946,6 @@ ginger.initAdmin = function() {
case "users":
ginger.initUserManagement();
break;
- case "audit":
- ginger.initAuditRules();
- break;
}
} else {
$("." + itemLowCase + "-ppc-enabled").hide();
diff --git a/ui/js/host-audit.js b/ui/js/host-audit.js
new file mode 100644
index 0000000..39b4cf6
--- /dev/null
+++ b/ui/js/host-audit.js
@@ -0,0 +1,1280 @@
+/*
+ * Copyright IBM Corp, 2017
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ginger.initAudit = function() {
+ $(".content-area", "#gingerHostAudit").css("height", "100%");
+ $(".audit-ppc-enabled").show();
+ ginger.loadAuditRulesData();
+ ginger.loadAuditlogsData();
+ ginger.loadAuditDispatcher();
+};
+
+ginger.loadAuditRulesData = function() {
+ $(".rules-loader").show();
+ ginger.getAuditRules(function(result) {
+
+ if (result.length > 0) {
+ var rows = "";
+ $.each(result, function(index, rule) {
+ rows += "<tr><td>" + (index+1) + "</td>";
+ if (rule.type == "System Call Rule") {
+ type = i18n['GINAUDIT0078M'];
+ } else if (rule.type == "Control Rule") {
+ type = i18n['GINAUDIT0079M'];
+ } else if (rule.type == "File System Rule") {
+ type = i18n['GINAUDIT0080M'];
+ }
+ rows += "<td>" + type + "</td>";
+ var ruleDetails = rule.rule;
+ var titleValue = "";
+ var syscallStartIndex = ruleDetails.indexOf("-S");
+
+ if (ruleDetails.substring(syscallStartIndex,ruleDetails.indexOf("-F",syscallStartIndex)).split(",").length > 10) {
+ titleValue=ruleDetails.replace(/.{70}/g,"$&"+"\n");
+ } else {
+ titleValue = ruleDetails;
+ }
+ rows += "<td class=\"content\" title=\""+titleValue+"\">" + ruleDetails + "</td>";
+ rows += "<td style=\"text-align:center;\" class=\"details-control\"><span class=\"fa fa-chevron-down common-down fa-lg\"></span> </td>";
+
+ if (rule.loaded=='yes') {
+ rows +="<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-loaded-enable enabled\"> <i class=\"fa fa-power-off\"></i></span></td>"
+ } else if (rule.loaded=='no') {
+ rows +="<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-loaded-disable disabled\"> <i class=\"fa fa-power-off\"></i></span></td>";
+ } else {
+ rows +="<td style=\"text-align:center;\" class=\"loaded\">--</td>";
+ }
+
+ if (rule.persisted=='yes') {
+ rows += "<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-persisted-enable enabled\"> <i class=\"fa fa-floppy-o\"></i></span></td>"
+ } else if (rule.persisted=='no') {
+ rows +="<td style=\"text-align:center;\" class=\"loaded\"><span class=\"audit-rules-persisted-disable disabled\"> <i class=\"fa fa-floppy-o\"></i></span></td>";
+ } else {
+ rows +="<td style=\"text-align:center;\" class=\"loaded\">--</td>";
+ }
+
+ if (rule.rule_info) {
+ rows += "<td>" + JSON.stringify(rule.rule_info) + "</td>";
+ } else {
+ rows += "<td></td>";
+ }
+ rows += "<td>" + rule.persisted + "</td>";
+ rows += "<td>" + rule.loaded + "</td></tr>";
+ });
+ $("#audit-rules-table tbody").html(rows);
+ }
+
+ var auditRulesTable = $("#audit-rules-table").DataTable({
+ columnDefs: [{"width":"10%", "targets" : 0},
+ {"width":"15%", "targets" : 1},
+ {"width":"45%", "targets" : 2},
+ {"width":"10%", "targets" : 3},
+ {"width":"10%", "targets" : 4},
+ {"width":"10%", "targets" : 5},
+ {orderable: false, targets: [3,4,5]},
+ {visible : false, targets: [6,7,8]}],
+ autoWidth:false,
+ "initComplete": function(settings, json) {
+ wok.initCompleteDataTableCallback(settings);
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINNET0063M']
+ }
+ });
+ // Add event listener for opening and closing details
+ $('#audit-rules-table tbody').on('click', 'td.details-control', function () {
+ //,td span.fa
+ var tr = $(this).closest('tr');
+ var row = auditRulesTable.row( tr );
+ var ruleInfo = (row.data()[6]!="")?JSON.parse(row.data()[6]):i18n['GINAUDIT0001M'];
+
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ ginger.ruleDetailsPopulation(ruleInfo,row);
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-rules-details',$("#audit-rules-table tbody")).closest("tr").css("color","black");
+ }
+ });
+
+ //Row selection
+ $('#audit-rules-table tbody').on('click', 'tr', function () {
+ $(this).toggleClass("selected");
+ });
+
+ $(".rules-loader").hide();
+ }, function(err) {
+ $(".rules-loader").hide();
+ wok.message.error(err.responseJSON.reason, '#alert-modal-audit-rules-container');
+ });
+};
+
+$('#audit-rule-add-btn').click(function() {
+ wok.window.open('plugins/ginger/host-admin-addAuditRule.html');
+});
+
+$('#Audit-Rule-Configure-btn').click(function() {
+ wok.window.open('plugins/ginger/host-admin-ConfigAuditRule.html');
+});
+
+$('#Audit-Rule-Import-btn').click(function() {
+ wok.window.open('plugins/ginger/host-admin-ImportAuditRule.html');
+});
+
+$('#Audit-Rule-Edit-btn').click(function() {
+ var auditRulesTable = $('#audit-rules-table').DataTable();
+ if (auditRulesTable.rows('.selected').data().length == 0 || auditRulesTable.rows('.selected').data().length > 1) {
+ var settings = {
+ content: i18n["GINAUDIT0030M"],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {}, function() {});
+ } else {
+ var selectedRowsData = auditRulesTable.rows('.selected').data();
+ var ruleName,ruleValue;
+ var persistcheck;
+ var ruleCheck = "";
+ $.each(selectedRowsData, function(index, value) {
+ ruleName = value[1];
+ ruleValue = value[2];
+ persistcheck = value[7];
+ });
+ for (var i = 0; i < ruleValue.length; i++) {
+ if (ruleValue[i] != " ") {
+ ruleCheck = ruleCheck + ruleValue[i];
+ } else {
+ break;
+ }
+ }
+ if (ruleCheck == "-e" || ruleCheck == "-D") {
+ wok.message.error("Cant edit these rules", "#audit-message", true);
+ } else {
+ if (persistcheck == "no") {
+ var settings = {
+ content: i18n["GINAUDIT0031M"],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {}, function() {});
+ } else {
+ if (ruleName==i18n['GINAUDIT0078M']) {
+ ruleName = "System Call Rule";
+ } else if (ruleName==i18n['GINAUDIT0079M']) {
+ ruleName = "Control Rule";
+ } else if (ruleName==i18n['GINAUDIT0080M']) {
+ ruleName = "File System Rule";
+ }
+ if (ruleName == "File System Rule") {
+ wok.window.open('plugins/ginger/host-admin-EditAuditRule.html');
+ } else if (ruleName == "Control Rule") {
+ wok.window.open('plugins/ginger/host-admin-editControlRule.html');
+ } else if (ruleName == "System Call Rule") {
+ wok.window.open('plugins/ginger/host-admin-editSystemRule.html');
+ }
+ }
+ }
+ }
+});
+
+$('#Audit-Rule-refresh-btn').on('click', function() {
+ $('#audit-rules-table tbody').off();
+ $("#audit-rules-table tbody").html("");
+ $("#audit-rules-table").DataTable().destroy();
+ ginger.loadAuditRulesData();
+});
+
+//delete Audit rules
+$('#audit-rule-delete-btn').on('click', function(event) {
+ var auditRulesTable = $('#audit-rules-table').DataTable();
+ if (auditRulesTable.rows('.selected').data().length == 0) {
+ var settings = {
+ content: i18n["GINAUDIT0021M"],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {}, function() {});
+ } else {
+ var selectedRowsData = auditRulesTable.rows('.selected').data();
+ var selectedRowsDataLength = auditRulesTable.rows('.selected').data().length;
+ var selectedRows = [];
+ $.each(selectedRowsData, function(key, value) {
+ selectedRows.push(value[2]);
+ });
+ var settings = {
+ content: i18n["GINAUDIT0022M"] + '<br>' + selectedRows,
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {
+ $.each(selectedRowsData, function(key, value) {
+ if (value[1] == "Control Rule" && value[7] == "no" && value[8] == "yes") {
+ wok.message.error(i18n["GINAUDIT0036M"]+' '+value[2], '#audit-message', true);
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ } else if (value[1] == "Control Rule" && (value[2] == "-D" || value[2].includes("-e"))) {
+ wok.message.error(i18n["GINAUDIT0039M"]+' '+value[2], '#audit-message', true);
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ } else {
+ ginger.deleteAuditRule(value[2], function(result) {
+ if (value[1] == "Control Rule") {
+ wok.message.success(i18n["GINAUDIT0037M"]+' '+value[2], '#audit-message');
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ if (selectedRowsDataLength === 0) {
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ } else {
+ wok.message.success(i18n["GINAUDIT0023M"]+' '+value[2], '#audit-message');
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ if (selectedRowsDataLength === 0) {
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ }
+ }, function(error) {
+ wok.message.error(error.responseJSON.reason, '#audit-message', true);
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ if (selectedRowsDataLength === 0) {
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ });
+ }
+ if (selectedRowsDataLength === 0) {
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ });
+ });
+ }
+});
+
+//audit load
+$('#Audit-Rule-Load-btn').on('click', function(event) {
+ var auditRulesTable = $('#audit-rules-table').DataTable();
+ if (auditRulesTable.rows('.selected').data().length == 0) {
+ var settings = {
+ content: i18n["GINAUDIT0021M"],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {}, function() {});
+ } else {
+ var selectedRowsData = auditRulesTable.rows('.selected').data();
+ var selectedRows = [];
+ $.each(selectedRowsData, function(key, value) {
+ selectedRows.push(value[2]);
+ });
+ var settings = {
+ content: i18n["GINAUDIT0024M"] + '<br>' + selectedRows,
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {
+ $.each(selectedRows, function(index, value) {
+ ginger.LoadAuditRule(value.replace('&lt;','<').replace('&gt;','>'), function(result) {
+ wok.message.success(i18n["GINAUDIT0025M"]+' '+value, '#audit-message');
+ }, function(error) {
+ wok.message.error(error.responseJSON.reason, '#audit-message', true);
+ })
+ });
+ setTimeout(function() {$('#Audit-Rule-refresh-btn').trigger('click')},500);
+ });
+ }
+});
+
+//unload rule
+$('#Audit-Rule-unload-btn').on('click', function(event) {
+ var auditRulesTable = $('#audit-rules-table').DataTable();
+ if (auditRulesTable.rows('.selected').data().length == 0) {
+ var settings = {
+ content: i18n["GINAUDIT0021M"],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {}, function() {});
+ } else {
+ var selectedRowsData = auditRulesTable.rows('.selected').data();
+ var selectedRows = [];
+ $.each(selectedRowsData, function(key, value) {
+ selectedRows.push(value[2]);
+ });
+ var settings = {
+ content: i18n["GINAUDIT0026M"] + '<br>' + selectedRows,
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {
+ $.each(selectedRowsData, function(index, value) {
+ if (value[1] == "Control Rule") {
+ wok.message.error(i18n["GINAUDIT0038M"], '#audit-message', true);
+ } else {
+ ginger.UnLoadAuditRule(value[2].replace('&lt;','<').replace('&gt;','>'), function(result) {
+ wok.message.success(i18n["GINAUDIT0027M"]+' '+value[2], '#audit-message');
+ }, function(error) {
+ wok.message.error(error.responseJSON.reason, '#audit-message', true);
+ })
+ }
+ });
+ setTimeout(function() {$('#Audit-Rule-refresh-btn').trigger('click')},500);
+ });
+ }
+});
+
+//persist audit
+$('#Audit-Rule-Persist-btn').on('click', function(event) {
+ var auditRulesTable = $('#audit-rules-table').DataTable();
+ if (auditRulesTable.rows('.selected').data().length == 0) {
+ var settings = {
+ content: i18n["GINAUDIT0021M"],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {}, function() {});
+ } else {
+ var selectedRowsData = auditRulesTable.rows('.selected').data();
+ var selectedRows = [];
+ $.each(selectedRowsData, function(key, value) {
+ selectedRows.push(value[2]);
+ });
+ var settings = {
+ content: i18n["GINAUDIT0028M"] + '<br>' + selectedRows,
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {
+ $.each(selectedRows, function(key, value) {
+ ginger.PersistAuditRule(value.replace('&lt;','<').replace('&gt;','>'), function(result) {
+ wok.message.success(i18n["GINAUDIT0029M"]+' '+value, '#audit-message');
+ }, function(error) {
+ wok.message.error(error.responseJSON.reason, '#audit-message', true);
+ })
+ });
+ setTimeout(function() {$('#Audit-Rule-refresh-btn').trigger('click')},500);
+ });
+ }
+});
+
+ginger.ruleDetailsPopulation = function(data , row) {
+ var text='';
+ var value;
+ var ruleDetails = '';
+ if (typeof data === 'object') {
+ $.each(data, function(key, obj) {
+ value = obj;
+ switch (key) {
+ case "action":
+ text = i18n['GINAUDIT0002M'];
+ break;
+ case "filter":
+ text = i18n['GINAUDIT0003M'];
+ break;
+ case "systemcall":
+ text = i18n['GINAUDIT0004M'];
+ if (value.length > 10) {
+ value=value.toString().replace(/.{70}/g,"$&"+"\n");
+ }
+ break;
+ case "field":
+ text = i18n['GINAUDIT0005M'];
+ if (value.length > 10) {
+ value=value.toString().replace(/.{70}/g,"$&"+"\n");
+ }
+ break;
+ case "key":
+ text = i18n['GINAUDIT0006M'];
+ break;
+ default:
+ text = key;
+ }
+
+ var detailsHtml = ['<div>',
+ '<span class="column-'+key+'">',
+ '<span class="header-'+key+'">'+text+'</span>',
+ '<span class="row-'+key+'">'+value+'</span>',
+ '</span>',
+ '</div>'].join('');
+ ruleDetails+=detailsHtml;
+ });
+ row.child('<div class="audit-rules-details" style="display: block;"><div class="details-list">'+ruleDetails+'</div></div>').show();
+ } else {
+ ruleDetails = data;
+ row.child('<div class="audit-rules-details" style="display: block;"><div class="noRuleInfo">'+ruleDetails+'</div></div>').show();
+ }
+};
+
+ginger.loadAuditlogsData = function() {
+ $(".logs-loader").show();
+ ginger.getAuditLogs(function(result) {
+ ginger.createAuditLogsTable(result);
+ },function(err) {
+ $(".logs-loader").hide();
+ wok.message.error(err.responseJSON.reason, '#alert-modal-audit-logs-container');
+ });
+
+ ginger.initFilterInfo();
+ ginger.initSummaryInfo();
+};
+
+ginger.createAuditLogsTable = function(data) {
+ var rows = "";
+ if (data.length > 0) {
+ $.each(data, function(index, log) {
+ var logDetails = log['record'+(index+1)];
+ if (logDetails) {
+ rows += "<tr><td>" + logDetails['Date and Time'] + "</td>";
+ rows += "<td>" + logDetails['TYPE'] + "</td>";
+ rows += "<td class=\"content\">" + logDetails['MSG']+ "</td>";
+ rows += "<td style=\"text-align:center;\" class=\"details-control\"><span class=\"fa fa-chevron-down common-down fa-lg\"></span> </td></tr>";
+ }
+ });
+ }
+ $("#audit-logs-table tbody").html(rows);
+
+ var auditLogsTable = $("#audit-logs-table").DataTable({
+ columnDefs: [
+ {"width":"15%", "targets" : 0},
+ {"width":"15%", "targets" : 1},
+ {"width":"60%", "targets" : 2},
+ {"width":"10%", "targets" : 3},
+ {orderable: false, targets: [3]}],
+ autoWidth:false,
+ "dom": '<"row"<"log-report pull-left"><"log-filter pull-left"><"log-reset pull-left"><"col-sm-12 filter"<"pull-right"l><"pull-right"f>>><"row"<"col-sm-12"t>><"row"<"col-sm-6 pages"p><"col-sm-6 info"i>>',
+ "initComplete": function(settings, json) {
+ wok.initCompleteDataTableCallback(settings);
+ var reportButton = '<button class="btn btn-primary pull-left" id="log-report-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogReport"><i class="fa fa-file-archive-o">&nbsp;</i> ' + i18n['GINAUDIT0008M'] + '</button>';
+ var filterButton = '<button class="btn btn-primary" id="log-filter-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogFilter"><i class="fa fa-filter">&nbsp;</i>' + i18n['GINAUDIT0007M'] + '</button>';
+ var resetButton = '<button class="btn btn-primary" id="log-reset-btn" aria-expanded="false"><i class="fa fa-undo">&nbsp;</i>' + i18n['GINAUDIT0019M'] + '</button>';
+ $(".log-report").html(reportButton);
+ $(".log-filter").append(filterButton);
+ $(".log-reset").html(resetButton);
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINAUDIT0012M']
+ }
+ });
+
+ // Add event listener for opening and closing details
+ $('#audit-logs-table tbody').off();
+ $('#audit-logs-table tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = auditLogsTable.row( tr );
+ var logMessage = (row.data()[2]!="")?row.data()[2]:i18n['GINAUDIT0001M'];
+ var dateTime = (row.data()[0]!="")?row.data()[0]:'';
+ var type = (row.data()[1]!="")?row.data()[1]:'';
+
+ $('.audit-log-details',$('#audit-logs-table tbody')).parent().remove();
+ $('.fa-chevron-up',$('#audit-logs-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+dateTime+'</dt><dd>'+i18n['GINAUDIT0013M']+'</dd><dt>'+type+'</dt><dd>'+i18n['GINAUDIT0014M']+'</dd><dt>'+logMessage+'</dt><dd>'+i18n['GINAUDIT0015M']+'</dd></dl></div>').show();
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-log-details',$('#audit-logs-table tbody')).closest("tr").css("color","black");
+ }
+ });
+
+ //Row selection
+ $('#audit-logs-table tbody').on('click', 'tr', function () {
+ if ($(this).hasClass("selected")) {
+ $(this).removeClass("selected");
+ } else {
+ auditLogsTable.$('tr.selected').removeClass('selected');
+ $(this).addClass("selected");
+ }
+ });
+
+ $('#log-reset-btn').on('click', function(e) {
+ $(".logs-loader").show();
+ ginger.getAuditLogs(function(result) {
+ $("#audit-logs-table tbody").empty();
+ $("#audit-logs-table").DataTable().destroy();
+ ginger.createAuditLogsTable(result);
+ },function(error) {
+ wok.message.error(data.responseJSON.reason,"#alert-modal-audit-logs-container");
+ });
+ });
+ $(".logs-loader").hide();
+};
+
+ginger.loadAuditDispatcher = function() {
+ ginger.getDispatcherPlugin(function(result) {
+ ginger.createDispatcherPluginTable(result);
+ },function(error) {
+ wok.message.error(data.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ ginger.getDispatcherDetails();
+ ginger.getPluginDetails();
+};
+
+ginger.createDispatcherPluginTable = function(data) {
+ var rows = "";
+ if (data.length > 0) {
+ $.each(data, function(index, log) {
+ if (log) {
+ rows += "<tr><td>" + log['name'] + "</td>";
+ if (log['details']['active'] == "yes") {
+ active = i18n['GINNET0077M'];
+ } else {
+ active = i18n['GINNET0078M'];
+ }
+ rows += "<td>" + active + "</td>";
+ rows += "<td style=\"text-align:center;\" class=\"details-control\"><span class=\"fa fa-chevron-down common-down fa-lg\"></span></td>";
+ details = log['details'];
+ if (details["active"] == "yes") {
+ details["active"] = i18n['GINNET0077M'];
+ } else {
+ details["active"] = i18n['GINNET0078M'];
+ }
+ rows +="<td>" +JSON.stringify(details)+"</td></tr>";
+ }
+ });
+ }
+ $("#audit-disp-plugin-table tbody").html(rows);
+
+ var auditDispPluginTable = $("#audit-disp-plugin-table").DataTable({
+ columnDefs: [
+ {orderable: false, targets: [2]},
+ {visible : false, targets: [3]}],
+ autoWidth:false,
+ "dom": '<"row"<"plugin-edit pull-left"><"#dispatcher.pull-left"><"refresh pull-left"><"status-value hidden"><"col-sm-12 filter"<"pull-right"l><"pull-right"f>>><"row"<"col-sm-12"t>><"row"<"col-sm-6 pages"p><"col-sm-6 info"i>>',
+ "initComplete": function(settings, json) {
+ wok.initCompleteDataTableCallback(settings);
+ var editButton = '<button class="btn btn-primary" id="plugin-edit-btn" aria-expanded="false"><i class="fa fa-pencil-square-o">&nbsp;</i>' + i18n['GINNET0074M'] + '</button>';
+ var refreshButton = '<button class="btn btn-primary" id="disp-refresh-btn" aria-expanded="false"><i class="fa fa-refresh">&nbsp;</i>' + i18n['GINIS00001M'] + '</button>';
+
+ var actionButton = [{id: 'dispatch-status-btn'},
+ {id: 'disp-settings-btn',
+ class: 'fa fa-cogs',
+ label: i18n['GINNET0012M']}];
+
+ var actionListSettings = {
+ panelID: 'dispatcher',
+ buttons: actionButton,
+ type: 'action'
+ };
+ ginger.createActionButtons(actionListSettings);
+
+ $(".plugin-edit").append(editButton);
+ $(".refresh").html(refreshButton);
+ $("#action-dropdown-button-dispatcher").empty().append('<i class="fa fa-angle-double-down" style="padding-right:7px;"></i>'+i18n['GINAUDITDISP0012M']);
+ $("#action-dropdown-button-dispatcher").css({'height':'38.7px','font-weight':'500','width':'auto','background-color':'#3a393b'});
+
+ ginger.getAuditStatus(function(result) {
+ if (result['dispatcher']!=undefined) {
+ $("#dispatch-status-btn").empty().html('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
+ $(".status-value").text('enabled');
+ } else {
+ $("#dispatch-status-btn").empty().html('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
+ $(".status-value").text('disabled');
+ }
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINAUDIT0012M']
+ }
+ });
+
+ // Add event listener for opening and closing details
+ $('#audit-disp-plugin-table tbody').off();
+ $('#audit-disp-plugin-table tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = auditDispPluginTable.row( tr );
+ var details = (row.data()[3]!="")?JSON.parse(row.data()[3]):i18n['GINAUDIT0001M'];
+
+ $('.audit-log-details',$('#audit-disp-plugin-table tbody')).parent().remove();
+ $('.fa-chevron-up',$('#audit-disp-plugin-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ var direction = (details['direction']!=undefined)?details['direction']:'--';
+ var format = (details['format']!=undefined)?details['format']:'--';
+ var args = (details['args']!=undefined)?details['args']:'--';
+ var active = (details['active']!=undefined)?details['active']:'--';
+ var path = (details['path']!=undefined)?details['path']:'--';
+ var type = (details['type']!=undefined)?details['type']:'--';
+
+ row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+
+ direction+'</dt><dd>'+i18n['GINAUDITDISP0001M']+'</dd><dt>'+
+ format+'</dt><dd>'+i18n['GINAUDITDISP0002M']+'</dd><dt>'+
+ args+'</dt><dd>'+i18n['GINAUDITDISP0003M']+'</dd><dt>'+
+ active+'</dt><dd>'+i18n['GINAUDITDISP0004M']+'</dd><dt>'+
+ path+'</dt><dd>'+i18n['GINAUDITDISP0005M']+'</dd><dt>'+
+ type+'</dt><dd>'+i18n['GINAUDITDISP0006M']+'</dd>'+
+ '</dl></div>').show();
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-log-details',$('#audit-disp-plugin-table tbody')).closest("tr").css('color','black');
+ }
+ });
+
+
+ //Row selection
+ $('#audit-disp-plugin-table tbody').on('click', 'tr', function () {
+ if ($(this).hasClass("selected")) {
+ $(this).removeClass("selected");
+ } else {
+ auditDispPluginTable.$('tr.selected').removeClass('selected');
+ $(this).addClass("selected");
+ }
+ });
+
+ $('#disp-refresh-btn').off();
+ $('#disp-refresh-btn').on('click', function(e) {
+ $(".dispatcher-loader").show();
+ ginger.getDispatcherPlugin(function(result) {
+ $("#audit-disp-plugin-table tbody").empty();
+ $("#audit-disp-plugin-table").DataTable().destroy();
+ ginger.createDispatcherPluginTable(result);
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ });
+
+ $("#dispatch-status-btn").off();
+ $("#dispatch-status-btn").on('click',function(e) {
+ var getCurrentStatus = $(".status-value").text();
+ var action = (getCurrentStatus=='enabled')?'disable':'enable';
+ ginger.changeAuditDispatcherStatus(action,function(result) {
+ if (result['dispatcher']!=undefined) {
+ $("#dispatch-status-btn").empty().append('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
+ wok.message.success(i18n['GINAUDITDISP0013M'],"#alert-modal-audit-dispatcher-container");
+ $(".status-value").text('enabled');
+ } else {
+ $("#dispatch-status-btn").empty().append('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
+ wok.message.success(i18n['GINAUDITDISP0014M'],"#alert-modal-audit-dispatcher-container");
+ $(".status-value").text('disabled');
+ }
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ });
+
+ $("#plugin-edit-btn").off();
+ $("#plugin-edit-btn").on('click',function() {
+ var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
+ if (selectedRowsData.length>0) {
+ $("#auditPluginDetails").modal("show");
+ } else {
+ var settings = {
+ content: i18n['GINAUDITDISP0009M'],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {},function() {});
+ }
+ });
+
+ $("#disp-settings-btn").off();
+ $("#disp-settings-btn").on('click',function() {
+ $("#auditDisprConf").modal("show");
+ });
+ $(".dispatcher-loader").hide();
+};
+
+ginger.getDispatcherDetails = function() {
+ $('#auditDisprConf').on('show.bs.modal', function(event) {
+ ginger.getDispatcherConfiguration(function(result) {
+ $("#overflowAction").val(result["overflow_action"]);
+ $("#priorityBoost").val(result["priority_boost"]);
+ $("#qDepth").val(result["q_depth"]);
+ $("#maxRestarts").val(result["max_restarts"]);
+ $("#nameFormat").val(result["name_format"]);
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+
+ $("#disp-conf-button-apply").on("click",function() {
+ var params = {};
+ params['overflow_action'] = $("#overflowAction").val();
+ params['priority_boost'] = $("#priorityBoost").val();
+ params['q_depth'] = $("#qDepth").val();
+ params['max_restarts'] = $("#maxRestarts").val();
+ params['name_format'] = $("#nameFormat").val();
+
+ ginger.updateDispatcherConfiguration(params, function(result) {
+ $('#auditDisprConf').modal('hide');
+ wok.message.success(i18n['GINAUDITDISP0007M'],"#alert-modal-audit-dispatcher-container");
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-disp-conf-container");
+ });
+ });
+ });
+
+ $('#auditDisprConf').on('hide.bs.modal', function(event) {
+ $("#disp-conf-button-apply").off();
+ });
+};
+
+ginger.getPluginDetails = function() {
+ $('#auditPluginDetails').on('show.bs.modal', function(event) {
+ var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
+ var pluginDetails = selectedRowsData[0];
+ var detailsInfo = JSON.parse(pluginDetails[3]);
+ var pluginName = pluginDetails[0];
+
+ $("#direction").val(detailsInfo['direction']);
+ $("#format").val(detailsInfo['format']);
+ $("#args").val(detailsInfo['args']);
+ if (detailsInfo['active'] == i18n['GINNET0077M']) {
+ $("#active").val("yes");
+ } else {
+ $("#active").val("no");
+ }
+ $("#path").val(detailsInfo['path']);
+ $("#type").val(detailsInfo['type']);
+ $("#active").selectpicker();
+ $('#active').selectpicker('refresh');
+
+ $("#plugin-update-button-apply").on("click",function() {
+ var params = {};
+ params['direction'] = $("#direction").val();
+ params['format'] = $("#format").val();
+ params['args'] = $("#args").val();
+ params['active'] = $("#active").val();
+ params['path'] = $("#path").val();
+ params['type'] = $("#type").val();
+
+ ginger.updateDispatcherPlugin(pluginName, params, function(result) {
+ $('#auditPluginDetails').modal('hide');
+ wok.message.success((i18n['GINAUDITDISP0008M']).replace("%1",pluginName),"#alert-modal-audit-dispatcher-container");
+ $(".dispatcher-loader").show();
+ ginger.getDispatcherPlugin(function(result) {
+ $("#audit-disp-plugin-table tbody").html("");
+ $("#audit-disp-plugin-table").DataTable().destroy();
+ ginger.createDispatcherPluginTable(result);
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-plugin-container");
+ });
+ });
+ });
+
+ $('#auditPluginDetails').on('hide.bs.modal', function(event) {
+ $("#plugin-update-button-apply").off();
+ });
+};
+
+ginger.populateFilterOptions = function(row) {
+ var optionsList =
+ {'-a':i18n['GINAUDIFILTER0001M'],
+ '--arch':i18n['GINAUDIFILTER0002M'],
+ '-c':i18n['GINAUDIFILTER0003M'],
+ '--debug':i18n['GINAUDIFILTER0004M'],
+ '-e':i18n['GINAUDIFILTER0005M'],
+ '-f':i18n['GINAUDIFILTER0006M'],
+ '-gi':i18n['GINAUDIFILTER0007M'],
+ '-hn':i18n['GINAUDIFILTER0008M'],
+ '--just-one':i18n['GINAUDIFILTER0009M'],
+ '-k':i18n['GINAUDIFILTER0010M'],
+ '-m':i18n['GINAUDIFILTER0011M'],
+ '-p':i18n['GINAUDIFILTER0012M'],
+ '-pp':i18n['GINAUDIFILTER0013M'],
+ '-r':i18n['GINAUDIFILTER0014M'],
+ '-sc':i18n['GINAUDIFILTER0015M'],
+ '--session':i18n['GINAUDIFILTER0016M'],
+ '-sv':i18n['GINAUDIFILTER0017M'],
+ '-te':i18n['GINAUDIFILTER0018M'],
+ '-ts':i18n['GINAUDIFILTER0019M'],
+ '-tm':i18n['GINAUDIFILTER0020M'],
+ '-ui':i18n['GINAUDIFILTER0021M'],
+ '-ul':i18n['GINAUDIFILTER0022M'],
+ '-uu':i18n['GINAUDIFILTER0023M'],
+ '-vm':i18n['GINAUDIFILTER0024M'],
+ '-w':i18n['GINAUDIFILTER0025M'],
+ '-x':i18n['GINAUDIFILTER0026M']};
+
+ var filterField = $('.selectpicker',row);
+ $.each(optionsList,function(key,value) {
+ filterField.append($("<option></option>")
+ .attr("value", key.replace(/"/g, ""))
+ .text(value.replace(/"/g, "")));
+ });
+ filterField.selectpicker();
+};
+
+ginger.populateReportOptions = function(row) {
+ var detailReportOptionsList =
+ {'-au':i18n['GINAUDIREPORT0001M'],
+ '-a':i18n['GINAUDIREPORT0002M'],
+ '--comm':i18n['GINAUDIREPORT0003M'],
+ '-c':i18n['GINAUDIREPORT0004M'],
+ '-cr':i18n['GINAUDIREPORT0005M'],
+ '-e':i18n['GINAUDIREPORT0006M'],
+ '-f':i18n['GINAUDIREPORT0007M'],
+ '-h':i18n['GINAUDIREPORT0008M'],
+ '--integrity':i18n['GINAUDIREPORT0009M'],
+ '-k':i18n['GINAUDIREPORT0010M'],
+ '-l':i18n['GINAUDIREPORT0011M'],
+ '-m':i18n['GINAUDIREPORT0012M'],
+ '-ma':i18n['GINAUDIREPORT0013M'],
+ '-n':i18n['GINAUDIREPORT0014M'],
+ '-p':i18n['GINAUDIREPORT0015M'],
+ '-r':i18n['GINAUDIREPORT0016M'],
+ '-s':i18n['GINAUDIREPORT0017M'],
+ '--success':i18n['GINAUDIREPORT0018M'],
+ '-t':i18n['GINAUDIREPORT0019M'],
+ '--tty':i18n['GINAUDIREPORT0020M'],
+ '-tm':i18n['GINAUDIREPORT0021M'],
+ '-u':i18n['GINAUDIREPORT0022M'],
+ '--virt':i18n['GINAUDIREPORT0023M'],
+ '-x':i18n['GINAUDIREPORT0024M']};
+
+ var summaryReportOptionList = {'--failed':i18n['GINAUDIREPORT0025M'],
+ '-nc':i18n['GINAUDIREPORT0026M'],
+ '-te':i18n['GINAUDIREPORT0027M'],
+ '-ts':i18n['GINAUDIREPORT0028M']};
+
+ var type = $('#reportType').val();
+
+ var optionsList = (type=='detailed')?detailReportOptionsList:summaryReportOptionList;
+ var filterField = $('#log-report-fields',row);
+
+ $.each(optionsList,function(key,value) {
+ filterField.append($("<option></option>")
+ .attr("value", key.replace(/"/g, ""))
+ .text(value.replace(/"/g, "")));
+ });
+ filterField.selectpicker();
+};
+
+ginger.initFilterInfo = function() {
+ $('#auditlogFilter').on('show.bs.modal', function(event) {
+ $('#log-filter-title').text(i18n['GINAUDIT0011M']);
+ $('#log-path-info','#auditlogFilter').val("/var/log/audit/audit.log");
+
+ var attachEvent = function(row) {
+ $(".delete", row).on("click", function() {
+ row.remove();
+
+ if ($('#newRow').children().length===0)
+ $("#filterList",'#auditlogFilter').addClass('hidden');
+ });
+
+ ginger.populateFilterOptions(row);
+
+ $('.selectpicker',row).change(function() {
+ var inputRequiredFieldsList = ['-a','--arch','-c','-e','-f','-ga','-ge','-gi','-hn','-k','-m','-n','-o','-p','-pp','-sc','-se','--session','-su','-sv','-tm','-ua','-ue','-ui','-ul','-uu','-vm','-x'];
+ var selectedValue = $(this).val();
+
+ if (selectedValue=="-te" || selectedValue=="-ts" ) {
+ var textField = $('input[type=text]',row);
+ if (textField.length!=0) {
+ var parentDiv = textField.parent();
+ textField.remove();
+ parentDiv.show();
+ var selectOptionHtml = $.parseHTML('<select class="selectpicker col-md-12 timeOption">'+
+ '<option value="now">'+i18n['GINAUDIREPORT0029M']+'</option>'+
+ '<option value="recent">'+i18n['GINAUDIREPORT0030M']+'</option>'+
+ '<option value="today">'+i18n['GINAUDIREPORT0031M']+'</option>'+
+ '<option value="yesterday">'+i18n['GINAUDIREPORT0032M']+'</option>'+
+ '<option value="this-week">'+i18n['GINAUDIREPORT0033M']+'</option>'+
+ '<option value="week-ago">'+i18n['GINAUDIREPORT0034M']+'</option>'+
+ '<option value="this-month">'+i18n['GINAUDIREPORT0035M']+'</option>'+
+ '<option value="this-year">'+i18n['GINAUDIREPORT0036M']+'</option>'+
+ '</select>');
+ parentDiv.append(selectOptionHtml);
+ $('.selectpicker',parentDiv).selectpicker();
+ }
+ } else if (inputRequiredFieldsList.indexOf(selectedValue)===-1) {
+ var textField = $('input[type=text]',row);
+ if (textField.length==0) {
+ if ($('.timeOption',row).length!=0) {
+ $('.timeOption',row).parent().append('<input type="text" class="form-control input" placeholder="'+i18n['GINAUDIT0010M']+'" />');
+ $('.timeOption',row).remove();
+ }
+ }
+ $('input[type=text]',row).val("").parent().hide();
+ } else {
+ var textField = $('input[type=text]',row);
+ if (textField.length==0) {
+ if ($('.timeOption',row).length!=0) {
+ $('.timeOption',row).parent().append('<input type="text" class="form-control input" placeholder="'+i18n['GINAUDIT0010M']+'" />');
+ $('.timeOption',row).remove();
+ }
+ }
+ textField.attr("disabled",false);
+ $('input[type=text]',row).val("").parent().show();
+ }
+ });
+ };
+
+ $(".add-filter",'#auditlogFilter').on("click", function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ $("#filterList").removeClass("hidden");
+
+ var newNode = $.parseHTML('<div class="row" style="margin-bottom:5px;">'+
+ '<div class="col-md-5">' +
+ '<select class="selectpicker col-md-10" id="log-filter-fields">'+
+ '</select>' +
+ '</div>'+
+ '<div class="col-md-5">'+
+ '<input type="text" class="form-control input" placeholder="'+i18n['GINAUDIT0010M']+'" style="height:40px;"/>' +
+ '</div>'+
+ '<div class="col-md-2">'+
+ '<span class="column-delete btn btn-link delete del-label" style="float:right;">' +
+ '<i class="fa fa-trash"></i></span>' +
+ '</div>'+
+ '</div>'+
+ '</div>');
+
+ $('#newRow','#auditlogFilter').append(newNode);
+ attachEvent($(newNode));
+ });
+
+ $('#log-filter-button-apply').on('click',function() {
+ $(".logs-loader").show();
+ $('.Audit-log-loader').show();
+ var filterarray = [];
+ var filtervaluearray = [];
+ var filterarray_len,sortarray_len;
+ var valuecheck,filtercheck;
+ $('#newRow div.row','#auditlogFilter').each(function() {
+ filterarray.push($('.selectpicker',$(this)).val());
+ filtercheck = $('.selectpicker',$(this)).val();
+ if (filtercheck == "-te" || filtercheck =="-ts") {
+ filtervaluearray.push("eventfilter");
+ } else if ($('input[type=text]',$(this)).parent().css('display') != 'none') {
+ filtervaluearray.push($('input[type=text]',$(this)).val());
+ }
+ });
+ for (var i=0; i<filtervaluearray.length; i++) {
+ if (filtervaluearray[i].length == 0)
+ valuecheck = 1;
+ }
+ filterarray_len = filterarray.length;
+ var sortarray = $.unique(filterarray.sort()).sort();
+ sortarray_len = sortarray.length;
+ if (filterarray_len != sortarray_len) {
+ wok.message.error(i18n['GINAUDIFILTER0027M'],"#addfielderror-message");
+ $('.Audit-log-loader').hide();
+ } else if (valuecheck == 1) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(i18n['GINAUDIFILTER0028M'],"#addfielderror-message");
+ } else {
+ var params = '';
+ var logFile= ($('#log-path-info',"#auditlogFilter").val()!='')?'-if '+ $('#log-path-info').val():'';
+ params+=logFile;
+
+ if ($('input[type=checkbox]:checked',$('#auditlogFilter')).length!==0) {
+ params.length>0?params+=' -i':params+='-i';
+ }
+
+ $('#newRow div.row','#auditlogFilter').each(function() {
+ var field = $('.selectpicker',$(this)).val();
+ var value = "";
+
+ if ($('.timeOption',$(this)).length!=0) {
+ value = $('.timeOption',$(this)).find('option:selected').val();
+ } else {
+ value = $('input[type=text]',$(this)).val();
+ }
+ var inputRequiredFieldsList = ['-a','--arch','-c','-e','-f','-ga','-ge','-gi','-hn','-k','-m','-n','-o','-p','-pp','-sc','-se','--session','-su','-sv','-tm','-ua','-ue','-ui','-ul','-uu','-vm','-x'];
+ if (inputRequiredFieldsList.indexOf(field)!=-1) {
+ if (value!='') {
+ if (params.length>0) {
+ params+=" ";
+ }
+ params+=field+" "+value;
+ }
+ } else {
+ if (params.length>0) {
+ params+=" ";
+ }
+ params+=field+(value!=''?(" "+value):'');
+ }
+ });
+
+ if (params=='') {
+ ginger.getAuditLogs(function(result) {
+ reloadAuditLogs(result);
+ },function(error) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
+ });
+ } else {
+ ginger.filterAuditLogs(params,function(result) {
+ reloadAuditLogs(result);
+ },function(error) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
+ });
+ }
+
+ var reloadAuditLogs = function(result) {
+ $('#auditlogFilter').modal('hide');
+ wok.message.success(i18n['GINAUDIT0016M'],"#alert-modal-audit-logs-container");
+ $("#audit-logs-table tbody").empty();
+ $("#audit-logs-table").DataTable().destroy();
+ ginger.createAuditLogsTable(result);
+ }
+ }
+ });
+ });
+
+ $('#auditlogFilter').on('hide.bs.modal', function(event) {
+ $(".logs-loader").hide();
+ $('.Audit-log-loader').hide();
+ $('#log-path-info',$(this)).val('');
+ $('#newRow',$(this)).empty();
+ $('#interpret',$(this)).attr('checked',false);
+ $('#log-filter-button-apply').off();
+ $("#addfielderror-message").empty();
+ $("#alert-modal-audit-filter-container").empty();
+ });
+};
+
+ginger.initSummaryInfo = function() {
+ $('#auditlogReport').on('show.bs.modal', function(event) {
+ $("#reportType").selectpicker();
+ $('#log-path-info','#auditlogReport').val("/var/log/audit/audit.log");
+
+ var attachEvent = function(row) {
+ $(".delete", row).on("click", function() {
+ row.remove();
+
+ if ($('#newRow','#auditlogReport').children().length===0)
+ $("#filterList",'#auditlogReport').addClass('hidden');
+ });
+
+ ginger.populateReportOptions(row);
+
+ $('#log-report-fields.selectpicker',row).change(function() {
+ var selectedValue = $(this).val();
+ if (selectedValue=="-te" || selectedValue=="-ts" ) {
+ var optionDropdown = $('select.timeOption',row);
+ optionDropdown.empty();
+ var selectOptionHtml = $.parseHTML('<option value="now">'+i18n['GINAUDIREPORT0029M']+'</option>'+
+ '<option value="recent">'+i18n['GINAUDIREPORT0030M']+'</option>'+
+ '<option value="today">'+i18n['GINAUDIREPORT0031M']+'</option>'+
+ '<option value="yesterday">'+i18n['GINAUDIREPORT0032M']+'</option>'+
+ '<option value="this-week">'+i18n['GINAUDIREPORT0033M']+'</option>'+
+ '<option value="week-ago">'+i18n['GINAUDIREPORT0034M']+'</option>'+
+ '<option value="this-month">'+i18n['GINAUDIREPORT0035M']+'</option>'+
+ '<option value="this-year">'+i18n['GINAUDIREPORT0036M']+'</option>');
+ optionDropdown.append(selectOptionHtml);
+ optionDropdown.selectpicker();
+ $('.timeOption',row).show();
+ } else {
+ var optionDropdown = $('.timeOption',row);
+ optionDropdown.hide();
+ }
+ });
+ };
+
+ $(".add-filter",'#auditlogReport').on("click", function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ $("#filterList",'#auditlogReport').removeClass("hidden");
+
+ var newNode = $.parseHTML('<div class="row" style="margin-bottom:5px;">'+
+ '<div class="col-md-5">' +
+ '<select class="selectpicker col-md-10" id="log-report-fields">'+
+ '</select>' +
+ '</div>'+
+ '<div class="col-md-5">'+
+ '<select class="selectpicker col-md-10 timeOption">'+
+ '</select>' +
+ '</div>'+
+ '<div class="col-md-2">'+
+ '<span class="column-delete btn btn-link delete del-label" style="float:right">' +
+ '<i class="fa fa-trash"></i></span>' +
+ '</div>'+
+ '</div>'+
+ '</div>');
+
+ $('#newRow','#auditlogReport').append(newNode);
+ attachEvent($(newNode));
+ });
+
+ $("#reportType").change(function() {
+ $('#newRow','#auditlogReport').empty();
+ $('#filterList','#auditlogReport').addClass('hidden');
+ });
+
+ $('#log-report-button-apply').on('click',function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ $('.report-loader').show();
+ var reportarray = [];
+ var reportarray_len,repsortarray_len;
+ var filtercheck;
+ $('#newRow div.row','#auditlogReport').each(function() {
+ reportarray.push($('.selectpicker',$(this)).val());
+ });
+ reportarray_len = reportarray.length;
+ var repsortarray = $.unique(reportarray.sort()).sort();
+ repsortarray_len = repsortarray.length;
+ if (reportarray_len != repsortarray_len) {
+ $('.report-loader').hide();
+ wok.message.error(i18n['GINAUDIFILTER0029M'],"#Filterfielderror-message");
+ $('#summaryreport').empty();
+ } else {
+ var params = '';
+ var logFile= ($('#log-path-info','#auditlogReport').val()!='')?'-if '+ $('#log-path-info','#auditlogReport').val():'';
+ params+=logFile;
+
+ if ($('input[type=checkbox]:checked',$('#auditlogReport')).length!==0) {
+ params.length>0?params+=' -i':params+='-i';
+ }
+
+ $('#newRow div.row','#auditlogReport').each(function() {
+ if (params.length>0) {
+ params+=" ";
+ }
+ var field = $('.selectpicker',$(this)).val();
+ var value = "";
+
+ if ($('.timeOption',$(this)).length!=0) {
+ value = $('.timeOption',$(this)).find('option:selected').val();
+ }
+ params+=field+(value!=undefined?(" "+value):'');
+ });
+
+ if (params=='') {
+ ginger.getAuditSummaryReport(function(result) {
+ populateReport(result);
+ },function(error) {
+ $('.report-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-report-container");
+ $('#summaryreport').empty();
+ });
+ } else {
+ ginger.getAuditReport(params,function(result) {
+ populateReport(result);
+ },function(error) {
+ $('.report-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-report-container");
+ $('#summaryreport').empty();
+ });
+ }
+
+ var populateReport = function(result) {
+ $('#report-details').removeClass("hidden").focus();
+ $('#summaryreport').empty();
+ var columnInfo = {};
+ var summary = [];
+
+ if (result.length>1) {
+ columnInfo = result[0]["column_info"];
+ summary = result[1]["summary"];
+ $("#report-graph-button").removeClass("hidden");
+ } else {
+ summary = result[0]["summary"];
+ $("#report-graph-button").addClass("hidden");
+ }
+
+ var details = "";
+ $.each(summary,function(index,info) {
+ if (info!="") {
+ details+=info+"<br>";
+ }
+ });
+
+ ginger.initGraphDetails(columnInfo);
+ $('#summaryreport').append(details);
+ $("#summaryReportPathInfo").html(i18n['GINAUDIT0017M']).removeClass('hidden');
+ $('.report-loader').hide();
+ }
+ }
+ });
+
+ $("#report-download-button").on("click",function(e) {
+ var reportFilePath = '/data/logs/audit_summary_report.txt';
+ window.open(reportFilePath, '_blank');
+ });
+ });
+
+ $('#auditlogReport').on('hide.bs.modal', function(event) {
+ $('#log-path-info',$(this)).val('');
+ $('#newRow',$(this)).empty();
+ $('#interpret',$(this)).attr('checked',false);
+ $('#log-report-button-apply').off();
+ $("#report-download-button").off();
+ $("#report-graph-button").off();
+ $('#summaryreport').empty();
+ $('#summaryReportPathInfo').empty().hide();
+ $("#report-details").addClass("hidden");
+ $("#Filterfielderror-message").empty();
+ $("#alert-modal-audit-report-container").empty();
+ });
+};
+
+ginger.initGraphDetails = function(columnInfo) {
+ $('#reportGraph').on('show.bs.modal', function(event) {
+ $("#graphPathInfo").addClass("hidden");
+ $("#graph-name").val(i18n['GINAUDIT0020M']);
+ $("#generate-report-graph-button").addClass("hidden");
+ var graphColumns = $("#graphColumns");
+ graphColumns.empty().selectpicker('destroy');
+ $.each(columnInfo,function(key,value) {
+ graphColumns.append($("<option></option>")
+ .attr("value",value)
+ .text(key.replace(/"/g, "")));
+ });
+ graphColumns.selectpicker();
+
+ var checkFields = function() {
+ if ($("#graphColumns").val()!=null && $("#graphColumns").val().length==2 && $("#graphFormat").val()!="" && $("#graph-name").val()!="") {
+ $("#generate-report-graph-button").removeClass("hidden");
+ } else {
+ $("#generate-report-graph-button").addClass("hidden");
+ }
+ }
+
+ $("#graphFormat").selectpicker();
+
+ $("#graphColumns").change(function(e) {
+ checkFields();
+ });
+
+ $("#graph-name").keyup(function(e) {
+ checkFields();
+ });
+
+ $("#generate-report-graph-button").on('click',function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ $("#graph").empty();
+ var columns = $("#graphColumns").val();
+ var format = $("#graphFormat").val();
+ var graphName = $("#graph-name").val();
+ var params = graphName+","+columns.toString()+","+format;
+ ginger.getReportGraph(params,function(result) {
+ var graphLocation = result[0]['Graph:'];
+ $("#graphPathInfo").html(i18n['GINAUDIT0018M'].replace("%1",graphLocation).replace("data","var/lib/wok")).removeClass("hidden");
+ window.open(graphLocation, '_blank');
+ },function(error) {
+ wok.message.error(data.responseJSON.reason,"#alert-modal-audit-graph-container");
+ });
+ });
+ });
+
+ $('#reportGraph').on('hide.bs.modal', function(event) {
+ $("#graphColumns").selectpicker('deselectAll');
+ $("#graphColumns").selectpicker('destroy');
+ $("#graphFormat").selectpicker('destroy');
+ $("#graph-name").val('');
+ $("#graph").empty();
+ $("#generate-report-graph-button").off();
+ });
+};
diff --git a/ui/js/host-sidebar.js b/ui/js/host-sidebar.js
index 84465f8..d8ce5ca 100644
--- a/ui/js/host-sidebar.js
+++ b/ui/js/host-sidebar.js
@@ -158,12 +158,22 @@ ginger.initSidebar = function() {
var $body = $(document.body);
var navHeight = $('.topbar').outerHeight(true) + 40;

- var start = new Sidebar($leftCol, ginger.sidebarObj);
- lastGingerPage = wok.cookie.get('lastGingerPage')
- if (!lastGingerPage)
- start.triggerFirstAvailableOption();
- else
- wok.topic('sidebarClicked').publish(lastGingerPage);
+ ginger.getCapabilities(function(result) {
+ if (result.Audit) {
+ ginger.sidebarObj.push({
+ title: i18n['Audit'],
+ url: 'plugins/ginger/tabs/host-audit.html',
+ id: 'ginger-audit'
+ });
+ }
+
+ var start = new Sidebar($leftCol, ginger.sidebarObj);
+ lastGingerPage = wok.cookie.get('lastGingerPage')
+ if (!lastGingerPage)
+ start.triggerFirstAvailableOption();
+ else
+ wok.topic('sidebarClicked').publish(lastGingerPage);
+ });

var checkScrollPosition = function() {
if ($(window).scrollTop() + $(window).height() > $(document).height() - 66) {
diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
index aee124c..7066e41 100644
--- a/ui/pages/i18n.json.tmpl
+++ b/ui/pages/i18n.json.tmpl
@@ -25,6 +25,7 @@
"Settings": "$_("Settings")",
"Administration": "$_("Administration")",
"Network": "$_("Network")",
+ "Audit": "$_("Audit")",
"Storage": "$_("Storage")",
"System Modules": "$_("System Modules")",
"System Services": "$_("System Services")",
diff --git a/ui/pages/tabs/host-admin.html.tmpl b/ui/pages/tabs/host-admin.html.tmpl
index f7a5622..619ae59 100644
--- a/ui/pages/tabs/host-admin.html.tmpl
+++ b/ui/pages/tabs/host-admin.html.tmpl
@@ -32,168 +32,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<div class="container">
<div id="alert-container"></div>
<div id="gingerHostAdmin" class="host-admin">
- <!-- Audit Rules section -->
- <div class="panel-group audit-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-rules-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Rules")</span>
- </a>
- </h3>
- <div id="modalWindow" class="modal fade host-modal guests-modal" tabindex="-1" role="dialog" aria-labelledby="guestsModalLabel" aria-hidden="true">
- </div>
- <div id="audit-rules-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
- <span id='alert-modal-audit-rules-container' style='display: none;'></span>
- <div class='clearfix'>
- <span id="audit-message" style="display:none;"></span>
- <div class="row">
- <div class="col-sd-12"><span>&nbsp;</span></div>
- <div class="pull-left">
- <div class="btn-group">
- <div class="btn-group">
- <div class="dropdown auditmenu-action">
- <button type="button" class="btn btn-primary dropdown-toggle edit-alt" data-toggle="dropdown">
- <i class="fa fa-pencil-square-o">$_("Actions")</i> <span class="caret"></span></button>
- <ul class="dropdown-menu" role="menu">
- <li>
- <button aria-expanded="false" id="Audit-Rule-Edit-btn" class="btn btn-primary"><i class="fa fa-pencil">$_("Edit")</i></button>
- </li>
- <li>
- <button aria-expanded="false" id="Audit-Rule-Load-btn" class="btn btn-primary"><i class="fa fa-file">$_("Load")</i></button>
- </li>
- <li>
- <button aria-expanded="false" id="Audit-Rule-unload-btn" class="btn btn-primary"><i class="fa fa-upload">$_("Unload")</i></button>
- </li>
- <li>
- <button aria-expanded="false" id="Audit-Rule-Persist-btn" class="btn btn-primary"><i class="fa fa-floppy-o">$_("Persist")</i></button>
- </li>
- <li>
- <button aria-expanded="false" style="background-color:#d9182d" id="audit-rule-delete-btn" class="btn btn-primary"><i class="fa fa-minus-circle">$_("Delete")</i></button>
- </li>
- </ul>
- </div>
- </div>
- <div class="btn-group">
- <div class="dropdown auditmenu-action">
- <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-pencil-square-o">$_("Rules")</i> <span class="caret"></span></button>
- <ul class="dropdown-menu" role="menu">
- <li>
- <button aria-expanded="false" id="audit-rule-add-btn" class="btn btn-primary"><i class="fa fa-plus-circle">$_("Add")</i></button>
- </li>
- <li>
- <button aria-expanded="false" id="Audit-Rule-Import-btn" class="btn btn-primary"><i class="fa fa-download">$_("Import")</i></button>
- </li>
- </ul>
- </div>
- </div>
- <button aria-expanded="false" id="Audit-Rule-Configure-btn" class="btn btn-primary"><i class="fa fa-pencil-square-o">$_("Configure Audit")</i></button>
- <button aria-expanded="false" id="Audit-Rule-refresh-btn" class="btn btn-primary"><i class="fa fa-refresh">$_("Refresh")</i></button>
- </div>
- </div>
- </div>
- <div class="row" id="audit-rules">
- <table id="audit-rules-table" class="table table-stripped" cellspacing="0" width="100%">
- <thead>
- <tr>
- <th>$_("ID")</th>
- <th>$_("Type")</th>
- <th>$_("Rule")</th>
- <th style="text-align:center;">$_("Details")</th>
- <th style="text-align:center;">$_("Loaded")</th>
- <th style="text-align:center;">$_("Persisted")</th>
- <th>$_("Info")</th>
- <th>$_("pervalue")</th>
- <th>$_("loadvalue")</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- <div class="wok-mask rules-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- Audit logs section -->
- <div class="panel-group users-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-logs-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Logs")</span>
- </a>
- </h3>
- <div id="audit-logs-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
- <span id='alert-modal-audit-logs-container' style='display: none;'></span>
- <div class='clearfix'>
- <div class="row">
- <div class="col-sd-12"><span>&nbsp;</span></div>
- </div>
- <div class="row" id="audit-logs">
- <table id="audit-logs-table" class="table table-stripped" cellspacing="0" width="100%">
- <thead>
- <tr>
- <th>$_("Date and Time")</th>
- <th>$_("Type")</th>
- <th>$_("Message")</th>
- <th style="text-align:center;">$_("Details")</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- <div class="wok-mask logs-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
-<!-- Audit dispatcher section -->
- <div class="panel-group users-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-dispatcher-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Dispatcher")</span>
- </a>
- </h3>
- <div id="audit-dispatcher-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
- <span id='alert-modal-audit-dispatcher-container' style='display: none;'></span>
- <div class='clearfix'>
- <div class="row">
- <div class="col-sd-12"><span>&nbsp;</span></div>
- </div>
- <div class="row" id="audit-dispatcher">
- <table id="audit-disp-plugin-table" class="table table-stripped" cellspacing="0" width="100%">
- <thead>
- <tr>
- <th>$_("Plugin")</th>
- <th>$_("Active")</th>
- <th style="text-align:center;">$_("Details")</th>
- <th>$_("Info")</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- <div class="wok-mask dispatcher-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
<!-- Firmware Update Panel -->
<div class="panel-group firmware-ppc-enabled accordion" id="firmware-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
<h3>
@@ -558,317 +396,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
</div>
</div>
</div>
-<!-- Audit logs - Log Filter -->
-<div class="modal fade host-modal" id="auditlogFilter" tabindex="-1" role="dialog" labelledby="UserPasswordChangeModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="log-filter-title"></h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-audit-filter-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <div class="form-group">
- <label for="log-path-info">$_("Log File Name")</label>
- <div class="form-group">
- <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
- <p class="help-block">
- <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
- </p>
- </div>
- </div>
- <div class="row">
- <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
- </div>
- <span id="addfielderror-message" style="display:none;"></span>
- <div class="row hidden" id="filterList">
- <div class="col-md-12">
- <div class="col-md-5">
- <label class="col-md-12">$_("Field")</label>
- </div>
- <div class="col-md-5">
- <label class="col-md-12">$_("Value")</label>
- </div>
- <div class="col-md-2">
- </div>
- </div>
- <div class="col-md-12" id="newRow">
- </div>
- </div>
- <div class="checkbox" style="margin-top:25px;">
- <label class="check-all">
- <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
- </label>
- </div>
- <div class="wok-mask Audit-log-loader" hidden>
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Please wait...")</div>
- </div>
- </div>
- </div>
- </form>
- </div>
- <div class="modal-footer">
- <button id="log-filter-button-apply" class="btn btn-default">$_("Filter")</button>
- <button id="log-filter-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
-</div>
-
-<!-- Audit log report summary -->
-<div class="modal fade host-modal" id="auditlogReport" tabindex="-1" role="dialog" labelledby="UserPasswordChangeModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="log-report-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="log-summary-title">$_("Audit Report")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-audit-report-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <!-- <div class="form-group"> -->
- <div class="form-group">
- <label for="reportType">$_("Audit Report Type")</label>
- <div class="col-md-12">
- <select id="reportType" class="selectpicker col-sm-6" name="reporttype">
- <option value="summary">$_("Summary Report")</option>
- <option value="detailed">$_("Detailed Report")</option>
- </select>
- <button id="log-report-button-apply" class="btn btn-primary"style="margin-left:100px;">$_("Generate Report")</button>
- </div>
- </div>
- <div class="form-group">
- <label for="log-path-info">$_("Log File Name")</label>
- <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
- <p class="help-block">
- <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
- </p>
- </div>
- <!-- </div> -->
- <div class="row">
- <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
- </div>
- <span id="Filterfielderror-message" style="display:none;"></span>
- <div class="row hidden" id="filterList">
- <div class="col-md-12">
- <div class="col-md-5">
- <label class="col-md-12">$_("Field")</label>
- </div>
- <div class="col-md-5">
- <label class="col-md-12">$_("Value")</label>
- </div>
- <div class="col-md-2">
- </div>
- </div>
- <div class="col-md-12" id="newRow">
- </div>
- </div>
- <div class="checkbox" style="margin-top:25px;">
- <label class="check-all">
- <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
- </label>
- </div>
- </form>
- <div class="row hidden" id="report-details" style="margin-top:30px;" tabindex="-1">
- <div class="alert alert-info hidden" id="summaryReportPathInfo"></div>
- <div class="row">
- <button id="report-graph-button" class="btn btn-primary" data-toggle="modal" data-target="#reportGraph">$_('Graph Preview')</button>
- <button id="report-download-button" class="btn btn-primary" data-search="">$_('Download')</button>
- </div>
- <div class="clearfix">
- <p id="summaryreport" class="report"></p>
- </div>
- <div class="wok-mask report-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Generating report...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="modal-footer">
- <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
-</div>
-<!-- Audit report graph -->
-<div class="modal fade host-modal" id="reportGraph" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="report-graph-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="log-summary-title">$_("Report Graph")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-audit-graph-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <div class="form-group">
- <label for="graph-name">$_("Graph Name")</label>
- <input id="graph-name" class="form-control input" name="graph-name" style="width:50%;"/>
- </div>
- <div class="form-group">
- <label for="graphFormat">$_("Graph Format")</label>
- <div class="col-md-12">
- <select id="graphFormat" class="selectpicker col-sm-6" name="graphformat">
- <option value="png">$_("PNG")</option>
- <option value="jpeg">$_("JPEG")</option>
- <option value="bmp">$_("BMP")</option>
- <option value="jpg">$_("JPG")</option>
- <option value="pdf">$_("PDF")</option>
- <option value="svg">$_("SVG")</option>
- </select>
- <button id="generate-report-graph-button" class="btn btn-primary"style="margin-left:100px;">$_("Generate Graph")</button>
- </div>
- </div>
- <div class="form-group">
- <label for="graphColumns">$_("Graph Columns")</label>
- <div class="col-md-12">
- <select id="graphColumns" class="selectpicker col-sm-6" name="graphcolumn" multiple data-max-options="2" data-min-options="2">
- </select>
- </div>
- </div>
- </form>
- <div class="alert alert-info hidden" id="graphPathInfo"></div>
- </div>
- <div class="modal-footer">
- <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
- </div>
- <!-- Audit Dispatcher Configuration -->
- <div class="modal fade host-modal" id="auditDisprConf" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="disp-conf-title">$_("Audit Dispatcher Configuration")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-disp-conf-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <div class="form-group">
- <label for="overflowAction">$_("Overflow Action")</label>
- <div class="form-group">
- <input id="overflowAction" class="form-control input" name="overflowAction" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="priorityBoost">$_("Priority Boost")</label>
- <div class="form-group">
- <input id="priorityBoost" class="form-control input" name="priorityboost" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="qDepth">$_("Q Depth")</label>
- <div class="form-group">
- <input id="qDepth" class="form-control input" name="qDepth" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="maxRestarts">$_("Max restarts")</label>
- <div class="form-group">
- <input id="maxRestarts" class="form-control input" name="maxrestarts" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="nameFormat">$_("Name Format")</label>
- <div class="form-group">
- <input id="nameFormat" class="form-control input" name="nameFormat" style="width:50%;"/>
- </div>
- </div>
- </form>
- </div>
- <div class="modal-footer">
- <button id="disp-conf-button-apply" class="btn btn-default">$_("Apply")</button>
- <button id="disp-conf-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
- </div>

- <!-- Audit Dispatcher Plugin Details -->
- <div class="modal fade host-modal" id="auditPluginDetails" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="disp-plugin-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="disp-conf-title">$_("Dispatcher Plugin Configuration")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-plugin-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-plugin-details">
- <div class="form-group">
- <label for="direction">$_("Direction")</label>
- <div class="form-group">
- <input id="direction" class="form-control input" name="direction" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="format">$_("Format")</label>
- <div class="form-group">
- <input id="format" class="form-control input" name="format" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="args">$_("Args")</label>
- <div class="form-group">
- <input id="args" class="form-control input" name="args" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="active">$_("Active")</label>
- <div class="form-group">
- <select id="active" class="selectpicker col-sm-6" name="active">
- <option value="yes">$_("Yes")</option>
- <option value="no">$_("No")</option>
- </select>
- </div>
- </div>
- <div class="form-group">
- <label for="nameFormat">$_("Path")</label>
- <div class="form-group">
- <input id="path" class="form-control input" name="path" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="type">$_("Type")</label>
- <div class="form-group">
- <input id="type" class="form-control input" name="type" style="width:50%;"/>
- </div>
- </div>
- </form>
- </div>
- <div class="modal-footer">
- <button id="plugin-update-button-apply" class="btn btn-default">$_("Apply")</button>
- <button id="plugin-update-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
- </div>
-</div>
<script id="backupItem" type="text/html">
<li class="wok-datagrid-row in" name="backupBodyItem" id="{identity}">
<span class="column-file" title="{file}">{filename}</span><!--
diff --git a/ui/pages/tabs/host-audit.html.tmpl b/ui/pages/tabs/host-audit.html.tmpl
new file mode 100644
index 0000000..2e65f15
--- /dev/null
+++ b/ui/pages/tabs/host-audit.html.tmpl
@@ -0,0 +1,518 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2015-2016
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+ <script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ <script type="text/javascript" src="plugins/ginger/js/host-audit.js"></script>
+</head>
+<body>
+ <div id="audit-root-container" class="ginger">
+ <div class="container">
+ <div id="alert-container"></div>
+ <div id="gingerHostAudit" class="host-admin">
+ <!-- Audit Rules section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-rules-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Rules")</span>
+ </a>
+ </h3>
+ <div id="modalWindow" class="modal fade host-modal guests-modal" tabindex="-1" role="dialog" aria-labelledby="guestsModalLabel" aria-hidden="true">
+ </div>
+ <div id="audit-rules-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
+ <span id='alert-modal-audit-rules-container' style='display: none;'></span>
+ <div class='clearfix'>
+ <span id="audit-message" style="display:none;"></span>
+ <div class="row">
+ <div class="col-sd-12"><span>&nbsp;</span></div>
+ <div class="pull-left">
+ <div class="btn-group">
+ <div class="btn-group">
+ <div class="dropdown auditmenu-action">
+ <button type="button" class="btn btn-primary dropdown-toggle edit-alt" data-toggle="dropdown">
+ <i class="fa fa-pencil-square-o">$_("Actions")</i> <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-Edit-btn" class="btn btn-primary"><i class="fa fa-pencil">$_("Edit")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-Load-btn" class="btn btn-primary"><i class="fa fa-file">$_("Load")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-unload-btn" class="btn btn-primary"><i class="fa fa-upload">$_("Unload")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-Persist-btn" class="btn btn-primary"><i class="fa fa-floppy-o">$_("Persist")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" style="background-color:#d9182d" id="audit-rule-delete-btn" class="btn btn-primary"><i class="fa fa-minus-circle">$_("Delete")</i></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="btn-group">
+ <div class="dropdown auditmenu-action">
+ <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-pencil-square-o">$_("Rules")</i> <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li>
+ <button aria-expanded="false" id="audit-rule-add-btn" class="btn btn-primary"><i class="fa fa-plus-circle">$_("Add")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-Import-btn" class="btn btn-primary"><i class="fa fa-download">$_("Import")</i></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <button aria-expanded="false" id="Audit-Rule-Configure-btn" class="btn btn-primary"><i class="fa fa-pencil-square-o">$_("Configure Audit")</i></button>
+ <button aria-expanded="false" id="Audit-Rule-refresh-btn" class="btn btn-primary"><i class="fa fa-refresh">$_("Refresh")</i></button>
+ </div>
+ </div>
+ </div>
+ <div class="row" id="audit-rules">
+ <table id="audit-rules-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("ID")</th>
+ <th>$_("Type")</th>
+ <th>$_("Rule")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ <th style="text-align:center;">$_("Loaded")</th>
+ <th style="text-align:center;">$_("Persisted")</th>
+ <th>$_("Info")</th>
+ <th>$_("pervalue")</th>
+ <th>$_("loadvalue")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask rules-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- Audit logs section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="audit-logs-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#audit-logs--ppc-enabled-accordion" href="#audit-logs-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Logs")</span>
+ </a>
+ </h3>
+ <div id="audit-logs-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
+ <span id='alert-modal-audit-logs-container' style='display: none;'></span>
+ <div class='clearfix'>
+ <div class="row">
+ <div class="col-sd-12"><span>&nbsp;</span></div>
+ </div>
+ <div class="row" id="audit-logs">
+ <table id="audit-logs-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("Date and Time")</th>
+ <th>$_("Type")</th>
+ <th>$_("Message")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask logs-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<!-- Audit dispatcher section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="audit-dispatcher-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#audit-dispatcher-ppc-enabled-accordion" href="#audit-dispatcher-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Dispatcher")</span>
+ </a>
+ </h3>
+ <div id="audit-dispatcher-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
+ <span id='alert-modal-audit-dispatcher-container' style='display: none;'></span>
+ <div class='clearfix'>
+ <div class="row">
+ <div class="col-sd-12"><span>&nbsp;</span></div>
+ </div>
+ <div class="row" id="audit-dispatcher">
+ <table id="audit-disp-plugin-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("Plugin")</th>
+ <th>$_("Active")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ <th>$_("Info")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask dispatcher-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit logs - Log Filter -->
+<div class="modal fade host-modal" id="auditlogFilter" tabindex="-1" role="dialog" labelledby="AuditLogsFilterModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-filter-title"></h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-filter-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="log-path-info">$_("Log File Name")</label>
+ <div class="form-group">
+ <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
+ </div>
+ <span id="addfielderror-message" style="display:none;"></span>
+ <div class="row hidden" id="filterList">
+ <div class="col-md-12">
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Field")</label>
+ </div>
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Value")</label>
+ </div>
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="col-md-12" id="newRow">
+ </div>
+ </div>
+ <div class="checkbox" style="margin-top:25px;">
+ <label class="check-all">
+ <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
+ </label>
+ </div>
+ <div class="wok-mask Audit-log-loader" hidden>
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Please wait...")</div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="log-filter-button-apply" class="btn btn-default">$_("Filter")</button>
+ <button id="log-filter-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit log report summary -->
+<div class="modal fade host-modal" id="auditlogReport" tabindex="-1" role="dialog" labelledby="AuditLogReportSummaryModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-report-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-summary-title">$_("Audit Report")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-report-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <!-- <div class="form-group"> -->
+ <div class="form-group">
+ <label for="reportType">$_("Audit Report Type")</label>
+ <div class="col-md-12">
+ <select id="reportType" class="selectpicker col-sm-6" name="reporttype">
+ <option value="summary">$_("Summary Report")</option>
+ <option value="detailed">$_("Detailed Report")</option>
+ </select>
+ <button id="log-report-button-apply" class="btn btn-primary"style="margin-left:100px;">$_("Generate Report")</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="log-path-info">$_("Log File Name")</label>
+ <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
+ </p>
+ </div>
+ <!-- </div> -->
+ <div class="row">
+ <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
+ </div>
+ <span id="Filterfielderror-message" style="display:none;"></span>
+ <div class="row hidden" id="filterList">
+ <div class="col-md-12">
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Field")</label>
+ </div>
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Value")</label>
+ </div>
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="col-md-12" id="newRow">
+ </div>
+ </div>
+ <div class="checkbox" style="margin-top:25px;">
+ <label class="check-all">
+ <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
+ </label>
+ </div>
+ </form>
+ <div class="row hidden" id="report-details" style="margin-top:30px;" tabindex="-1">
+ <div class="alert alert-info hidden" id="summaryReportPathInfo"></div>
+ <div class="row">
+ <button id="report-graph-button" class="btn btn-primary" data-toggle="modal" data-target="#reportGraph">$_('Graph Preview')</button>
+ <button id="report-download-button" class="btn btn-primary" data-search="">$_('Download')</button>
+ </div>
+ <div class="clearfix">
+ <p id="summaryreport" class="report"></p>
+ </div>
+ <div class="wok-mask report-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Generating report...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit report graph -->
+<div class="modal fade host-modal" id="reportGraph" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="report-graph-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-summary-title">$_("Report Graph")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-graph-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="graph-name">$_("Graph Name")</label>
+ <input id="graph-name" class="form-control input" name="graph-name" style="width:50%;"/>
+ </div>
+ <div class="form-group">
+ <label for="graphFormat">$_("Graph Format")</label>
+ <div class="col-md-12">
+ <select id="graphFormat" class="selectpicker col-sm-6" name="graphformat">
+ <option value="png">$_("PNG")</option>
+ <option value="jpeg">$_("JPEG")</option>
+ <option value="bmp">$_("BMP")</option>
+ <option value="jpg">$_("JPG")</option>
+ <option value="pdf">$_("PDF")</option>
+ <option value="svg">$_("SVG")</option>
+ </select>
+ <button id="generate-report-graph-button" class="btn btn-primary"style="margin-left:100px;">$_("Generate Graph")</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="graphColumns">$_("Graph Columns")</label>
+ <div class="col-md-12">
+ <select id="graphColumns" class="selectpicker col-sm-6" name="graphcolumn" multiple data-max-options="2" data-min-options="2">
+ </select>
+ </div>
+ </div>
+ </form>
+ <div class="alert alert-info hidden" id="graphPathInfo"></div>
+ </div>
+ <div class="modal-footer">
+ <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Audit Dispatcher Configuration -->
+ <div class="modal fade host-modal" id="auditDisprConf" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="disp-conf-title">$_("Audit Dispatcher Configuration")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-disp-conf-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="overflowAction">$_("Overflow Action")</label>
+ <div class="form-group">
+ <input id="overflowAction" class="form-control input" name="overflowAction" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="priorityBoost">$_("Priority Boost")</label>
+ <div class="form-group">
+ <input id="priorityBoost" class="form-control input" name="priorityboost" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="qDepth">$_("Q Depth")</label>
+ <div class="form-group">
+ <input id="qDepth" class="form-control input" name="qDepth" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="maxRestarts">$_("Max restarts")</label>
+ <div class="form-group">
+ <input id="maxRestarts" class="form-control input" name="maxrestarts" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="nameFormat">$_("Name Format")</label>
+ <div class="form-group">
+ <input id="nameFormat" class="form-control input" name="nameFormat" style="width:50%;"/>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="disp-conf-button-apply" class="btn btn-default">$_("Apply")</button>
+ <button id="disp-conf-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Audit Dispatcher Plugin Details -->
+ <div class="modal fade host-modal" id="auditPluginDetails" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="disp-plugin-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="disp-conf-title">$_("Dispatcher Plugin Configuration")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-plugin-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-plugin-details">
+ <div class="form-group">
+ <label for="direction">$_("Direction")</label>
+ <div class="form-group">
+ <input id="direction" class="form-control input" name="direction" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="format">$_("Format")</label>
+ <div class="form-group">
+ <input id="format" class="form-control input" name="format" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="args">$_("Args")</label>
+ <div class="form-group">
+ <input id="args" class="form-control input" name="args" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="active">$_("Active")</label>
+ <div class="form-group">
+ <select id="active" class="selectpicker col-sm-6" name="active">
+ <option value="yes">$_("Yes")</option>
+ <option value="no">$_("No")</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="nameFormat">$_("Path")</label>
+ <div class="form-group">
+ <input id="path" class="form-control input" name="path" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="type">$_("Type")</label>
+ <div class="form-group">
+ <input id="type" class="form-control input" name="type" style="width:50%;"/>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="plugin-update-button-apply" class="btn btn-default">$_("Apply")</button>
+ <button id="plugin-update-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+</script>
+<script>
+ginger.initAudit();

Daniel Henrique Barboza

unread,
Mar 2, 2017, 4:13:52 PM3/2/17
to ginger-...@googlegroups.com
This is a great contribution, thank you!

I have nothing to add about the layout look and feel. It feels right.
However
I have some comments:

- the lastPage is kind of broken in the new "Settings" tab. When hitting
F5, the
refresh goes back to the user-log tab. I think it's because of the URL
of the
sidebar being unknown in the routing, and the default action reroutes it to
user-log.

- in Chrome I am seeing strange behaviors/bugs but I am not sure it has to
do with this contribution. No tabs are loaded after logging in. I am jus
mentioning it here to be on the record. If someone else has problems when
testing this patch in Chrome please let me know. Otherwise I'll consider it
has something to do with Chrome in my environment.



Daniel

Aline Manera

unread,
Mar 2, 2017, 8:17:40 PM3/2/17
to Ginger Devel
There are some elements which 2 settings for aria-expanded.
aria-expanded should be set to true when the widget is open (expanded) and,
in addition to that, the content should have the class "collapse in".
Otherwise, the expand icon will not reflect the right behavior.
When setting aria-expanded=false, only set the content class as "collapse".

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/pages/tabs/host-network.html.tmpl | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/ui/pages/tabs/host-network.html.tmpl b/ui/pages/tabs/host-network.html.tmpl
index f17d81b..7c7ceb1 100644
--- a/ui/pages/tabs/host-network.html.tmpl
+++ b/ui/pages/tabs/host-network.html.tmpl
@@ -43,7 +43,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<!-- Global Network Configuration Panel -->
<div class="panel-group network-ppc-enabled accordion" id="network-global-configuration-accordion" role="tablist" aria-multiselectable="true">
<h3>
- <a role="button" aria-expanded="true" data-toggle="collapse" data-parent="#network-global-accordion" href="#network-global-configuration-content-area" aria-expanded="true" aria-controls="network-global-configuration-content-area">
+ <a role="button" aria-expanded="false" data-toggle="collapse" data-parent="#network-global-accordion" href="#network-global-configuration-content-area" aria-controls="network-global-configuration-content-area">
<span class="accordion-icon"></span>
<span class="accordion-text" id="global-network-configuration-title">$_("Global Network Configuration")</span>
</a>
@@ -85,7 +85,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<!-- Redesigned Network Configuration Panel -->
<div class="panel-group network-ppc-enabled accordion" id="network-configuration-accordion" role="tablist" aria-multiselectable="true">
<h3>
- <a role="button" aria-expanded="true" data-toggle="collapse" data-parent="#network-configuration-accordion" href="#network-configuration-content-area" aria-expanded="false" aria-controls="network-configuration-content-area">
+ <a role="button" data-toggle="collapse" data-parent="#network-configuration-accordion" href="#network-configuration-content-area" aria-expanded="false" aria-controls="network-configuration-content-area">
<span class="accordion-icon"></span>
<span class="accordion-text" id="network-configuration-title">$_("Network Configuration")</span>
</a>
@@ -95,7 +95,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<div id="enable-sriov-progress-container" class="enable-sriov-status" style='display: none;'>
<div>
<h3>
- <a role="button" data-toggle="collapse" data-parent="#enable-sriov-progress-container" href="#status-sriov-container" aria-expanded="true" aria-controls="status-sriov-container">
+ <a role="button" data-toggle="collapse" data-parent="#enable-sriov-progress-container" href="#status-sriov-container" aria-expanded="false" aria-controls="status-sriov-container">
<i class="fa fa-chevron-down" role="presentation"></i>
$_("Enable SR-IOV Progress")
</a>
@@ -153,7 +153,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<script id="ovsBridgesPanel" type="text/html">
<div class='panel-group network-ppc-enabled accordion' id='ovsbridge-content-area-accordion' role='tablist' aria-multiselectable='true'>
<h3>
- <a role='button' aria-expanded='true' data-toggle='collapse' data-parent='#ovsbridge-content-area-accordion' href='#ovsbridge-content-area' aria-expanded='false' aria-controls='ovsbridge-content-area' class=''>
+ <a role='button' data-toggle='collapse' data-parent='#ovsbridge-content-area-accordion' href='#ovsbridge-content-area' aria-expanded='false' aria-controls='ovsbridge-content-area' class=''>
<span class='accordion-icon'></span>

Aline Manera

unread,
Mar 2, 2017, 8:17:40 PM3/2/17
to Ginger Devel
** IMPORTANT **
This patch set DEPENDS on Wok patch:
- [Kimchi-devel] [PATCH] [Wok] Allow a plugin extends any HTML page from another one instead of only tabs content

V1 - V2:
- Move HTML files from /tabs to avoid getting the lastPage cookie set on every
sidebar entry
- Do not change location.hash when loading a sidebar entry

Aline Manera (4):
Fix expand/collpase widget configuration in Network tab
Ginger sidebar
Move Audit features to a sidebar entry
Move System Modules to a sidebar entry

ui/config/tab-ext.xml | 25 +-
ui/css/ginger.css | 185 ++--
ui/css/src/ginger.scss | 3 +-
ui/css/src/modules/_administration.scss | 5 +
ui/css/src/modules/_settings.scss | 104 +++
ui/css/src/modules/_sysmodules.scss | 14 +-
ui/css/src/modules/_systemservices.scss | 20 +-
ui/js/host-admin.js | 1299 --------------------------
ui/js/host-audit.js | 1280 +++++++++++++++++++++++++
ui/js/host-settings.js | 196 ++++
ui/js/host-sysmodules.js | 25 +-
ui/js/host-system-services.js | 40 +-
ui/pages/{tabs => }/host-admin.html.tmpl | 472 ----------
ui/pages/host-audit.html.tmpl | 518 ++++++++++
ui/pages/{tabs => }/host-network.html.tmpl | 8 +-
ui/pages/{tabs => }/host-storage.html.tmpl | 0
ui/pages/host-sysmodules.html.tmpl | 101 ++
ui/pages/host-system-services.html.tmpl | 120 +++
ui/pages/i18n.json.tmpl | 3 +
ui/pages/tabs/host-settings.html.tmpl | 53 ++
ui/pages/tabs/host-system-services.html.tmpl | 209 -----
21 files changed, 2556 insertions(+), 2124 deletions(-)
create mode 100644 ui/css/src/modules/_settings.scss
create mode 100644 ui/js/host-audit.js
create mode 100644 ui/js/host-settings.js
rename ui/pages/{tabs => }/host-admin.html.tmpl (52%)
create mode 100644 ui/pages/host-audit.html.tmpl
rename ui/pages/{tabs => }/host-network.html.tmpl (95%)
rename ui/pages/{tabs => }/host-storage.html.tmpl (100%)
create mode 100644 ui/pages/host-sysmodules.html.tmpl
create mode 100644 ui/pages/host-system-services.html.tmpl
create mode 100644 ui/pages/tabs/host-settings.html.tmpl
delete mode 100644 ui/pages/tabs/host-system-services.html.tmpl

--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:17:42 PM3/2/17
to Ginger Devel
This patch launches only one tab (Settings) for Ginger plugin.
This tab has a sidebar menu which each entry represents a former Ginger tab
(Administration, Network, Storage, System Services).

This patch does not do any UI change in the tabs content. It only
changes the way the tab content is displayed.

The HTML files were moved from /tabs to avoid getting a lastPage cookie
set on every sidebar entry. That way, when refresing the browser
section, the user will get the current tab content refreshed.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
Signed-off-by: Samuel GuimarĂ£es <sguima...@gmail.com>
---
ui/config/tab-ext.xml | 25 +--
ui/css/ginger.css | 95 ++++++++++-
ui/css/src/ginger.scss | 3 +-
ui/css/src/modules/_settings.scss | 104 ++++++++++++
ui/js/host-settings.js | 181 +++++++++++++++++++++
ui/pages/{tabs => }/host-admin.html.tmpl | 0
ui/pages/{tabs => }/host-network.html.tmpl | 0
ui/pages/{tabs => }/host-storage.html.tmpl | 0
ui/pages/{tabs => }/host-system-services.html.tmpl | 0
ui/pages/i18n.json.tmpl | 2 +
ui/pages/tabs/host-settings.html.tmpl | 53 ++++++
11 files changed, 438 insertions(+), 25 deletions(-)
create mode 100644 ui/css/src/modules/_settings.scss
create mode 100644 ui/js/host-settings.js
rename ui/pages/{tabs => }/host-admin.html.tmpl (100%)
rename ui/pages/{tabs => }/host-network.html.tmpl (100%)
rename ui/pages/{tabs => }/host-storage.html.tmpl (100%)
rename ui/pages/{tabs => }/host-system-services.html.tmpl (100%)
create mode 100644 ui/pages/tabs/host-settings.html.tmpl

diff --git a/ui/config/tab-ext.xml b/ui/config/tab-ext.xml
index 6e92641..e768633 100644
+ <path>plugins/ginger/tabs/host-settings.html</path>
</tab>
</tabs-ext>
diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index a6495dd..412561c 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -1,6 +1,6 @@
@charset "UTF-8";
/*
- * Copyright IBM Corp, 2015-2016
+ * Copyright IBM Corp, 2015-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
#administration-root-container .accordion {
margin: 12px 20px 12px 60px;
padding-bottom: 18px;
diff --git a/ui/css/src/ginger.scss b/ui/css/src/ginger.scss
index 19dc761..abd2d06 100644
--- a/ui/css/src/ginger.scss
+++ b/ui/css/src/ginger.scss
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp, 2015-2016
+ * Copyright IBM Corp, 2015-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -166,6 +166,7 @@
//
// Ginger and classes
// ----------------------------------------------------------------------------
+@import "modules/sidebar";
@import "modules/administration";
@import "modules/network";
@import "modules/storage";
diff --git a/ui/css/src/modules/_settings.scss b/ui/css/src/modules/_settings.scss
new file mode 100644
index 0000000..aa6c71d
--- /dev/null
+++ b/ui/css/src/modules/_settings.scss
+ }
+ }
+ }
+}
+
diff --git a/ui/js/host-settings.js b/ui/js/host-settings.js
new file mode 100644
index 0000000..00e6809
--- /dev/null
+++ b/ui/js/host-settings.js
@@ -0,0 +1,181 @@
+/*
+ * Copyright IBM Corp, 2017
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ginger.sidebarObj = [
+ {
+ title: i18n['Administration'],
+ url: 'plugins/ginger/host-admin.html',
+ id: 'ginger-admin'
+ },
+ {
+ title: i18n['Network'],
+ url: 'plugins/ginger/host-network.html',
+ id: 'ginger-network'
+ },
+ {
+ title: i18n['Storage'],
+ url: 'plugins/ginger/host-storage.html',
+ id: 'ginger-storage'
+ },
+ {
+ title: i18n['System Services'],
+ url: 'plugins/ginger/host-system-services.html',
+ id: 'ginger-system-services'
+ }
+ wok.cookie.set('lastGingerPage', url)
+ }).promise()
+ .done(function() {
+ $('#rightCol > .wok-mask').hide();
+ });
+ };
+
+ var checkHash = function(url) {
+ var hashClick = url.split('/')[1];
+ var hashPage = url.split('/')[2];
+ if (hashPage === 'host-settings' && (THIS_PLUGIN === hashClick)) {
+ wok.topic('redirect').publish(url + '.html');
+ } else if (hashPage !== 'host-settings' && (THIS_PLUGIN === hashClick)) {
+ wok.topic('sidebarClicked').publish(url + '.html');
+ } else {
+ // Logs every datatable instance and destroys them to avoid warnings
+ var tables = $.fn.dataTable.tables();
+ if (tables.length){
+ $.each(tables, function(i, table) {
+ $(table).DataTable().clear().destroy();
+ });
+ }
+ wok.topic('sidebarClicked').unsubscribe(onSidebarRedirect);
+ wok.topic('redirect').publish(url + '.html');
+ }
+ }
+
+ var clickHandlers = function() {
+ wok.topic('sidebarClicked').subscribe(onSidebarRedirect);
+
+ $('#sidebar.list-group').on('click', 'a', function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var href = $(this).attr('href');
+ checkHash(href.substring(0, href.lastIndexOf('.')));
+ });
+ };
+
+ var triggerFirstAvailableOption = function() {
+ var el = this.el;
+ $('li > a', el).first().trigger('click');
+ }
+
+ return {
+ THIS_PLUGIN: THIS_PLUGIN,
+ createSidebar: createSidebar,
+ onSidebarRedirect: onSidebarRedirect,
+ loadPanel: loadPanel,
+ checkHash: checkHash,
+ clickHandlers: clickHandlers,
+ triggerFirstAvailableOption: triggerFirstAvailableOption
+ };
+})();
+
+ginger.initSidebar = function() {
+ var $sidebar = $('#sidebar');
+ var $leftCol = $('#leftCol');
+ var $content = $('#rightCol');
+ var $body = $(document.body);
+ var navHeight = $('.topbar').outerHeight(true) + 40;
+
+ var start = new Sidebar($leftCol, ginger.sidebarObj);
+ lastGingerPage = wok.cookie.get('lastGingerPage')
+ if (!lastGingerPage)
+ start.triggerFirstAvailableOption();
+ else
+ wok.topic('sidebarClicked').publish(lastGingerPage);
+
+ var checkScrollPosition = function() {
+ if ($(window).scrollTop() + $(window).height() > $(document).height() - 66) {
+ var $bottom = ($(window).scrollTop() + $(window).height()) - $(document).height();
+ $('#sidebar.affix').css('bottom', '66px');
+ } else {
+ $('#sidebar.affix').css('bottom', '6px');
+ }
+ };
+
+ /* activate sidebar */
+ if ($content.height() > $sidebar.height()) {
+ $sidebar.affix({
+ offset: {
+ top: 210
+ }
+ });
+
+ $body.scrollspy({
+ target: '#leftCol',
+ offset: navHeight
+ });
+
+ $(window).on("load resize scroll", function(e) {
+ checkScrollPosition();
+ });
+ }
+};
diff --git a/ui/pages/tabs/host-admin.html.tmpl b/ui/pages/host-admin.html.tmpl
similarity index 100%
rename from ui/pages/tabs/host-admin.html.tmpl
rename to ui/pages/host-admin.html.tmpl
diff --git a/ui/pages/tabs/host-network.html.tmpl b/ui/pages/host-network.html.tmpl
similarity index 100%
rename from ui/pages/tabs/host-network.html.tmpl
rename to ui/pages/host-network.html.tmpl
diff --git a/ui/pages/tabs/host-storage.html.tmpl b/ui/pages/host-storage.html.tmpl
similarity index 100%
rename from ui/pages/tabs/host-storage.html.tmpl
rename to ui/pages/host-storage.html.tmpl
diff --git a/ui/pages/tabs/host-system-services.html.tmpl b/ui/pages/host-system-services.html.tmpl
similarity index 100%
rename from ui/pages/tabs/host-system-services.html.tmpl
rename to ui/pages/host-system-services.html.tmpl
diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
index 6c4a8a1..aee124c 100644
--- a/ui/pages/i18n.json.tmpl
+++ b/ui/pages/i18n.json.tmpl
@@ -22,10 +22,12 @@
#silent _ = t.gettext
#silent _t = t.gettext
{
+ "Settings": "$_("Settings")",
"Administration": "$_("Administration")",
"Network": "$_("Network")",
"Storage": "$_("Storage")",
"System Modules": "$_("System Modules")",
+ "System Services": "$_("System Services")",
"Manual": "$_("Manual")",
"Automatic(DHCP)": "$_("Automatic(DHCP)")",
"Automatic": "$_("Automatic")",
diff --git a/ui/pages/tabs/host-settings.html.tmpl b/ui/pages/tabs/host-settings.html.tmpl
new file mode 100644
index 0000000..f088232
--- /dev/null
+++ b/ui/pages/tabs/host-settings.html.tmpl
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2017
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+ <script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ <script type="text/javascript" src="plugins/ginger/js/host-settings.js"></script>
+</head>
+<body>
+ <div class="container">
+ <div id="gingerMainContent" class="row">
+ <div id="leftCol">
+ </div>
+ <div id="rightCol">
+ <div class="row"></div>
+ <div class="wok-mask">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<script type="text/javascript">
+ ginger.initSidebar();

Aline Manera

unread,
Mar 2, 2017, 8:17:48 PM3/2/17
to Ginger Devel
There are 3 sections in the Administration tab related to Audit.
This patch adds a new sidebar entry (Audit) to accommodate all those audit
features.

This patch does not change any UI element. It is just moving code around
to get the features separated into a new sidebar entry.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/css/ginger.css | 12 +
ui/css/src/modules/_administration.scss | 5 +
ui/js/host-admin.js | 1299 -------------------------------
ui/js/host-audit.js | 1280 ++++++++++++++++++++++++++++++
ui/js/host-settings.js | 22 +-
ui/pages/host-admin.html.tmpl | 472 -----------
ui/pages/host-audit.html.tmpl | 518 ++++++++++++
ui/pages/i18n.json.tmpl | 1 +
8 files changed, 1832 insertions(+), 1777 deletions(-)
create mode 100644 ui/js/host-audit.js
create mode 100644 ui/pages/host-audit.html.tmpl

diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index 412561c..a11ba87 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -252,6 +252,7 @@
float: left;
}

+#audit-root-container .accordion,
#administration-root-container .accordion {
margin: 12px 20px 12px 60px;
padding-bottom: 18px;
// See the License for the specific language governing permissions and
- wok.message.error(data.responseJSON.reason,"#alert-modal-audit-logs-container");
- });
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- });
-
- $("#dispatch-status-btn").off();
- $("#dispatch-status-btn").on('click',function(e){
- var getCurrentStatus = $(".status-value").text();
- var action = (getCurrentStatus=='enabled')?'disable':'enable';
- ginger.changeAuditDispatcherStatus(action,function(result){
- if(result['dispatcher']!=undefined){
- $("#dispatch-status-btn").empty().append('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
- wok.message.success(i18n['GINAUDITDISP0013M'],"#alert-modal-audit-dispatcher-container");
- $(".status-value").text('enabled');
- }else{
- $("#dispatch-status-btn").empty().append('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
- wok.message.success(i18n['GINAUDITDISP0014M'],"#alert-modal-audit-dispatcher-container");
- $(".status-value").text('disabled');
- }
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- wok.message.error(error.responseJSON.reason,"#alert-modal-disp-conf-container");
- });
- wok.message.error(error.responseJSON.reason,"#alert-modal-plugin-container");
- });
- window.open(reportFilePath, '_blank');
- });
- wok.message.error(data.responseJSON.reason,"#alert-modal-audit-graph-container");
- });
new file mode 100644
index 0000000..39b4cf6
--- /dev/null
+++ b/ui/js/host-audit.js
@@ -0,0 +1,1280 @@
+/*
+ * Copyright IBM Corp, 2017
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ ginger.ruleDetailsPopulation(ruleInfo,row);
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-rules-details',$("#audit-rules-table tbody")).closest("tr").css("color","black");
+ }
+ });
+
+ wok.window.open('plugins/ginger/host-admin-editSystemRule.html');
+ }
+ }
+ }
+ }
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ }
+ }, function(error) {
+ wok.message.error(error.responseJSON.reason, '#audit-message', true);
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ if (selectedRowsDataLength === 0) {
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ });
+ }
+ }
+ });
+ }
+ $("#audit-logs-table tbody").html(rows);
+
+ var auditLogsTable = $("#audit-logs-table").DataTable({
+ columnDefs: [
+ {"width":"15%", "targets" : 0},
+ {"width":"15%", "targets" : 1},
+ {"width":"60%", "targets" : 2},
+ {"width":"10%", "targets" : 3},
+ {orderable: false, targets: [3]}],
+ autoWidth:false,
+ "dom": '<"row"<"log-report pull-left"><"log-filter pull-left"><"log-reset pull-left"><"col-sm-12 filter"<"pull-right"l><"pull-right"f>>><"row"<"col-sm-12"t>><"row"<"col-sm-6 pages"p><"col-sm-6 info"i>>',
+ "initComplete": function(settings, json) {
+ wok.initCompleteDataTableCallback(settings);
+ var reportButton = '<button class="btn btn-primary pull-left" id="log-report-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogReport"><i class="fa fa-file-archive-o">&nbsp;</i> ' + i18n['GINAUDIT0008M'] + '</button>';
+ var filterButton = '<button class="btn btn-primary" id="log-filter-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogFilter"><i class="fa fa-filter">&nbsp;</i>' + i18n['GINAUDIT0007M'] + '</button>';
+ var resetButton = '<button class="btn btn-primary" id="log-reset-btn" aria-expanded="false"><i class="fa fa-undo">&nbsp;</i>' + i18n['GINAUDIT0019M'] + '</button>';
+ $(".log-report").html(reportButton);
+ $(".log-filter").append(filterButton);
+ $(".log-reset").html(resetButton);
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINAUDIT0012M']
+ }
+ });
+
+ // Add event listener for opening and closing details
+ $('#audit-logs-table tbody').off();
+ $('#audit-logs-table tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = auditLogsTable.row( tr );
+ var logMessage = (row.data()[2]!="")?row.data()[2]:i18n['GINAUDIT0001M'];
+ var dateTime = (row.data()[0]!="")?row.data()[0]:'';
+ var type = (row.data()[1]!="")?row.data()[1]:'';
+
+ $('.audit-log-details',$('#audit-logs-table tbody')).parent().remove();
+ $('.fa-chevron-up',$('#audit-logs-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+dateTime+'</dt><dd>'+i18n['GINAUDIT0013M']+'</dd><dt>'+type+'</dt><dd>'+i18n['GINAUDIT0014M']+'</dd><dt>'+logMessage+'</dt><dd>'+i18n['GINAUDIT0015M']+'</dd></dl></div>').show();
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-log-details',$('#audit-logs-table tbody')).closest("tr").css("color","black");
+ }
+ });
+
+ //Row selection
+ $('#audit-logs-table tbody').on('click', 'tr', function () {
+ if ($(this).hasClass("selected")) {
+ $(this).removeClass("selected");
+ } else {
+ auditLogsTable.$('tr.selected').removeClass('selected');
+ $(this).addClass("selected");
+ }
+ });
+
+ }
+ });
+ }
+ $(".status-value").text('enabled');
+ } else {
+ $("#dispatch-status-btn").empty().html('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
+ $(".status-value").text('disabled');
+ }
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINAUDIT0012M']
+ }
+ });
+
+ // Add event listener for opening and closing details
+ $('#audit-disp-plugin-table tbody').off();
+ $('#audit-disp-plugin-table tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = auditDispPluginTable.row( tr );
+ var details = (row.data()[3]!="")?JSON.parse(row.data()[3]):i18n['GINAUDIT0001M'];
+
+ $('.audit-log-details',$('#audit-disp-plugin-table tbody')).parent().remove();
+ $('.fa-chevron-up',$('#audit-disp-plugin-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ var direction = (details['direction']!=undefined)?details['direction']:'--';
+ var format = (details['format']!=undefined)?details['format']:'--';
+ var args = (details['args']!=undefined)?details['args']:'--';
+ var active = (details['active']!=undefined)?details['active']:'--';
+ var path = (details['path']!=undefined)?details['path']:'--';
+ var type = (details['type']!=undefined)?details['type']:'--';
+
+ row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+
+ direction+'</dt><dd>'+i18n['GINAUDITDISP0001M']+'</dd><dt>'+
+ format+'</dt><dd>'+i18n['GINAUDITDISP0002M']+'</dd><dt>'+
+ args+'</dt><dd>'+i18n['GINAUDITDISP0003M']+'</dd><dt>'+
+ active+'</dt><dd>'+i18n['GINAUDITDISP0004M']+'</dd><dt>'+
+ path+'</dt><dd>'+i18n['GINAUDITDISP0005M']+'</dd><dt>'+
+ type+'</dt><dd>'+i18n['GINAUDITDISP0006M']+'</dd>'+
+ '</dl></div>').show();
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-log-details',$('#audit-disp-plugin-table tbody')).closest("tr").css('color','black');
+ }
+ });
+
+
+ //Row selection
+ $('#audit-disp-plugin-table tbody').on('click', 'tr', function () {
+ if ($(this).hasClass("selected")) {
+ $(this).removeClass("selected");
+ } else {
+ auditDispPluginTable.$('tr.selected').removeClass('selected');
+ $(this).addClass("selected");
+ }
+ });
+
+ $('#disp-refresh-btn').off();
+ $('#disp-refresh-btn').on('click', function(e) {
+ $(".dispatcher-loader").show();
+ ginger.getDispatcherPlugin(function(result) {
+ $("#audit-disp-plugin-table tbody").empty();
+ $("#audit-disp-plugin-table").DataTable().destroy();
+ ginger.createDispatcherPluginTable(result);
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ });
+
+ $("#dispatch-status-btn").off();
+ $("#dispatch-status-btn").on('click',function(e) {
+ var getCurrentStatus = $(".status-value").text();
+ var action = (getCurrentStatus=='enabled')?'disable':'enable';
+ ginger.changeAuditDispatcherStatus(action,function(result) {
+ if (result['dispatcher']!=undefined) {
+ $("#dispatch-status-btn").empty().append('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
+ wok.message.success(i18n['GINAUDITDISP0013M'],"#alert-modal-audit-dispatcher-container");
+ $(".status-value").text('enabled');
+ } else {
+ $("#dispatch-status-btn").empty().append('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
+ wok.message.success(i18n['GINAUDITDISP0014M'],"#alert-modal-audit-dispatcher-container");
+ $(".status-value").text('disabled');
+ }
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ });
+
+ $("#plugin-edit-btn").off();
+ $("#plugin-edit-btn").on('click',function() {
+ var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
+ if (selectedRowsData.length>0) {
+ $("#auditPluginDetails").modal("show");
+ } else {
+ var settings = {
+ content: i18n['GINAUDITDISP0009M'],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {},function() {});
+ }
+ });
+
+ $("#active").val("yes");
+ } else {
+ }
+ });
+ };
+
+ $(".add-filter",'#auditlogFilter').on("click", function(e) {
+ e.preventDefault();
+ }
+ });
+
+ if (params=='') {
+ ginger.getAuditLogs(function(result) {
+ reloadAuditLogs(result);
+ },function(error) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
+ });
+ } else {
+ ginger.filterAuditLogs(params,function(result) {
+ reloadAuditLogs(result);
+ },function(error) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
+ });
+ }
+
+ }
+ });
+ };
+
+ $(".add-filter",'#auditlogReport').on("click", function(e) {
+ e.preventDefault();
+ });
+ }
+
+ var populateReport = function(result) {
+ $('#report-details').removeClass("hidden").focus();
+ $('#summaryreport').empty();
+ var columnInfo = {};
+ var summary = [];
+
+ if (result.length>1) {
+ columnInfo = result[0]["column_info"];
+ summary = result[1]["summary"];
+ $("#report-graph-button").removeClass("hidden");
+ } else {
+ summary = result[0]["summary"];
+ $("#report-graph-button").addClass("hidden");
+ }
+
+ var details = "";
+ $.each(summary,function(index,info) {
+ if (info!="") {
+ details+=info+"<br>";
+ }
+ });
+
+ ginger.initGraphDetails(columnInfo);
+ $('#summaryreport').append(details);
+ $("#summaryReportPathInfo").html(i18n['GINAUDIT0017M']).removeClass('hidden');
+ $('.report-loader').hide();
+ }
+ }
+ });
+
+ $("#generate-report-graph-button").removeClass("hidden");
+ } else {
+ $("#generate-report-graph-button").addClass("hidden");
+ }
+ }
+
+};
diff --git a/ui/js/host-settings.js b/ui/js/host-settings.js
index 00e6809..976a427 100644
--- a/ui/js/host-settings.js
+++ b/ui/js/host-settings.js
@@ -145,12 +145,22 @@ ginger.initSidebar = function() {
var $body = $(document.body);
var navHeight = $('.topbar').outerHeight(true) + 40;

- var start = new Sidebar($leftCol, ginger.sidebarObj);
- lastGingerPage = wok.cookie.get('lastGingerPage')
- if (!lastGingerPage)
- start.triggerFirstAvailableOption();
- else
- wok.topic('sidebarClicked').publish(lastGingerPage);
+ ginger.getCapabilities(function(result) {
+ if (result.Audit) {
+ ginger.sidebarObj.push({
+ title: i18n['Audit'],
+ url: 'plugins/ginger/host-audit.html',
+ id: 'ginger-audit'
+ });
+ }
+
+ var start = new Sidebar($leftCol, ginger.sidebarObj);
+ lastGingerPage = wok.cookie.get('lastGingerPage')
+ if (!lastGingerPage)
+ start.triggerFirstAvailableOption();
+ else
+ wok.topic('sidebarClicked').publish(lastGingerPage);
+ });

var checkScrollPosition = function() {
if ($(window).scrollTop() + $(window).height() > $(document).height() - 66) {
diff --git a/ui/pages/host-admin.html.tmpl b/ui/pages/host-admin.html.tmpl
index f7a5622..619ae59 100644
--- a/ui/pages/host-admin.html.tmpl
+++ b/ui/pages/host-admin.html.tmpl
diff --git a/ui/pages/host-audit.html.tmpl b/ui/pages/host-audit.html.tmpl
new file mode 100644
index 0000000..2e65f15
--- /dev/null
+++ b/ui/pages/host-audit.html.tmpl
@@ -0,0 +1,518 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2015-2016
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+ <script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ <script type="text/javascript" src="plugins/ginger/js/host-audit.js"></script>
+</head>
+<body>
+ <div id="audit-root-container" class="ginger">
+ <div class="container">
+ <div id="alert-container"></div>
+ <div id="gingerHostAudit" class="host-admin">
+ <!-- Audit Rules section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-rules-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Rules")</span>
+ </a>
+ </h3>
+ <div id="modalWindow" class="modal fade host-modal guests-modal" tabindex="-1" role="dialog" aria-labelledby="guestsModalLabel" aria-hidden="true">
+ </div>
+ </div>
+ </div>
+ <div class="btn-group">
+ <div class="dropdown auditmenu-action">
+ <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-pencil-square-o">$_("Rules")</i> <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li>
+ <button aria-expanded="false" id="audit-rule-add-btn" class="btn btn-primary"><i class="fa fa-plus-circle">$_("Add")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-Import-btn" class="btn btn-primary"><i class="fa fa-download">$_("Import")</i></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <button aria-expanded="false" id="Audit-Rule-Configure-btn" class="btn btn-primary"><i class="fa fa-pencil-square-o">$_("Configure Audit")</i></button>
+ <button aria-expanded="false" id="Audit-Rule-refresh-btn" class="btn btn-primary"><i class="fa fa-refresh">$_("Refresh")</i></button>
+ </div>
+ </div>
+ </div>
+ <div class="row" id="audit-rules">
+ <table id="audit-rules-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("ID")</th>
+ <th>$_("Type")</th>
+ <th>$_("Rule")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ <th style="text-align:center;">$_("Loaded")</th>
+ <th style="text-align:center;">$_("Persisted")</th>
+ <th>$_("Info")</th>
+ <th>$_("pervalue")</th>
+ <th>$_("loadvalue")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask rules-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="wok-mask logs-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="wok-mask dispatcher-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit logs - Log Filter -->
+<div class="modal fade host-modal" id="auditlogFilter" tabindex="-1" role="dialog" labelledby="AuditLogsFilterModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-filter-title"></h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-filter-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="log-path-info">$_("Log File Name")</label>
+ <div class="form-group">
+ <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
+ </div>
+ <span id="addfielderror-message" style="display:none;"></span>
+ <div class="row hidden" id="filterList">
+ <div class="col-md-12">
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Field")</label>
+ </div>
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Value")</label>
+ </div>
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="col-md-12" id="newRow">
+ </div>
+ </div>
+ <div class="checkbox" style="margin-top:25px;">
+ <label class="check-all">
+ <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
+ </label>
+ </div>
+ <div class="wok-mask Audit-log-loader" hidden>
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Please wait...")</div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="log-filter-button-apply" class="btn btn-default">$_("Filter")</button>
+ <button id="log-filter-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit log report summary -->
+<div class="modal fade host-modal" id="auditlogReport" tabindex="-1" role="dialog" labelledby="AuditLogReportSummaryModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-report-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-summary-title">$_("Audit Report")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-report-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <!-- <div class="form-group"> -->
+ <div class="form-group">
+ <label for="reportType">$_("Audit Report Type")</label>
+ <div class="col-md-12">
+ <select id="reportType" class="selectpicker col-sm-6" name="reporttype">
+ <option value="summary">$_("Summary Report")</option>
+ <option value="detailed">$_("Detailed Report")</option>
+ </select>
+ <button id="log-report-button-apply" class="btn btn-primary"style="margin-left:100px;">$_("Generate Report")</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="log-path-info">$_("Log File Name")</label>
+ <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
+ </p>
+ </div>
+ <!-- </div> -->
+ <div class="row">
+ <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
+ </div>
+ <span id="Filterfielderror-message" style="display:none;"></span>
+ <div class="row hidden" id="filterList">
+ <div class="col-md-12">
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Field")</label>
+ </div>
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Value")</label>
+ </div>
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="col-md-12" id="newRow">
+ </div>
+ </div>
+ <div class="checkbox" style="margin-top:25px;">
+ <label class="check-all">
+ <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
+ </label>
+ </div>
+ </form>
+ <div class="row hidden" id="report-details" style="margin-top:30px;" tabindex="-1">
+ <div class="alert alert-info hidden" id="summaryReportPathInfo"></div>
+ <div class="row">
+ <button id="report-graph-button" class="btn btn-primary" data-toggle="modal" data-target="#reportGraph">$_('Graph Preview')</button>
+ <button id="report-download-button" class="btn btn-primary" data-search="">$_('Download')</button>
+ </div>
+ <div class="clearfix">
+ <p id="summaryreport" class="report"></p>
+ </div>
+ <div class="wok-mask report-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Generating report...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="graphColumns">$_("Graph Columns")</label>
+ <div class="col-md-12">
+ <select id="graphColumns" class="selectpicker col-sm-6" name="graphcolumn" multiple data-max-options="2" data-min-options="2">
+ </select>
+ </div>
+ </div>
+ </form>
+ <div class="alert alert-info hidden" id="graphPathInfo"></div>
+ </div>
+ <div class="modal-footer">
+ <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Audit Dispatcher Configuration -->
+ <div class="modal fade host-modal" id="auditDisprConf" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="disp-conf-title">$_("Audit Dispatcher Configuration")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-disp-conf-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="overflowAction">$_("Overflow Action")</label>
+ <div class="form-group">
+ <input id="overflowAction" class="form-control input" name="overflowAction" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="priorityBoost">$_("Priority Boost")</label>
+ <div class="form-group">
+ <input id="priorityBoost" class="form-control input" name="priorityboost" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="qDepth">$_("Q Depth")</label>
+ <div class="form-group">
+ <input id="qDepth" class="form-control input" name="qDepth" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="maxRestarts">$_("Max restarts")</label>
+ <div class="form-group">
+ <input id="maxRestarts" class="form-control input" name="maxrestarts" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="nameFormat">$_("Name Format")</label>
+ <div class="form-group">
+ <input id="nameFormat" class="form-control input" name="nameFormat" style="width:50%;"/>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="disp-conf-button-apply" class="btn btn-default">$_("Apply")</button>
+ <button id="disp-conf-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Audit Dispatcher Plugin Details -->
+ <div class="modal fade host-modal" id="auditPluginDetails" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="disp-plugin-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="disp-conf-title">$_("Dispatcher Plugin Configuration")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-plugin-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-plugin-details">
+ <div class="form-group">
+ <label for="direction">$_("Direction")</label>
+ <div class="form-group">
+ <input id="direction" class="form-control input" name="direction" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="format">$_("Format")</label>
+ <div class="form-group">
+ <input id="format" class="form-control input" name="format" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="args">$_("Args")</label>
+ <div class="form-group">
+ <input id="args" class="form-control input" name="args" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="active">$_("Active")</label>
+ <div class="form-group">
+ <select id="active" class="selectpicker col-sm-6" name="active">
+ <option value="yes">$_("Yes")</option>
+ <option value="no">$_("No")</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="nameFormat">$_("Path")</label>
+ <div class="form-group">
+ <input id="path" class="form-control input" name="path" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="type">$_("Type")</label>
+ <div class="form-group">
+ <input id="type" class="form-control input" name="type" style="width:50%;"/>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="plugin-update-button-apply" class="btn btn-default">$_("Apply")</button>
+ <button id="plugin-update-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+</script>
+<script>
+ginger.initAudit();
+</script>
+</body>
+</html>
diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
index aee124c..7066e41 100644
--- a/ui/pages/i18n.json.tmpl
+++ b/ui/pages/i18n.json.tmpl
@@ -25,6 +25,7 @@
"Settings": "$_("Settings")",
"Administration": "$_("Administration")",
"Network": "$_("Network")",
+ "Audit": "$_("Audit")",
"Storage": "$_("Storage")",
"System Modules": "$_("System Modules")",
"System Services": "$_("System Services")",
--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:17:48 PM3/2/17
to Ginger Devel
The System Services tab is not only for system services. It also handles
the System Modules features.

As those feature are not related, there is no reason to keep them
together.

This patch adds a new sidebar entry for System Modules and split the
code into 2 HTML files.

This patch does not change any UI element. It is just moving code around
to get the features separated into 2 different sidebar entries.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/css/ginger.css | 78 +++++-------------
ui/css/src/modules/_sysmodules.scss | 14 ++--
ui/css/src/modules/_systemservices.scss | 20 ++---
ui/js/host-settings.js | 5 ++
ui/js/host-sysmodules.js | 25 +++++-
ui/js/host-system-services.js | 40 +---------
ui/pages/host-sysmodules.html.tmpl | 101 ++++++++++++++++++++++++
ui/pages/host-system-services.html.tmpl | 135 ++++++--------------------------
8 files changed, 191 insertions(+), 227 deletions(-)
create mode 100644 ui/pages/host-sysmodules.html.tmpl

diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index a11ba87..c1ecabe 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
// Code derived from Project Kimchi
+ flex-basis: 28.4%;
}

@media (min-width: $screen-xlg + 140) {
diff --git a/ui/js/host-settings.js b/ui/js/host-settings.js
index 976a427..f46ff6b 100644
--- a/ui/js/host-settings.js
+++ b/ui/js/host-settings.js
@@ -36,6 +36,11 @@ ginger.sidebarObj = [
title: i18n['System Services'],
url: 'plugins/ginger/host-system-services.html',
id: 'ginger-system-services'
+ },
+ {
+ title: i18n['System Modules'],
+ url: 'plugins/ginger/host-sysmodules.html',
+ id: 'ginger-system-modules'
}
];

diff --git a/ui/js/host-sysmodules.js b/ui/js/host-sysmodules.js
index ecc35b2..9017cfd 100644
--- a/ui/js/host-sysmodules.js
+++ b/ui/js/host-sysmodules.js
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp, 2016
+ * Copyright IBM Corp, 2016-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,6 +17,24 @@
*/

ginger.loadSysmodules = function() {
+ $('#rightCol > .wok-mask').show();
+
+ // Set height and panel scrollbars
+ var panelHeight = function() {
+ var viewportHeight = $(window).height();
+ $('.well', '#sysmodules-content-area').css({'height': viewportHeight - 300 +'px', 'overflow-y': 'scroll'});
+ };
+ panelHeight();
+
+ $(window).on('resize', function(){
+ panelHeight();
+ });
+
+ $('#rightCol > .wok-mask').show();

// Set height and panel scrollbars
var panelHeight = function() {
var viewportHeight = $(window).height();
- $('.well', '#sysmodules-accordion, #system-services-accordion').css({'height': viewportHeight - 400 +'px', 'overflow-y': 'scroll'});
+ $('.well', '#system-services-content-area').css({'height': viewportHeight - 300 +'px', 'overflow-y': 'scroll'});
};
panelHeight();

- // Hide other collapses once one is clicked
-
- $("#gingerHostAdmin > div > h3 > a[data-toggle=collapse]").click(function(e){
- e.preventDefault();
- e.stopPropagation();
- $("#gingerHostAdmin > div > .panel-collapse.collapse.in").collapse("hide");
- $($(this).attr("href")).collapse("show");
- });
-
- $('#system-services-datagrid ul').addClass('hidden');
- $('#system-services-datagrid .no-matching-data').removeClass('hidden');
- } else {
- $('#system-services-datagrid ul').removeClass('hidden');
- $('#system-services-datagrid .no-matching-data').addClass('hidden');
- }
- });
-}
diff --git a/ui/pages/host-sysmodules.html.tmpl b/ui/pages/host-sysmodules.html.tmpl
new file mode 100644
index 0000000..e646e29
--- /dev/null
+++ b/ui/pages/host-sysmodules.html.tmpl
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2016
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+<script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+<script type="text/javascript" src="plugins/ginger/js/host-sysmodules.js"></script>
+</head>
+<body>
+ <div id="host-sysmodules-root-container" class="ginger">
+ <div class="container">
+ <div id="gingerHostSysModules" class="host-admin">
+ <div id="sysmodules-content-area">
+ <div id="sysmodules-alert-container"></div>
+ <div class="row grid-control">
+ <div class="sysmodules-actions btn-group" id="sysmodules-actions-area">
+ <button class="btn btn-primary load-modules-btn" type="button" id="load_sysmodules_button"><i class="fa fa-download"></i> $_("Load Modules")</button>
+ </div>
+ <div class="pull-right">
+ <label for="search_input" class="sr-only">$_("Filter System Modules"):</label>
+ <input type="text" class="filter form-control search" id="search_input" placeholder="$_("Filter")">
+ </div>
+ </div>
+ <div class="wok-datagrid" id="sysmodules-datagrid" role="grid">
+ <div class="wok-datagrid-header" role="row">
+ <span role="columnheader" class="column-name">$_("Name")</span><!--
+ --><span role="columnheader" class="column-depends">$_("Depends On")</span><!--
+ --><span role="columnheader" class="column-version">$_("Version")</span><!--
+ --><span role="columnheader" class="column-details">$_("Details")</span><!--
+ --><span role="columnheader" class="column-actions">
+ <span role="columnheader" class="sr-only">$_("Actions")</span><!--
+ --></span>
+ </div>
+ <div class="well">
+ <ul class="wok-datagrid-body list" id="sysmodules-body"></ul>
+ <div class="no-matching-data hidden">
+ <span role="row">$_("No result found")</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<script id="sysmodulesItem" type="html/text">
+ <li class="wok-datagrid-row" id="{name}" data-id="{name}" role="row">
+ <span role="gridcell" class="column-name name-filter" title="{name}">{name}</span><!--
+ --><span role="gridcell" class="column-depends depends-filter">{depends}</span><!--
+ --><span role="gridcell" class="column-version version-filter">{version}</span><!--
+ --><span role="gridcell" class="column-details">
+ <div class="arrow arrow-down" role="button"></div>
+ </span><!--
+ --><span role="gridcell" class="column-actions btn btn-link btn-unload"><i class="fa fa-upload"></i> $_("Unload")</span>
+ <div role="gridcell" class="sysmodules-details" style="display: none;">
+ <div role="grid" class="details-list"></div>
+ </div>
+ <div role="presentation" class="clear"></div>
+ </li>
+</script>
+<script id="detail-head" type="text/html">
+ <span role="row" class="column-{key}">
+ <span role="columnheader" class='header-{key}'>{title}</span>
+ <span role="gridcell" class='body-{key}'></span>
+ </span>
+</script>
+<script id="detail-body" type="text/html">
+ <span class="row-{index}">{object}</span>
+</script>
+<script id="detail-body-obj" type="text/html">
+ <span class="row-{index}">
+ <span class="col-key">{key}:</span>
+ <span class="col-value">{value}</span>
+ </span>
+</script>
+<script>
+ ginger.loadSysmodules();
+</script>
+<div id="modalWindow" class="modal fade host-modal sysmodules-modal ginger" tabindex="-1" role="dialog" aria-labelledby="sysmodulesModalLabel" aria-hidden="true"></div>
+</body>
+</html>
diff --git a/ui/pages/host-system-services.html.tmpl b/ui/pages/host-system-services.html.tmpl
index ed6fc8d..f2e37cb 100644
--- a/ui/pages/host-system-services.html.tmpl
+++ b/ui/pages/host-system-services.html.tmpl
@@ -25,92 +25,34 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<head>
<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
<script type="text/javascript" src="plugins/ginger/js/util.js"></script>
-<script type="text/javascript" src="plugins/ginger/js/host-sysmodules.js"></script>
<script type="text/javascript" src="plugins/ginger/js/host-system-services.js"></script>
</head>
<body>
- <div id="host-sysmodules-root-container" class="ginger">
+ <div id="host-system-services-root-container" class="ginger">
<div class="container">
- <div id="gingerHostAdmin" class="host-admin">
- <div class="panel-group accordion" id="system-services-accordion" role="tablist" aria-multiselectable="false">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#system-services-accordion" href="#system-services-content-area" aria-expanded="false" aria-controls="system-services-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text" id="system-services-header">$_("System Services Management")</span>
- </a>
- </h3>
- <div id="system-services-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="system-services-header">
- <div id="system-services-alert-container"></div>
- <div class="row grid-control">
- <div class="pull-right">
- <label for="search_input_system_services" class="sr-only">$_("Filter System Services"):</label>
- <input type="text" class="filter form-control search" id="search_input_system_services" placeholder="$_("Filter")">
- </div>
- </div>
- <div class="wok-datagrid" id="system-services-datagrid">
- <div class="wok-datagrid-header">
- <span class="column-service-name" data-placement="auto bottom" data-toggle="tooltip" title="$_('Name')">$_("Name")</span><!--
- --><span class="column-service-loaded" data-placement="auto bottom" data-toggle="tooltip" title="$_('Loaded')">$_("Loaded")</span><!--
- --><span class="column-service-status" data-placement="auto bottom" data-toggle="tooltip" title="$_('Status')">$_("Status")</span><!--
- --><span class="column-service-autostart" data-placement="auto bottom" data-toggle="tooltip" title="$_('Autostart')">$_("Autostart")</span><!--
- --><span class="column-service-details" data-placement="auto bottom" data-toggle="tooltip" title="$_('Details')">$_("Details")</span><!--
- --><span class="column-service-description" data-placement="auto bottom" data-toggle="tooltip" title="$_('Description')">$_("Description")</span><!--
- --><span class="column-service-actions" data-placement="auto bottom" data-toggle="tooltip" title="$_('Actions')"><span class="sr-only">$_("Actions")</span></span>
- </div>
- <div class="well">
- <ul class="wok-datagrid-body list" id="system-services-body"></ul>
- <div class="no-matching-data hidden">
- <span role="row">$_("No result found")</span>
- </div>
- </div>
-
- </div>
- <div class="wok-mask">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="panel-group accordion" id="sysmodules-accordion" role="tablist" aria-multiselectable="false">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#sysmodules-accordion" href="#sysmodules-content-area" aria-expanded="false" aria-controls="sysmodules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text" id="sysmodules-header">$_("System Modules Management")</span>
- </a>
- </h3>
- <div id="sysmodules-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="sysmodules-header">
+ <div id="gingerHostSystemServices" class="host-admin">
+ <div id="system-services-content-area">
+ <div id="system-services-alert-container"></div>
+ <div class="row grid-control">
+ <div class="pull-right">
+ <label for="search_input_system_services" class="sr-only">$_("Filter System Services"):</label>
+ <input type="text" class="filter form-control search" id="search_input_system_services" placeholder="$_("Filter")">
+ </div>
+ </div>
+ <div class="wok-datagrid" id="system-services-datagrid">
+ <div class="wok-datagrid-header">
+ <span class="column-service-name" data-placement="auto bottom" data-toggle="tooltip" title="$_('Name')">$_("Name")</span><!--
+ --><span class="column-service-loaded" data-placement="auto bottom" data-toggle="tooltip" title="$_('Loaded')">$_("Loaded")</span><!--
+ --><span class="column-service-status" data-placement="auto bottom" data-toggle="tooltip" title="$_('Status')">$_("Status")</span><!--
+ --><span class="column-service-autostart" data-placement="auto bottom" data-toggle="tooltip" title="$_('Autostart')">$_("Autostart")</span><!--
+ --><span class="column-service-details" data-placement="auto bottom" data-toggle="tooltip" title="$_('Details')">$_("Details")</span><!--
+ --><span class="column-service-description" data-placement="auto bottom" data-toggle="tooltip" title="$_('Description')">$_("Description")</span><!--
+ --><span class="column-service-actions" data-placement="auto bottom" data-toggle="tooltip" title="$_('Actions')"><span class="sr-only">$_("Actions")</span></span>
+ </div>
<div class="well">
- <div id="sysmodules-alert-container"></div>
- <div class="row grid-control">
- <div class="sysmodules-actions btn-group" id="sysmodules-actions-area">
- <button class="btn btn-primary load-modules-btn" type="button" id="load_sysmodules_button"><i class="fa fa-download"></i> $_("Load Modules")</button>
- </div>
- <div class="pull-right">
- <label for="search_input" class="sr-only">$_("Filter System Modules"):</label>
- <input type="text" class="filter form-control search" id="search_input" placeholder="$_("Filter")">
- </div>
- </div>
- <div class="wok-datagrid" id="sysmodules-datagrid" role="grid">
- <div class="wok-datagrid-header" role="row">
- <span role="columnheader" class="column-name">$_("Name")</span><!--
- --><span role="columnheader" class="column-depends">$_("Depends On")</span><!--
- --><span role="columnheader" class="column-version">$_("Version")</span><!--
- --><span role="columnheader" class="column-details">$_("Details")</span><!--
- --><span role="columnheader" class="column-actions">
- <span role="columnheader" class="sr-only">$_("Actions")</span><!--
- --></span>
- </div>
- <ul class="wok-datagrid-body list" id="sysmodules-body"></ul>
- </div>
- <div class="wok-mask">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
+ <ul class="wok-datagrid-body list" id="system-services-body"></ul>
+ <div class="no-matching-data hidden">
+ <span role="row">$_("No result found")</span>
</div>
</div>
</div>
@@ -118,36 +60,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
</div>
</div>
</div>
-<script id="sysmodulesItem" type="html/text">
- <li class="wok-datagrid-row" id="{name}" data-id="{name}" role="row">
- <span role="gridcell" class="column-name name-filter" title="{name}">{name}</span><!--
- --><span role="gridcell" class="column-depends depends-filter">{depends}</span><!--
- --><span role="gridcell" class="column-version version-filter">{version}</span><!--
- --><span role="gridcell" class="column-details">
- <div class="arrow arrow-down" role="button"></div>
- </span><!--
- --><span role="gridcell" class="column-actions btn btn-link btn-unload"><i class="fa fa-upload"></i> $_("Unload")</span>
- <div role="gridcell" class="sysmodules-details" style="display: none;">
- <div role="grid" class="details-list"></div>
- </div>

Aline Manera

unread,
Mar 2, 2017, 8:32:45 PM3/2/17
to Ginger Devel
** IMPORTANT **
This patch set DEPENDS on Wok patch:
- [Kimchi-devel] [PATCH] [Wok] Allow a plugin extends any HTML page from another one instead of only tabs content

V2 - V3:
- Update CSS file

V1 - V2:
- Move HTML files from /tabs to avoid getting the lastPage cookie set on every
sidebar entry
- Do not change location.hash when loading a sidebar entry


Aline Manera (4):
Fix expand/collpase widget configuration in Network tab
Ginger sidebar
Move Audit features to a sidebar entry
Move System Modules to a sidebar entry

ui/config/tab-ext.xml | 25 +-
ui/css/ginger.css | 185 ++--
ui/css/src/ginger.scss | 3 +-
ui/css/src/modules/_administration.scss | 5 +
ui/css/src/modules/_settings.scss | 104 +++
ui/css/src/modules/_sysmodules.scss | 14 +-
ui/css/src/modules/_systemservices.scss | 20 +-
ui/js/host-admin.js | 1299 --------------------------
ui/js/host-audit.js | 1280 +++++++++++++++++++++++++
ui/js/host-settings.js | 196 ++++
ui/js/host-sysmodules.js | 25 +-
ui/js/host-system-services.js | 40 +-
ui/pages/{tabs => }/host-admin.html.tmpl | 472 ----------
ui/pages/host-audit.html.tmpl | 518 ++++++++++
ui/pages/{tabs => }/host-network.html.tmpl | 8 +-
ui/pages/{tabs => }/host-storage.html.tmpl | 0
ui/pages/host-sysmodules.html.tmpl | 101 ++
ui/pages/host-system-services.html.tmpl | 120 +++
ui/pages/i18n.json.tmpl | 3 +
ui/pages/tabs/host-settings.html.tmpl | 53 ++
ui/pages/tabs/host-system-services.html.tmpl | 209 -----
21 files changed, 2556 insertions(+), 2124 deletions(-)
create mode 100644 ui/css/src/modules/_settings.scss
create mode 100644 ui/js/host-audit.js
create mode 100644 ui/js/host-settings.js
rename ui/pages/{tabs => }/host-admin.html.tmpl (52%)
create mode 100644 ui/pages/host-audit.html.tmpl
rename ui/pages/{tabs => }/host-network.html.tmpl (95%)
rename ui/pages/{tabs => }/host-storage.html.tmpl (100%)

Aline Manera

unread,
Mar 2, 2017, 8:32:46 PM3/2/17
to Ginger Devel
There are some elements which 2 settings for aria-expanded.
aria-expanded should be set to true when the widget is open (expanded) and,
in addition to that, the content should have the class "collapse in".
Otherwise, the expand icon will not reflect the right behavior.
When setting aria-expanded=false, only set the content class as "collapse".

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/pages/tabs/host-network.html.tmpl | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/ui/pages/tabs/host-network.html.tmpl b/ui/pages/tabs/host-network.html.tmpl
index f17d81b..7c7ceb1 100644
--- a/ui/pages/tabs/host-network.html.tmpl
+++ b/ui/pages/tabs/host-network.html.tmpl
@@ -43,7 +43,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<!-- Global Network Configuration Panel -->
<div class="panel-group network-ppc-enabled accordion" id="network-global-configuration-accordion" role="tablist" aria-multiselectable="true">
<h3>
- <a role="button" aria-expanded="true" data-toggle="collapse" data-parent="#network-global-accordion" href="#network-global-configuration-content-area" aria-expanded="true" aria-controls="network-global-configuration-content-area">
+ <a role="button" aria-expanded="false" data-toggle="collapse" data-parent="#network-global-accordion" href="#network-global-configuration-content-area" aria-controls="network-global-configuration-content-area">
<span class="accordion-icon"></span>
<span class="accordion-text" id="global-network-configuration-title">$_("Global Network Configuration")</span>
</a>
@@ -85,7 +85,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<!-- Redesigned Network Configuration Panel -->
<div class="panel-group network-ppc-enabled accordion" id="network-configuration-accordion" role="tablist" aria-multiselectable="true">
<h3>
- <a role="button" aria-expanded="true" data-toggle="collapse" data-parent="#network-configuration-accordion" href="#network-configuration-content-area" aria-expanded="false" aria-controls="network-configuration-content-area">
+ <a role="button" data-toggle="collapse" data-parent="#network-configuration-accordion" href="#network-configuration-content-area" aria-expanded="false" aria-controls="network-configuration-content-area">
<span class="accordion-icon"></span>
<span class="accordion-text" id="network-configuration-title">$_("Network Configuration")</span>
</a>
@@ -95,7 +95,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<div id="enable-sriov-progress-container" class="enable-sriov-status" style='display: none;'>
<div>
<h3>
- <a role="button" data-toggle="collapse" data-parent="#enable-sriov-progress-container" href="#status-sriov-container" aria-expanded="true" aria-controls="status-sriov-container">
+ <a role="button" data-toggle="collapse" data-parent="#enable-sriov-progress-container" href="#status-sriov-container" aria-expanded="false" aria-controls="status-sriov-container">
<i class="fa fa-chevron-down" role="presentation"></i>
$_("Enable SR-IOV Progress")
</a>
@@ -153,7 +153,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<script id="ovsBridgesPanel" type="text/html">
<div class='panel-group network-ppc-enabled accordion' id='ovsbridge-content-area-accordion' role='tablist' aria-multiselectable='true'>
<h3>
- <a role='button' aria-expanded='true' data-toggle='collapse' data-parent='#ovsbridge-content-area-accordion' href='#ovsbridge-content-area' aria-expanded='false' aria-controls='ovsbridge-content-area' class=''>
+ <a role='button' data-toggle='collapse' data-parent='#ovsbridge-content-area-accordion' href='#ovsbridge-content-area' aria-expanded='false' aria-controls='ovsbridge-content-area' class=''>
<span class='accordion-icon'></span>

Aline Manera

unread,
Mar 2, 2017, 8:32:49 PM3/2/17
to Ginger Devel
This patch launches only one tab (Settings) for Ginger plugin.
This tab has a sidebar menu which each entry represents a former Ginger tab
(Administration, Network, Storage, System Services).

This patch does not do any UI change in the tabs content. It only
changes the way the tab content is displayed.

The HTML files were moved from /tabs to avoid getting a lastPage cookie
set on every sidebar entry. That way, when refresing the browser
section, the user will get the current tab content refreshed.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
Signed-off-by: Samuel GuimarĂ£es <sguima...@gmail.com>
---
ui/config/tab-ext.xml | 25 +--
ui/css/ginger.css | 95 ++++++++++-
ui/css/src/ginger.scss | 3 +-
ui/css/src/modules/_settings.scss | 104 ++++++++++++
ui/js/host-settings.js | 181 +++++++++++++++++++++
ui/pages/{tabs => }/host-admin.html.tmpl | 0
ui/pages/{tabs => }/host-network.html.tmpl | 0
ui/pages/{tabs => }/host-storage.html.tmpl | 0
ui/pages/{tabs => }/host-system-services.html.tmpl | 0
ui/pages/i18n.json.tmpl | 2 +
ui/pages/tabs/host-settings.html.tmpl | 53 ++++++
11 files changed, 438 insertions(+), 25 deletions(-)
create mode 100644 ui/css/src/modules/_settings.scss
create mode 100644 ui/js/host-settings.js
rename ui/pages/{tabs => }/host-admin.html.tmpl (100%)
rename ui/pages/{tabs => }/host-network.html.tmpl (100%)
rename ui/pages/{tabs => }/host-storage.html.tmpl (100%)
diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index a6495dd..412561c 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -1,6 +1,6 @@
@charset "UTF-8";
/*
- * Copyright IBM Corp, 2015-2016
+ * Copyright IBM Corp, 2015-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
margin: 12px 20px 12px 60px;
padding-bottom: 18px;
diff --git a/ui/css/src/ginger.scss b/ui/css/src/ginger.scss
index 19dc761..8d23a32 100644
--- a/ui/css/src/ginger.scss
+++ b/ui/css/src/ginger.scss
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp, 2015-2016
+ * Copyright IBM Corp, 2015-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -166,6 +166,7 @@
//
// Ginger and classes
// ----------------------------------------------------------------------------
+@import "modules/settings";
@import "modules/administration";
@import "modules/network";
@import "modules/storage";
diff --git a/ui/css/src/modules/_settings.scss b/ui/css/src/modules/_settings.scss
new file mode 100644
+ }
+ }
+ }
+}
+
+}
diff --git a/ui/js/host-settings.js b/ui/js/host-settings.js
new file mode 100644
+ },
+ {
+ title: i18n['Network'],
+ url: 'plugins/ginger/host-network.html',
+ id: 'ginger-network'
+ },
+ {
+ title: i18n['Storage'],
+ url: 'plugins/ginger/host-storage.html',
+ id: 'ginger-storage'
+ },
+ {
+ $('#rightCol > .wok-mask').show();
+
+ // Load page content.
+ loadPanel(url);
+ };
+
+ var loadPanel = function(url) {
+ // Get the page content through Ajax and render it.
+ url && $('#rightCol .row').load(url, function(responseText, textStatus, jqXHR) {
+ if (jqXHR['status'] === 401 || jqXHR['status'] === 303) {
+ var isSessionTimeout = jqXHR['responseText'].indexOf("sessionTimeout") != -1;
+ document.location.href = isSessionTimeout ? 'login.html?error=sessionTimeout' : 'login.html';
+ return;
+ } else if (status === "error") {
+ wok.message.error(xhr.status + " " + xhr.statusText, '#rightCol .row', true);
+ }
+ wok.cookie.set('lastGingerPage', url)
+ }).promise()
+ .done(function() {
+ $('#rightCol > .wok-mask').hide();
+ });
+ };
+
+ var checkHash = function(url) {
+ var hashClick = url.split('/')[1];
+ var hashPage = url.split('/')[2];
+ if (hashPage === 'host-settings' && (THIS_PLUGIN === hashClick)) {
+ wok.topic('redirect').publish(url + '.html');
+ } else if (hashPage !== 'host-settings' && (THIS_PLUGIN === hashClick)) {
+ wok.topic('sidebarClicked').publish(url + '.html');
+ } else {
+ // Logs every datatable instance and destroys them to avoid warnings
+ var tables = $.fn.dataTable.tables();
+ if (tables.length){
+ $.each(tables, function(i, table) {
+ $(table).DataTable().clear().destroy();
+ });
+ }
+ wok.topic('sidebarClicked').unsubscribe(onSidebarRedirect);
+ wok.topic('redirect').publish(url + '.html');
+ }
+ }
+
+ var clickHandlers = function() {
+ wok.topic('sidebarClicked').subscribe(onSidebarRedirect);
+
+ $('#sidebar.list-group').on('click', 'a', function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var href = $(this).attr('href');
+ checkHash(href.substring(0, href.lastIndexOf('.')));
+ });
+ };
+
+ var triggerFirstAvailableOption = function() {
+ var el = this.el;
+ $('li > a', el).first().trigger('click');
+ }
+
+ return {
+ THIS_PLUGIN: THIS_PLUGIN,
+ createSidebar: createSidebar,
+ onSidebarRedirect: onSidebarRedirect,
+ loadPanel: loadPanel,
+ checkHash: checkHash,
+ clickHandlers: clickHandlers,
+ triggerFirstAvailableOption: triggerFirstAvailableOption
+ };
+})();
+
+ginger.initSidebar = function() {
+ var $sidebar = $('#sidebar');
+ var $leftCol = $('#leftCol');
+ var $content = $('#rightCol');
+ var $body = $(document.body);
+ var navHeight = $('.topbar').outerHeight(true) + 40;
+
+ var start = new Sidebar($leftCol, ginger.sidebarObj);
+ lastGingerPage = wok.cookie.get('lastGingerPage')
+ if (!lastGingerPage)
+ start.triggerFirstAvailableOption();
+ else
+ wok.topic('sidebarClicked').publish(lastGingerPage);
+
+ var checkScrollPosition = function() {
+ if ($(window).scrollTop() + $(window).height() > $(document).height() - 66) {
+ var $bottom = ($(window).scrollTop() + $(window).height()) - $(document).height();
+ $('#sidebar.affix').css('bottom', '66px');
+ } else {
+ $('#sidebar.affix').css('bottom', '6px');
+ }
+ };
+
+ /* activate sidebar */
+ if ($content.height() > $sidebar.height()) {
+ $sidebar.affix({
+ offset: {
+ top: 210
+ }
+ });
+
diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
index 6c4a8a1..aee124c 100644
--- a/ui/pages/i18n.json.tmpl
+++ b/ui/pages/i18n.json.tmpl
@@ -22,10 +22,12 @@
#silent _ = t.gettext
#silent _t = t.gettext
{
+ "Settings": "$_("Settings")",
"Administration": "$_("Administration")",
"Network": "$_("Network")",
"Storage": "$_("Storage")",
"System Modules": "$_("System Modules")",
+ "System Services": "$_("System Services")",
"Manual": "$_("Manual")",
"Automatic(DHCP)": "$_("Automatic(DHCP)")",
"Automatic": "$_("Automatic")",
diff --git a/ui/pages/tabs/host-settings.html.tmpl b/ui/pages/tabs/host-settings.html.tmpl
new file mode 100644
index 0000000..f088232
--- /dev/null
+++ b/ui/pages/tabs/host-settings.html.tmpl
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2017
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+ <script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ <script type="text/javascript" src="plugins/ginger/js/host-settings.js"></script>
+</head>
+<body>
+ <div class="container">
+ <div id="gingerMainContent" class="row">
+ <div id="leftCol">
+ </div>
+ <div id="rightCol">
+ <div class="row"></div>
+ <div class="wok-mask">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<script type="text/javascript">
+ ginger.initSidebar();
+</script>
+</body>
+</html>
--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:32:52 PM3/2/17
to Ginger Devel
The System Services tab is not only for system services. It also handles
the System Modules features.

As those feature are not related, there is no reason to keep them
together.

This patch adds a new sidebar entry for System Modules and split the
code into 2 HTML files.

This patch does not change any UI element. It is just moving code around
to get the features separated into 2 different sidebar entries.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/css/ginger.css | 78 +++++-------------
ui/css/src/modules/_sysmodules.scss | 14 ++--
ui/css/src/modules/_systemservices.scss | 20 ++---
ui/js/host-settings.js | 5 ++
ui/js/host-sysmodules.js | 25 +++++-
ui/js/host-system-services.js | 40 +---------
ui/pages/host-sysmodules.html.tmpl | 101 ++++++++++++++++++++++++
ui/pages/host-system-services.html.tmpl | 135 ++++++--------------------------
8 files changed, 191 insertions(+), 227 deletions(-)
create mode 100644 ui/pages/host-sysmodules.html.tmpl

diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index a11ba87..c1ecabe 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
// Code derived from Project Kimchi
title: i18n['System Services'],
url: 'plugins/ginger/host-system-services.html',
id: 'ginger-system-services'
+ },
+ {
+ title: i18n['System Modules'],
+ url: 'plugins/ginger/host-sysmodules.html',
+ id: 'ginger-system-modules'
}
];

diff --git a/ui/js/host-sysmodules.js b/ui/js/host-sysmodules.js
index ecc35b2..9017cfd 100644
--- a/ui/js/host-sysmodules.js
+++ b/ui/js/host-sysmodules.js
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp, 2016
+ * Copyright IBM Corp, 2016-2017
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,6 +17,24 @@
*/

ginger.loadSysmodules = function() {
+ $('#rightCol > .wok-mask').show();
+
+ $('#rightCol > .wok-mask').show();

new file mode 100644
index 0000000..e646e29
--- /dev/null
+++ b/ui/pages/host-sysmodules.html.tmpl
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2016
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+<script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+<script type="text/javascript" src="plugins/ginger/js/host-sysmodules.js"></script>
+</head>
+<body>
+ <div id="host-sysmodules-root-container" class="ginger">
+ <div class="container">
+ <div id="gingerHostSysModules" class="host-admin">
+ <div id="sysmodules-content-area">
+ <div id="sysmodules-alert-container"></div>
+ <div class="row grid-control">
+ <div class="sysmodules-actions btn-group" id="sysmodules-actions-area">
+ <button class="btn btn-primary load-modules-btn" type="button" id="load_sysmodules_button"><i class="fa fa-download"></i> $_("Load Modules")</button>
+ </div>
+ <div class="pull-right">
+ <label for="search_input" class="sr-only">$_("Filter System Modules"):</label>
+ <input type="text" class="filter form-control search" id="search_input" placeholder="$_("Filter")">
+ </div>
+ </div>
+ <div class="wok-datagrid" id="sysmodules-datagrid" role="grid">
+ <div class="wok-datagrid-header" role="row">
+ <span role="columnheader" class="column-name">$_("Name")</span><!--
+ --><span role="columnheader" class="column-depends">$_("Depends On")</span><!--
+ --><span role="columnheader" class="column-version">$_("Version")</span><!--
+ --><span role="columnheader" class="column-details">$_("Details")</span><!--
+ --><span role="columnheader" class="column-actions">
+ <span role="columnheader" class="sr-only">$_("Actions")</span><!--
+ --></span>
+ </div>
+ <div class="well">
+ <ul class="wok-datagrid-body list" id="sysmodules-body"></ul>
+ <div class="no-matching-data hidden">
+ <span role="row">$_("No result found")</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
@@ -25,92 +25,34 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<head>
<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
<script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ </div>
+ </div>

Aline Manera

unread,
Mar 2, 2017, 8:32:54 PM3/2/17
to Ginger Devel
There are 3 sections in the Administration tab related to Audit.
This patch adds a new sidebar entry (Audit) to accommodate all those audit
features.

This patch does not change any UI element. It is just moving code around
to get the features separated into a new sidebar entry.

Signed-off-by: Aline Manera <ali...@linux.vnet.ibm.com>
---
ui/css/ginger.css | 12 +
ui/css/src/modules/_administration.scss | 5 +
ui/js/host-admin.js | 1299 -------------------------------
ui/js/host-audit.js | 1280 ++++++++++++++++++++++++++++++
ui/js/host-settings.js | 22 +-
ui/pages/host-admin.html.tmpl | 472 -----------
ui/pages/host-audit.html.tmpl | 518 ++++++++++++
ui/pages/i18n.json.tmpl | 1 +
8 files changed, 1832 insertions(+), 1777 deletions(-)
create mode 100644 ui/js/host-audit.js
create mode 100644 ui/pages/host-audit.html.tmpl

diff --git a/ui/css/ginger.css b/ui/css/ginger.css
index 412561c..a11ba87 100644
--- a/ui/css/ginger.css
+++ b/ui/css/ginger.css
@@ -252,6 +252,7 @@
float: left;
}

+#audit-root-container .accordion,
#administration-root-container .accordion {
margin: 12px 20px 12px 60px;
// See the License for the specific language governing permissions and
- $('.audit-rules-details',$("#audit-rules-table tbody")).closest("tr").css("color","black");
- }
- });
-
- //Row selection
- $('#audit-rules-table tbody').on('click', 'tr', function () {
- $(this).toggleClass("selected");
- });
-
- $('#Audit-Rule-refresh-btn').trigger('click');
- }
- });
- }
- if(selectedRowsDataLength === 0){
- $('#Audit-Rule-refresh-btn').trigger('click');
- }
- });
- })
- }
- });
- });
- }
-});
-
- wok.message.error(err.responseJSON.reason, '#alert-modal-audit-logs-container');
- });
-
- });
-
- // Add event listener for opening and closing details
- $('#audit-logs-table tbody').off();
- $('#audit-logs-table tbody').on('click', 'td.details-control', function () {
- var tr = $(this).closest('tr');
- var row = auditLogsTable.row( tr );
- var logMessage = (row.data()[2]!="")?row.data()[2]:i18n['GINAUDIT0001M'];
- var dateTime = (row.data()[0]!="")?row.data()[0]:'';
- var type = (row.data()[1]!="")?row.data()[1]:'';
-
- $('.audit-log-details',$('#audit-logs-table tbody')).parent().remove();
- $('.fa-chevron-up',$('#audit-logs-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- if (row.child.isShown()) {
- // This row is already open - close it
- row.child.hide();
- $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
- tr.removeClass('shown');
- }else{
- // Open this row
- row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+dateTime+'</dt><dd>'+i18n['GINAUDIT0013M']+'</dd><dt>'+type+'</dt><dd>'+i18n['GINAUDIT0014M']+'</dd><dt>'+logMessage+'</dt><dd>'+i18n['GINAUDIT0015M']+'</dd></dl></div>').show();
- $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
- tr.addClass('shown');
- $('.audit-log-details',$('#audit-logs-table tbody')).closest("tr").css("color","black");
- }
- });
-
- //Row selection
- $('#audit-logs-table tbody').on('click', 'tr', function () {
- if($(this).hasClass("selected")){
- $(this).removeClass("selected");
- } else{
- auditLogsTable.$('tr.selected').removeClass('selected');
- $(this).addClass("selected");
- }
- });
-
- $('#log-reset-btn').on('click', function(e) {
- $(".logs-loader").show();
- ginger.getAuditLogs(function(result){
- $("#audit-logs-table tbody").empty();
- $("#audit-logs-table").DataTable().destroy();
- ginger.createAuditLogsTable(result);
- },function(error){
- wok.message.error(data.responseJSON.reason,"#alert-modal-audit-logs-container");
- });
- $(".status-value").text('enabled');
- }else{
- $("#dispatch-status-btn").empty().html('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
- $(".status-value").text('disabled');
- }
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- })
- },
- "oLanguage": {
- "sEmptyTable": i18n['GINAUDIT0012M']
- }
- });
-
- $('.audit-log-details',$('#audit-disp-plugin-table tbody')).closest("tr").css('color','black');
- }
- });
-
-
- //Row selection
- $('#audit-disp-plugin-table tbody').on('click', 'tr', function () {
- if($(this).hasClass("selected")){
- $(this).removeClass("selected");
- }else{
- auditDispPluginTable.$('tr.selected').removeClass('selected');
- $(this).addClass("selected");
- }
- });
-
- $('#disp-refresh-btn').off();
- $('#disp-refresh-btn').on('click', function(e) {
- $(".dispatcher-loader").show();
- ginger.getDispatcherPlugin(function(result){
- $("#audit-disp-plugin-table tbody").empty();
- $("#audit-disp-plugin-table").DataTable().destroy();
- ginger.createDispatcherPluginTable(result);
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- });
-
- $("#dispatch-status-btn").off();
- $("#dispatch-status-btn").on('click',function(e){
- var getCurrentStatus = $(".status-value").text();
- var action = (getCurrentStatus=='enabled')?'disable':'enable';
- ginger.changeAuditDispatcherStatus(action,function(result){
- if(result['dispatcher']!=undefined){
- $("#dispatch-status-btn").empty().append('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
- wok.message.success(i18n['GINAUDITDISP0013M'],"#alert-modal-audit-dispatcher-container");
- $(".status-value").text('enabled');
- }else{
- $("#dispatch-status-btn").empty().append('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
- wok.message.success(i18n['GINAUDITDISP0014M'],"#alert-modal-audit-dispatcher-container");
- $(".status-value").text('disabled');
- }
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
- });
-
- $("#plugin-edit-btn").off();
- $("#plugin-edit-btn").on('click',function(){
- var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
- if(selectedRowsData.length>0){
- $("#auditPluginDetails").modal("show");
- }else{
- var settings = {
- content: i18n['GINAUDITDISP0009M'],
- confirm: i18n["GINNET0015M"]
- };
- wok.confirm(settings, function(){},function(){});
- }
- });
-
- $("#disp-settings-btn").off();
- $("#disp-settings-btn").on('click',function(){
- $("#auditDisprConf").modal("show");
- });
- $(".dispatcher-loader").hide();
-};
-
-ginger.getDispatcherDetails = function(){
- $('#auditDisprConf').on('show.bs.modal', function(event) {
-
- ginger.getDispatcherConfiguration(function(result){
- $("#overflowAction").val(result["overflow_action"]);
- $("#priorityBoost").val(result["priority_boost"]);
- $("#qDepth").val(result["q_depth"]);
- $("#maxRestarts").val(result["max_restarts"]);
- $("#nameFormat").val(result["name_format"]);
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
- });
-
- $("#disp-conf-button-apply").on("click",function(){
- var params = {};
- params['overflow_action'] = $("#overflowAction").val();
- params['priority_boost'] = $("#priorityBoost").val();
- params['q_depth'] = $("#qDepth").val();
- params['max_restarts'] = $("#maxRestarts").val();
- params['name_format'] = $("#nameFormat").val();
-
- ginger.updateDispatcherConfiguration(params, function(result){
- $('#auditDisprConf').modal('hide');
- wok.message.success(i18n['GINAUDITDISP0007M'],"#alert-modal-audit-dispatcher-container");
- },function(error){
- wok.message.error(error.responseJSON.reason,"#alert-modal-disp-conf-container");
- });
- });
- });
-
- $('#auditDisprConf').on('hide.bs.modal', function(event) {
- $("#disp-conf-button-apply").off();
- });
-};
-
-ginger.getPluginDetails = function(){
- $('#auditPluginDetails').on('show.bs.modal', function(event) {
- var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
- var pluginDetails = selectedRowsData[0];
- var detailsInfo = JSON.parse(pluginDetails[3]);
- var pluginName = pluginDetails[0];
-
- $("#direction").val(detailsInfo['direction']);
- $("#format").val(detailsInfo['format']);
- $("#args").val(detailsInfo['args']);
- if(detailsInfo['active'] == i18n['GINNET0077M']){
- $("#active").val("yes");
- }else{
- });
- });
-
- $("#filterList",'#auditlogFilter').addClass('hidden');
- });
-
- wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
- });
- }
-
- var reloadAuditLogs = function(result){
- $('#auditlogFilter').modal('hide');
- wok.message.success(i18n['GINAUDIT0016M'],"#alert-modal-audit-logs-container");
- $("#audit-logs-table tbody").empty();
- $("#audit-logs-table").DataTable().destroy();
- ginger.createAuditLogsTable(result);
- }
- }
- });
- });
-
- $('#auditlogFilter').on('hide.bs.modal', function(event) {
- $(".logs-loader").hide();
- $('.Audit-log-loader').hide();
- $('#log-path-info',$(this)).val('');
- $('#newRow',$(this)).empty();
- $('#interpret',$(this)).attr('checked',false);
- $('#log-filter-button-apply').off();
- $("#addfielderror-message").empty();
- $("#alert-modal-audit-filter-container").empty();
- });
-};
-
-ginger.initSummaryInfo = function(){
- $('#auditlogReport').on('show.bs.modal', function(event) {
- $("#reportType").selectpicker();
- $('#log-path-info','#auditlogReport').val("/var/log/audit/audit.log");
-
- var attachEvent = function(row) {
- $(".delete", row).on("click", function() {
- row.remove();
-
- if($('#newRow','#auditlogReport').children().length===0)
- $("#filterList",'#auditlogReport').addClass('hidden');
- });
-
- $('#filterList','#auditlogReport').addClass('hidden');
- });
-
- params+=field+(value!=undefined?(" "+value):'');
- });
-
- $("#report-graph-button").removeClass("hidden");
- }else{
- summary = result[0]["summary"];
- $("#report-graph-button").addClass("hidden");
- }
-
- var details = "";
- $.each(summary,function(index,info){
- if(info!=""){
- details+=info+"<br>";
- }
- });
-
- ginger.initGraphDetails(columnInfo);
- $('#summaryreport').append(details);
- $("#summaryReportPathInfo").html(i18n['GINAUDIT0017M']).removeClass('hidden');
- $('.report-loader').hide();
- }
- }
- });
-
- $("#report-download-button").on("click",function(e){
- var reportFilePath = '/data/logs/audit_summary_report.txt';
- window.open(reportFilePath, '_blank');
- });
- });
-
- $("#generate-report-graph-button").removeClass("hidden");
- }else{
- $("#generate-report-graph-button").addClass("hidden");
- }
- }
- });
- });
-
- $('#reportGraph').on('hide.bs.modal', function(event) {
- $("#graphColumns").selectpicker('deselectAll');
- $("#graphColumns").selectpicker('destroy');
- $("#graphFormat").selectpicker('destroy');
- $("#graph-name").val('');
- $("#graph").empty();
- $("#generate-report-graph-button").off();
- });
- };
ginger.initAdmin = function() {
$(".content-area", "#gingerHostAdmin").css("height", "100%");
ginger.getCapabilities(function(result) {
@@ -2242,9 +946,6 @@ ginger.initAdmin = function() {
case "users":
ginger.initUserManagement();
break;
- case "audit":
- ginger.initAuditRules();
- break;
}
} else {
$("." + itemLowCase + "-ppc-enabled").hide();
diff --git a/ui/js/host-audit.js b/ui/js/host-audit.js
new file mode 100644
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ ginger.ruleDetailsPopulation(ruleInfo,row);
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-rules-details',$("#audit-rules-table tbody")).closest("tr").css("color","black");
+ }
+ });
+
+ wok.window.open('plugins/ginger/host-admin-editSystemRule.html');
+ }
+ }
+ }
+ }
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ }
+ }, function(error) {
+ wok.message.error(error.responseJSON.reason, '#audit-message', true);
+ selectedRowsDataLength = selectedRowsDataLength - 1;
+ if (selectedRowsDataLength === 0) {
+ $('#Audit-Rule-refresh-btn').trigger('click');
+ }
+ });
+ }
+ }
+ });
+ }
+ $("#audit-logs-table tbody").html(rows);
+
+ var auditLogsTable = $("#audit-logs-table").DataTable({
+ columnDefs: [
+ {"width":"15%", "targets" : 0},
+ {"width":"15%", "targets" : 1},
+ {"width":"60%", "targets" : 2},
+ {"width":"10%", "targets" : 3},
+ {orderable: false, targets: [3]}],
+ autoWidth:false,
+ "dom": '<"row"<"log-report pull-left"><"log-filter pull-left"><"log-reset pull-left"><"col-sm-12 filter"<"pull-right"l><"pull-right"f>>><"row"<"col-sm-12"t>><"row"<"col-sm-6 pages"p><"col-sm-6 info"i>>',
+ "initComplete": function(settings, json) {
+ wok.initCompleteDataTableCallback(settings);
+ var reportButton = '<button class="btn btn-primary pull-left" id="log-report-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogReport"><i class="fa fa-file-archive-o">&nbsp;</i> ' + i18n['GINAUDIT0008M'] + '</button>';
+ var filterButton = '<button class="btn btn-primary" id="log-filter-btn" aria-expanded="false" data-toggle="modal" data-target="#auditlogFilter"><i class="fa fa-filter">&nbsp;</i>' + i18n['GINAUDIT0007M'] + '</button>';
+ var resetButton = '<button class="btn btn-primary" id="log-reset-btn" aria-expanded="false"><i class="fa fa-undo">&nbsp;</i>' + i18n['GINAUDIT0019M'] + '</button>';
+ $(".log-report").html(reportButton);
+ $(".log-filter").append(filterButton);
+ $(".log-reset").html(resetButton);
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINAUDIT0012M']
+ }
+ });
+
+ // Add event listener for opening and closing details
+ $('#audit-logs-table tbody').off();
+ $('#audit-logs-table tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = auditLogsTable.row( tr );
+ var logMessage = (row.data()[2]!="")?row.data()[2]:i18n['GINAUDIT0001M'];
+ var dateTime = (row.data()[0]!="")?row.data()[0]:'';
+ var type = (row.data()[1]!="")?row.data()[1]:'';
+
+ $('.audit-log-details',$('#audit-logs-table tbody')).parent().remove();
+ $('.fa-chevron-up',$('#audit-logs-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+dateTime+'</dt><dd>'+i18n['GINAUDIT0013M']+'</dd><dt>'+type+'</dt><dd>'+i18n['GINAUDIT0014M']+'</dd><dt>'+logMessage+'</dt><dd>'+i18n['GINAUDIT0015M']+'</dd></dl></div>').show();
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-log-details',$('#audit-logs-table tbody')).closest("tr").css("color","black");
+ }
+ });
+
+ //Row selection
+ $('#audit-logs-table tbody').on('click', 'tr', function () {
+ if ($(this).hasClass("selected")) {
+ $(this).removeClass("selected");
+ } else {
+ auditLogsTable.$('tr.selected').removeClass('selected');
+ $(this).addClass("selected");
+ }
+ });
+
+ }
+ });
+ }
+ $(".status-value").text('enabled');
+ } else {
+ $("#dispatch-status-btn").empty().html('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
+ $(".status-value").text('disabled');
+ }
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ },
+ "oLanguage": {
+ "sEmptyTable": i18n['GINAUDIT0012M']
+ }
+ });
+
+ // Add event listener for opening and closing details
+ $('#audit-disp-plugin-table tbody').off();
+ $('#audit-disp-plugin-table tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = auditDispPluginTable.row( tr );
+ var details = (row.data()[3]!="")?JSON.parse(row.data()[3]):i18n['GINAUDIT0001M'];
+
+ $('.audit-log-details',$('#audit-disp-plugin-table tbody')).parent().remove();
+ $('.fa-chevron-up',$('#audit-disp-plugin-table tbody')).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ if (row.child.isShown()) {
+ // This row is already open - close it
+ row.child.hide();
+ $("span",$(this)).addClass('fa-chevron-down').removeClass('fa-chevron-up');
+ tr.removeClass('shown');
+ } else {
+ // Open this row
+ var direction = (details['direction']!=undefined)?details['direction']:'--';
+ var format = (details['format']!=undefined)?details['format']:'--';
+ var args = (details['args']!=undefined)?details['args']:'--';
+ var active = (details['active']!=undefined)?details['active']:'--';
+ var path = (details['path']!=undefined)?details['path']:'--';
+ var type = (details['type']!=undefined)?details['type']:'--';
+
+ row.child('<div class="audit-log-details"><dl class="audit-log-info"><dt>'+
+ direction+'</dt><dd>'+i18n['GINAUDITDISP0001M']+'</dd><dt>'+
+ format+'</dt><dd>'+i18n['GINAUDITDISP0002M']+'</dd><dt>'+
+ args+'</dt><dd>'+i18n['GINAUDITDISP0003M']+'</dd><dt>'+
+ active+'</dt><dd>'+i18n['GINAUDITDISP0004M']+'</dd><dt>'+
+ path+'</dt><dd>'+i18n['GINAUDITDISP0005M']+'</dd><dt>'+
+ type+'</dt><dd>'+i18n['GINAUDITDISP0006M']+'</dd>'+
+ '</dl></div>').show();
+ $("span",$(this)).addClass('fa-chevron-up').removeClass('fa-chevron-down');
+ tr.addClass('shown');
+ $('.audit-log-details',$('#audit-disp-plugin-table tbody')).closest("tr").css('color','black');
+ }
+ });
+
+
+ //Row selection
+ $('#audit-disp-plugin-table tbody').on('click', 'tr', function () {
+ if ($(this).hasClass("selected")) {
+ $(this).removeClass("selected");
+ } else {
+ auditDispPluginTable.$('tr.selected').removeClass('selected');
+ $(this).addClass("selected");
+ }
+ });
+
+ $('#disp-refresh-btn').off();
+ $('#disp-refresh-btn').on('click', function(e) {
+ $(".dispatcher-loader").show();
+ ginger.getDispatcherPlugin(function(result) {
+ $("#audit-disp-plugin-table tbody").empty();
+ $("#audit-disp-plugin-table").DataTable().destroy();
+ ginger.createDispatcherPluginTable(result);
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ });
+
+ $("#dispatch-status-btn").off();
+ $("#dispatch-status-btn").on('click',function(e) {
+ var getCurrentStatus = $(".status-value").text();
+ var action = (getCurrentStatus=='enabled')?'disable':'enable';
+ ginger.changeAuditDispatcherStatus(action,function(result) {
+ if (result['dispatcher']!=undefined) {
+ $("#dispatch-status-btn").empty().append('<i class="fa fa-pause">&nbsp;</i>'+i18n['GINAUDITDISP0011M']);
+ wok.message.success(i18n['GINAUDITDISP0013M'],"#alert-modal-audit-dispatcher-container");
+ $(".status-value").text('enabled');
+ } else {
+ $("#dispatch-status-btn").empty().append('<i class="fa fa-play">&nbsp;</i>'+i18n['GINAUDITDISP0010M']);
+ wok.message.success(i18n['GINAUDITDISP0014M'],"#alert-modal-audit-dispatcher-container");
+ $(".status-value").text('disabled');
+ }
+ },function(error) {
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-dispatcher-container");
+ });
+ });
+
+ $("#plugin-edit-btn").off();
+ $("#plugin-edit-btn").on('click',function() {
+ var selectedRowsData = $("#audit-disp-plugin-table").DataTable().rows('.selected').data();
+ if (selectedRowsData.length>0) {
+ $("#auditPluginDetails").modal("show");
+ } else {
+ var settings = {
+ content: i18n['GINAUDITDISP0009M'],
+ confirm: i18n["GINNET0015M"]
+ };
+ wok.confirm(settings, function() {},function() {});
+ }
+ });
+
+ $("#active").val("yes");
+ } else {
+ }
+ });
+ };
+
+ $(".add-filter",'#auditlogFilter').on("click", function(e) {
+ e.preventDefault();
+ }
+ });
+
+ if (params=='') {
+ ginger.getAuditLogs(function(result) {
+ reloadAuditLogs(result);
+ },function(error) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
+ });
+ } else {
+ ginger.filterAuditLogs(params,function(result) {
+ reloadAuditLogs(result);
+ },function(error) {
+ $('.Audit-log-loader').hide();
+ wok.message.error(error.responseJSON.reason,"#alert-modal-audit-filter-container");
+ });
+ }
+
+ var optionDropdown = $('.timeOption',row);
+ optionDropdown.hide();
+ }
+ });
+ };
+
+ $(".add-filter",'#auditlogReport').on("click", function(e) {
+ e.preventDefault();
+ });
+ }
+
+ var populateReport = function(result) {
+ $('#report-details').removeClass("hidden").focus();
+ $('#summaryreport').empty();
+ var columnInfo = {};
+ var summary = [];
+
+ if (result.length>1) {
+ columnInfo = result[0]["column_info"];
+ summary = result[1]["summary"];
+ $("#report-graph-button").removeClass("hidden");
+ } else {
+ summary = result[0]["summary"];
+ $("#report-graph-button").addClass("hidden");
+ }
+
+ var details = "";
+ $.each(summary,function(index,info) {
+ if (info!="") {
+ details+=info+"<br>";
+ }
+ });
+
+ ginger.initGraphDetails(columnInfo);
+ $('#summaryreport').append(details);
+ $("#summaryReportPathInfo").html(i18n['GINAUDIT0017M']).removeClass('hidden');
+ $('.report-loader').hide();
+ }
+ }
+ });
+
+ $("#generate-report-graph-button").removeClass("hidden");
+ } else {
+ $("#generate-report-graph-button").addClass("hidden");
+ }
+ }
+
diff --git a/ui/js/host-settings.js b/ui/js/host-settings.js
index 00e6809..976a427 100644
--- a/ui/js/host-settings.js
+++ b/ui/js/host-settings.js
@@ -145,12 +145,22 @@ ginger.initSidebar = function() {
var $body = $(document.body);
var navHeight = $('.topbar').outerHeight(true) + 40;

- var start = new Sidebar($leftCol, ginger.sidebarObj);
- lastGingerPage = wok.cookie.get('lastGingerPage')
- if (!lastGingerPage)
- start.triggerFirstAvailableOption();
- else
- wok.topic('sidebarClicked').publish(lastGingerPage);
+ ginger.getCapabilities(function(result) {
+ if (result.Audit) {
+ ginger.sidebarObj.push({
+ title: i18n['Audit'],
+ url: 'plugins/ginger/host-audit.html',
+ id: 'ginger-audit'
+ });
+ }
+
+ var start = new Sidebar($leftCol, ginger.sidebarObj);
+ lastGingerPage = wok.cookie.get('lastGingerPage')
+ if (!lastGingerPage)
+ start.triggerFirstAvailableOption();
+ else
+ wok.topic('sidebarClicked').publish(lastGingerPage);
+ });

var checkScrollPosition = function() {
if ($(window).scrollTop() + $(window).height() > $(document).height() - 66) {
diff --git a/ui/pages/host-admin.html.tmpl b/ui/pages/host-admin.html.tmpl
index f7a5622..619ae59 100644
--- a/ui/pages/host-admin.html.tmpl
+++ b/ui/pages/host-admin.html.tmpl
@@ -32,168 +32,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
<div class="container">
<div id="alert-container"></div>
<div id="gingerHostAdmin" class="host-admin">
- <!-- Audit Rules section -->
- <div class="panel-group audit-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-rules-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Rules")</span>
- </a>
- </h3>
- </div>
- </div>
- <div class="btn-group">
- <div class="dropdown auditmenu-action">
- <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-pencil-square-o">$_("Rules")</i> <span class="caret"></span></button>
- <ul class="dropdown-menu" role="menu">
- <li>
- <button aria-expanded="false" id="audit-rule-add-btn" class="btn btn-primary"><i class="fa fa-plus-circle">$_("Add")</i></button>
- </li>
- <li>
- <button aria-expanded="false" id="Audit-Rule-Import-btn" class="btn btn-primary"><i class="fa fa-download">$_("Import")</i></button>
- </li>
- </ul>
- </div>
- </div>
- <button aria-expanded="false" id="Audit-Rule-Configure-btn" class="btn btn-primary"><i class="fa fa-pencil-square-o">$_("Configure Audit")</i></button>
- <button aria-expanded="false" id="Audit-Rule-refresh-btn" class="btn btn-primary"><i class="fa fa-refresh">$_("Refresh")</i></button>
- </div>
- </div>
- </div>
- <div class="row" id="audit-rules">
- <table id="audit-rules-table" class="table table-stripped" cellspacing="0" width="100%">
- <thead>
- <tr>
- <th>$_("ID")</th>
- <th>$_("Type")</th>
- <th>$_("Rule")</th>
- <th style="text-align:center;">$_("Details")</th>
- <th style="text-align:center;">$_("Loaded")</th>
- <th style="text-align:center;">$_("Persisted")</th>
- <th>$_("Info")</th>
- <th>$_("pervalue")</th>
- <th>$_("loadvalue")</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- <div class="wok-mask rules-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- Audit logs section -->
- <div class="panel-group users-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-logs-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Logs")</span>
- </a>
- </h3>
- <div id="audit-logs-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
- <span id='alert-modal-audit-logs-container' style='display: none;'></span>
- <div class='clearfix'>
- <div class="row">
- <div class="col-sd-12"><span>&nbsp;</span></div>
- </div>
- <div class="row" id="audit-logs">
- <table id="audit-logs-table" class="table table-stripped" cellspacing="0" width="100%">
- <thead>
- <tr>
- <th>$_("Date and Time")</th>
- <th>$_("Type")</th>
- <th>$_("Message")</th>
- <th style="text-align:center;">$_("Details")</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- <div class="wok-mask logs-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
-<!-- Audit dispatcher section -->
- <div class="panel-group users-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
- <h3>
- <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-dispatcher-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
- <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Dispatcher")</span>
- </a>
- </h3>
- <div id="audit-dispatcher-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
- <span id='alert-modal-audit-dispatcher-container' style='display: none;'></span>
- <div class='clearfix'>
- <div class="row">
- <div class="col-sd-12"><span>&nbsp;</span></div>
- </div>
- <div class="row" id="audit-dispatcher">
- <table id="audit-disp-plugin-table" class="table table-stripped" cellspacing="0" width="100%">
- <thead>
- <tr>
- <th>$_("Plugin")</th>
- <th>$_("Active")</th>
- <th style="text-align:center;">$_("Details")</th>
- <th>$_("Info")</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- <div class="wok-mask dispatcher-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
<!-- Firmware Update Panel -->
<div class="panel-group firmware-ppc-enabled accordion" id="firmware-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
<h3>
@@ -558,317 +396,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
</div>
</div>
</div>
-<!-- Audit logs - Log Filter -->
-<div class="modal fade host-modal" id="auditlogFilter" tabindex="-1" role="dialog" labelledby="UserPasswordChangeModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="log-filter-title"></h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-audit-filter-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <div class="form-group">
- <label for="log-path-info">$_("Log File Name")</label>
- <div class="form-group">
- <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
- <p class="help-block">
- <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
- </p>
- </div>
- </div>
- <div class="row">
- <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
- </div>
- <span id="addfielderror-message" style="display:none;"></span>
- <div class="row hidden" id="filterList">
- <div class="col-md-12">
- <div class="col-md-5">
- <label class="col-md-12">$_("Field")</label>
- </div>
- <div class="col-md-5">
- <label class="col-md-12">$_("Value")</label>
- </div>
- <div class="col-md-2">
- </div>
- </div>
- <div class="col-md-12" id="newRow">
- </div>
- </div>
- <div class="checkbox" style="margin-top:25px;">
- <label class="check-all">
- <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
- </label>
- </div>
- <div class="wok-mask Audit-log-loader" hidden>
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Please wait...")</div>
- </div>
- </div>
- </div>
- </form>
- </div>
- <div class="modal-footer">
- <button id="log-filter-button-apply" class="btn btn-default">$_("Filter")</button>
- <button id="log-filter-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
-</div>
-
-<!-- Audit log report summary -->
-<div class="modal fade host-modal" id="auditlogReport" tabindex="-1" role="dialog" labelledby="UserPasswordChangeModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="log-report-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="log-summary-title">$_("Audit Report")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-audit-report-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <!-- <div class="form-group"> -->
- <div class="form-group">
- <label for="reportType">$_("Audit Report Type")</label>
- <div class="col-md-12">
- <select id="reportType" class="selectpicker col-sm-6" name="reporttype">
- <option value="summary">$_("Summary Report")</option>
- <option value="detailed">$_("Detailed Report")</option>
- </select>
- <button id="log-report-button-apply" class="btn btn-primary"style="margin-left:100px;">$_("Generate Report")</button>
- </div>
- </div>
- <div class="form-group">
- <label for="log-path-info">$_("Log File Name")</label>
- <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
- <p class="help-block">
- <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
- </p>
- </div>
- <!-- </div> -->
- <div class="row">
- <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
- </div>
- <span id="Filterfielderror-message" style="display:none;"></span>
- <div class="row hidden" id="filterList">
- <div class="col-md-12">
- <div class="col-md-5">
- <label class="col-md-12">$_("Field")</label>
- </div>
- <div class="col-md-5">
- <label class="col-md-12">$_("Value")</label>
- </div>
- <div class="col-md-2">
- </div>
- </div>
- <div class="col-md-12" id="newRow">
- </div>
- </div>
- <div class="checkbox" style="margin-top:25px;">
- <label class="check-all">
- <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
- </label>
- </div>
- </form>
- <div class="row hidden" id="report-details" style="margin-top:30px;" tabindex="-1">
- <div class="alert alert-info hidden" id="summaryReportPathInfo"></div>
- <div class="row">
- <button id="report-graph-button" class="btn btn-primary" data-toggle="modal" data-target="#reportGraph">$_('Graph Preview')</button>
- <button id="report-download-button" class="btn btn-primary" data-search="">$_('Download')</button>
- </div>
- <div class="clearfix">
- <p id="summaryreport" class="report"></p>
- </div>
- <div class="wok-mask report-loader">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Generating report...")</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="modal-footer">
- <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
-</div>
-<!-- Audit report graph -->
-<div class="modal fade host-modal" id="reportGraph" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="report-graph-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="log-summary-title">$_("Report Graph")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-audit-graph-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <div class="form-group">
- <label for="graph-name">$_("Graph Name")</label>
- <input id="graph-name" class="form-control input" name="graph-name" style="width:50%;"/>
- </div>
- <div class="form-group">
- <label for="graphFormat">$_("Graph Format")</label>
- <div class="col-md-12">
- <select id="graphFormat" class="selectpicker col-sm-6" name="graphformat">
- <option value="png">$_("PNG")</option>
- <option value="jpeg">$_("JPEG")</option>
- <option value="bmp">$_("BMP")</option>
- <option value="jpg">$_("JPG")</option>
- <option value="pdf">$_("PDF")</option>
- <option value="svg">$_("SVG")</option>
- </select>
- <button id="generate-report-graph-button" class="btn btn-primary"style="margin-left:100px;">$_("Generate Graph")</button>
- </div>
- </div>
- <div class="form-group">
- <label for="graphColumns">$_("Graph Columns")</label>
- <div class="col-md-12">
- <select id="graphColumns" class="selectpicker col-sm-6" name="graphcolumn" multiple data-max-options="2" data-min-options="2">
- </select>
- </div>
- </div>
- </form>
- <div class="alert alert-info hidden" id="graphPathInfo"></div>
- </div>
- <div class="modal-footer">
- <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
- </div>
- <!-- Audit Dispatcher Configuration -->
- <div class="modal fade host-modal" id="auditDisprConf" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="disp-conf-title">$_("Audit Dispatcher Configuration")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-disp-conf-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-log-report-filter">
- <div class="form-group">
- <label for="overflowAction">$_("Overflow Action")</label>
- <div class="form-group">
- <input id="overflowAction" class="form-control input" name="overflowAction" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="priorityBoost">$_("Priority Boost")</label>
- <div class="form-group">
- <input id="priorityBoost" class="form-control input" name="priorityboost" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="qDepth">$_("Q Depth")</label>
- <div class="form-group">
- <input id="qDepth" class="form-control input" name="qDepth" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="maxRestarts">$_("Max restarts")</label>
- <div class="form-group">
- <input id="maxRestarts" class="form-control input" name="maxrestarts" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="nameFormat">$_("Name Format")</label>
- <div class="form-group">
- <input id="nameFormat" class="form-control input" name="nameFormat" style="width:50%;"/>
- </div>
- </div>
- </form>
- </div>
- <div class="modal-footer">
- <button id="disp-conf-button-apply" class="btn btn-default">$_("Apply")</button>
- <button id="disp-conf-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
- </div>

- <!-- Audit Dispatcher Plugin Details -->
- <div class="modal fade host-modal" id="auditPluginDetails" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog" role="document">
- <div class="modal-content" >
- <div class="modal-header">
- <button type="button" id="disp-plugin-button-close" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- <h4 class="modal-title" id="disp-conf-title">$_("Dispatcher Plugin Configuration")</h4>
- <hr style="width:99%;margin-left:5px;"/>
- </div>
- <div class="modal-body">
- <span id='alert-modal-plugin-container' style='display: none;'></span>
- <form class="form-horizontal" id="form-plugin-details">
- <div class="form-group">
- <label for="direction">$_("Direction")</label>
- <div class="form-group">
- <input id="direction" class="form-control input" name="direction" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="format">$_("Format")</label>
- <div class="form-group">
- <input id="format" class="form-control input" name="format" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="args">$_("Args")</label>
- <div class="form-group">
- <input id="args" class="form-control input" name="args" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="active">$_("Active")</label>
- <div class="form-group">
- <select id="active" class="selectpicker col-sm-6" name="active">
- <option value="yes">$_("Yes")</option>
- <option value="no">$_("No")</option>
- </select>
- </div>
- </div>
- <div class="form-group">
- <label for="nameFormat">$_("Path")</label>
- <div class="form-group">
- <input id="path" class="form-control input" name="path" style="width:50%;"/>
- </div>
- </div>
- <div class="form-group">
- <label for="type">$_("Type")</label>
- <div class="form-group">
- <input id="type" class="form-control input" name="type" style="width:50%;"/>
- </div>
- </div>
- </form>
- </div>
- <div class="modal-footer">
- <button id="plugin-update-button-apply" class="btn btn-default">$_("Apply")</button>
- <button id="plugin-update-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
- </div>
- </div>
- </div>
- </div>
-</div>
<script id="backupItem" type="text/html">
<li class="wok-datagrid-row in" name="backupBodyItem" id="{identity}">
<span class="column-file" title="{file}">{filename}</span><!--
diff --git a/ui/pages/host-audit.html.tmpl b/ui/pages/host-audit.html.tmpl
new file mode 100644
index 0000000..2e65f15
--- /dev/null
+++ b/ui/pages/host-audit.html.tmpl
@@ -0,0 +1,518 @@
+<!DOCTYPE html>
+<!--
+Copyright IBM Corp, 2015-2016
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-->
+#unicode UTF-8
+#import gettext
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css">
+ <script type="text/javascript" src="plugins/ginger/js/util.js"></script>
+ <script type="text/javascript" src="plugins/ginger/js/host-audit.js"></script>
+</head>
+<body>
+ <div id="audit-root-container" class="ginger">
+ <div class="container">
+ <div id="alert-container"></div>
+ <div id="gingerHostAudit" class="host-admin">
+ <!-- Audit Rules section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="rules-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#rules-ppc-enabled-accordion" href="#audit-rules-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Rules")</span>
+ </a>
+ </h3>
+ <div id="modalWindow" class="modal fade host-modal guests-modal" tabindex="-1" role="dialog" aria-labelledby="guestsModalLabel" aria-hidden="true">
+ </div>
+ </div>
+ </div>
+ <div class="btn-group">
+ <div class="dropdown auditmenu-action">
+ <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-pencil-square-o">$_("Rules")</i> <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li>
+ <button aria-expanded="false" id="audit-rule-add-btn" class="btn btn-primary"><i class="fa fa-plus-circle">$_("Add")</i></button>
+ </li>
+ <li>
+ <button aria-expanded="false" id="Audit-Rule-Import-btn" class="btn btn-primary"><i class="fa fa-download">$_("Import")</i></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <button aria-expanded="false" id="Audit-Rule-Configure-btn" class="btn btn-primary"><i class="fa fa-pencil-square-o">$_("Configure Audit")</i></button>
+ <button aria-expanded="false" id="Audit-Rule-refresh-btn" class="btn btn-primary"><i class="fa fa-refresh">$_("Refresh")</i></button>
+ </div>
+ </div>
+ </div>
+ <div class="row" id="audit-rules">
+ <table id="audit-rules-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("ID")</th>
+ <th>$_("Type")</th>
+ <th>$_("Rule")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ <th style="text-align:center;">$_("Loaded")</th>
+ <th style="text-align:center;">$_("Persisted")</th>
+ <th>$_("Info")</th>
+ <th>$_("pervalue")</th>
+ <th>$_("loadvalue")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask rules-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- Audit logs section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="audit-logs-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#audit-logs--ppc-enabled-accordion" href="#audit-logs-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Logs")</span>
+ </a>
+ </h3>
+ <div id="audit-logs-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
+ <span id='alert-modal-audit-logs-container' style='display: none;'></span>
+ <div class='clearfix'>
+ <div class="row">
+ <div class="col-sd-12"><span>&nbsp;</span></div>
+ </div>
+ <div class="row" id="audit-logs">
+ <table id="audit-logs-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("Date and Time")</th>
+ <th>$_("Type")</th>
+ <th>$_("Message")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask logs-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<!-- Audit dispatcher section -->
+ <div class="panel-group audit-ppc-enabled accordion" id="audit-dispatcher-ppc-enabled-accordion" role="tablist" aria-multiselectable="true" style="display: none;">
+ <h3>
+ <a role="button" data-toggle="collapse" data-parent="#audit-dispatcher-ppc-enabled-accordion" href="#audit-dispatcher-content-area" aria-expanded="false" aria-controls="audit-rules-content-area" class="">
+ <span class="accordion-icon"></span><span class="accordion-text">$_("Audit Dispatcher")</span>
+ </a>
+ </h3>
+ <div id="audit-dispatcher-content-area" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
+ <span id='alert-modal-audit-dispatcher-container' style='display: none;'></span>
+ <div class='clearfix'>
+ <div class="row">
+ <div class="col-sd-12"><span>&nbsp;</span></div>
+ </div>
+ <div class="row" id="audit-dispatcher">
+ <table id="audit-disp-plugin-table" class="table table-stripped" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>$_("Plugin")</th>
+ <th>$_("Active")</th>
+ <th style="text-align:center;">$_("Details")</th>
+ <th>$_("Info")</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wok-mask dispatcher-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit logs - Log Filter -->
+<div class="modal fade host-modal" id="auditlogFilter" tabindex="-1" role="dialog" labelledby="AuditLogsFilterModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-filter-title"></h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-filter-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="log-path-info">$_("Log File Name")</label>
+ <div class="form-group">
+ <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
+ </div>
+ <span id="addfielderror-message" style="display:none;"></span>
+ <div class="row hidden" id="filterList">
+ <div class="col-md-12">
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Field")</label>
+ </div>
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Value")</label>
+ </div>
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="col-md-12" id="newRow">
+ </div>
+ </div>
+ <div class="checkbox" style="margin-top:25px;">
+ <label class="check-all">
+ <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
+ </label>
+ </div>
+ <div class="wok-mask Audit-log-loader" hidden>
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Please wait...")</div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="log-filter-button-apply" class="btn btn-default">$_("Filter")</button>
+ <button id="log-filter-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit log report summary -->
+<div class="modal fade host-modal" id="auditlogReport" tabindex="-1" role="dialog" labelledby="AuditLogReportSummaryModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-report-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-summary-title">$_("Audit Report")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-report-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <!-- <div class="form-group"> -->
+ <div class="form-group">
+ <label for="reportType">$_("Audit Report Type")</label>
+ <div class="col-md-12">
+ <select id="reportType" class="selectpicker col-sm-6" name="reporttype">
+ <option value="summary">$_("Summary Report")</option>
+ <option value="detailed">$_("Detailed Report")</option>
+ </select>
+ <button id="log-report-button-apply" class="btn btn-primary"style="margin-left:100px;">$_("Generate Report")</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="log-path-info">$_("Log File Name")</label>
+ <input id="log-path-info" class="form-control input" name="path" style="width:50%;"/>
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Please provide either file name or directory where the log file exists.")
+ </p>
+ </div>
+ <!-- </div> -->
+ <div class="row">
+ <span class='add-new-filter'><a class="add-filter btn btn-link" href="#" style="padding-left:0px;"><i class="fa fa-plus-circle"></i> $_("Add new filter")</a></span>
+ </div>
+ <span id="Filterfielderror-message" style="display:none;"></span>
+ <div class="row hidden" id="filterList">
+ <div class="col-md-12">
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Field")</label>
+ </div>
+ <div class="col-md-5">
+ <label class="col-md-12">$_("Value")</label>
+ </div>
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="col-md-12" id="newRow">
+ </div>
+ </div>
+ <div class="checkbox" style="margin-top:25px;">
+ <label class="check-all">
+ <input type="checkbox" id="interpret" style="margin-top:10px;">$_("Interpret numeric entities into text")
+ </label>
+ </div>
+ </form>
+ <div class="row hidden" id="report-details" style="margin-top:30px;" tabindex="-1">
+ <div class="alert alert-info hidden" id="summaryReportPathInfo"></div>
+ <div class="row">
+ <button id="report-graph-button" class="btn btn-primary" data-toggle="modal" data-target="#reportGraph">$_('Graph Preview')</button>
+ <button id="report-download-button" class="btn btn-primary" data-search="">$_('Download')</button>
+ </div>
+ <div class="clearfix">
+ <p id="summaryreport" class="report"></p>
+ </div>
+ <div class="wok-mask report-loader">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Generating report...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- Audit report graph -->
+<div class="modal fade host-modal" id="reportGraph" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="report-graph-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="log-summary-title">$_("Report Graph")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-audit-graph-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="graph-name">$_("Graph Name")</label>
+ <input id="graph-name" class="form-control input" name="graph-name" style="width:50%;"/>
+ </div>
+ <div class="form-group">
+ <label for="graphFormat">$_("Graph Format")</label>
+ <div class="col-md-12">
+ <select id="graphFormat" class="selectpicker col-sm-6" name="graphformat">
+ <option value="png">$_("PNG")</option>
+ <option value="jpeg">$_("JPEG")</option>
+ <option value="bmp">$_("BMP")</option>
+ <option value="jpg">$_("JPG")</option>
+ <option value="pdf">$_("PDF")</option>
+ <option value="svg">$_("SVG")</option>
+ </select>
+ <button id="generate-report-graph-button" class="btn btn-primary"style="margin-left:100px;">$_("Generate Graph")</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="graphColumns">$_("Graph Columns")</label>
+ <div class="col-md-12">
+ <select id="graphColumns" class="selectpicker col-sm-6" name="graphcolumn" multiple data-max-options="2" data-min-options="2">
+ </select>
+ </div>
+ </div>
+ </form>
+ <div class="alert alert-info hidden" id="graphPathInfo"></div>
+ </div>
+ <div class="modal-footer">
+ <button id="log-report-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Audit Dispatcher Configuration -->
+ <div class="modal fade host-modal" id="auditDisprConf" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="log-filter-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="disp-conf-title">$_("Audit Dispatcher Configuration")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-disp-conf-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-log-report-filter">
+ <div class="form-group">
+ <label for="overflowAction">$_("Overflow Action")</label>
+ <div class="form-group">
+ <input id="overflowAction" class="form-control input" name="overflowAction" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="priorityBoost">$_("Priority Boost")</label>
+ <div class="form-group">
+ <input id="priorityBoost" class="form-control input" name="priorityboost" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="qDepth">$_("Q Depth")</label>
+ <div class="form-group">
+ <input id="qDepth" class="form-control input" name="qDepth" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="maxRestarts">$_("Max restarts")</label>
+ <div class="form-group">
+ <input id="maxRestarts" class="form-control input" name="maxrestarts" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="nameFormat">$_("Name Format")</label>
+ <div class="form-group">
+ <input id="nameFormat" class="form-control input" name="nameFormat" style="width:50%;"/>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="disp-conf-button-apply" class="btn btn-default">$_("Apply")</button>
+ <button id="disp-conf-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Audit Dispatcher Plugin Details -->
+ <div class="modal fade host-modal" id="auditPluginDetails" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" >
+ <div class="modal-header">
+ <button type="button" id="disp-plugin-button-close" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="disp-conf-title">$_("Dispatcher Plugin Configuration")</h4>
+ <hr style="width:99%;margin-left:5px;"/>
+ </div>
+ <div class="modal-body">
+ <span id='alert-modal-plugin-container' style='display: none;'></span>
+ <form class="form-horizontal" id="form-plugin-details">
+ <div class="form-group">
+ <label for="direction">$_("Direction")</label>
+ <div class="form-group">
+ <input id="direction" class="form-control input" name="direction" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="format">$_("Format")</label>
+ <div class="form-group">
+ <input id="format" class="form-control input" name="format" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="args">$_("Args")</label>
+ <div class="form-group">
+ <input id="args" class="form-control input" name="args" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="active">$_("Active")</label>
+ <div class="form-group">
+ <select id="active" class="selectpicker col-sm-6" name="active">
+ <option value="yes">$_("Yes")</option>
+ <option value="no">$_("No")</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="nameFormat">$_("Path")</label>
+ <div class="form-group">
+ <input id="path" class="form-control input" name="path" style="width:50%;"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="type">$_("Type")</label>
+ <div class="form-group">
+ <input id="type" class="form-control input" name="type" style="width:50%;"/>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button id="plugin-update-button-apply" class="btn btn-default">$_("Apply")</button>
+ <button id="plugin-update-button-cancel" class="btn btn-default" data-dismiss="modal">$_("Cancel")</button>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+</script>
+<script>
+ginger.initAudit();
+</script>
+</body>
+</html>
diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
index aee124c..7066e41 100644
--- a/ui/pages/i18n.json.tmpl
+++ b/ui/pages/i18n.json.tmpl
@@ -25,6 +25,7 @@
"Settings": "$_("Settings")",
"Administration": "$_("Administration")",
"Network": "$_("Network")",
+ "Audit": "$_("Audit")",
"Storage": "$_("Storage")",
"System Modules": "$_("System Modules")",
"System Services": "$_("System Services")",
--
2.9.3

Aline Manera

unread,
Mar 2, 2017, 8:48:57 PM3/2/17
to Ginger Devel

Please, consider V3 of this patch set.

Aline Manera

unread,
Mar 2, 2017, 8:52:56 PM3/2/17
to Daniel Henrique Barboza, ginger-...@googlegroups.com
Hi Daniel,

On 03/02/2017 06:13 PM, Daniel Henrique Barboza wrote:
> This is a great contribution, thank you!
>
> I have nothing to add about the layout look and feel. It feels right.
> However
> I have some comments:
>
> - the lastPage is kind of broken in the new "Settings" tab. When
> hitting F5, the
> refresh goes back to the user-log tab. I think it's because of the URL
> of the
> sidebar being unknown in the routing, and the default action reroutes
> it to
> user-log.
>
> - in Chrome I am seeing strange behaviors/bugs but I am not sure it
> has to
> do with this contribution. No tabs are loaded after logging in. I am jus
> mentioning it here to be on the record. If someone else has problems when
> testing this patch in Chrome please let me know. Otherwise I'll
> consider it
> has something to do with Chrome in my environment.
>
>

I was investigating the problem on Chrome and I noticed it happens still
on master branch.
I don't think it is related to Ginger itself. Seems an issue on how Wok
loads the UI.

To reproduce the issue on master I did:
- Login
- Gets the user log tab
- Move to Virtualization tab
- Logout
- Login
- The UI will not be loaded any more.

I will continue to investigate that and turn back if any news but it
does not seem to be related to this patch (as I could reproduce on
master branch).

Aline Manera

unread,
Mar 2, 2017, 9:31:33 PM3/2/17
to Daniel Henrique Barboza, ginger-...@googlegroups.com
\o/

Daniel, I found the problem and sent a patch to Wok:
[Kimchi-devel] [PATCH] [Wok] Bug fix: Pass function parameters when
calling setTimeout

I'd recommend you to test the V3 of Ginger Sidebar patch set with this
Wok patch as well to make sure the problem was really solved.

Daniel Henrique Barboza

unread,
Mar 3, 2017, 7:03:18 AM3/3/17
to Aline Manera, ginger-...@googlegroups.com


On 03/02/2017 11:31 PM, Aline Manera wrote:
> \o/
>
> Daniel, I found the problem and sent a patch to Wok:
> [Kimchi-devel] [PATCH] [Wok] Bug fix: Pass function parameters when
> calling setTimeout
>
> I'd recommend you to test the V3 of Ginger Sidebar patch set with this
> Wok patch as well to make sure the problem was really solved.

Nice fix!

Lucio Correia

unread,
Mar 3, 2017, 8:27:59 AM3/3/17
to ginger-...@googlegroups.com
I believe calling it Host or Host Settings would make it clearer for new
users.
Lucio Correia

Daniel Henrique Barboza

unread,
Mar 3, 2017, 8:34:29 AM3/3/17
to ginger-...@googlegroups.com
"Host" is the name of its parent second level tab, not sure if it's
suitable to name it
"Host" here too.

"Host Settings" can work, but "Settings" under the "Host" second level
tab is the
same as "Host Settings". The same way that "Network" under
"Virtualization" tab of
Kimchi would mean "Virtualization Network".

In my opinion "Settings" here is fine.

Lucio Correia

unread,
Mar 3, 2017, 8:44:01 AM3/3/17
to ginger-...@googlegroups.com
Reviewed-By: Lucio Correia <luci...@linux.vnet.ibm.com>

On 02/03/2017 22:32, Aline Manera wrote:
Lucio Correia

Daniel Henrique Barboza

unread,
Mar 3, 2017, 11:43:57 AM3/3/17
to ginger-...@googlegroups.com
Applied. Thanks!
Reply all
Reply to author
Forward
0 new messages