Merge branch 'og-work'
This commit is contained in:
@@ -1,17 +1,25 @@
|
||||
2.007000_002 -
|
||||
|
||||
* NOTE this version requires SNMP::Info 3.x
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Finally we have a discover/refresh daemon job :)
|
||||
* Also... a Scheduler which removes need for crontab installation
|
||||
* The netdisco-do script can run a one-off discover for a device
|
||||
* Can select MAC Address display format on Node and Device Port search
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* SNMP connection now uses cached info if available
|
||||
* Better handling of MIBs home location in deploy script
|
||||
* Port filter in device port display is now highlighted green
|
||||
* Navbar search is fuzzier
|
||||
* Phone node icon is a little phone handset
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Rename plugins developer doc to .pod
|
||||
* Update to latest Bootstrap and JQuery, and temp. fix #7326 in Bootstrap
|
||||
* Partial Name in Port search now working
|
||||
|
||||
2.007000_001 - 2013-03-17
|
||||
|
||||
|
||||
@@ -4,38 +4,38 @@ name 'App-Netdisco';
|
||||
license 'bsd';
|
||||
all_from 'lib/App/Netdisco.pm';
|
||||
|
||||
requires 'Algorithm::Cron' => 0;
|
||||
requires 'App::cpanminus' => 0;
|
||||
requires 'App::local::lib::helper' => 0;
|
||||
requires 'Algorithm::Cron' => 0.07;
|
||||
requires 'App::cpanminus' => 1.6108;
|
||||
requires 'App::local::lib::helper' => 0.07;
|
||||
requires 'DBD::Pg' => 0;
|
||||
requires 'DBD::SQLite' => 0;
|
||||
requires 'DBIx::Class' => 0;
|
||||
requires 'DBIx::Class::Helper::Row::SubClass' => 0;
|
||||
requires 'Daemon::Control' => 0;
|
||||
requires 'Dancer' => 1.3098;
|
||||
requires 'Dancer::Plugin::DBIC' => 0;
|
||||
requires 'File::ShareDir' => 0;
|
||||
requires 'HTML::Entities' => 0;
|
||||
requires 'HTTP::Tiny' => 0;
|
||||
requires 'DBD::SQLite' => 1.37;
|
||||
requires 'DBIx::Class' => 0.08210;
|
||||
requires 'DBIx::Class::Helpers' => 2.016006;
|
||||
requires 'Daemon::Control' => 0.001000;
|
||||
requires 'Dancer' => 1.3112;
|
||||
requires 'Dancer::Plugin::DBIC' => 0.1802;
|
||||
requires 'File::ShareDir' => 1.03;
|
||||
requires 'HTML::Parser' => 3.70;
|
||||
requires 'HTTP::Tiny' => 0.029;
|
||||
requires 'JSON' => 0;
|
||||
requires 'List::MoreUtils' => 0;
|
||||
requires 'Moo' => 0;
|
||||
requires 'MCE' => 1.405;
|
||||
requires 'Net::DNS' => 0;
|
||||
requires 'Net::MAC' => 0;
|
||||
requires 'NetAddr::IP' => '4.059';
|
||||
requires 'Path::Class' => 0;
|
||||
requires 'Plack' => 1.0006;
|
||||
requires 'Plack::Middleware::Expires' => 0;
|
||||
requires 'Role::Tiny' => 0;
|
||||
requires 'Socket6' => 0;
|
||||
requires 'Starman' => 0;
|
||||
requires 'SNMP::Info' => '3.01';
|
||||
requires 'SQL::Translator' => 0;
|
||||
requires 'Template' => 0;
|
||||
requires 'YAML' => 0;
|
||||
requires 'namespace::clean' => 0;
|
||||
requires 'version' => 0.9901;
|
||||
requires 'List::MoreUtils' => 0.33;
|
||||
requires 'Moo' => 1.001000;
|
||||
requires 'MCE' => 1.408;
|
||||
requires 'Net::DNS' => 0.72;
|
||||
requires 'Net::MAC' => 2.103622;
|
||||
requires 'NetAddr::IP' => 4.068;
|
||||
requires 'Path::Class' => 0.32;
|
||||
requires 'Plack' => 1.0023;
|
||||
requires 'Plack::Middleware::Expires' => 0.03;
|
||||
requires 'Role::Tiny' => 1.002005;
|
||||
requires 'Socket6' => 0.23;
|
||||
requires 'Starman' => 0.3008;
|
||||
requires 'SNMP::Info' => 3.01;
|
||||
requires 'SQL::Translator' => 0.11016;
|
||||
requires 'Template::Toolkit' => 2.24;
|
||||
requires 'YAML' => 0.84;
|
||||
requires 'namespace::clean' => 0.24;
|
||||
requires 'version' => 0.9902;
|
||||
|
||||
install_share 'share';
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ use Term::UI;
|
||||
use Term::ReadLine;
|
||||
|
||||
use Archive::Extract;
|
||||
$Archive::Extract::PREFER_BIN = 1;
|
||||
use HTTP::Tiny;
|
||||
use Try::Tiny;
|
||||
|
||||
@@ -96,15 +97,27 @@ deploy_db() if $bool;
|
||||
|
||||
say '';
|
||||
$bool = $term->ask_yn(
|
||||
prompt => 'Would you like to download and update vendor MAC prefixes (OUI data)?', default => 'n',
|
||||
prompt => 'Download and update vendor MAC prefixes (OUI data)?', default => 'n',
|
||||
);
|
||||
deploy_oui() if $bool;
|
||||
|
||||
say '';
|
||||
$bool = $term->ask_yn(
|
||||
prompt => 'Would you like to download and update MIB files?', default => 'n',
|
||||
);
|
||||
deploy_mibs() if $bool;
|
||||
my $default_mibhome = dir($home, 'netdisco-mibs');
|
||||
if (setting('mibhome') and setting('mibhome') ne $default_mibhome) {
|
||||
my $mibhome = $term->get_reply(
|
||||
print_me => "MIB home options:",
|
||||
prompt => "Download and update MIB files to...?",
|
||||
choices => [setting('mibhome'), $default_mibhome, 'Skip this.'],
|
||||
default => 'Skip this.',
|
||||
);
|
||||
deploy_mibs($mibhome) if $mibhome and $mibhome ne 'Skip this.';
|
||||
}
|
||||
else {
|
||||
$bool = $term->ask_yn(
|
||||
prompt => "Download and update MIB files?", default => 'n',
|
||||
);
|
||||
deploy_mibs($default_mibhome) if $bool;
|
||||
}
|
||||
|
||||
sub deploy_db {
|
||||
system 'netdisco-db-deploy';
|
||||
@@ -142,13 +155,15 @@ sub deploy_oui {
|
||||
}
|
||||
|
||||
sub deploy_mibs {
|
||||
my $mibhome = dir(shift);
|
||||
|
||||
my $url = 'http://downloads.sourceforge.net/project/netdisco/netdisco-mibs/latest-snapshot/netdisco-mibs-snapshot.tar.gz';
|
||||
my $file = file($home, 'netdisco-mibs-snapshot.tar.gz');
|
||||
my $resp = HTTP::Tiny->new->mirror($url, $file);
|
||||
|
||||
if ($resp->{success}) {
|
||||
my $ae = Archive::Extract->new(archive => $file, type => 'tgz');
|
||||
$ae->extract(to => $home);
|
||||
$ae->extract(to => $mibhome->parent->stringify);
|
||||
unlink $file;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ package App::Netdisco::DB::Result::Node;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Net::MAC;
|
||||
|
||||
use base 'DBIx::Class::Core';
|
||||
__PACKAGE__->table("node");
|
||||
__PACKAGE__->add_columns(
|
||||
@@ -134,4 +136,12 @@ between the date stamp and time stamp. That is:
|
||||
|
||||
sub time_last_stamp { return (shift)->get_column('time_last_stamp') }
|
||||
|
||||
=head2 net_mac
|
||||
|
||||
Returns the C<mac> column instantiated into a L<Net::MAC> object.
|
||||
|
||||
=cut
|
||||
|
||||
sub net_mac { return Net::MAC->new(mac => (shift)->mac) }
|
||||
|
||||
1;
|
||||
|
||||
@@ -7,6 +7,8 @@ package App::Netdisco::DB::Result::NodeIp;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Net::MAC;
|
||||
|
||||
use base 'DBIx::Class::Core';
|
||||
__PACKAGE__->table("node_ip");
|
||||
__PACKAGE__->add_columns(
|
||||
@@ -206,4 +208,12 @@ between the date stamp and time stamp. That is:
|
||||
|
||||
sub time_last_stamp { return (shift)->get_column('time_last_stamp') }
|
||||
|
||||
=head2 net_mac
|
||||
|
||||
Returns the C<mac> column instantiated into a L<Net::MAC> object.
|
||||
|
||||
=cut
|
||||
|
||||
sub net_mac { return Net::MAC->new(mac => (shift)->mac) }
|
||||
|
||||
1;
|
||||
|
||||
@@ -147,7 +147,8 @@ sub _try_connect {
|
||||
}
|
||||
|
||||
sub _build_mibdirs {
|
||||
return map { dir(setting('mibhome'), $_) }
|
||||
my $home = (setting('mibhome') || $ENV{NETDISCO_HOME} || $ENV{HOME});
|
||||
return map { dir($home, $_) }
|
||||
@{ setting('mibdirs') || [] };
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ hook 'before' => sub {
|
||||
if (not param('tab') or param('tab') ne 'ports') {
|
||||
params->{'age_num'} = 3;
|
||||
params->{'age_unit'} = 'months';
|
||||
params->{'mac_format'} = 'IEEE';
|
||||
}
|
||||
};
|
||||
|
||||
@@ -62,8 +63,13 @@ hook 'before_template' => sub {
|
||||
tab => 'ports',
|
||||
age_num => 3,
|
||||
age_unit => 'months',
|
||||
mac_format => 'IEEE',
|
||||
});
|
||||
|
||||
# for Net::MAC method
|
||||
$tokens->{mac_format_call} = 'as_'. params->{'mac_format'}
|
||||
if params->{'mac_format'};
|
||||
|
||||
foreach my $col (@{ var('port_columns') }) {
|
||||
next unless $col->{default} eq 'on';
|
||||
$tokens->{device_ports}->query_param($col->{name}, 'checked');
|
||||
|
||||
@@ -75,7 +75,7 @@ get '/search' => sub {
|
||||
params->{'tab'} = 'vlan';
|
||||
}
|
||||
else {
|
||||
my $nd = $s->resultset('Device')->search_aliases($q);
|
||||
my $nd = $s->resultset('Device')->search_fuzzy($q);
|
||||
|
||||
if ($nd and $nd->count) {
|
||||
if ($nd->count == 1) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
# Web app env-related settings should go to environments/$env.yml
|
||||
|
||||
# Your application's name
|
||||
# application's name
|
||||
appname: "Netdisco"
|
||||
|
||||
# The default web layout to use for your application (located in
|
||||
@@ -33,7 +33,7 @@ engines:
|
||||
end_tag: '%]'
|
||||
PRE_CHOMP: 1
|
||||
|
||||
# netdisco stuff (can be overidden in the environment .yml)
|
||||
# Netdisco stuff (can be overidden in the environment .yml)
|
||||
|
||||
web_plugins:
|
||||
- Inventory
|
||||
@@ -55,7 +55,12 @@ snmpver: 2
|
||||
snmpretries: 2
|
||||
snmptimeout: 1000000
|
||||
|
||||
mibhome: /usr/share/netdisco/mibs
|
||||
# If unset, Netdisco uses "NETDISCO_HOME/netdisco-mibs", assuming you're
|
||||
# using the netdisco-deploy script to download MIBs there. Otherwise, set
|
||||
# this, for example:
|
||||
#
|
||||
# mibhome: /usr/share/netdisco/mibs
|
||||
|
||||
mibdirs:
|
||||
- cisco
|
||||
- rfc
|
||||
|
||||
@@ -37,7 +37,6 @@ plugins:
|
||||
|
||||
# local settings for Netdisco poller and port changes
|
||||
|
||||
mibhome: '/home/netdisco/netdisco-mibs'
|
||||
mibdirs:
|
||||
- cisco
|
||||
- rfc
|
||||
|
||||
@@ -39,7 +39,6 @@ no_auth: 1
|
||||
|
||||
# local settings for Netdisco poller and port changes
|
||||
|
||||
mibhome: '/home/netdisco/netdisco-mibs'
|
||||
mibdirs:
|
||||
- cisco
|
||||
- rfc
|
||||
|
||||
@@ -252,6 +252,19 @@ td {
|
||||
width: 95px;
|
||||
}
|
||||
|
||||
/* set the MAC format drop-down width */
|
||||
#nd_mac_format {
|
||||
margin-top: 4px;
|
||||
width: 154px;
|
||||
}
|
||||
|
||||
/* set the MAC format drop-down width */
|
||||
#nd_node_mac_format {
|
||||
margin-left: -2px;
|
||||
margin-top: 4px;
|
||||
width: 165px;
|
||||
}
|
||||
|
||||
/* sidebar submit button width and spacing from Node Props */
|
||||
.sidebar button {
|
||||
margin-top: 9px;
|
||||
@@ -266,13 +279,28 @@ td {
|
||||
/* little icon inside of search input fields */
|
||||
.field_clear_icon, .field_copy_icon {
|
||||
position: absolute;
|
||||
margin-left: 132px;
|
||||
margin-left: 140px;
|
||||
margin-top: 5px;
|
||||
z-index: 1;
|
||||
padding: 7px;
|
||||
padding: 0px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.field_copy_icon {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.field_clear_icon {
|
||||
background-color: #A9DBA9;
|
||||
color: #3A87AD;
|
||||
}
|
||||
|
||||
/* for the ports form, but the positioning is slightly different */
|
||||
#ports_form .field_clear_icon {
|
||||
margin-left: 149px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
/* change highlighting for form fields which are being used in a search */
|
||||
form .clearfix.success select {
|
||||
background-color: #A9DBA9;
|
||||
@@ -294,6 +322,11 @@ form .clearfix.success input {
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.inputs-list i {
|
||||
margin-right: 5px;
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
||||
/* nudge content closer to the header labels in the sidebar */
|
||||
.inputs-list li:first-child {
|
||||
padding-top: 3px !important;
|
||||
|
||||
@@ -135,7 +135,41 @@ if (window.History && window.History.enabled) {
|
||||
});
|
||||
}
|
||||
|
||||
// if any field in Search Options has content, highlight in green
|
||||
function device_form_state(e) {
|
||||
if (e.prop('value') != "") {
|
||||
e.parent(".clearfix").addClass('success');
|
||||
|
||||
if (e.parents('#device_form').length) {
|
||||
$('#nq').css('text-decoration', 'line-through');
|
||||
|
||||
if (e.attr('type') == 'text') {
|
||||
$('.field_copy_icon').hide();
|
||||
}
|
||||
}
|
||||
|
||||
var id = '#' + e.attr('name') + '_clear_btn';
|
||||
$(id).show();
|
||||
}
|
||||
else {
|
||||
e.parent(".clearfix").removeClass('success');
|
||||
var id = '#' + e.attr('name') + '_clear_btn';
|
||||
$(id).hide();
|
||||
|
||||
var num_empty = $.grep(form_inputs,
|
||||
function(n,i) {return($(n).val() != "")}).length;
|
||||
if (num_empty === 3) {
|
||||
$('#nq').css('text-decoration', 'none');
|
||||
$('.field_copy_icon').show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// sidebar form fields should change colour and have bin/copy icon
|
||||
$('.field_copy_icon').hide();
|
||||
$('.field_clear_icon').hide();
|
||||
|
||||
// activate typeahead on the main search box, for device names only
|
||||
$('#nq').typeahead({
|
||||
source: function (query, process) {
|
||||
|
||||
@@ -196,7 +196,8 @@
|
||||
[% FOREACH node IN row.$nodes %]
|
||||
[% '<br/>' IF row.remote_ip OR NOT loop.first %]
|
||||
[% '<span class="label label-warning">A</span> ' IF NOT node.active %]
|
||||
<a href="[% search_node %]&q=[% node.mac | uri %]">[% node.mac | html_entity %]</a>
|
||||
<a href="[% search_node %]&q=[% node.net_mac.$mac_format_call | uri %]">
|
||||
[% node.net_mac.$mac_format_call | html_entity %]</a>
|
||||
[% ' (' _ node.time_last_age _ ')' IF params.n_age %]
|
||||
[% IF params.n_ip %]
|
||||
[% FOREACH ip IN node.ips %]
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
[% WHILE (row = macs.next) %]
|
||||
<tr>
|
||||
<td><a class="nd_linkcell"
|
||||
href="[% search_node %]&q=[% row.mac | uri %]">[% row.mac | html_entity %]</a></td>
|
||||
href="[% search_node %]&q=[% row.net_mac.$mac_format_call | uri %]">
|
||||
[% row.net_mac.$mac_format_call | html_entity %]</a></td>
|
||||
[% IF params.vendor %]
|
||||
<td>[% row.oui.company | html_entity %]</td>
|
||||
[% END %]
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
<td>
|
||||
[% IF first_row %]
|
||||
<a class="nd_linkcell"
|
||||
href="[% search_node %]&q=[% row.mac | uri %]">[% row.mac | html_entity %]</a>
|
||||
href="[% search_node %]&q=[% row.net_mac.$mac_format_call | uri %]">
|
||||
[% row.net_mac.$mac_format_call | html_entity %]</a>
|
||||
[% ELSE %]
|
||||
|
||||
[% END %]
|
||||
@@ -51,7 +52,8 @@
|
||||
<td>
|
||||
[% IF first_row %]
|
||||
<a class="nd_linkcell"
|
||||
href="[% search_node %]&q=[% node.mac | uri %]">[% node.mac | html_entity %]</a>
|
||||
href="[% search_node %]&q=[% node.net_mac.$mac_format_call | uri %]">
|
||||
[% node.net_mac.$mac_format_call | html_entity %]</a>
|
||||
[% ELSE %]
|
||||
|
||||
[% END %]
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
// ajax content is loaded
|
||||
var path = 'device';
|
||||
|
||||
// fields in the Device Search Options form (Device tab)
|
||||
var form_inputs = $("#ports_form .clearfix input").not('[type="checkbox"]')
|
||||
.add("#ports_form .clearfix select");
|
||||
|
||||
function inner_view_processing(tab) {
|
||||
// LT wanted the page title to reflect what's on the page :)
|
||||
document.title = $('#nd_device_name').text()
|
||||
@@ -95,6 +99,10 @@
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// sidebar form fields should change colour and have bin/copy icon
|
||||
form_inputs.each(function() {device_form_state($(this))});
|
||||
form_inputs.change(function() {device_form_state($(this))});
|
||||
|
||||
// sidebar collapser events trigger change of up/down arrow
|
||||
$('.collapse').on('show', function() {
|
||||
$(this).siblings().find('.arrow-up-down')
|
||||
@@ -106,28 +114,12 @@
|
||||
.toggleClass('icon-chevron-up icon-chevron-down');
|
||||
});
|
||||
|
||||
// show or hide sweeping brush icon when field has content
|
||||
var sweep = $('#ports_form').find("input[name=f]");
|
||||
|
||||
if (sweep.val() === "") {
|
||||
$('.field_clear_icon').hide();
|
||||
} else {
|
||||
$('.field_clear_icon').show();
|
||||
}
|
||||
|
||||
sweep.change(function() {
|
||||
if ($(this).val() === "") {
|
||||
$('.field_clear_icon').hide();
|
||||
} else {
|
||||
$('.field_clear_icon').show();
|
||||
}
|
||||
});
|
||||
|
||||
// handler for sweeping brush icon in port filter box
|
||||
// handler for bin icon in port filter box
|
||||
var portfilter = $('#ports_form').find("input[name=f]");
|
||||
$('.field_clear_icon').click(function() {
|
||||
sweep.val('');
|
||||
$('.field_clear_icon').hide();
|
||||
portfilter.val('');
|
||||
$('#ports_form').trigger('submit');
|
||||
device_form_state(portfilter); // will hide copy icons
|
||||
});
|
||||
|
||||
// clickable device port names can simply resubmit AJAX rather than
|
||||
@@ -137,9 +129,10 @@
|
||||
|
||||
var port = $(this).text();
|
||||
port = $.trim(port);
|
||||
sweep.val(port);
|
||||
portfilter.val(port);
|
||||
|
||||
$('.field_clear_icon').show();
|
||||
$('#ports_form').trigger('submit');
|
||||
device_form_state(portfilter); // will hide copy icons
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,54 +3,20 @@
|
||||
var path = 'search';
|
||||
|
||||
// fields in the Device Search Options form (Device tab)
|
||||
var d_inputs = $("#device_form .clearfix input").not('[type="checkbox"]')
|
||||
var form_inputs = $("#device_form .clearfix input").not('[type="checkbox"]')
|
||||
.add("#device_form .clearfix select");
|
||||
|
||||
// if any field in Device Search Options has content, highlight in green
|
||||
// and strikethrough the navbar search
|
||||
function device_form_state(e) {
|
||||
if (e.is('[value!=""]')) {
|
||||
if (e.attr('type') == 'text') {
|
||||
$('.field_copy_icon').hide();
|
||||
}
|
||||
|
||||
e.parent(".clearfix").addClass('success');
|
||||
$('#nq').css('text-decoration', 'line-through');
|
||||
|
||||
var id = '#' + e.attr('name') + '_clear_btn';
|
||||
$(id).show();
|
||||
}
|
||||
else {
|
||||
e.parent(".clearfix").removeClass('success');
|
||||
var id = '#' + e.attr('name') + '_clear_btn';
|
||||
$(id).hide();
|
||||
|
||||
if (! d_inputs.is('[value!=""]') ) {
|
||||
$('#nq').css('text-decoration', 'none');
|
||||
$('.field_copy_icon').show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// this is called by do_search to support local code
|
||||
// here, when tab changes need to strike/unstrike the navbar search
|
||||
function inner_view_processing(tab) {
|
||||
if (tab == 'device') {
|
||||
d_inputs.each(function() {device_form_state($(this))});
|
||||
}
|
||||
else {
|
||||
$('#nq').css('text-decoration', 'none');
|
||||
}
|
||||
}
|
||||
|
||||
// on load, check initial Device Search Options form state,
|
||||
// and on each change to the form fields
|
||||
$(document).ready(function() {
|
||||
$('.field_copy_icon').hide();
|
||||
$('.field_clear_icon').hide();
|
||||
|
||||
d_inputs.each(function() {device_form_state($(this))});
|
||||
d_inputs.change(function() {device_form_state($(this))});
|
||||
// sidebar form fields should change colour and have bin/copy icon
|
||||
form_inputs.each(function() {device_form_state($(this))});
|
||||
form_inputs.change(function() {device_form_state($(this))});
|
||||
|
||||
// handler for copy icon in search option
|
||||
$('.field_copy_icon').click(function() {
|
||||
@@ -65,6 +31,6 @@
|
||||
var name = $(this).data('btn-for');
|
||||
var input = $('#device_form [name=' + name + ']');
|
||||
input.val('');
|
||||
device_form_state(input);
|
||||
device_form_state(input); // will hide copy icons
|
||||
});
|
||||
});
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
<![endif]-->
|
||||
|
||||
<script type="text/javascript" src="[% uri_base %]/javascripts/jquery-latest.min.js"></script>
|
||||
<!-- <script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.1.1.js"></script> -->
|
||||
<script type="text/javascript" src="[% uri_base %]/javascripts/jquery-history.js"></script>
|
||||
<script type="text/javascript" src="[% uri_base %]/javascripts/jquery-deserialize.js"></script>
|
||||
<script type="text/javascript" src="[% uri_base %]/javascripts/bootstrap.min.js"></script>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
<input name="q" value="[% params.q | html_entity %]" type="hidden"/>
|
||||
<div class="clearfix">
|
||||
<a class="field_clear_icon" href="#"
|
||||
rel="tooltip" data-placement="top" data-offset="3" data-title="Show all Ports">
|
||||
<img src="[% uri_base %]/images/tango_sweep.png"/></a>
|
||||
<i class="field_clear_icon icon-trash icon-large"
|
||||
rel="tooltip" data-placement="bottom" data-offset="3" data-title="Show all Ports"
|
||||
id="f_clear_btn" data-btn-for="port"></i>
|
||||
<input id="nd_port_query" placeholder="Port, Name or VLAN"
|
||||
name="f" value="[% params.f | html_entity %]" type="text"
|
||||
rel="tooltip" data-placement="left" data-offset="5" data-title="Filter by Port, Name or VLAN"/>
|
||||
@@ -28,7 +28,7 @@
|
||||
<span class="label label-info">B</span> Blocking
|
||||
</li>
|
||||
<li>
|
||||
<span class="label">P</span> IP Phone
|
||||
<i class="icon-phone icon-large"></i> IP Phone
|
||||
</li>
|
||||
<li>
|
||||
<span class="label label-important">N</span> Neighbor Inacessible
|
||||
@@ -76,15 +76,7 @@
|
||||
<div id="nd_portprops" class="collapse">
|
||||
<ul class="inputs-list unstyled">
|
||||
<li>
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" id="free"
|
||||
name="free"[% ' checked="checked"' IF params.free %]/>
|
||||
Only Show Free Ports
|
||||
</label>
|
||||
</li>
|
||||
<li>
|
||||
<span rel="tooltip" data-placement="left"
|
||||
data-offset="5" data-title="Free if Down for this period of time">
|
||||
<em>Mark as Free if Down for:</em><br/>
|
||||
<select id="nd_days_select" name="age_num">
|
||||
[% FOREACH count IN [1..32] %]
|
||||
<option[% ' selected="selected"' IF params.age_num == count %]>[% count %]</option>
|
||||
@@ -95,7 +87,13 @@
|
||||
<option[% ' selected="selected"' IF params.age_unit == unit %]>[% unit %]</option>
|
||||
[% END %]
|
||||
</select>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" id="free"
|
||||
name="free"[% ' checked="checked"' IF params.free %]/>
|
||||
Only show Free Ports
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -107,6 +105,14 @@
|
||||
</label></span>
|
||||
<div id="nd_nodeprops" class="collapse">
|
||||
<ul class="inputs-list unstyled">
|
||||
<li>
|
||||
<em>MAC address format:</em><br/>
|
||||
<select id="nd_mac_format" name="mac_format">
|
||||
[% FOREACH format IN [ 'IEEE', 'Cisco', 'Microsoft', 'Sun' ] %]
|
||||
<option[% ' selected="selected"' IF params.mac_format == format %]>[% format %]</option>
|
||||
[% END %]
|
||||
</select>
|
||||
</li>
|
||||
[% FOREACH item IN vars.connected_properties %]
|
||||
<li>
|
||||
<label class="checkbox">
|
||||
|
||||
@@ -31,11 +31,19 @@
|
||||
</div>
|
||||
<div class="clearfix input-prepend">
|
||||
<label class="add-on">
|
||||
<input type="checkbox" id="partial"
|
||||
<input type="checkbox" id="node_partial"
|
||||
name="partial"[% ' checked="checked"' IF params.partial %]/>
|
||||
</label>
|
||||
<label class="nd_checkboxlabel" for="partial">
|
||||
<label class="nd_checkboxlabel" for="node_partial">
|
||||
<span class="nd_searchcheckbox uneditable-input">Partial Name</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="clearfix">
|
||||
<em>MAC address format:</em><br/>
|
||||
<select id="nd_node_mac_format" name="mac_format">
|
||||
[% FOREACH format IN [ 'IEEE', 'Cisco', 'Microsoft', 'Sun' ] %]
|
||||
<option[% ' selected="selected"' IF params.mac_format == format %]>[% format %]</option>
|
||||
[% END %]
|
||||
</select>
|
||||
</div>
|
||||
<button id="[% tab.id %]_submit" type="submit" class="btn btn-info">Search Again</button>
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
<input name="q" value="[% params.q | html_entity %]" type="hidden"/>
|
||||
<div class="clearfix input-prepend">
|
||||
<label class="add-on">
|
||||
<input type="checkbox" id="partial"
|
||||
<input type="checkbox" id="port_partial"
|
||||
name="partial"[% ' checked="checked"' IF params.partial %]/>
|
||||
</label>
|
||||
<label class="nd_checkboxlabel" for="partial">
|
||||
<label class="nd_checkboxlabel" for="port_partial">
|
||||
<span class="nd_searchcheckbox uneditable-input">Partial Name</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
16
TODO
16
TODO
@@ -1,23 +1,27 @@
|
||||
|
||||
** in no particular order... **
|
||||
** names by tasks indicate who's "taken" them **
|
||||
|
||||
FRONTEND
|
||||
========
|
||||
|
||||
* UI for topo DB table editing
|
||||
- drop topo file support and use DB only
|
||||
* Port/Name/VLAN box should be green when filled
|
||||
* Choice of MAC address formats
|
||||
* Empty inventory should trigger request to discover
|
||||
* No devices - trigger first discover splash page
|
||||
|
||||
* (jeneric) device module tab
|
||||
|
||||
DAEMON
|
||||
======
|
||||
|
||||
* macsuck/arpnip
|
||||
|
||||
CORE
|
||||
====
|
||||
|
||||
* pseudo-device support
|
||||
* VRF support
|
||||
|
||||
DOCS
|
||||
====
|
||||
|
||||
* Scheduler
|
||||
* Discover/Refresh jobs
|
||||
* netdisco-do
|
||||
|
||||
Reference in New Issue
Block a user