relocate repo files so ND2 is the only code
This commit is contained in:
52
share/views/ajax/device/addresses.tt
Normal file
52
share/views/ajax/device/addresses.tt
Normal file
@@ -0,0 +1,52 @@
|
||||
<table id="da-data-table" class="table table-striped table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Address</th>
|
||||
<th>DNS</th>
|
||||
<th class="nd_center-cell">Interface</th>
|
||||
<th>Description</th>
|
||||
<th>Prefix</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
var table = $('#da-data-table').dataTable({
|
||||
"deferRender": true,
|
||||
"data": [% results %],
|
||||
"columns": [
|
||||
{
|
||||
"data": 'alias',
|
||||
"render": function(data, type, row, meta) {
|
||||
return he.encode(data || '');
|
||||
}
|
||||
}, {
|
||||
"data": 'dns',
|
||||
"render": function(data, type, row, meta) {
|
||||
return he.encode(data || '');
|
||||
}
|
||||
}, {
|
||||
"data": 'port',
|
||||
"type": 'portsort',
|
||||
"render": function(data, type, row, meta) {
|
||||
return type === 'display' ?
|
||||
'<a href="[% device_ports %]&q=' + encodeURIComponent(row.ip) + '&f=' + encodeURIComponent(data) + '">' + he.encode(data || '') + '</a>' :
|
||||
data;
|
||||
}
|
||||
}, {
|
||||
"data": 'name',
|
||||
"render": function(data, type, row, meta) {
|
||||
return he.encode(data || '');
|
||||
}
|
||||
}, {
|
||||
"data": 'subnet',
|
||||
"render": function(data, type, row, meta) {
|
||||
return '<a href="[% search_device %]&q=' + encodeURIComponent(data) + '&ip=' + encodeURIComponent(data) + '">' + he.encode(data || '') + '</a>';
|
||||
}
|
||||
}
|
||||
],
|
||||
[% INCLUDE 'ajax/datatabledefaults.tt' -%]
|
||||
});
|
||||
});
|
||||
</script>
|
||||
11
share/views/ajax/device/addresses_csv.tt
Normal file
11
share/views/ajax/device/addresses_csv.tt
Normal file
@@ -0,0 +1,11 @@
|
||||
[% USE CSV -%]
|
||||
[% CSV.dump([ 'Address' 'DNS' 'Interface' 'Description' 'Prefix' ]) %]
|
||||
|
||||
[% FOREACH row IN results %]
|
||||
[% mylist = [] %]
|
||||
[% FOREACH col IN [ row.alias row.dns row.port row.device_port.name row.subnet ] %]
|
||||
[% mylist.push(col) %]
|
||||
[% END %]
|
||||
[% CSV.dump(mylist) %]
|
||||
|
||||
[% END %]
|
||||
199
share/views/ajax/device/details.tt
Normal file
199
share/views/ajax/device/details.tt
Normal file
@@ -0,0 +1,199 @@
|
||||
[% SET user_can_port_control = user_has_role('port_control') %]
|
||||
<table class="table table-condensed table-striped">
|
||||
</tbody>
|
||||
<tr>
|
||||
<td>System Name</td>
|
||||
<td>[% d.name %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Location
|
||||
[% IF user_can_port_control %]
|
||||
<i class="icon-edit nd_edit-icon nd_device-details-edit"></i>
|
||||
[% END %]
|
||||
</td>
|
||||
[% IF user_can_port_control %]
|
||||
<td class="nd_editable-cell" contenteditable="true"
|
||||
data-field="location" data-for-device="[% d.ip %]">
|
||||
[% d.location | html_entity %]
|
||||
</td>
|
||||
[% ELSE %]
|
||||
<td>
|
||||
<a rel="tooltip" data-placement="top" data-offset="5" data-title="Find Similar Devices"
|
||||
href="[% search_device %]&q=[% d.location | uri %]&location=[% d.location | uri %]">[% d.location | html_entity %]</a>
|
||||
</td>
|
||||
[% END %]
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Contact
|
||||
[% IF user_can_port_control %]
|
||||
<i class="icon-edit nd_edit-icon nd_device-details-edit"></i>
|
||||
[% END %]
|
||||
</td>
|
||||
[% IF user_can_port_control %]
|
||||
<td class="nd_editable-cell" contenteditable="true"
|
||||
data-field="contact" data-for-device="[% d.ip | html_entity %]">
|
||||
[% d.contact | html_entity %]
|
||||
</td>
|
||||
[% ELSE %]
|
||||
<td>[% d.contact | html_entity %]</td>
|
||||
[% END %]
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Vendor / Model</td>
|
||||
<td>
|
||||
<a rel="tooltip" data-placement="top" data-offset="5" data-title="Find Similar Devices"
|
||||
href="[% search_device %]&q=[% d.vendor | uri %]&vendor=[% d.vendor | uri %]">[% d.vendor | html_entity %]</a>
|
||||
/
|
||||
<a rel="tooltip" data-placement="top" data-offset="5" data-title="Find Similar Devices"
|
||||
href="[% search_device %]&q=[% d.model | uri %]&model=[% d.model | uri %]">[% d.model | html_entity %]</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>OS / Version</td>
|
||||
<td>[% d.os | html_entity %] /
|
||||
<a rel="tooltip" data-placement="top" data-offset="5"
|
||||
data-title="Find Similar Devices"
|
||||
href="[% search_device %]&q=[% d.os_ver | uri %]&os_ver=[% d.os_ver | uri %]">[% d.os_ver | html_entity %]</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Serial Number</td>
|
||||
<td>[% d.serial | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Description</td>
|
||||
<td>[% d.description | html_entity | html_line_break %]</td>
|
||||
</tr>
|
||||
[% IF settings._extra_device_details.size %]
|
||||
[% FOREACH config IN settings._extra_device_details %]
|
||||
<tr>
|
||||
<td>
|
||||
[% config.label %]
|
||||
</td>
|
||||
<td>
|
||||
[% TRY %]
|
||||
[% INCLUDE "plugin/${config.name}/device_details.tt" %]
|
||||
[% CATCH %]
|
||||
<!-- dummy content required by Template Toolkit TRY -->
|
||||
[% END %]
|
||||
</td>
|
||||
</tr>
|
||||
[% END %]
|
||||
[% END %]
|
||||
<tr>
|
||||
<td>Administration</td>
|
||||
<td>
|
||||
<a href="ssh://[% d.ip | uri %]" target="_blank">
|
||||
<span class="label label-info"><i class="icon-keyboard"></i> SSH</span></a>
|
||||
<a href="telnet://[% d.ip | uri %]" target="_blank">
|
||||
<span class="label label-info"><i class="icon-keyboard"></i> Telnet</span></a>
|
||||
<a href="https://[% d.ip | uri %]/" target="_blank">
|
||||
<span class="label label-info"><i class="icon-external-link"></i> Web</span></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SNMP Class</td>
|
||||
<td><a target="_blank" href="https://metacpan.org/pod/[% d.snmp_class | uri %]">[% d.snmp_class | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Uptime</td>
|
||||
<td>[% d.uptime_age | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Layers</td>
|
||||
<td>
|
||||
[% d.layers.substr(7,1) ? '<span class="badge badge-success">1</span>' : '<span class="badge"> </span>' %]
|
||||
[% d.layers.substr(6,1) ? '<span class="badge badge-success">2</span>' : '<span class="badge"> </span>' %]
|
||||
[% d.layers.substr(5,1) ? '<span class="badge badge-success">3</span>' : '<span class="badge"> </span>' %]
|
||||
[% d.layers.substr(4,1) ? '<span class="badge badge-success">4</span>' : '<span class="badge"> </span>' %]
|
||||
[% d.layers.substr(3,1) ? '<span class="badge badge-success">5</span>' : '<span class="badge"> </span>' %]
|
||||
[% d.layers.substr(2,1) ? '<span class="badge badge-success">6</span>' : '<span class="badge"> </span>' %]
|
||||
[% d.layers.substr(1,1) ? '<span class="badge badge-success">7</span>' : '<span class="badge"> </span>' %]
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Last Discover</td>
|
||||
<td>[% d.last_discover_stamp | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Last Arpnip</td>
|
||||
<td>[% d.last_arpnip_stamp | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Last Macsuck</td>
|
||||
<td>[% d.last_macsuck_stamp | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Hardware Status</td>
|
||||
<td>Fan: [% d.fan | html_entity %]
|
||||
<br/>PS1 [[% d.ps1_type | html_entity %]]: [% d.ps1_status | html_entity %]
|
||||
<br/>PS2 [[% d.ps2_type | html_entity %]]: [% d.ps2_status | html_entity %]</td>
|
||||
</tr>
|
||||
[% IF p.size %]
|
||||
<tr>
|
||||
<td>PoE Status</td>
|
||||
<td>
|
||||
[% FOREACH m IN p %]
|
||||
[% UNLESS m.module == 1 %]
|
||||
<br/>
|
||||
[% END %]
|
||||
Module [% m.module %]: [% m.status | html_entity %], [% m.poe_capable_ports %] power-capable ports, [% m.poe_powered_ports %] powered ([% m.poe_disabled_ports %] admin disabled, [% m.poe_errored_ports %] errors), [% m.poe_power_committed %]/[% m.power %] watts committed.
|
||||
[% END %]
|
||||
</td>
|
||||
</tr>
|
||||
[% END %]
|
||||
<tr>
|
||||
<td>MAC Address</td>
|
||||
<td>[% d.mac | html_entity %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>VTP Domain</td>
|
||||
<td>[% d.vtp_domain | html_entity %]</td>
|
||||
</tr>
|
||||
[% IF user_has_role('admin') %]
|
||||
<tr data-for-device="[% d.ip %]">
|
||||
<td>Admin Tasks</td>
|
||||
<td>
|
||||
<input type="hidden" data-form="discover" value="[% d.ip %]" name="device"/>
|
||||
<button class="btn btn-info btn-small nd_adminbutton" name="discover">Discover</button>
|
||||
<input type="hidden" data-form="arpnip" value="[% d.ip %]" name="device"/>
|
||||
<button class="btn btn-info btn-small nd_adminbutton" name="arpnip">Arpnip</button>
|
||||
<input type="hidden" data-form="macsuck" value="[% d.ip %]" name="device"/>
|
||||
<button class="btn btn-info btn-small nd_adminbutton" name="macsuck">Macsuck</button>
|
||||
<input type="hidden" data-form="nbtstat" value="[% d.ip %]" name="device"/>
|
||||
<button class="btn btn-info btn-small nd_adminbutton" name="nbtstat">NBTstat</button>
|
||||
|
||||
<button class="btn btn-danger btn-small pull-right"
|
||||
data-toggle="modal" data-target="#nd_devdel" type="button">Delete</button>
|
||||
|
||||
<div id="nd_devdel" class="nd_modal nd_deep-horizon modal hide fade" tabindex="-1"
|
||||
role="dialog" aria-labelledby="nd_devdel-label" aria-hidden="true">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
|
||||
<h3 id="nd_devdel-label">Confirm Delete: [% d.dns || d.ip | html_entity %]</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<blockquote>
|
||||
<ul>
|
||||
<li><p>This action is immediate and not reversible</p></li>
|
||||
<li><p>All associated Nodes may be removed from the database</p></li>
|
||||
</ul>
|
||||
</blockquote>
|
||||
<textarea id="nd_devdel-log" class="input-block-level" rows="2" data-form="delete"
|
||||
placeholder="Enter a log message" name="log"></textarea>
|
||||
<label class="checkbox">
|
||||
<input id="nd_devdel-archive" type="checkbox" data-form="delete" name="archive">
|
||||
<h4 class="nd_unbolden">Archive Nodes</h4>
|
||||
</label>
|
||||
<input type="hidden" data-form="delete" value="[% d.ip %]" name="device"/>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-success" data-dismiss="modal" aria-hidden="true">Cancel</button>
|
||||
<button class="btn btn-danger nd_adminbutton" name="delete" data-dismiss="modal">Confirm</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
[% END %]
|
||||
</tbody>
|
||||
</table>
|
||||
60
share/views/ajax/device/modules.tt
Normal file
60
share/views/ajax/device/modules.tt
Normal file
@@ -0,0 +1,60 @@
|
||||
[% BLOCK recurse -%]
|
||||
[% INCLUDE print_line item=item %]
|
||||
[% IF nodes.$item.children.defined -%]
|
||||
<ul>
|
||||
[% FOREACH kidtype IN nodes.$item.children.keys -%]
|
||||
[%- FOREACH kid IN nodes.$item.children.$kidtype -%]
|
||||
[%- IF kid -%]
|
||||
[% INCLUDE recurse item=kid %]
|
||||
[%- END -%]
|
||||
[%- END -%]
|
||||
[%- END -%]
|
||||
</ul>
|
||||
[% END -%]
|
||||
</li>
|
||||
[%- END -%]
|
||||
[% BLOCK print_line -%]
|
||||
<li>
|
||||
[% IF nodes.$item.children.defined -%]
|
||||
<span><i class="icon-minus-sign text-info"></i>
|
||||
[%- ELSE -%]
|
||||
<span><i class="icon-leaf"></i>
|
||||
[%- END -%]
|
||||
<a href="[% uri_for('/report/moduleinventory') %]?description=[% nodes.$item.module.description | uri %]">[% nodes.$item.module.description -%]</a>
|
||||
[%- IF nodes.$item.module.name -%]
|
||||
<a href="[% uri_for('/report/moduleinventory') %]?name=[% nodes.$item.module.name | uri %]">([% nodes.$item.module.name %])</a>
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.fw_ver -%]
|
||||
fw: [% nodes.$item.module.fw_ver %]
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.hw_ver -%]
|
||||
hw: [% nodes.$item.module.hw_ver %]
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.sw_ver -%]
|
||||
sw: [% nodes.$item.module.sw_ver %]
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.serial -%]
|
||||
<a href="[% uri_for('/report/moduleinventory') %]?serial=[% nodes.$item.module.serial | uri %]">[serial: [% nodes.$item.module.serial %]]</a>
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.type -%]
|
||||
/ <a href="[% uri_for('/report/moduleinventory') %]?type=[% nodes.$item.module.type | uri %]">[% nodes.$item.module.type %]</a>
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.model -%]
|
||||
/ <a href="[% uri_for('/report/moduleinventory') %]?model=[% nodes.$item.module.model | uri %]">[% nodes.$item.module.model %]</a>
|
||||
[%- END -%]
|
||||
[%- IF nodes.$item.module.fru -%]
|
||||
<b>[FRU]</b>
|
||||
[%- END -%]
|
||||
</span>
|
||||
[%- END -%]
|
||||
<div class="tree">
|
||||
<ul>
|
||||
[% FOREACH module IN nodes.root %]
|
||||
[% INCLUDE recurse item=module %]
|
||||
[%- END -%]
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
[%+ INCLUDE 'js/bootstrap-tree.js' -%]
|
||||
</script>
|
||||
187
share/views/ajax/device/netmap.tt
Normal file
187
share/views/ajax/device/netmap.tt
Normal file
@@ -0,0 +1,187 @@
|
||||
<script>
|
||||
|
||||
var winHeight = window.innerHeight;
|
||||
var winWidth = window.innerWidth;
|
||||
|
||||
// links in the initial tree drawing use this generator
|
||||
var treeLink = d3.svg.diagonal.radial()
|
||||
.projection(function(d) { return [d.y, d.x / 180 * Math.PI]; });
|
||||
|
||||
// actual device neighbor links use this generator
|
||||
var neighLink = d3.svg.diagonal.radial();
|
||||
|
||||
// store x,y for all circles on the map
|
||||
var loc = {};
|
||||
// store actual links between all nodes
|
||||
var neighbors_data = {};
|
||||
|
||||
// main SVG background, with support for pan/zoom
|
||||
var svg = d3.select("#netmap_pane").append("svg")
|
||||
.attr("width", winWidth - 50)
|
||||
.attr("height", winHeight - 100)
|
||||
.attr("pointer-events", "all")
|
||||
.append('g')
|
||||
.call(d3.behavior.zoom().on("zoom", redraw))
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + winHeight / 2 + "," + winHeight / 2 + ")");
|
||||
|
||||
// this is the image background
|
||||
// XXX there must be a way to discover the radial tree's size?
|
||||
svg.append('rect')
|
||||
.attr("x", (0 - (winHeight * 2)))
|
||||
.attr('width', "400%")
|
||||
.attr("y", (0 - (winHeight * 2)))
|
||||
.attr('height', "400%")
|
||||
.attr('fill', 'white');
|
||||
|
||||
// handle pan and zoom
|
||||
function redraw() {
|
||||
svg.attr("transform",
|
||||
"translate(" + d3.event.translate + ")"
|
||||
+ "scale(" + d3.event.scale + ")"
|
||||
+ "translate(" + (winHeight / 2) + "," + (winHeight / 2) + ")");
|
||||
}
|
||||
|
||||
// save the x,y of an element into the loc dictionary
|
||||
function recordLocation(d,i) {
|
||||
var rect = this.getBoundingClientRect();
|
||||
loc[d.name] = {
|
||||
'x': (rect.left + ((rect.right - rect.left) / 2))
|
||||
,'y': (rect.top + ((rect.bottom - rect.top) / 2))
|
||||
};
|
||||
}
|
||||
|
||||
// convert a device name to a valid CSS class name
|
||||
function to_class(name) { return 'nd_' + name.replace(/\./g, "_") }
|
||||
|
||||
// handler for clicking on a circle - redirect to that device's netmap
|
||||
function circleClick(d) {
|
||||
window.location = '[% uri_for('/device') %]?tab=netmap'
|
||||
+ '&q=' + d.fullname
|
||||
+ '&depth=[% params.depth | uri %]'
|
||||
+ '&vlan=[% params.vlan | uri %]';
|
||||
}
|
||||
|
||||
// handler for mouseover on a circle - show that device's real neighbors
|
||||
function circleOver(d) {
|
||||
$('.link').hide();
|
||||
$('path.' + to_class(d.name)).show();
|
||||
$(this).css('cursor', 'pointer');
|
||||
|
||||
$.each(neighbors_data[d.name], function(idx, target) {
|
||||
if (! (target in loc)) { return true }
|
||||
$('circle.' + to_class(target)).css('fill', '#e96cfa');
|
||||
});
|
||||
}
|
||||
|
||||
// handler for mouseout on a circle - hide real neighbours and show treeLinks
|
||||
function circleOut(d) {
|
||||
$.each(neighbors_data[d.name], function(idx, target) {
|
||||
if (! (target in loc)) { return true }
|
||||
$('circle.' + to_class(target)).css('fill', '#fff');
|
||||
});
|
||||
|
||||
$(this).css('cursor', 'auto');
|
||||
$('path.' + to_class(d.name)).hide();
|
||||
$('.link').show();
|
||||
}
|
||||
|
||||
// load all device connections into neighbors_data dictionary
|
||||
$.getJSON('[% uri_for('/ajax/data/device/alldevicelinks') %]', function(data) {
|
||||
neighbors_data = data;
|
||||
|
||||
// draw the tree
|
||||
d3.json("[% uri_for('/ajax/data/device/netmap') %]?"
|
||||
+ '&q=[% params.q | uri %]'
|
||||
+ '&depth=[% params.depth | uri %]'
|
||||
+ '&vlan=[% params.vlan | uri %]', function(error, root) {
|
||||
var tree = d3.layout.tree()
|
||||
// magic number "8" for scaling (network depth). seems to make things look right for me.
|
||||
.size([360, (winHeight / 8 * (root['scale'] || 0))])
|
||||
.separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });
|
||||
|
||||
var nodes = tree.nodes(root),
|
||||
links = tree.links(nodes);
|
||||
|
||||
var link = svg.selectAll(".link")
|
||||
.data(links)
|
||||
.enter().append("path")
|
||||
.attr("class", "link")
|
||||
.attr("d", treeLink);
|
||||
|
||||
var node = svg.selectAll(".node")
|
||||
.data(nodes)
|
||||
.enter().append("g")
|
||||
.attr("class", "node")
|
||||
.attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + d.y + ")"; });
|
||||
|
||||
// begin to draw...
|
||||
d3.select("#nd_waiting").remove();
|
||||
|
||||
node.append("circle")
|
||||
.attr("r", 4.5)
|
||||
// circle has class name of its device, so we can show/hide it
|
||||
.attr("class", function(d) { return to_class(d.name) })
|
||||
// store the x,y of every circle we've just drawn
|
||||
.each(recordLocation)
|
||||
// handlers for mouse interaction with the circles
|
||||
.on("click", circleClick)
|
||||
.on("mouseover", circleOver)
|
||||
.on("mouseout", circleOut);
|
||||
|
||||
node.append("text")
|
||||
.attr("dy", ".31em")
|
||||
.attr("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; })
|
||||
.attr("transform", function(d) { return d.x < 180 ? "translate(8)" : "rotate(180)translate(-8)"; })
|
||||
.text(function(d) { return d.name; });
|
||||
|
||||
// reorient text on the root node
|
||||
svg.select(".node")
|
||||
.attr("transform", function(d) {
|
||||
return d.x < 180 ? "rotate(0)translate(0)" : "rotate(180)translate(0)"; });
|
||||
|
||||
// key (name) of the root node in our locations store
|
||||
var rootname = svg.select(".node").data()[0].name;
|
||||
// reformatted neighbors_data for the real neighbor links
|
||||
var neighbors = [];
|
||||
|
||||
// need to build neighbors array only after we have built loc dictionary,
|
||||
// after drawing the circles and storing their x,y
|
||||
$.each(neighbors_data, function(key, val) {
|
||||
if (! (key in loc)) { return true }
|
||||
|
||||
$.each(val, function(idx, name) {
|
||||
if (! (name in loc)) { return true }
|
||||
|
||||
neighbors.push({
|
||||
'source': {
|
||||
'name': key
|
||||
,'x': loc[key]['x']
|
||||
,'y': loc[key]['y']
|
||||
}
|
||||
,'target': {
|
||||
'name': name
|
||||
,'x': loc[name]['x']
|
||||
,'y': loc[name]['y']
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// insert Netdisco neighbor links below circles but above tree links
|
||||
svg.selectAll(".neighbor")
|
||||
.data(neighbors)
|
||||
.enter().insert("path", ".node")
|
||||
// add class name of source device, so we can show/hide the link
|
||||
// (also "neighbor" class)
|
||||
.attr("class", function(d) { return ("neighbor " + to_class( d.source.name )) })
|
||||
.attr("d", neighLink)
|
||||
.attr("transform", "translate(-" + loc[rootname]['x'] + ",-" + loc[rootname]['y'] + ")");
|
||||
});
|
||||
|
||||
}); // jquery getJSON for all connections
|
||||
|
||||
// vim: ft=javascript
|
||||
</script>
|
||||
|
||||
<div id="nd_waiting" class="span2 alert"><i class="icon-spinner icon-spin"></i> Waiting for results...</div>
|
||||
427
share/views/ajax/device/ports.tt
Normal file
427
share/views/ajax/device/ports.tt
Normal file
@@ -0,0 +1,427 @@
|
||||
[% SET user_can_port_control = user_has_role('port_control') %]
|
||||
<table id="dp-data-table" class="table table-bordered table-striped" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
[% FOREACH item IN vars.port_columns %]
|
||||
[% NEXT IF item.name == 'c_admin' %]
|
||||
[% NEXT IF item.name == 'c_nodes' AND params.c_nodes AND params.c_neighbors %]
|
||||
[% NEXT UNLESS params.${item.name} %]
|
||||
[% SET th_class = '' %]
|
||||
[% IF (item.name == 'c_port' OR item.name == 'c_descr' OR item.name == 'c_name') %]
|
||||
[% th_class = ' class="portsort"' %]
|
||||
[% END %]
|
||||
<th[% th_class %]>
|
||||
[% item.label | html_entity %]
|
||||
</th>
|
||||
[% END %]
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
[% FOREACH row IN results %]
|
||||
<tr>
|
||||
<td class="nd_center-cell nd_devport-icon">
|
||||
[% IF row.up_admin != 'up' %]
|
||||
<i class="icon-remove"></i>
|
||||
[% ELSIF row.up == 'up' AND row.stp == 'blocking' AND row.vlan_count < 2 %]
|
||||
<i class="icon-fullscreen text-info"></i>
|
||||
[% ELSIF row.has_column_loaded('is_free') AND row.is_free %]
|
||||
<i class="icon-arrow-down text-success"></i>
|
||||
[% ELSIF row.up_admin == 'up' AND (row.up != 'up' AND row.up != 'dormant') %]
|
||||
<i class="icon-arrow-down text-error"></i>
|
||||
[% ELSE %]
|
||||
<i class="icon-angle-up text-success"></i>
|
||||
[% END %]
|
||||
[% IF row.slave_of %]<br/>
|
||||
[% IF row.get_column('agg_master_up_admin') != 'up' %]
|
||||
<small><i class="icon-group muted"></i></small>
|
||||
[% ELSIF row.get_column('agg_master_up') == 'up' %]
|
||||
<small><i class="icon-group text-success"></i></small>
|
||||
[% ELSE %]
|
||||
<small><i class="icon-group text-error"></i></small>
|
||||
[% END %]
|
||||
[% END %]
|
||||
</td>
|
||||
|
||||
[% FOREACH config IN settings._extra_device_port_cols %]
|
||||
[% NEXT UNLESS config.position == 'left' AND params.${config.name} %]
|
||||
<td>
|
||||
[% TRY %]
|
||||
[% INCLUDE "plugin/${config.name}/device_port_column.tt" %]
|
||||
[% CATCH %]
|
||||
<!-- dummy content required by Template Toolkit TRY -->
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_port %]
|
||||
[% IF user_can_port_control AND params.c_admin %]
|
||||
[% IF row.up_admin == 'up' %]
|
||||
<td nowrap class="nd_editable-cell" data-action="down"
|
||||
data-order="[% row.port | html_entity %]" data-filter="[% row.port | html_entity %]"
|
||||
data-field="c_port" data-for-device="[% device.ip | html_entity %]" data-for-port="[% row.port | html_entity %]">
|
||||
[% ELSE %]
|
||||
<td nowrap class="nd_editable-cell" data-action="up"
|
||||
data-order="[% row.port | html_entity %]" data-filter="[% row.port | html_entity %]"
|
||||
data-field="c_port" data-for-device="[% device.ip | html_entity %]" data-for-port="[% row.port | html_entity %]">
|
||||
[% END %]
|
||||
[% ELSE %]
|
||||
<td nowrap data-order="[% row.port | html_entity %]" data-filter="[% row.port | html_entity %]">
|
||||
[% END %]
|
||||
<a class="nd_log-icon"
|
||||
href="[% uri_for('/report/portlog') %]?q=[% device.ip | uri %]&f=[% row.port | uri %]">
|
||||
<i class="icon-file-text-alt"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="View Port Log"></i>
|
||||
</a>
|
||||
[% IF user_can_port_control AND params.c_admin %]
|
||||
[% IF row.up_admin == 'up' %]
|
||||
<span class="nd_hand-icon">
|
||||
<i class="icon-bullseye" data-action="bounce"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="Bounce Port"></i>
|
||||
<i class="icon-hand-down"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="Disable Port"></i>
|
||||
</span>
|
||||
[% ELSE %]
|
||||
<span class="nd_hand-icon">
|
||||
<i class="icon-bullseye" data-action="bounce" style="display: none"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="Bounce Port"></i>
|
||||
<i class="icon-hand-up"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="Enable Port"></i>
|
||||
</span>
|
||||
[% END %]
|
||||
[% END %]
|
||||
<a class="nd_this-port-only nd_port-only-first" href="[% uri_for('/device',
|
||||
self_options) %]&q=[% params.q | uri %]&f=[% row.port | uri %]&prefer=port">
|
||||
[% IF row.is_master %]
|
||||
<small><i class="icon-group muted"></i></small>
|
||||
[% END %]
|
||||
[% row.port | html_entity %]</a>
|
||||
[% IF row.slave_of %]<br/>
|
||||
<a class="nd_this-port-only" href="[% uri_for('/device',
|
||||
self_options) %]&q=[% params.q | uri %]&f=[% row.slave_of | uri %]&prefer=port">
|
||||
[% row.slave_of | html_entity %]</a>
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% FOREACH config IN settings._extra_device_port_cols %]
|
||||
[% NEXT UNLESS config.position == 'mid' AND params.${config.name} %]
|
||||
<td>
|
||||
[% TRY %]
|
||||
[% INCLUDE "plugin/${config.name}/device_port_column.tt" %]
|
||||
[% CATCH %]
|
||||
<!-- dummy content required by Template Toolkit TRY -->
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_descr %]
|
||||
<td nowrap>[% row.descr | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_comment %]
|
||||
<td nowrap>[% row.last_comment | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_type %]
|
||||
<td>[% row.type | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_duplex %]
|
||||
<td>
|
||||
[% IF row.up == 'up' AND row.duplex %]
|
||||
[% (row.duplex_admin.ucfirst || 'Auto') | html_entity %] / [% row.duplex.ucfirst | html_entity %]
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_lastchange %]
|
||||
<td>[% row.lastchange_stamp | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_name %]
|
||||
[% IF user_can_port_control AND params.c_admin %]
|
||||
<td nowrap class="nd_editable-cell" contenteditable="true"
|
||||
data-field="c_name" data-for-device="[% device.ip | html_entity %]" data-for-port="[% row.port | html_entity %]">
|
||||
<i class="icon-edit nd_edit-icon"></i>
|
||||
[% ELSE %]
|
||||
<td nowrap class="nd_editable-cell">
|
||||
[% END %]
|
||||
<div class="nd_editable-cell-content">
|
||||
[% row.name | html_entity %]
|
||||
</div>
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_speed %]
|
||||
<td>[% row.speed | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_mac %]
|
||||
<td>[% row.mac | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_mtu %]
|
||||
<td>[% row.mtu | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_pvid %]
|
||||
[% IF user_can_port_control AND params.c_admin %]
|
||||
<td class="nd_editable-cell" contenteditable="true" data-default="[% row.vlan | html_entity %]"
|
||||
data-field="c_pvid" data-for-device="[% device.ip | html_entity %]" data-for-port="[% row.port | html_entity %]">
|
||||
<i class="icon-edit nd_edit-icon"></i>
|
||||
<div class="nd_editable-cell-content">
|
||||
[% IF row.vlan %][% row.vlan | html_entity %][% END %]
|
||||
</div>
|
||||
</td>
|
||||
[% ELSE %]
|
||||
<td>
|
||||
<a class="nd_linkcell"
|
||||
href="[% uri_for('/search') %]?tab=vlan&q=[% row.vlan | uri %]">
|
||||
[% row.vlan | html_entity %]</a>
|
||||
</td>
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_vmember %]
|
||||
<td>
|
||||
[% IF vmember_ok %]
|
||||
[% IF row.vlan_count %]
|
||||
[% SET output = '' %]
|
||||
[% SET vlanlist = [] %]
|
||||
[% FOREACH vlan IN row.all_port_vlans %][% vlanlist.push(vlan.get_column('vlan')) %][% END %]
|
||||
[% FOREACH vlan IN vlanlist.nsort %]
|
||||
[% SET output = output _
|
||||
'<a href="' _ uri_for('/search') _ '?tab=vlan&q=' _ vlan _ '">' _ vlan _ '</a>' %]
|
||||
[% SET output = output _ ', ' IF NOT loop.last %]
|
||||
[% END %]
|
||||
[% IF row.vlan_count > 10 %] [%# TODO make this a settable variable %]
|
||||
[% SET output = '<div class="nd_vlan-total">(' _ row.vlan_count
|
||||
_ ')</div><span class="nd_linkcell nd_collapse-vlans">
|
||||
<div class="nd_arrow-up-down-left icon-chevron-up icon-large"></div>Show VLANs</span>
|
||||
<div class="nd_collapsing nd_collapse-pre-hidden">' _ output %]
|
||||
[% SET output = output _ '</div>' %]
|
||||
[% END %]
|
||||
[% output %]
|
||||
[% END %]
|
||||
[% ELSE %]
|
||||
<i class="icon-asterisk"></i> (too many to list)
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_power %]
|
||||
[% IF row.power %]
|
||||
[% IF row.power.admin == 'true' %]
|
||||
[% IF user_can_port_control AND params.c_admin %]
|
||||
<td nowrap data-action="false"
|
||||
data-field="c_power" data-for-device="[% device.ip | html_entity %]"
|
||||
data-for-port="[% row.port | html_entity %]">
|
||||
|
||||
<i class="icon-off nd_power-icon nd_power-on"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="Disable Power"></i>
|
||||
[% ELSE %]
|
||||
<td nowrap>
|
||||
<i class="icon-off nd_power-on"></i>
|
||||
[% END %]
|
||||
<span>
|
||||
[% IF row.power.power > 0 %]
|
||||
[% row.power.power | html_entity %] mW
|
||||
[% ELSE %]
|
||||
([% row.power.status | html_entity %])
|
||||
[% END %]
|
||||
</span>
|
||||
[% ELSE %]
|
||||
[% IF user_can_port_control AND params.c_admin %]
|
||||
<td nowrap data-action="true"
|
||||
data-field="c_power" data-for-device="[% device.ip | html_entity %]"
|
||||
data-for-port="[% row.port | html_entity %]">
|
||||
|
||||
<i class="icon-off nd_power-icon"
|
||||
rel="tooltip" data-placement="top" data-offset="3"
|
||||
data-animation="" data-title="Enable Power"></i>
|
||||
[% ELSE %]
|
||||
<td>
|
||||
<i class="icon-off"></i>
|
||||
[% END %]
|
||||
[% END %]
|
||||
</td>
|
||||
[% ELSE %]
|
||||
<td></td>
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_ssid %]
|
||||
<td>[% row.ssid.ssid | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_nodes OR params.c_neighbors %]
|
||||
<td>
|
||||
[% IF params.c_neighbors AND (row.remote_ip OR row.is_uplink) %]
|
||||
[% IF row.neighbor %]
|
||||
<i class="icon-link[% ' text-warning' IF row.manual_topo %]"></i>
|
||||
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
||||
<i class="icon-phone"></i>
|
||||
[% ELSIF row.remote_type AND row.remote_type.match('^AP:\s') %]
|
||||
<i class="icon-signal"></i>
|
||||
[% END %]
|
||||
<a href="[% uri_for('/device', self_options) %]&q=[% row.neighbor.ip | uri %]">
|
||||
[% row.neighbor.dns.remove(settings.domain_suffix) || row.neighbor.ip | html_entity %]</a>
|
||||
[% IF row.remote_port %]
|
||||
-
|
||||
<a href="[% uri_for('/device', self_options) %]&q=[% row.neighbor.ip | uri %]&f=[% row.remote_port | uri %]&prefer=port">
|
||||
[% row.remote_port | html_entity %]</a>
|
||||
[% END %]
|
||||
<br/>
|
||||
[% IF params.neigh_id and (row.remote_id or row.remote_type) %]
|
||||
([% 'id: '_ row.remote_id IF row.remote_id %]
|
||||
[% ' type: '_ row.remote_type IF row.remote_type %])<br/>
|
||||
[% END %]
|
||||
[% ELSIF row.remote_ip %]
|
||||
<i class="icon-unlink text-error"></i>
|
||||
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
||||
<i class="icon-phone"></i>
|
||||
[% ELSIF row.remote_type AND row.remote_type.match('^AP:\s') %]
|
||||
<i class="icon-signal"></i>
|
||||
[% END %]
|
||||
<a href="[% search_node %]&q=[% row.remote_ip | uri %]">
|
||||
[% row.remote_ip | html_entity %]
|
||||
[% ' - ' IF row.remote_port %][% row.remote_port | html_entity %]</a><br/>
|
||||
[% IF params.neigh_id and (row.remote_id or row.remote_type) %]
|
||||
([% 'id: '_ row.remote_id IF row.remote_id %]
|
||||
[% ' type: '_ row.remote_type IF row.remote_type %])<br/>
|
||||
[% END %]
|
||||
[% ELSE %]
|
||||
<i class="icon-unlink text-error"></i> (possible uplink)
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% IF params.c_nodes %]
|
||||
[% FOREACH node IN row.$nodes %]
|
||||
[% '<br/>' IF (row.remote_ip OR row.is_uplink) OR NOT loop.first %]
|
||||
[% '<i class="icon-book"></i> ' IF NOT node.active %]
|
||||
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
||||
<i class="icon-phone"></i>
|
||||
[% ELSIF node.wireless.defined
|
||||
OR (row.remote_type AND row.remote_type.match('^AP:\s')) %]
|
||||
<i class="icon-signal"></i>
|
||||
[% END %]
|
||||
<a href="[% search_node %]&q=[% node.net_mac.$mac_format_call | uri %]">
|
||||
[% node.net_mac.$mac_format_call | html_entity %]</a>
|
||||
[% IF (node.vlan > 0) && (node.vlan != row.vlan) %]
|
||||
(on vlan [% node.vlan | html_entity %])
|
||||
[% END %]
|
||||
[% IF params.n_ssid AND node.wireless.defined %]
|
||||
(SSID:
|
||||
[% FOREACH wlan IN node.wireless %]
|
||||
<a href="[%+ uri_for('/report/portssid') %]?ssid=[% wlan.ssid | uri %]">[% wlan.ssid | html_entity %]</a>
|
||||
[% END %]
|
||||
)
|
||||
[% END %]
|
||||
[% IF params.n_vendor AND node.oui.defined %]
|
||||
(Vendor:
|
||||
[% FOREACH oui IN node.oui %]
|
||||
<a href="[%+ uri_for('/report/nodevendor') %]?vendor=[% oui.abbrev | uri %]">[% oui.abbrev | html_entity %]</a>
|
||||
[% END %]
|
||||
)
|
||||
[% END %]
|
||||
[% ' (' _ node.time_last_age _ ')' IF params.n_age %]
|
||||
[% IF params.n_ip4 %]
|
||||
[% FOREACH ip IN node.ip4s %]
|
||||
<br/> [% '<i class="icon-book"></i> ' IF NOT ip.active %]
|
||||
[% SET dns = ip.dns %]
|
||||
[% IF dns %]
|
||||
<a href="[% search_node %]&q=[% ip.ip | uri %]">[% dns %] ([% ip.ip | html_entity %])</a>
|
||||
[% ELSE %]
|
||||
<a href="[% search_node %]&q=[% ip.ip | uri %]">[% ip.ip | html_entity %]</a>
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% IF params.n_ip6 %]
|
||||
[% FOREACH ip IN node.ip6s %]
|
||||
<br/> [% '<i class="icon-book"></i> ' IF NOT ip.active %]
|
||||
[% SET dns = ip.dns %]
|
||||
[% IF dns %]
|
||||
<a href="[% search_node %]&q=[% ip.ip | uri %]">[% dns %] ([% ip.ip | html_entity %])</a>
|
||||
[% ELSE %]
|
||||
<a href="[% search_node %]&q=[% ip.ip | uri %]">[% ip.ip | html_entity %]</a>
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% IF params.n_netbios %]
|
||||
[% FOREACH nbt IN node.netbios %]
|
||||
<br/> \\<a href="[% uri_for('/report/netbios') %]?domain=[% nbt.domain | uri %]" title="Nodes in this Domain">[% nbt.domain | html_entity %]</a>\<a href="[% search_node %]&q=[% nbt.nbname | uri %]">[% nbt.nbname | html_entity %]</a>
|
||||
<br/> [% nbt.nbuser || '[No User]' | html_entity %]@<a href="[% search_node %]&q=[% nbt.ip | uri %]">[% nbt.ip | html_entity %]</a>
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_stp %]
|
||||
<td>[% row.stp | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_up %]
|
||||
<td>
|
||||
[% row.up_admin.ucfirst | html_entity %] / [% row.up.ucfirst | html_entity %]
|
||||
</td>
|
||||
[% END %]
|
||||
|
||||
[% FOREACH config IN settings._extra_device_port_cols %]
|
||||
[% NEXT UNLESS config.position == 'right' AND params.${config.name} %]
|
||||
<td>
|
||||
[% TRY %]
|
||||
[% INCLUDE "plugin/${config.name}/device_port_column.tt" %]
|
||||
[% CATCH %]
|
||||
<!-- dummy content required by Template Toolkit TRY -->
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
</tr>
|
||||
[% END %]
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
[% IF user_can_port_control %]
|
||||
<div id="nd_portlog" class="nd_modal nd_deep-horizon modal hide fade" tabindex="-1"
|
||||
role="dialog" aria-hidden="true">
|
||||
<div class="modal-body">
|
||||
<blockquote>
|
||||
<ul><li><p>Please provide a reason for changing the Port Configuration</p></li></ul>
|
||||
</blockquote>
|
||||
<select id="nd_portlog-reason" class="input-block-level" name="reason">
|
||||
[% FOREACH pair IN settings.port_control_reasons.pairs %]
|
||||
<option[% ' selected="selected"' IF pair.key == 'other' %] value="[% pair.key | html_entity %]">
|
||||
[% pair.value | html_entity %]</option>
|
||||
[% END %]
|
||||
</select>
|
||||
<textarea id="nd_portlog-log" class="input-block-level" rows="2" name="log"
|
||||
placeholder="Enter a log message"></textarea>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
|
||||
<button id="nd_portlog-submit" class="btn btn-info" data-dismiss="modal">Continue</button>
|
||||
</div>
|
||||
</div>
|
||||
[% END %]
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#dp-data-table').dataTable({
|
||||
"columnDefs": [
|
||||
{ "sortable": false, "targets": 0 },
|
||||
{ "searchable": false, "targets": 0 },
|
||||
{ "type": 'portsort', "targets": [ 'portsort' ] }
|
||||
],
|
||||
"order": [[ 1, 'asc' ]],
|
||||
[% INCLUDE 'ajax/datatabledefaults.tt' -%]
|
||||
} );
|
||||
} );
|
||||
</script>
|
||||
228
share/views/ajax/device/ports_csv.tt
Normal file
228
share/views/ajax/device/ports_csv.tt
Normal file
@@ -0,0 +1,228 @@
|
||||
[% USE CSV -%]
|
||||
|
||||
[% SET headers = [] %]
|
||||
[% SET c_nodes_pos = -1 %]
|
||||
[% FOREACH item IN vars.port_columns %]
|
||||
[% NEXT IF item.name == 'c_admin' %]
|
||||
[% NEXT UNLESS params.${item.name} %]
|
||||
|
||||
[% IF item.name == 'c_nodes' %]
|
||||
[% SET c_nodes_pos = headers.size %]
|
||||
[% headers.push('Node MAC') %]
|
||||
[% headers.push('Archived Node') %]
|
||||
[% headers.push('Age Stamp') IF params.n_age %]
|
||||
[% headers.push('Node IP') IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% headers.push('Node DNS') IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% headers.push('Archived IP') IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% ELSIF item.name == 'c_duplex' %]
|
||||
[% headers.push('Duplex Setting') %]
|
||||
[% headers.push('Duplex') %]
|
||||
[% ELSIF item.name == 'c_power' %]
|
||||
[% headers.push('PoE Status') %]
|
||||
[% headers.push('PoE Power (mW)') %]
|
||||
[% ELSIF item.name == 'c_neighbors' %]
|
||||
[% headers.push('Neighbor IP') %]
|
||||
[% headers.push('Neighbor DNS') %]
|
||||
[% ELSIF item.name == 'c_up' %]
|
||||
[% headers.push('Port Setting') %]
|
||||
[% headers.push('Port Status') %]
|
||||
[% ELSE %]
|
||||
[% headers.push(item.label) %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% CSV.dump(headers) %]
|
||||
|
||||
[% FOREACH row IN results %]
|
||||
[% SET myport = [] %]
|
||||
|
||||
[% FOREACH config IN settings._extra_device_port_cols %]
|
||||
[% NEXT UNLESS config.position == 'left' AND params.${config.name} %]
|
||||
[% TRY %]
|
||||
[% PROCESS "plugin/${config.name}/device_port_column_csv.tt" %]
|
||||
[% CATCH %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_port %]
|
||||
[% myport.push(row.port) %]
|
||||
[% END %]
|
||||
|
||||
[% FOREACH config IN settings._extra_device_port_cols %]
|
||||
[% NEXT UNLESS config.position == 'mid' AND params.${config.name} %]
|
||||
[% TRY %]
|
||||
[% PROCESS "plugin/${config.name}/device_port_column_csv.tt" %]
|
||||
[% CATCH %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_descr %]
|
||||
[% myport.push(row.descr) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_comment %]
|
||||
[% myport.push(row.last_comment) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_type %]
|
||||
[% myport.push(row.type) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_duplex %]
|
||||
[% IF row.up == 'up' AND row.duplex %]
|
||||
[% myport.push( row.duplex_admin.ucfirst || 'Auto' ) %]
|
||||
[% myport.push( row.duplex.ucfirst ) %]
|
||||
[% ELSE %]
|
||||
[% myport.push('') %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_lastchange %]
|
||||
[% myport.push(row.lastchange_stamp) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_name %]
|
||||
[% myport.push(row.name) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_speed %]
|
||||
[% myport.push(row.speed) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_mac %]
|
||||
[% myport.push(row.mac) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_mtu %]
|
||||
[% myport.push(row.mtu) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_pvid %]
|
||||
[% myport.push(row.vlan) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_vmember %]
|
||||
[% IF row.vlan_count %]
|
||||
[% SET output = '' %]
|
||||
[% SET vlanlist = [] %]
|
||||
[% FOREACH vlan IN row.all_port_vlans %][% vlanlist.push(vlan.get_column('vlan')) %][% END %]
|
||||
[% FOREACH vlan IN vlanlist.nsort %]
|
||||
[% SET output = output _ ',' IF NOT loop.first %]
|
||||
[% SET output = output _ vlan %]
|
||||
[% END %]
|
||||
[% myport.push(output) %]
|
||||
[% ELSE %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_power %]
|
||||
[% IF row.power AND row.power.admin == 'true' %]
|
||||
[% myport.push( row.power.status ) %]
|
||||
[% myport.push( row.power.power || '0' ) %]
|
||||
[% ELSE %]
|
||||
[% myport.push('') %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_nodes %]
|
||||
[% myport.push('') %]
|
||||
[% myport.push('') %]
|
||||
[% myport.push('') IF params.n_age %]
|
||||
[% myport.push('') IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% myport.push('') IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% myport.push('') IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_neighbors %]
|
||||
[% IF (row.remote_ip OR row.is_uplink) %]
|
||||
[% IF row.neighbor %]
|
||||
[% myport.push( row.neighbor.ip ) %]
|
||||
[% myport.push( row.neighbor.dns.remove(settings.domain_suffix) ) %]
|
||||
[% ELSIF row.remote_ip AND row.remote_port %]
|
||||
[% myport.push( row.remote_ip ) %]
|
||||
[% myport.push('') %]
|
||||
[% ELSE %]
|
||||
[% myport.push('(possible uplink)') %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% ELSE %]
|
||||
[% myport.push('') %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_stp %]
|
||||
[% myport.push(row.stp) %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.c_up %]
|
||||
[% myport.push( row.up_admin.ucfirst ) %]
|
||||
[% myport.push( row.up.ucfirst ) %]
|
||||
[% END %]
|
||||
|
||||
[% FOREACH config IN settings._extra_device_port_cols %]
|
||||
[% NEXT UNLESS config.position == 'right' AND params.${config.name} %]
|
||||
[% TRY %]
|
||||
[% PROCESS "plugin/${config.name}/device_port_column_csv.tt" %]
|
||||
[% CATCH %]
|
||||
[% myport.push('') %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% SET has_nodes = 0 %]
|
||||
[% IF params.c_nodes %]
|
||||
[% FOREACH node IN row.$nodes %]
|
||||
[% SET has_nodes = 1 %]
|
||||
[% SET mynode = [] %]
|
||||
|
||||
[% CALL mynode.push(node.net_mac.$mac_format_call) %]
|
||||
[% CALL mynode.push((node.active ? 'No' : 'Yes')) %]
|
||||
|
||||
[% CALL mynode.push(node.time_last_age) IF params.n_age %]
|
||||
|
||||
[% IF params.n_ip4 OR params.n_ip6 %]
|
||||
[% mynode.push('') %]
|
||||
[% mynode.push('') %]
|
||||
[% mynode.push('') %]
|
||||
[% SET has_ips = 0 %]
|
||||
|
||||
[% IF params.n_ip4 %]
|
||||
[% FOREACH ip IN node.ip4s %]
|
||||
[% SET has_ips = 1 %]
|
||||
|
||||
[% CALL mynode.splice(-3, 1, ip.ip) %]
|
||||
[% CALL mynode.splice(-2, 1, ip.dns) %]
|
||||
[% CALL mynode.splice(-1, 1, (ip.active ? 'No' : 'Yes')) %]
|
||||
|
||||
[% CALL myport.splice(c_nodes_pos, mynode.size, mynode) %]
|
||||
[% CSV.dump(myport) %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% IF params.n_ip6 %]
|
||||
[% FOREACH ip IN node.ip6s %]
|
||||
[% SET has_ips = 1 %]
|
||||
|
||||
[% CALL mynode.splice(-3, 1, ip.ip) %]
|
||||
[% CALL mynode.splice(-2, 1, ip.dns) %]
|
||||
[% CALL mynode.splice(-1, 1, (ip.active ? 'No' : 'Yes')) %]
|
||||
|
||||
[% CALL myport.splice(c_nodes_pos, mynode.size, mynode) %]
|
||||
[% CSV.dump(myport) %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% CSV.dump(myport) IF NOT has_ips %]
|
||||
[% ELSE %]
|
||||
[% CALL myport.splice(c_nodes_pos, mynode.size, mynode) %]
|
||||
[% CSV.dump(myport) %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% CSV.dump(myport) IF NOT has_nodes %]
|
||||
[% END %]
|
||||
Reference in New Issue
Block a user