diff options
Diffstat (limited to 'web/nms-public.gathering.org/js/nms-info-box.js')
-rw-r--r-- | web/nms-public.gathering.org/js/nms-info-box.js | 713 |
1 files changed, 0 insertions, 713 deletions
diff --git a/web/nms-public.gathering.org/js/nms-info-box.js b/web/nms-public.gathering.org/js/nms-info-box.js deleted file mode 100644 index a718f78..0000000 --- a/web/nms-public.gathering.org/js/nms-info-box.js +++ /dev/null @@ -1,713 +0,0 @@ -"use strict"; - -/* - * NMS info window controller - * - * Interface: nmsInfoBox.showWindow(windowType,optionalParameter), nmsInfoBox.hide(), nmsInfoBox.refresh() - * - * Any windowTypes should at a minimum implement load, update, unload, getTitle, getContent, getChildContent - * - */ - -var nmsInfoBox = nmsInfoBox || { - stats: {}, - _container: false, //Container window - _window: false, //Active window (reference to _windowTypes object or false) - _windowTypes: [] //List of all avaliable window types -}; - -/* - * Shows a window from the _windowTypes list - */ -nmsInfoBox.showWindow = function (windowName,argument) { - if(windowName == "switchInfo" && argument != '' && argument == this._window.sw) { - nmsInfoBox.hide(); - return; - } - nmsInfoBox.hide(); - for(var win in this._windowTypes) { - if(windowName == win) { - this._window = this._windowTypes[win]; - this._show(argument); - return; - } - } -}; - -/* - * Refresh the active window - */ -nmsInfoBox.refresh = function(argument) { - if(!nmsInfoBox._window) - return; - nmsInfoBox._show(argument); -}; -nmsInfoBox.update = function(argument) { - if(!nmsInfoBox._window) - return; - nmsInfoBox._window.update(argument); -} - -/* - * Internal function to show the active _window and pass along any arguments - */ -nmsInfoBox._show = function(argument) { - nmsData.addHandler("comments","switchshower",nmsInfoBox.update,'comments'); - nmsData.addHandler("switches","switchshower",nmsInfoBox.update,'switches'); - nmsData.addHandler("smanagement","switchshower",nmsInfoBox.update,'smanagement'); - nmsData.addHandler("snmp","switchshower",nmsInfoBox.update,'snmp'); - - if(argument != "soft") - this._window.load(argument); - - this._container = document.getElementById("info-panel-container"); - var panel = document.createElement("div"); - panel.classList.add("panel", "panel-default"); - var title = document.createElement("div"); - title.classList.add("panel-heading"); - var body = document.createElement("div"); - body.classList.add("panel-body"); - - title.innerHTML = this._window.getTitle() + '<button type="button" class="close" aria-label="Close" onclick="nmsInfoBox.hide();" style="float: right;"><span aria-hidden="true">×</span></button>'; - var content = this._window.getContent(); - if(!content.nodeName) { - body.innerHTML = this._window.content; - } else { - body.appendChild(content); - } - var childContent = this._window.getChildContent(); - if(childContent != false) { - body.appendChild(childContent); - } - - panel.appendChild(title); - panel.appendChild(body); - while(this._container.firstChild) { - this._container.removeChild(this._container.firstChild); - } - this._container.appendChild(panel); - this._container.style.display = "block"; - $('[data-toggle="popover"]').popover({placement:"top",container:'body'}); -}; - -/* - * Hide the active window and tell it to unload - */ -nmsInfoBox.hide = function() { - if(!this._container || !this._window) - return; - this._container.style.display = "none"; - this._window.unload(); - this._window = false; - nmsData.unregisterHandler("comments","switchshower"); - nmsData.unregisterHandler("switches","switchshower"); - nmsData.unregisterHandler("smanagement","switchshower"); - nmsData.unregisterHandler("snmp","switchshower"); -}; - -/* - * Window type: Add Switch - * - * Basic window that lets you create a new switch - * - */ -nmsInfoBox._windowTypes.addSwitch = { - title: 'Add new switch', - content: '<input type="text" class="form-control" id="create-sysname" placeholder="Sysname id"><button class="btn btn-default" onclick="nmsInfoBox._windowTypes.addSwitch.save();">Add switch</button>', - childContent: false, - getTitle: function() { - return this.title; - }, - getContent: function() { - return this.content; - }, - getChildContent: function() { - return this.childContent; - }, - load: function(argument) { - }, - update: function(type) { - }, - unload: function() { - }, - save: function() { - var sysname = document.getElementById('create-sysname').value; - var myData = JSON.stringify([{'sysname':sysname}]); - $.ajax({ - type: "POST", - url: "/api/write/switch-add", - dataType: "text", - data:myData, - success: function (data, textStatus, jqXHR) { - var result = JSON.parse(data); - if(result.switches_addded.length > 0) { // FIXME unresolved variable switches_addded - nmsInfoBox.hide(); - } - nmsData.invalidate("switches"); - nmsData.invalidate("smanagement"); - } - }); - } -}; - -/* - * Window type: Switch info - * - * Advanced window with information about a specific switch, and basic editing options - * - * Custom interfaces: showComments, showSNMP, showEdit, save - * - */ -nmsInfoBox._windowTypes.switchInfo = { - title: '', - content: '', - childContent: false, - sw: '', - swi: '', - swm: '', - commentsHash: false, - activeView: '', - load: function(sw) { - if(sw) { - this.sw = sw; - } - this.swi = nmsData.switches["switches"][this.sw]; - try { - this.swm = nmsData.smanagement.switches[this.sw]; - } catch(e) { - this.swm = []; - } - - var content = []; - - for (var v in this.swi) { - if (v == "placement") { - var place = JSON.stringify(this.swi[v]); - content.push([v,place]); - continue; - } - content.push([v, this.swi[v]]); - } - - for (var v in this.swm) { - content.push([v, this.swm[v]]); - } - content.sort(); - - var infotable = nmsInfoBox._makeTable(content); - infotable.id = "info-switch-table"; - - this.content = infotable; - - }, - update: function(type) { - switch (type) { - case 'comments': - if(this.activeView == "comments" && this.commentsHash != nmsData.comments.hash) { - nmsInfoBox._windowTypes.switchInfo.showComments(); - } - break; - } - }, - getTitle: function() { - var sshButton = ''; - try { - var mgmt = nmsInfoBox._window.swm.mgmt_v4_addr; - sshButton = mgmt.split("/")[0]; - } catch(e) { - console.log(e); - } - if(sshButton != null && sshButton != undefined && sshButton != '') { - sshButton = ' <button type="button" class="ssh btn btn-xs btn-default"><a href="ssh://' + sshButton + '">SSH</a></button>'; - } - return '<h4>' + this.sw + '</h4><button type="button" class="edit btn btn-xs btn-warning" onclick="nmsInfoBox._windowTypes.switchInfo.showEdit(\'' + this.sw + '\');">Edit</button> <button type="button" class="comments btn btn-xs btn-default" onclick="nmsInfoBox._windowTypes.switchInfo.showComments(\'' + this.sw + '\');">Comments</button> <button type="button" class="edit btn btn-xs btn-default" onclick="nmsInfoBox._windowTypes.switchInfo.showSNMP(\'ports\');">Ports</button> <button type="button" class="edit btn btn-xs btn-default" onclick="nmsInfoBox._windowTypes.switchInfo.showSNMP(\'misc\');">Misc</button>' + sshButton; - }, - getContent: function() { - return this.content; - }, - getChildContent: function() { - return this.childContent; - }, - showComments: function() { - var oldView = this.activeView; - this.activeView = "comments"; - var domObj = document.createElement("div"); - var comments = []; - - var commentbox = document.createElement("div"); - commentbox.id = "commentbox"; - commentbox.className = "panel-body"; - commentbox.style.width = "100%"; - commentbox.innerHTML = '<div class="input-group"><input type="text" class="form-control" placeholder="Comment" id="' + this.sw + '-comment"><span class=\"input-group-btn\"><button class="btn btn-default" onclick="addComment(\'' + this.sw + '\',document.getElementById(\'' + this.sw + '-comment\').value); document.getElementById(\'' + this.sw + '-comment\').value = \'\'; document.getElementById(\'' + this.sw + '-comment\').placeholder = \'Comment added. Wait for next refresh.\';">Add comment</button></span></div>'; - - // If we have no switch data, so just show comment form - if(!nmsData.comments || !nmsData.comments.comments) { - this.commentsHash = false; - - // We have data, refresh - } else if(nmsData.comments.comments[this.sw]) { - this.commentsHash = nmsData.comments.hash; - for (var c in nmsData.comments.comments[this.sw]["comments"]) { - var comment = nmsData.comments.comments[this.sw]["comments"][c]; - if (comment["state"] == "active" || comment["state"] == "persist" || comment["state"] == "inactive") { - comments.push(comment); - } - } - - if (comments.length > 0) { - var commenttable = nmsInfoBox._makeCommentTable(comments); - commenttable.id = "info-switch-comments-table"; - domObj.appendChild(commenttable); - } - - // We have no data for this switch, but its still correct - } else { - this.commentsHash = nmsData.comments.hash; - } - - domObj.appendChild(commentbox); - this.childContent = domObj; - nmsInfoBox.refresh(); - }, - showEdit: function() { - this.activeView = "edit"; - var domObj = document.createElement("div"); - var template = {}; - - nmsInfoBox._editValues = {}; - var place; - for (var v in this.swi) { - if (v == "placement") { - place = JSON.stringify(this.swi[v]); - template[v] = place; - continue; - } - template[v] = nmsInfoBox._nullBlank(this.swi[v]); - } - for (var v in this.swm) { - template[v] = nmsInfoBox._nullBlank(this.swm[v]); - } - var content = []; - for (v in template) { - var tmpsw = '\'' + this.sw + '\''; - var tmpv = '\'' + v + '\''; - var tmphandler = '"nmsInfoBox._editChange(' + tmpsw + ',' + tmpv + ');"'; - var html = "<input type=\"text\" class=\"form-control\" value='" + template[v] + "' id=\"edit-"+ this.sw + "-" + v + '" onchange=' + tmphandler + ' oninput=' + tmphandler + '/>'; - content.push([v, html]); - } - - content.sort(); - - var table = nmsInfoBox._makeTable(content, "edit"); - domObj.appendChild(table); - - var submit = document.createElement("button"); - submit.innerHTML = "Save changes"; - submit.classList.add("btn", "btn-primary"); - submit.id = "edit-submit-" + this.sw; - submit.onclick = function(e) { nmsInfoBox._windowTypes.switchInfo.save(); }; - domObj.appendChild(submit); - - var output = document.createElement("output"); - output.id = "edit-output"; - domObj.appendChild(output); - - if (place) { - var pval = document.getElementById("edit-" + this.sw + "-placement"); - if (pval) { - pval.value = place; - } - } - - this.childContent = domObj; - nmsInfoBox.refresh(); - }, - showSNMP: function(tree) { - this.activeView = "snmp"; - var domObj = document.createElement("div"); - - var output = document.createElement("output"); - output.id = "edit-output"; - output.style = "white-space: pre;"; - try { - output.value = JSON.stringify(nmsData.snmp.snmp[this.sw][tree],null,4); - } catch(e) { - output.value = "(no recent data (yet)?)"; - } - domObj.appendChild(output); - - this.childContent = domObj; - nmsInfoBox.refresh(); - }, - unload: function() { - this.title = ''; - this.content = ''; - this.childContent = false; - this.sw = ''; - this.swi = ''; - this.swm = ''; - this.commentsHash = false; - this.activeView = ''; - }, - save: function() { - var myData = nmsInfoBox._editStringify(this.sw); - $.ajax({ - type: "POST", - url: "/api/write/switch-update", - dataType: "text", - data:myData, - success: function (data, textStatus, jqXHR) { - var result = JSON.parse(data); - if(result.switches_updated.length > 0) { // FIXME unresolved variable switches_addded - nmsInfoBox.hide(); - } - nmsData.invalidate("switches"); - nmsData.invalidate("smanagement"); - } - }); - } -}; - -/* - * Window type: Show inventory listing - * - * Basic window that displays a list of all devices with simple summary information - * - * TODO: Set up more complex views with more columns, sorting, etc. - * - */ -nmsInfoBox._windowTypes.inventoryListing = { - content: '', - childContent: false, - activeView: '', - activeFilter: '', - getTitle: function() { - return '<h4>Inventory listing</h4><button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'distro_name\');">Distro name</button> <button type="button" class="distro-name btn btn-xs btn-default" onclick="nmsInfoBox.showWindow(\'inventoryListing\',\'sysDescr\');">System Description</button>'; - }, - getContent: function() { - return this.content; - }, - getChildContent: function() { - return this.childContent; - }, - setFilter: function(filter) { - this.activeFilter = filter.toLowerCase(); - nmsInfoBox._windowTypes.inventoryListing.load("refresh"); - }, - getFilter: function() { - return this.activeFilter; - }, - load: function(list) { - var hasSnmp = false; - var targetArray = []; - var listTitle = ''; - var needRefresh = false; - var needSnmp = false; - var contentObj = document.createElement("div"); - var inputObj = document.createElement("div"); - inputObj.innerHTML = '<div class="input-group"><input type="text" class="form-control" placeholder="Filter" id="inventorylisting-filter" value="' + this.activeFilter + '" onkeyup="if (event.keyCode == 13) {nmsInfoBox._windowTypes.inventoryListing.setFilter(document.getElementById(\'inventorylisting-filter\').value);}"><span class=\"input-group-btn\"><button class="btn btn-default" onclick="nmsInfoBox._windowTypes.inventoryListing.setFilter(document.getElementById(\'inventorylisting-filter\').value);">Filtrer</button></span></div>'; - contentObj.appendChild(inputObj); - - - if(!nmsData.switches || !nmsData.switches.switches) - return; - if(!(!nmsData.snmp || !nmsData.snmp.snmp)) { - hasSnmp = true; - } - if(list == "refresh") { - list = this.activeView; - needRefresh = true; - } - - switch (list) { - case 'distro_name': - listTitle = 'Distro names'; - break; - case 'sysDescr': - if(hasSnmp) - listTitle = 'System description'; - needSnmp = true; - break; - default: - listTitle = 'Distro names'; - list = 'distro_name'; - } - this.activeView = list; - - if(needSnmp && !hasSnmp) { - this.content = "No SNMP data loaded. Reloading shortly."; - nmsData.addHandler("snmp","inventoryListing",nmsInfoBox._windowTypes.inventoryListing.update,"snmp-request"); - return; - } - - var resultArray = []; - for(var sw in nmsData.switches.switches) { - var value = ''; - if(this.activeFilter != '') { - if(sw.toLowerCase().indexOf(this.activeFilter) == -1 && !nmsInfoBox._searchSmart(this.activeFilter,sw)) - continue; - } - try { - switch (list) { - case 'distro_name': - value = nmsData.switches.switches[sw]["distro_name"]; - break; - case 'sysDescr': - value = nmsData.snmp.snmp[sw]["misc"]["sysDescr"][0]; - break; - } - } catch (e) { - //console.log(e); - } - resultArray.push([sw, value]); - } - - resultArray.sort(); - - var infotable = nmsInfoBox._makeTable(resultArray,listTitle); - infotable.id = "inventory-table"; - - contentObj.appendChild(infotable); - this.content = contentObj; - if(needRefresh) - nmsInfoBox.refresh("soft"); - }, - update: function(type) { - if(type == "snmp-request") { - nmsData.unregisterHandler("snmp","inventoryListing"); - nmsInfoBox._windowTypes.inventoryListing.load("refresh"); - } - }, - unload: function() { - nmsData.unregisterHandler("snmp","inventoryListing"); - this.content = ''; - this.activeView = ''; - this.activeFilter = ''; - }, - save: function() { - } -}; - -/* - * Click a switch and display it - * it. - */ -nmsInfoBox.click = function(sw) -{ - this.showWindow("switchInfo",sw); - this._windowTypes.switchInfo.showComments(); -}; - -/* - * General-purpose table-maker? - * - * Takes an array of arrays as input, and an optional caption. - * - * E.g.: _makeTable([["name","Kjell"],["Age","five"]], "Age list"); - */ -nmsInfoBox._makeTable = function(content, caption) { - var table = document.createElement("table"); - var tr; - var td1; - var td2; - table.className = "table"; - table.classList.add("table"); - table.classList.add("table-condensed"); - if (caption != undefined) { - var cap = document.createElement("caption"); - cap.textContent = caption; - table.appendChild(cap); - } - for (var v in content) { - tr = table.insertRow(-1); - tr.className = content[v][0].toLowerCase(); - td1 = tr.insertCell(0); - td2 = tr.insertCell(1); - td1.innerHTML = content[v][0]; - td2.innerHTML = content[v][1]; - } - return table; -}; - -/* - * Create and return a table for comments. - * - * Input is an array of comments. - */ -nmsInfoBox._makeCommentTable = function(content) { - var table = document.createElement("table"); - table.className = "table"; - table.classList.add("table"); - table.classList.add("table-condensed"); - var cap = document.createElement("caption"); - cap.textContent = "Comments" - table.appendChild(cap); - for (var commentid in content) { - var tr; - var td1; - var td2; - var comment = content[commentid]; - var col; - if (comment["state"] == "active") - col = "danger"; - else if (comment["state"] == "inactive") - col = false; - else - col = "info"; - tr = table.insertRow(-1); - tr.id = "commentRow" + comment["id"]; - tr.className = col; - - td1 = tr.insertCell(0); - td1.style.whiteSpace = "nowrap"; - td1.style.width = "8em"; - td2 = tr.insertCell(1); - var txt = '<div class="btn-group" role="group" aria-label="..."><button type="button" class="btn btn-xs btn-default" data-trigger="focus" data-toggle="popover" title="Info" data-content="Comment added ' + comment["time"] + " by user " + comment["username"] + ' and listed as ' + comment["state"] + '"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></button>'; - txt += '<button type="button" class="btn btn-xs btn-danger" data-trigger="focus" data-toggle="tooltip" title="Mark as deleted" onclick="commentDelete(' + comment["id"] + ');"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></button>'; - txt += '<button type="button" class="btn btn-xs btn-success" data-trigger="focus" data-toggle="tooltip" title="Mark as inactive/fixed" onclick="commentInactive(' + comment["id"] + ');"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button>'; - txt += '<button type="button" class="btn btn-xs btn-info" data-trigger="focus" data-toggle="tooltip" title="Mark as persistent" onclick="commentPersist(' + comment["id"] + ');"><span class="glyphicon glyphicon-star" aria-hidden="true"></span></button></div>'; - td1.innerHTML = txt; - td2.innerHTML = comment["comment"]; - } - return table; -}; - -nmsInfoBox._searchSmart = function(id, sw) { - try { - try { - if (nmsData.switches.switches[sw].distro_name.toLowerCase() == id) { - return true; - } - } catch (e) {} - if (id.match("active")) { - var limit = id; - limit = limit.replace("active>",""); - limit = limit.replace("active<",""); - limit = limit.replace("active=",""); - var operator = id.replace("active","")[0]; - if (limit == parseInt(limit)) { - if (operator == ">" ) { - if (nmsData.switchstate.switches[sw]['totals'].live > limit) { - return true; - } - } else if (operator == "<") { - if (nmsData.switchstate.switches[sw]['totals'].live < limit) { - return true; - } - } else if (operator == "=") { - if (nmsData.switchstate.switches[sw]['totals'].live == limit) { - return true; - } - } - } - } - try { - if (nmsData.smanagement.switches[sw].mgmt_v4_addr.match(id)) { - return true; - } - if (nmsData.smanagement.switches[sw].mgmt_v6_addr.match(id)) { - return true; - } - } catch (e) {} - try { - if (nmsData.smanagement.switches[sw].subnet4.match(id)) { - return true; - } - if (nmsData.smanagement.switches[sw].subnet6.match(id)) { - return true; - } - } catch (e) {} - if (nmsData.snmp.snmp[sw].misc.sysDescr[0].toLowerCase().match(id)) { - return true; - } - } catch (e) { - return false; - } - return false; -}; - -/* - * FIXME: Not sure this belongs here, it's really part of the "Core" ui, - * not just the infobox. - */ -nmsInfoBox._search = function() { - var el = document.getElementById("searchbox"); - var id = false; - var matches = []; - if (el) { - id = el.value.toLowerCase(); - } - if(id) { - nmsMap.enableHighlights(); - for(var sw in nmsData.switches.switches) { - if(sw.toLowerCase().indexOf(id) > -1) { - matches.push(sw); - nmsMap.setSwitchHighlight(sw,true); - } else if (nmsInfoBox._searchSmart(id,sw)) { - matches.push(sw); - nmsMap.setSwitchHighlight(sw,true); - } else { - nmsMap.setSwitchHighlight(sw,false); - } - } - } else { - nmsMap.disableHighlights(); - } - if(matches.length == 1) { - document.getElementById("searchbox-submit").classList.add("btn-primary"); - document.getElementById("searchbox").dataset.match = matches[0]; - } else { - document.getElementById("searchbox-submit").classList.remove("btn-primary"); - document.getElementById("searchbox").dataset.match = ''; - } -}; - -nmsInfoBox._searchKeyListener = function(e) { - switch (e.keyCode) { - case 13: - var sw = document.getElementById("searchbox").dataset.match; - if(sw != '') { - nmsInfoBox.showWindow("switchInfo",sw); - this._windowTypes.switchInfo.showComments(); - } - break; - case 27: - document.getElementById("searchbox").dataset.match = ''; - document.getElementById("searchbox").value = ''; - nmsInfoBox._search(); - nmsInfoBox.hide(); - break; - } -}; - -nmsInfoBox._nullBlank = function(x) { - if (x == null || x == false || x == undefined) - return ""; - return x; -}; - - -nmsInfoBox._editChange = function(sw, v) { - var el = document.getElementById("edit-" + sw + "-" + v); - var val = el.value; - if (v == "placement") { - try { - val = JSON.parse(val); - el.parentElement.classList.remove("has-error"); - el.parentElement.classList.add("has-success"); - } catch (e) { - el.parentElement.classList.add("has-error"); - return; - } - } - nmsInfoBox._editValues[v] = val; - el.classList.add("has-warning"); - var myData = nmsInfoBox._editStringify(sw); - var out = document.getElementById("edit-output"); - out.value = myData; -}; - -nmsInfoBox._editStringify = function(sw) { - nmsInfoBox._editValues['sysname'] = sw; - return JSON.stringify([nmsInfoBox._editValues]); -}; |