<div dir="ltr"><div><div>Please disregard this patch, it must be sent to Ginger list.<br><br></div>Tks<br><br></div>André Teodoro<br><div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 14, 2016 at 10:22 AM, <span dir="ltr"><<a href="mailto:andreteodoro.work@gmail.com" target="_blank">andreteodoro.work@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Andre Teodoro <<a href="mailto:andreteodoro.work@gmail.com">andreteodoro.work@gmail.com</a>><br>
<br>
Signed-off-by: Andre Teodoro <<a href="mailto:andreteodoro.work@gmail.com">andreteodoro.work@gmail.com</a>><br>
---<br>
<span class=""> ui/config/tab-ext.xml | 23 +-<br>
ui/css/ginger.css | 209 +++++++-<br>
ui/css/src/ginger.scss | 70 ++-<br>
ui/css/src/modules/_sysmodules.scss | 126 +++++<br>
ui/js/host-sysmodules.js | 76 +++<br>
ui/js/util.js | 871 ++++++++++++++++----------------<br>
ui/pages/tabs/host-sysmodules.html.tmpl | 88 ++++<br>
7 files changed, 1012 insertions(+), 451 deletions(-)<br>
create mode 100644 ui/css/src/modules/_sysmodules.scss<br>
create mode 100644 ui/js/host-sysmodules.js<br>
create mode 100644 ui/pages/tabs/host-sysmodules.html.tmpl<br>
<br>
</span>diff --git a/ui/config/tab-ext.xml b/ui/config/tab-ext.xml<br>
index 2247666..f3efc95 100644<br>
--- a/ui/config/tab-ext.xml<br>
+++ b/ui/config/tab-ext.xml<br>
@@ -1,5 +1,5 @@<br>
<?xml version="1.0" encoding="utf-8"?><br>
-<!--<br>
+ <!--<br>
Copyright IBM Corp, 2015<br>
<br>
This library is free software; you can redistribute it and/or<br>
@@ -19,22 +19,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA<br>
<tabs-ext><br>
<functionality>Host</functionality><br>
<tab><br>
- <access role="admin" mode="admin"/><br>
- <access role="user" mode="none"/><br>
+ <access role="admin" mode="admin" /><br>
+ <access role="user" mode="none" /><br>
<title>Administration</title><br>
<path>plugins/ginger/tabs/host-admin.html</path><br>
</tab><br>
<tab><br>
- <access role="admin" mode="admin"/><br>
- <access role="user" mode="none"/><br>
+ <access role="admin" mode="admin" /><br>
+ <access role="user" mode="none" /><br>
<title>Network</title><br>
<path>plugins/ginger/tabs/host-network.html</path><br>
</tab><br>
<tab><br>
- <access role="admin" mode="admin"/><br>
- <access role="user" mode="none"/><br>
-<br>
+ <access role="admin" mode="admin" /><br>
+ <access role="user" mode="none" /><br>
<title>Storage</title><br>
<path>plugins/ginger/tabs/host-storage.html</path><br>
</tab><br>
-</tabs-ext><br>
+ <tab><br>
+ <access role="admin" mode="admin" /><br>
+ <access role="user" mode="none" /><br>
+ <title>System Modules</title><br>
+ <path>plugins/ginger/tabs/host-sysmodules.html</path><br>
+ </tab><br>
+</tabs-ext><br>
\ No newline at end of file<br>
diff --git a/ui/css/ginger.css b/ui/css/ginger.css<br>
index 560fb3c..725366f 100644<br>
--- a/ui/css/ginger.css<br>
+++ b/ui/css/ginger.css<br>
@@ -153,7 +153,9 @@<br>
background-color: #008abf;<br>
}<br>
<br>
-.ginger .modal-body .nav-tabs > li.active > a, .ginger .modal-body .nav-tabs > li.active > a:hover, .ginger .modal-body .nav-tabs > li.active > a:focus {<br>
+.ginger .modal-body .nav-tabs > li.active > a,<br>
+.ginger .modal-body .nav-tabs > li.active > a:hover,<br>
+.ginger .modal-body .nav-tabs > li.active > a:focus {<br>
border-color: -moz-use-text-color -moz-use-text-color #008abf;<br>
}<br>
<br>
@@ -948,49 +950,60 @@<br>
#form-nw-vlan-ipv4,<br>
#form-nw-vlan-general,<br>
#form-nw-vlan-ipv6,<br>
-#form-nw-vlan-advance {<br>
+#form-nw-vlan-advance,<br>
+#form-nw-bond-general,<br>
+#form-nw-bond-ipv4,<br>
+#form-nw-bond-ipv6,<br>
+#form-nw-bond-advance {<br>
margin: 15px 0 0;<br>
width: 98%;<br>
}<br>
<br>
#nw-settings-window .tab-content,<br>
-#nw-vlan-window .tab-content {<br>
+#nw-vlan-window .tab-content,<br>
+#nw-bond-window .tab-content {<br>
height: 559px;<br>
overflow: auto;<br>
}<br>
<br>
#nw-settings-window .tab-content .tab-pane,<br>
-#nw-vlan-window .tab-content .tab-pane {<br>
+#nw-vlan-window .tab-content .tab-pane,<br>
+#nw-bond-window .tab-content .tab-pane {<br>
position: relative;<br>
}<br>
<br>
#nw-settings-tabs .form-horizontal .control-label,<br>
-#nw-vlan-tabs .form-horizontal .control-label {<br>
+#nw-vlan-tabs .form-horizontal .control-label,<br>
+#nw-bond-tabs .form-horizontal .control-label {<br>
text-align: left;<br>
padding-top: 0px;<br>
}<br>
<br>
#nw-settings-tabs .bootgrid-table,<br>
-#nw-vlan-tabs .bootgrid-table {<br>
+#nw-vlan-tabs .bootgrid-table,<br>
+#nw-bond-tabs .bootgrid-table {<br>
height: 140px;<br>
width: 99%;<br>
margin-left: 1%;<br>
}<br>
<br>
#nw-settings-tabs .bootgrid-table th > .column-header-anchor > .icon,<br>
-#nw-vlan-tabs .bootgrid-table th > .column-header-anchor > .icon {<br>
+#nw-vlan-tabs .bootgrid-table th > .column-header-anchor > .icon,<br>
+#nw-bond-tabs .bootgrid-table th > .column-header-anchor > .icon {<br>
right: 40%;<br>
}<br>
<br>
#nw-settings-tabs .bootgrid-table thead,<br>
-#nw-vlan-tabs .bootgrid-table thead {<br>
+#nw-vlan-tabs .bootgrid-table thead,<br>
+#nw-bond-tabs .bootgrid-table thead {<br>
display: block;<br>
width: 100%;<br>
padding: 0;<br>
}<br>
<br>
#nw-settings-tabs .bootgrid-table tbody,<br>
-#nw-vlan-tabs .bootgrid-table tbody {<br>
+#nw-vlan-tabs .bootgrid-table tbody,<br>
+#nw-bond-tabs .bootgrid-table tbody {<br>
height: 120px;<br>
overflow: auto;<br>
position: absolute;<br>
@@ -999,13 +1012,15 @@<br>
}<br>
<br>
#nw-settings-tabs .bootgrid-table tr,<br>
-#nw-vlan-tabs .bootgrid-table tr {<br>
+#nw-vlan-tabs .bootgrid-table tr,<br>
+#nw-bond-tabs .bootgrid-table tr {<br>
width: 100%;<br>
display: inline-table;<br>
}<br>
<br>
#nw-settings-tabs .bootgrid-table th,<br>
-#nw-vlan-tabs .bootgrid-table th {<br>
+#nw-vlan-tabs .bootgrid-table th,<br>
+#nw-bond-tabs .bootgrid-table th {<br>
background-color: #eee;<br>
}<br>
<br>
@@ -1251,3 +1266,175 @@<br>
margin: 0;<br>
width: 160px;<br>
}<br>
+<br>
+#host-sysmodules-root-container .accordion {<br>
+ margin: 12px 20px 12px 60px;<br>
+ padding-bottom: 18px;<br>
+ border-bottom: 1px solid #eee;<br>
+ overflow: visible;<br>
+ clear: both;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion:first-chld {<br>
+ margin-top: 24px;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion > h3 {<br>
+ margin: 0;<br>
+ padding: 0;<br>
+ font-size: 26px;<br>
+ font-weight: 300;<br>
+ height: 44px;<br>
+ display: block;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion > h3 a {<br>
+ color: #3a393b;<br>
+ text-decoration: none;<br>
+ display: block;<br>
+ padding: 6px 30px;<br>
+ margin-left: -30px;<br>
+ margin-right: -30px;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion > h3 a span.accordion-icon {<br>
+ margin-left: -52px;<br>
+ vertical-align: middle;<br>
+ display: inline-block;<br>
+ font: normal normal normal 32px/1 FontAwesome;<br>
+ text-rendering: auto;<br>
+ -webkit-font-smoothing: antialiased;<br>
+ color: #3a393b;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion > h3 a[aria-expanded="false"] span.accordion-icon:before {<br>
+ content: "\f01a";<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion > h3 a[aria-expanded="true"] span.accordion-icon:before {<br>
+ content: "\f01b";<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion > h3 a span.accordion-text {<br>
+ margin-left: 23px;<br>
+ display: inline-block;<br>
+ vertical-align: middle;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .navbar-default.toolbar {<br>
+ background-color: #008abf !important;<br>
+}<br>
+<br>
+#sysmodules-content-area {<br>
+ padding: 0;<br>
+ list-style-type: none;<br>
+}<br>
+<br>
+#sysmodules-content-area .li:nth-child(even) {<br>
+ background-color: #fcfcfc;<br>
+}<br>
+<br>
+#sysmodules-content-area .li:nth-child(odd) {<br>
+ background-color: #fff;<br>
+}<br>
+<br>
+#sysmodules-content-area .header > span,<br>
+#sysmodules-content-area .header > div,<br>
+#sysmodules-content-area .body > span,<br>
+#sysmodules-content-area .body > div {<br>
+ padding: 6px 2px;<br>
+ display: inline-block;<br>
+ font-family: "Open Sans", Helvetica, Arial, "Lucida Grande", sans-serif;<br>
+}<br>
+<br>
+#sysmodules-content-area .header {<br>
+ border-top: 0 none;<br>
+}<br>
+<br>
+#sysmodules-content-area .header > span,<br>
+#sysmodules-content-area .header > div {<br>
+ vertical-align: bottom;<br>
+ height: 36px;<br>
+ font-weight: 300;<br>
+ font-size: 12.5pt;<br>
+ line-height: 1.42857;<br>
+ border-bottom: 0;<br>
+ border-top: 0;<br>
+}<br>
+<br>
+#sysmodules-content-area .body {<br>
+ border-top: 1px solid #eee;<br>
+}<br>
+<br>
+#sysmodules-content-area .body > span,<br>
+#sysmodules-content-area .body > div {<br>
+ vertical-align: middle;<br>
+ font-size: 11pt;<br>
+ line-height: 2.42857;<br>
+ font-weight: 400;<br>
+}<br>
+<br>
+#sysmodules-content-area .btn-group {<br>
+ margin-bottom: 20px;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-name {<br>
+ width: 30%;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-depends {<br>
+ width: 30%;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-details {<br>
+ width: 12%;<br>
+ vertical-align: middle;<br>
+ text-align: center;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-version {<br>
+ width: 14%;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-actions {<br>
+ width: 14%;<br>
+}<br>
+<br>
+#sysmodules-content-area .sysmodules-details {<br>
+ width: 100%;<br>
+ padding: 22px;<br>
+ background: #ddd;<br>
+}<br>
+<br>
+#sysmodules-content-area .details-list {<br>
+ max-height: 285px;<br>
+ min-height: 140px;<br>
+ background: #fff;<br>
+ padding: 0;<br>
+ overflow-x: hidden;<br>
+ overflow-y: auto;<br>
+}<br>
+<br>
+#sysmodules-content-area .arrow-down,<br>
+#sysmodules-content-area .arrow-up {<br>
+ display: inline-block;<br>
+ font: normal normal normal 14px/1 FontAwesome;<br>
+ font-size: inherit;<br>
+ text-rendering: auto;<br>
+ -webkit-font-smoothing: antialiased;<br>
+ -moz-osx-font-smoothing: grayscale;<br>
+ cursor: pointer;<br>
+}<br>
+<br>
+#sysmodules-content-area .arrow-down:before {<br>
+ content: "\f078";<br>
+}<br>
+<br>
+#sysmodules-content-area .arrow-up:before {<br>
+ content: "\f077";<br>
+}<br>
+<br>
+#sysmodules-content-area .btn .fa-upload {<br>
+ margin-right: 10px;<br>
+ font-size: 20px;<br>
+}<br>
diff --git a/ui/css/src/ginger.scss b/ui/css/src/ginger.scss<br>
index 610ecea..862f298 100644<br>
--- a/ui/css/src/ginger.scss<br>
+++ b/ui/css/src/ginger.scss<br>
@@ -1,4 +1,4 @@<br>
-/*<br>
+ /*<br>
* Copyright IBM Corp, 2015<br>
*<br>
* This library is free software; you can redistribute it and/or<br>
@@ -18,10 +18,8 @@<br>
<br>
// Core variables<br>
@import "../../../../../../../ui/css/src/modules/wok-variables";<br>
-<br>
// Compass Mixins<br>
@import "../../../../../../../ui/css/src/vendor/compass-mixins/lib/compass";<br>
-<br>
.ui-tooltip {<br>
width: "";<br>
display: inline-block;<br>
@@ -144,14 +142,68 @@<br>
}<br>
<br>
.ginger {<br>
- div.modal-footer {<br>
- background-color: #008abf;<br>
- }<br>
- .modal-body .nav-tabs > li.active > a, .modal-body .nav-tabs > li.active > a:hover, .modal-body .nav-tabs > li.active > a:focus{<br>
- border-color:-moz-use-text-color -moz-use-text-color #008abf;<br>
- }<br>
+ div.modal-footer {<br>
+ background-color: #008abf;<br>
+ }<br>
+ .modal-body .nav-tabs > li.active > a,<br>
+ .modal-body .nav-tabs > li.active > a:hover,<br>
+ .modal-body .nav-tabs > li.active > a:focus {<br>
+ border-color: -moz-use-text-color -moz-use-text-color #008abf;<br>
+ }<br>
+}<br>
+<br>
+@mixin ginger-accordion() {<br>
+ margin: 12px 20px 12px 60px;<br>
+ padding-bottom: 18px;<br>
+ border-bottom: 1px solid $table-border-color;<br>
+ overflow: visible;<br>
+ clear: both;<br>
+ &:first-chld {<br>
+ margin-top: 24px;<br>
+ }<br>
+ > h3 {<br>
+ margin: 0;<br>
+ padding: 0;<br>
+ font-size: 26px;<br>
+ font-weight: 300;<br>
+ height: 44px;<br>
+ display: block;<br>
+ a {<br>
+ color: $brand-primary;<br>
+ text-decoration: none;<br>
+ display: block;<br>
+ padding: 6px 30px;<br>
+ margin-left: -30px;<br>
+ margin-right: -30px;<br>
+ span.accordion-icon {<br>
+ margin-left: -52px;<br>
+ vertical-align: middle;<br>
+ display: inline-block;<br>
+ font: normal normal normal 32px/1 FontAwesome;<br>
+ text-rendering: auto;<br>
+ -webkit-font-smoothing: antialiased;<br>
+ color: $brand-primary;<br>
+ }<br>
+ &[aria-expanded="false"] {<br>
+ span.accordion-icon:before {<br>
+ content: "\f01a";<br>
+ }<br>
+ }<br>
+ &[aria-expanded="true"] {<br>
+ span.accordion-icon:before {<br>
+ content: "\f01b";<br>
+ }<br>
+ }<br>
+ span.accordion-text {<br>
+ margin-left: 23px;<br>
+ display: inline-block;<br>
+ vertical-align: middle;<br>
+ }<br>
+ }<br>
+ }<br>
}<br>
<br>
@import "modules/administration";<br>
@import "modules/network";<br>
@import "modules/storage";<br>
+@import "modules/sysmodules";<br>
\ No newline at end of file<br>
diff --git a/ui/css/src/modules/_sysmodules.scss b/ui/css/src/modules/_sysmodules.scss<br>
new file mode 100644<br>
index 0000000..5858dcc<br>
--- /dev/null<br>
+++ b/ui/css/src/modules/_sysmodules.scss<br>
@@ -0,0 +1,126 @@<br>
+//<br>
+// Project Ginger<br>
+//<br>
+// Copyright IBM, Corp. 2016<br>
+//<br>
+// Code derived from Project Kimchi<br>
+//<br>
+// Licensed under the Apache License, Version 2.0 (the "License");<br>
+// you may not use this file except in compliance with the License.<br>
+// You may obtain a copy of the License at<br>
+//<br>
+// <a href="http://www.apache.org/licenses/LICENSE-2.0" rel="noreferrer" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br>
+//<br>
+// Unless required by applicable law or agreed to in writing, software<br>
+// distributed under the License is distributed on an "AS IS" BASIS,<br>
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+// See the License for the specific language governing permissions and<br>
+// limitations under the License.<br>
+//<br>
+#host-sysmodules-root-container {<br>
+ .accordion {<br>
+ @include ginger-accordion();<br>
+ }<br>
+ .navbar-default.toolbar {<br>
+ background-color: $hosts-color !important;<br>
+ }<br>
+}<br>
+<br>
+#sysmodules-content-area {<br>
+ padding: 0;<br>
+ list-style-type: none;<br>
+ .li:nth-child(even) {<br>
+ background-color: #fcfcfc;<br>
+ }<br>
+ .li:nth-child(odd) {<br>
+ background-color: #fff;<br>
+ }<br>
+ .header,<br>
+ .body {<br>
+ > span,<br>
+ > div {<br>
+ padding: 6px 2px;<br>
+ display: inline-block;<br>
+ font-family: $font-family-sans-serif;<br>
+ }<br>
+ }<br>
+ .header {<br>
+ border-top: 0 none;<br>
+ > span,<br>
+ > div {<br>
+ vertical-align: bottom;<br>
+ height: 36px;<br>
+ font-weight: 300;<br>
+ font-size: 12.5pt;<br>
+ line-height: 1.42857;<br>
+ border-bottom: 0;<br>
+ border-top: 0;<br>
+ }<br>
+ }<br>
+ .body {<br>
+ border-top: 1px solid #eee;<br>
+ > span,<br>
+ > div {<br>
+ vertical-align: middle;<br>
+ font-size: 11pt;<br>
+ line-height: 2.42857;<br>
+ font-weight: 400;<br>
+ }<br>
+ }<br>
+ .btn-group {<br>
+ margin-bottom: 20px;<br>
+ }<br>
+ .actBtn {<br>
+ width: 115px;<br>
+ }<br>
+ .column-name {<br>
+ width: 30%;<br>
+ }<br>
+ .column-depends {<br>
+ width: 30%;<br>
+ }<br>
+ .column-details {<br>
+ width: 12%;<br>
+ vertical-align: middle;<br>
+ text-align: center;<br>
+ }<br>
+ .column-version {<br>
+ width: 14%;<br>
+ }<br>
+ .column-actions {<br>
+ width: 14%;<br>
+ }<br>
+ .sysmodules-details {<br>
+ width: 100%;<br>
+ padding: 22px;<br>
+ background: $table-bg-active;<br>
+ }<br>
+ .details-list {<br>
+ max-height: 285px;<br>
+ min-height: 140px;<br>
+ background: $table-bg;<br>
+ padding: 0;<br>
+ overflow-x: hidden;<br>
+ overflow-y: auto;<br>
+ }<br>
+ .arrow-down,<br>
+ .arrow-up {<br>
+ display: inline-block;<br>
+ font: normal normal normal 14px/1 FontAwesome;<br>
+ font-size: inherit;<br>
+ text-rendering: auto;<br>
+ -webkit-font-smoothing: antialiased;<br>
+ -moz-osx-font-smoothing: grayscale;<br>
+ cursor: pointer;<br>
+ }<br>
+ .arrow-down:before {<br>
+ content: "\f078";<br>
+ }<br>
+ .arrow-up:before {<br>
+ content: "\f077";<br>
+ }<br>
+ .btn .fa-upload {<br>
+ margin-right: 10px;<br>
+ font-size: 20px;<br>
+ }<br>
+}<br>
\ No newline at end of file<br>
diff --git a/ui/js/host-sysmodules.js b/ui/js/host-sysmodules.js<br>
new file mode 100644<br>
index 0000000..3644a02<br>
--- /dev/null<br>
+++ b/ui/js/host-sysmodules.js<br>
@@ -0,0 +1,76 @@<br>
+/*<br>
+ * Copyright IBM Corp, 2016<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library; if not, write to the Free Software<br>
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA<br>
+ */<br>
+<br>
+ginger.initSysmodules = function() {<br>
+ $(".content-area", "#gingerHostAdmin").css("height", "100%");<br>
+ ginger.loadSysmodules();<br>
+};<br>
+<br>
+ginger.loadSysmodules = function() {<br>
+ ginger.getSysmodules(function(data) {<br>
+ $("#sysmodules-body").empty();<br>
+ for (var i = 0; i < data.length; i++) {<br>
+ var tempNode = $.parseHTML(wok.substitute($("#sysmodulesItem").html(), data[i]));<br>
+ $("#sysmodules-body").append(tempNode);<br>
+<br>
+ $(".details-list", tempNode).append('Details');<br>
+<br>
+ $(".btn-unload").on("click", function(event) {<br>
+ event.preventDefault();<br>
+ event.stopImmediatePropagation();<br>
+ var sysmoduleItem = $(this).parent();<br>
+<br>
+ ginger.removeSysmodule(sysmoduleItem.prop("id"), function() {<br>
+ sysmoduleItem.remove();<br>
+ }, function(error) {<br>
+ wok.message.error('Unable to unload the module.');<br>
+ });<br>
+ });<br>
+ }<br>
+<br>
+ $('.load-modules-btn').on('click', function(event) {<br>
+ // TODO: Implement load modules action<br>
+ });<br>
+<br>
+ $('.arrow').on('click', function(event) {<br>
+ var that = $(this).parent().parent();<br>
+ var slide = $('.sysmodules-details', $(this).parent().parent());<br>
+ if (that.hasClass('in')) {<br>
+ that.css('height', 'auto');<br>
+ that.removeClass('in');<br>
+ ginger.changeArrow($('.arrow-down', that));<br>
+ slide.slideDown('slow');<br>
+ } else {<br>
+ slide.slideUp('slow', function() {<br>
+ that.css('height', '');<br>
+ });<br>
+ that.addClass('in');<br>
+ ginger.changeArrow($('.arrow-up', that));<br>
+ }<br>
+ });<br>
+ });<br>
+<br>
+};<br>
+<br>
+ginger.changeArrow = function(obj) {<br>
+ if ($(obj).hasClass('arrow-down')) {<br>
+ $(obj).removeClass('arrow-down').addClass('arrow-up');<br>
+ } else {<br>
+ $(obj).removeClass('arrow-up').addClass('arrow-down');<br>
+ }<br>
+}<br>
\ No newline at end of file<br>
diff --git a/ui/js/util.js b/ui/js/util.js<br>
index ed12bd4..8e1cc17 100644<br>
--- a/ui/js/util.js<br>
+++ b/ui/js/util.js<br>
@@ -21,27 +21,27 @@ ginger.hostarch = null;<br>
ginger.selectedInterface = null;<br>
<br>
trackingTasks = [];<br>
-ginger.getFirmware = function(suc, err){<br>
+ginger.getFirmware = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/firmware',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/firmware',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.updateFirmware = function(content, suc, err){<br>
+ginger.updateFirmware = function(content, suc, err) {<br>
$.ajax({<br>
- url : "plugins/ginger/firmware",<br>
- type : 'PUT',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify(content),<br>
+ url: "plugins/ginger/firmware",<br>
+ type: 'PUT',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify(content),<br>
success: suc,<br>
error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
@@ -50,82 +50,82 @@ ginger.updateFirmware = function(content, suc, err){<br>
};<br>
<br>
ginger.fwProgress = function(suc, err, progress) {<br>
- var taskID = -1;<br>
- var onResponse = function(data) {<br>
- taskID = data['id'];<br>
- trackTask();<br>
- };<br>
-<br>
- var trackTask = function() {<br>
- ginger.getTask(taskID, onTaskResponse, err);<br>
- };<br>
-<br>
- var onTaskResponse = function(result) {<br>
- var taskStatus = result['status'];<br>
- switch(taskStatus) {<br>
- case 'running':<br>
- progress && progress(result);<br>
- setTimeout(function() {<br>
- trackTask();<br>
- }, 1000);<br>
- break;<br>
- case 'finished':<br>
- case 'failed':<br>
- suc(result);<br>
- break;<br>
- default:<br>
- break;<br>
- }<br>
+ var taskID = -1;<br>
+ var onResponse = function(data) {<br>
+ taskID = data['id'];<br>
+ trackTask();<br>
+ };<br>
+<br>
+ var trackTask = function() {<br>
+ ginger.getTask(taskID, onTaskResponse, err);<br>
+ };<br>
+<br>
+ var onTaskResponse = function(result) {<br>
+ var taskStatus = result['status'];<br>
+ switch (taskStatus) {<br>
+ case 'running':<br>
+ progress && progress(result);<br>
+ setTimeout(function() {<br>
+ trackTask();<br>
+ }, 1000);<br>
+ break;<br>
+ case 'finished':<br>
+ case 'failed':<br>
+ suc(result);<br>
+ break;<br>
+ default:<br>
+ break;<br>
+ }<br>
+ };<br>
+<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/fwprogress',<br>
+ type: "GET",<br>
+ contentType: "application/json",<br>
+ dataType: "json",<br>
+ success: onResponse,<br>
+ error: err<br>
+ });<br>
+ },<br>
+<br>
+<br>
+ ginger.listBackupArchives = function(suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/backup/archives',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
+ wok.message.error(data.responseJSON.reason);<br>
+ }<br>
+ });<br>
};<br>
<br>
- wok.requestJSON({<br>
- url : 'plugins/ginger/fwprogress',<br>
- type : "GET",<br>
- contentType : "application/json",<br>
- dataType : "json",<br>
- success : onResponse,<br>
- error : err<br>
- });<br>
-},<br>
-<br>
-<br>
-ginger.listBackupArchives = function(suc, err){<br>
- wok.requestJSON({<br>
- url : 'plugins/ginger/backup/archives',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
- wok.message.error(data.responseJSON.reason);<br>
- }<br>
- });<br>
-};<br>
-<br>
ginger.createBackupArchive = function(bak, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/backup/archives',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify(bak),<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/backup/archives',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify(bak),<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.getBackupArchiveFile = function(id, suc, err){<br>
+ginger.getBackupArchiveFile = function(id, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/backup/archives/' + encodeURIComponent(id) + '/file',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/backup/archives/' + encodeURIComponent(id) + '/file',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -133,12 +133,12 @@ ginger.getBackupArchiveFile = function(id, suc, err){<br>
<br>
ginger.deleteBackupArchive = function(id, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/backup/archives/' + encodeURIComponent(id),<br>
- type : 'DELETE',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/backup/archives/' + encodeURIComponent(id),<br>
+ type: 'DELETE',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -146,13 +146,13 @@ ginger.deleteBackupArchive = function(id, suc, err) {<br>
<br>
ginger.deleteBackupArchives = function(content, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/backup/discard_archives',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify(content),<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/backup/discard_archives',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify(content),<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -160,25 +160,25 @@ ginger.deleteBackupArchives = function(content, suc, err) {<br>
<br>
ginger.getInterfaces = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/network/interfaces',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/network/interfaces',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.updateInterface = function(name, content, suc, err){<br>
+ginger.updateInterface = function(name, content, suc, err) {<br>
$.ajax({<br>
- url : 'plugins/ginger/network/interfaces/' + encodeURIComponent(name),<br>
- type : 'PUT',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify(content),<br>
+ url: 'plugins/ginger/network/interfaces/' + encodeURIComponent(name),<br>
+ type: 'PUT',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify(content),<br>
success: suc,<br>
error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
@@ -188,50 +188,50 @@ ginger.updateInterface = function(name, content, suc, err){<br>
<br>
ginger.enableInterface = function(name, status, suc, err) {<br>
wok.requestJSON({<br>
- url : "plugins/ginger/network/interfaces/" + name +<br>
- '/' + (status == "down" ? 'deactivate' : 'activate'),<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err<br>
+ url: "plugins/ginger/network/interfaces/" + name +<br>
+ '/' + (status == "down" ? 'deactivate' : 'activate'),<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
});<br>
};<br>
<br>
ginger.deleteInterface = function(name, suc, err) {<br>
- wok.requestJSON({<br>
- url : 'plugins/ginger/network/cfginterfaces/' + name,<br>
- type : 'DELETE',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err || function(data) {<br>
- wok.message.error(data.responseJSON.reason);<br>
- }<br>
- });<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/network/cfginterfaces/' + name,<br>
+ type: 'DELETE',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
+ wok.message.error(data.responseJSON.reason);<br>
+ }<br>
+ });<br>
};<br>
<br>
-ginger.getNetworkGlobals = function(suc, err){<br>
+ginger.getNetworkGlobals = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/network',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/network',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.updateNetworkGlobals = function(content, suc, err){<br>
+ginger.updateNetworkGlobals = function(content, suc, err) {<br>
$.ajax({<br>
- url : 'plugins/ginger/network',<br>
- type : 'PUT',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify(content),<br>
+ url: 'plugins/ginger/network',<br>
+ type: 'PUT',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify(content),<br>
success: suc,<br>
error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
@@ -241,12 +241,12 @@ ginger.updateNetworkGlobals = function(content, suc, err){<br>
<br>
ginger.confirmNetworkUpdate = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/network/confirm_change',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/network/confirm_change',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -254,55 +254,57 @@ ginger.confirmNetworkUpdate = function(suc, err) {<br>
<br>
ginger.confirmInterfaceUpdate = function(name, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/network/interfaces/' + encodeURIComponent(name) + '/confirm_change',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/network/interfaces/' + encodeURIComponent(name) + '/confirm_change',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.validateIp = function(ip){<br>
+ginger.validateIp = function(ip) {<br>
var ipReg = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;<br>
return ipReg.test(ip);<br>
};<br>
<br>
-ginger.validateMask = function(mask){<br>
- if(mask.indexOf('.')!=-1){<br>
+ginger.validateMask = function(mask) {<br>
+ if (mask.indexOf('.') != -1) {<br>
var secs = mask.split('.');<br>
var binMask = "";<br>
- for(var i=0; i<secs.length; i++)<br>
+ for (var i = 0; i < secs.length; i++)<br>
binMask += parseInt(secs[i]).toString(2);<br>
return /^1+0+$/.test(binMask);<br>
- }else{<br>
+ } else {<br>
return mask > 0 && mask < 32;<br>
}<br>
};<br>
<br>
-ginger.getPowerProfiles = function(suc, err){<br>
+ginger.getPowerProfiles = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/powerprofiles',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/powerprofiles',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.activatePowerProfile = function(name, suc, err){<br>
+ginger.activatePowerProfile = function(name, suc, err) {<br>
$.ajax({<br>
- url : "plugins/ginger/powerprofiles/" + encodeURIComponent(name),<br>
- type : 'PUT',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify({ active: true }),<br>
+ url: "plugins/ginger/powerprofiles/" + encodeURIComponent(name),<br>
+ type: 'PUT',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify({<br>
+ active: true<br>
+ }),<br>
success: suc,<br>
error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
@@ -310,113 +312,113 @@ ginger.activatePowerProfile = function(name, suc, err){<br>
});<br>
};<br>
<br>
-ginger.getSANAdapters = function(suc, err){<br>
+ginger.getSANAdapters = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/san_adapters',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/san_adapters',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.getSensors = function(suc, err){<br>
+ginger.getSensors = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/sensors',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/sensors',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.getSEPSubscriptions = function(suc, err){<br>
+ginger.getSEPSubscriptions = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/ibm_sep',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/ibm_sep',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.deleteSubscription = function (hostname, suc, err) {<br>
+ginger.deleteSubscription = function(hostname, suc, err) {<br>
wok.requestJSON({<br>
- url : wok.url + 'plugins/ginger/ibm_sep/subscribers/' + hostname,<br>
- type : 'DELETE',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: wok.url + 'plugins/ginger/ibm_sep/subscribers/' + hostname,<br>
+ type: 'DELETE',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
<br>
-ginger.addSEPSubscription = function(subscription, suc, err){<br>
+ginger.addSEPSubscription = function(subscription, suc, err) {<br>
wok.requestJSON({<br>
- url : wok.url + 'plugins/ginger/ibm_sep/subscribers',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- data : JSON.stringify(subscription),<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: wok.url + 'plugins/ginger/ibm_sep/subscribers',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ data: JSON.stringify(subscription),<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.getSEPStatus = function(suc, err){<br>
+ginger.getSEPStatus = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/ibm_sep',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/ibm_sep',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.startSEP = function(suc, err){<br>
+ginger.startSEP = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/ibm_sep/start',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/ibm_sep/start',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
};<br>
<br>
-ginger.stopSEP = function(suc, err){<br>
+ginger.stopSEP = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/ibm_sep/stop',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
+ url: 'plugins/ginger/ibm_sep/stop',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -424,13 +426,13 @@ ginger.stopSEP = function(suc, err){<br>
<br>
ginger.getUsers = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/users',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : function(data) {<br>
+ url: 'plugins/ginger/users',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -438,27 +440,27 @@ ginger.getUsers = function(suc, err) {<br>
<br>
ginger.addUser = function(username, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/users',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- data : JSON.stringify(username),<br>
- dataType : 'json',<br>
- resend : true,<br>
- success : suc,<br>
- error : err || function(data) {<br>
- wok.message.error(data.responseJSON.reason);<br>
+ url: 'plugins/ginger/users',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ data: JSON.stringify(username),<br>
+ dataType: 'json',<br>
+ resend: true,<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
+ wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
<br>
-ginger.deleteUser = function (username, suc, err) {<br>
+ginger.deleteUser = function(username, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/users/' + username,<br>
- type : 'DELETE',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ url: 'plugins/ginger/users/' + username,<br>
+ type: 'DELETE',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -466,12 +468,12 @@ ginger.deleteUser = function (username, suc, err) {<br>
<br>
ginger.getCapabilities = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/capabilities',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ url: 'plugins/ginger/capabilities',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
@@ -480,16 +482,16 @@ ginger.getCapabilities = function(suc, err) {<br>
/**<br>
* Get the host information.<br>
*/<br>
-ginger.getHostDetails = function (suc,err) {<br>
- wok.requestJSON({<br>
- url : 'plugins/gingerbase/host',<br>
- type : 'GET',<br>
- resend: true,<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error: err<br>
- });<br>
+ginger.getHostDetails = function(suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/gingerbase/host',<br>
+ type: 'GET',<br>
+ resend: true,<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
+ });<br>
}<br>
<br>
/**<br>
@@ -497,89 +499,103 @@ ginger.getHostDetails = function (suc,err) {<br>
*/<br>
ginger.getPlugins = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins',<br>
- type : 'GET',<br>
+ url: 'plugins',<br>
+ type: 'GET',<br>
resend: true,<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
error: err<br>
});<br>
};<br>
-ginger.getFilesystems = function(suc , err){<br>
- wok.requestJSON({<br>
- url : 'plugins/ginger/filesystems',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ginger.getFilesystems = function(suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/filesystems',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
-ginger.getSwapdevices = function(suc , err){<br>
- wok.requestJSON({<br>
- url : 'plugins/ginger/swaps',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ginger.getSwapdevices = function(suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/swaps',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
<br>
-ginger.getVolumegroups = function(suc , err){<br>
- wok.requestJSON({<br>
- url : 'plugins/ginger/vgs',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ginger.getVolumegroups = function(suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/vgs',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
+ wok.message.error(data.responseJSON.reason);<br>
+ }<br>
+ });<br>
+}<br>
+ginger.getStgdevs = function(suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/stgdevs',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
-ginger.getStgdevs = function(suc , err){<br>
+<br>
+ginger.getFcpTapeDevices = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/stgdevs',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ url: 'plugins/gingers390x/lstapes',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
<br>
-ginger.getFcpTapeDevices = function(suc , err){<br>
+ginger.getSysmodules = function(suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/gingers390x/lstapes',<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : function(data) {<br>
+ url: 'plugins/ginger/sysmodules',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: function(data) {<br>
wok.message.error(data.responseJSON.reason);<br>
}<br>
});<br>
}<br>
+<br>
ginger.formatDASDDevice = function(busId, settings, suc, err, progress) {<br>
var onResponse = function(data) {<br>
- taskID = data['id'];<br>
- ginger.trackTask(taskID, suc, err, progress);<br>
+ taskID = data['id'];<br>
+ ginger.trackTask(taskID, suc, err, progress);<br>
};<br>
<br>
wok.requestJSON({<br>
- url : '/plugins/ginger/dasddevs/'+busId+'/format',<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- data : JSON.stringify(settings),<br>
- dataType : 'json',<br>
+ url: '/plugins/ginger/dasddevs/' + busId + '/format',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ data: JSON.stringify(settings),<br>
+ dataType: 'json',<br>
success: onResponse,<br>
error: err<br>
});<br>
@@ -587,11 +603,11 @@ ginger.formatDASDDevice = function(busId, settings, suc, err, progress) {<br>
<br>
ginger.removeDASDDevice = function(busId, settings, suc, err, progress) {<br>
wok.requestJSON({<br>
- url : "/plugins/gingers390x/storagedevices/"+ busId +"/offline",<br>
- type : 'POST',<br>
- contentType : 'application/json',<br>
- data : JSON.stringify(settings),<br>
- dataType : 'json',<br>
+ url: "/plugins/gingers390x/storagedevices/" + busId + "/offline",<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ data: JSON.stringify(settings),<br>
+ dataType: 'json',<br>
success: suc,<br>
error: err<br>
});<br>
@@ -599,11 +615,22 @@ ginger.removeDASDDevice = function(busId, settings, suc, err, progress) {<br>
<br>
ginger.removeFCDevice = function(lunPath, settings, suc, err, progress) {<br>
wok.requestJSON({<br>
- url : "/plugins/gingers390x/fcluns/"+ lunPath,<br>
- type : 'DELETE',<br>
- contentType : 'application/json',<br>
- data : JSON.stringify(settings),<br>
- dataType : 'json',<br>
+ url: "/plugins/gingers390x/fcluns/" + lunPath,<br>
+ type: 'DELETE',<br>
+ contentType: 'application/json',<br>
+ data: JSON.stringify(settings),<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
+ });<br>
+}<br>
+<br>
+ginger.removeSysmodule = function(moduleId, suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/sysmodules/' + moduleId,<br>
+ type: 'DELETE',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
success: suc,<br>
error: err<br>
});<br>
@@ -611,45 +638,45 @@ ginger.removeFCDevice = function(lunPath, settings, suc, err, progress) {<br>
<br>
ginger.getTask = function(taskId, suc, err) {<br>
wok.requestJSON({<br>
- url : 'plugins/ginger/tasks/' + encodeURIComponent(taskId),<br>
- type : 'GET',<br>
- contentType : 'application/json',<br>
- dataType : 'json',<br>
- success : suc,<br>
- error : err<br>
+ url: 'plugins/ginger/tasks/' + encodeURIComponent(taskId),<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
});<br>
}<br>
ginger.trackTask = function(taskID, suc, err, progress) {<br>
var onTaskResponse = function(result) {<br>
var taskStatus = result['status'];<br>
- switch(taskStatus) {<br>
- case 'running':<br>
- progress && progress(result);<br>
- setTimeout(function() {<br>
- ginger.trackTask(taskID, suc, err, progress);<br>
- }, 2000);<br>
- break;<br>
- case 'finished':<br>
- suc && suc(result);<br>
- break;<br>
- case 'failed':<br>
- err && err(result);<br>
- break;<br>
- default:<br>
- break;<br>
+ switch (taskStatus) {<br>
+ case 'running':<br>
+ progress && progress(result);<br>
+ setTimeout(function() {<br>
+ ginger.trackTask(taskID, suc, err, progress);<br>
+ }, 2000);<br>
+ break;<br>
+ case 'finished':<br>
+ suc && suc(result);<br>
+ break;<br>
+ case 'failed':<br>
+ err && err(result);<br>
+ break;<br>
+ default:<br>
+ break;<br>
}<br>
};<br>
<br>
ginger.getTask(taskID, onTaskResponse, err);<br>
- if(trackingTasks.indexOf(taskID) < 0)<br>
+ if (trackingTasks.indexOf(taskID) < 0)<br>
trackingTasks.push(taskID);<br>
}<br>
<br>
-ginger.trackdevices = function(trackDevicelist,removeItem) {<br>
+ginger.trackdevices = function(trackDevicelist, removeItem) {<br>
"use strict";<br>
trackDevicelist = jQuery.grep(trackDevicelist, function(value) {<br>
- return value != removeItem;<br>
- });<br>
+ return value != removeItem;<br>
+ });<br>
return trackDevicelist;<br>
};<br>
<br>
@@ -657,17 +684,17 @@ ginger.trackdevices = function(trackDevicelist,removeItem) {<br>
* Create a network interface with new information.<br>
*/<br>
ginger.createCfgInterface = function(settings, suc, err) {<br>
- wok.requestJSON({<br>
- url: 'plugins/ginger/network/cfginterfaces/',<br>
- type: 'POST',<br>
- contentType: 'application/json',<br>
- data: JSON.stringify(settings),<br>
- dataType: 'json',<br>
- success: suc,<br>
- error: err || function(data) {<br>
- wok.message.error(data.responseJSON.reason);<br>
- }<br>
- });<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/network/cfginterfaces/',<br>
+ type: 'POST',<br>
+ contentType: 'application/json',<br>
+ data: JSON.stringify(settings),<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err || function(data) {<br>
+ wok.message.error(data.responseJSON.reason);<br>
+ }<br>
+ });<br>
}<br>
<br>
/**<br>
@@ -678,74 +705,74 @@ ginger.createCfgInterface = function(settings, suc, err) {<br>
* @param err callback for error<br>
*/<br>
ginger.listCfgInterface = function(suc, err) {<br>
- wok.requestJSON({<br>
- url: 'plugins/ginger/network/cfginterfaces/',<br>
- type: 'GET',<br>
- contentType: 'application/json',<br>
- dataType: 'json',<br>
- success: suc,<br>
- error: err<br>
- });<br>
-}<br>
-/**<br>
- * Retrieve the information of a given network interface by its name from it's cfg file.<br>
- *<br>
- * @param interface name<br>
- * @param suc callback for success<br>
- * @param err callback for error<br>
- */<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/network/cfginterfaces/',<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
+ });<br>
+ }<br>
+ /**<br>
+ * Retrieve the information of a given network interface by its name from it's cfg file.<br>
+ *<br>
+ * @param interface name<br>
+ * @param suc callback for success<br>
+ * @param err callback for error<br>
+ */<br>
ginger.retrieveCfgInterface = function(interface, suc, err) {<br>
+ wok.requestJSON({<br>
+ url: 'plugins/ginger/network/cfginterfaces/' + interface,<br>
+ type: 'GET',<br>
+ contentType: 'application/json',<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
+ });<br>
+ }<br>
+ /**<br>
+ * Update a network interface with new information.<br>
+ */<br>
+ginger.updateCfgInterface = function(interface, settings, suc, err) {<br>
wok.requestJSON({<br>
- url: 'plugins/ginger/network/cfginterfaces/'+interface,<br>
- type: 'GET',<br>
- contentType: 'application/json',<br>
- dataType: 'json',<br>
- success: suc,<br>
- error: err<br>
+ url: 'plugins/ginger/network/cfginterfaces/' + encodeURIComponent(interface),<br>
+ type: 'PUT',<br>
+ contentType: 'application/json',<br>
+ data: JSON.stringify(settings),<br>
+ dataType: 'json',<br>
+ success: suc,<br>
+ error: err<br>
});<br>
}<br>
- /**<br>
- * Update a network interface with new information.<br>
- */<br>
-ginger.updateCfgInterface = function(interface, settings, suc, err) {<br>
- wok.requestJSON({<br>
- url: 'plugins/ginger/network/cfginterfaces/' + encodeURIComponent(interface),<br>
- type: 'PUT',<br>
- contentType: 'application/json',<br>
- data: JSON.stringify(settings),<br>
- dataType: 'json',<br>
- success: suc,<br>
- error: err<br>
- });<br>
-}<br>
<br>
-ginger.disableclass = function(clas){<br>
- jQuery("."+clas).css('pointer-events', 'none')<br>
- jQuery("."+clas).find("input, select, button, textarea, div").attr("disabled",true);<br>
- jQuery("."+clas).css('opacity', '0.5')<br>
+ginger.disableclass = function(clas) {<br>
+ jQuery("." + clas).css('pointer-events', 'none')<br>
+ jQuery("." + clas).find("input, select, button, textarea, div").attr("disabled", true);<br>
+ jQuery("." + clas).css('opacity', '0.5')<br>
}<br>
<br>
-ginger.enableclass = function(clas){<br>
- jQuery("."+clas).css('pointer-events', 'auto')<br>
- jQuery("."+clas).find("input, select, button, textarea, div").attr("disabled",false);<br>
- jQuery("."+clas).css('opacity', 'initial')<br>
+ginger.enableclass = function(clas) {<br>
+ jQuery("." + clas).css('pointer-events', 'auto')<br>
+ jQuery("." + clas).find("input, select, button, textarea, div").attr("disabled", false);<br>
+ jQuery("." + clas).css('opacity', 'initial')<br>
}<br>
<br>
ginger.isInteger = function(value) {<br>
-return !isNaN(value) &&<br>
- parseInt(Number(value)) == value &&<br>
- !isNaN(parseInt(value, 10));<br>
+ return !isNaN(value) &&<br>
+ parseInt(Number(value)) == value &&<br>
+ !isNaN(parseInt(value, 10));<br>
}<br>
<br>
ginger.isValidIPv6 = function(ipv6addr) {<br>
- if (/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ipv6addr)) {<br>
- return true;<br>
- } else {<br>
- return false;<br>
- }<br>
- return false;<br>
+ if (/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ipv6addr)) {<br>
+ return true;<br>
+ } else {<br>
+ return false;<br>
+ }<br>
+ return false;<br>
}<br>
<br>
ginger.isValidIPv6Prefix = function(prefix) {<br>
- return prefix > 0 && prefix < 127;<br>
-}<br>
+ return prefix > 0 && prefix < 127;<br>
+}<br>
\ No newline at end of file<br>
diff --git a/ui/pages/tabs/host-sysmodules.html.tmpl b/ui/pages/tabs/host-sysmodules.html.tmpl<br>
new file mode 100644<br>
index 0000000..d7225de<br>
--- /dev/null<br>
+++ b/ui/pages/tabs/host-sysmodules.html.tmpl<br>
@@ -0,0 +1,88 @@<br>
+<!DOCTYPE html><br>
+<!--<br>
+Copyright IBM Corp, 2016<br>
+<br>
+This library is free software; you can redistribute it and/or<br>
+modify it under the terms of the GNU Lesser General Public<br>
+License as published by the Free Software Foundation; either<br>
+version 2.1 of the License, or (at your option) any later version.<br>
+<br>
+This library is distributed in the hope that it will be useful,<br>
+but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+Lesser General Public License for more details.<br>
+<br>
+You should have received a copy of the GNU Lesser General Public<br>
+License along with this library; if not, write to the Free Software<br>
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA<br>
+--><br>
+#unicode UTF-8<br>
+#import gettext<br>
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)<br>
+#silent _ = t.gettext<br>
+#silent _t = t.gettext<br>
+<html><br>
+<head><br>
+<link rel="stylesheet" type="text/css" href="plugins/ginger/css/ginger.css"><br>
+<script type="text/javascript" src="plugins/ginger/js/util.js"></script><br>
+<script type="text/javascript" src="plugins/ginger/js/host-sysmodules.js"></script><br>
+<script type="text/javascript" src="plugins/ginger/js/ginger-bootgrid.js"></script><br>
+</head><br>
+<body><br>
+ <div id="host-sysmodules-root-container" class="ginger"><br>
+ <nav class="navbar navbar-default toolbar"><br>
+ <div class="container"><br>
+ <div id="toolbar"></div><br>
+ </div><br>
+ </nav><br>
+ <div class="container"><br>
+ <div id="alert-container"></div><br>
+ <div id="gingerHostAdmin" class="host-admin"><br>
+ <div class="panel-group accordion" id="sysmodules-accordion" role="tablist" aria-multiselectable="true"><br>
+ <h3><br>
+ <a role="button" data-toggle="collapse" data-parent="#sysmodules-accordion" href="#sysmodules-content-area" aria-expanded="false" aria-controls="sysmodules-content-area" class=""><br>
+ <span class="accordion-icon"></span><span class="accordion-text">$_("System Modules Management")</span><br>
+ </a><br>
+ </h3><br>
+ <div id="sysmodules-content-area" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne"><br>
+ <div class="sysmodules-actions btn-group" id="sysmodules-actions-<br>
+ area"><br>
+ <button class="btn btn-primary actBtn load-modules-btn" type="submit" data-toggle="modal" data-target="#loadModule"><i class="fa fa-download"></i> $_("Load Modules")</button><br>
+ </div><br>
+ <div class="wok-datagrid" id="sysmodules-datagrid"><br>
+ <div class="wok-datagrid-header"><br>
+ <span class="column-name">$_("Name")</span><!--<br>
+ --><span class="column-depends">$_("Depends On")</span><!--<br>
+ --><span class="column-version">$_("Version")</span><!--<br>
+ --><span class="column-details">$_("Details")</span><!--<br>
+ --><span class="column-actions" style="display:none"><br>
+ <span class="sr-only">Actions</span><!--<br>
+ --></span><br>
+ </div><br>
+ <ul class="wok-datagrid-body" id="sysmodules-body"></ul><br>
+ </div><br>
+ </div><br>
+ </div><br>
+ </div><br>
+ </div><br>
+ </div><br>
+<script id="sysmodulesItem" type="html/text"><br>
+ <li class="wok-datagrid-row in" name="sysmodulesBodyItem" id="{name}"><br>
+ <span class="column-name" title="{name}">{name}</span><!--<br>
+ --><span class="column-depends">{depends}</span><!--<br>
+ --><span class="column-version">{version}</span><!--<br>
+ --><span class="column-details"><br>
+ <div class="arrow arrow-down"></div><br>
+ </span><!--<br>
+ --><span class="column-actions btn btn-link btn-unload"><i class="fa fa-upload"></i> $_("Unload")</span><br>
+ <div class="sysmodules-details" style="display: none;"><br>
+ <div class="details-list" ></div><br>
+ </div><br>
+ <div class="clear"></div><br>
+ </li><br>
+</script><br>
+<script><br>
+ ginger.initSysmodules();<br>
+</script><br>
+</body><br>
+</html><br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><br>André Teodoro<br></div></div>
</div></div></div>