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