Merge branch 'master' into og-newnetmap

This commit is contained in:
Oliver Gorwits
2017-12-17 19:52:49 +00:00
11 changed files with 105 additions and 79 deletions

16
Changes
View File

@@ -1,4 +1,17 @@
2.036012_003 - EXPERIMENTAL RELEASE 2.037002 - 2017-12-14
[ENHANCEMENTS]
* Include Connected Device ID in Device Ports sidebar cookie
* Improve netdisco-do docs
2.037001 - 2017-12-14
[ENHANCEMENTS]
* Also update stats on running netdisco-deploy
2.037000 - 2017-12-14
[NEW FEATURES] [NEW FEATURES]
@@ -11,6 +24,7 @@
* Deduplicate neighbors based on lldpRemChassisId * Deduplicate neighbors based on lldpRemChassisId
* Scheduler config does not need to be uncommented * Scheduler config does not need to be uncommented
* More efficient polling of the job queue * More efficient polling of the job queue
* Better Port search options and results presentation
[BUG FIXES] [BUG FIXES]

View File

@@ -78,6 +78,7 @@
"Sereal" : "0", "Sereal" : "0",
"Socket6" : "0.23", "Socket6" : "0.23",
"Starman" : "0.4008", "Starman" : "0.4008",
"Storable" : "0",
"Template" : "2.24", "Template" : "2.24",
"Template::Plugin::CSV" : "0.04", "Template::Plugin::CSV" : "0.04",
"Template::Plugin::Number::Format" : "1.02", "Template::Plugin::Number::Format" : "1.02",
@@ -85,7 +86,8 @@
"Term::UI" : "0", "Term::UI" : "0",
"Try::Tiny" : "0", "Try::Tiny" : "0",
"URI" : "0", "URI" : "0",
"URL::Encode" : "0.01", "URL::Encode" : "0.03",
"URL::Encode::XS" : "0",
"YAML" : "0.84", "YAML" : "0.84",
"YAML::XS" : "0.41", "YAML::XS" : "0.41",
"aliased" : "0", "aliased" : "0",
@@ -103,7 +105,7 @@
"provides" : { "provides" : {
"App::Netdisco" : { "App::Netdisco" : {
"file" : "lib/App/Netdisco.pm", "file" : "lib/App/Netdisco.pm",
"version" : "2.036012_003" "version" : "2.037001"
}, },
"App::Netdisco::AnyEvent::Nbtstat" : { "App::Netdisco::AnyEvent::Nbtstat" : {
"file" : "lib/App/Netdisco/AnyEvent/Nbtstat.pm" "file" : "lib/App/Netdisco/AnyEvent/Nbtstat.pm"
@@ -740,7 +742,7 @@
"file" : "lib/Dancer/Template/NetdiscoTemplateToolkit.pm" "file" : "lib/Dancer/Template/NetdiscoTemplateToolkit.pm"
} }
}, },
"release_status" : "testing", "release_status" : "stable",
"resources" : { "resources" : {
"bugtracker" : { "bugtracker" : {
"web" : "https://github.com/netdisco/netdisco/issues" "web" : "https://github.com/netdisco/netdisco/issues"
@@ -755,6 +757,6 @@
"x_IRC" : "irc://irc.freenode.org/#netdisco", "x_IRC" : "irc://irc.freenode.org/#netdisco",
"x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/netdisco-users" "x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/netdisco-users"
}, },
"version" : "2.036012_003", "version" : "2.037001",
"x_serialization_backend" : "JSON::PP version 2.94" "x_serialization_backend" : "JSON::PP version 2.94"
} }

View File

@@ -18,7 +18,7 @@ name: App-Netdisco
provides: provides:
App::Netdisco: App::Netdisco:
file: lib/App/Netdisco.pm file: lib/App/Netdisco.pm
version: 2.036012_003 version: '2.037001'
App::Netdisco::AnyEvent::Nbtstat: App::Netdisco::AnyEvent::Nbtstat:
file: lib/App/Netdisco/AnyEvent/Nbtstat.pm file: lib/App/Netdisco/AnyEvent/Nbtstat.pm
App::Netdisco::Backend::Job: App::Netdisco::Backend::Job:
@@ -498,6 +498,7 @@ requires:
Sereal: '0' Sereal: '0'
Socket6: '0.23' Socket6: '0.23'
Starman: '0.4008' Starman: '0.4008'
Storable: '0'
Template: '2.24' Template: '2.24'
Template::Plugin::CSV: '0.04' Template::Plugin::CSV: '0.04'
Template::Plugin::Number::Format: '1.02' Template::Plugin::Number::Format: '1.02'
@@ -505,7 +506,8 @@ requires:
Term::UI: '0' Term::UI: '0'
Try::Tiny: '0' Try::Tiny: '0'
URI: '0' URI: '0'
URL::Encode: '0.01' URL::Encode: '0.03'
URL::Encode::XS: '0'
YAML: '0.84' YAML: '0.84'
YAML::XS: '0.41' YAML::XS: '0.41'
aliased: '0' aliased: '0'
@@ -518,5 +520,5 @@ resources:
homepage: http://netdisco.org/ homepage: http://netdisco.org/
license: http://opensource.org/licenses/bsd-license.php license: http://opensource.org/licenses/bsd-license.php
repository: https://github.com/netdisco/netdisco repository: https://github.com/netdisco/netdisco
version: 2.036012_003 version: '2.037001'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018' x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

View File

@@ -40,6 +40,7 @@ use App::Netdisco;
use Dancer ':script'; use Dancer ':script';
use Dancer::Plugin::DBIC 'schema'; use Dancer::Plugin::DBIC 'schema';
use Dancer::Plugin::Passphrase; use Dancer::Plugin::Passphrase;
use App::Netdisco::Util::Statistics ();
info "App::Netdisco $App::Netdisco::VERSION loaded."; info "App::Netdisco $App::Netdisco::VERSION loaded.";
@@ -139,6 +140,11 @@ sub deploy_db {
say 'DB schema update complete.'; say 'DB schema update complete.';
print color 'reset'; print color 'reset';
App::Netdisco::Util::Statistics::update_stats();
print color 'bold blue';
say 'Statistics updated.';
print color 'reset';
if (not setting('safe_password_store')) { if (not setting('safe_password_store')) {
say ''; say '';
print color 'bold red'; print color 'bold red';

View File

@@ -166,15 +166,19 @@ netdisco-do - Run any Netdisco job from the command-line.
This program allows you to run any Netdisco poller job from the command-line. This program allows you to run any Netdisco poller job from the command-line.
The C<-d> option will accept a hostname (that can be resolved to an IP with =head1 ACTIONS
DNS), an IP address, or IP prefix (subnets in CIDR format). It can be any
interface on the device known to Netdisco.
Note that some jobs (C<discoverall>, C<macwalk>, C<arpwalk>, C<nbtwalk>) Note that some jobs (C<discoverall>, C<macwalk>, C<arpwalk>, C<nbtwalk>)
simply add entries to the Netdisco job queue for other jobs, so won't seem simply add entries to the Netdisco job queue for other jobs, so won't seem
to do much when you trigger them. to do much when you trigger them.
=head1 ACTIONS For any action, if you wish to run one of its individual worker stages, then
pass C<action::stage> as the first argument to C<netdisco-do>, for example
C<discover::neighbors>.
Any action taking a C<device> parameter can be passed either a hostname or IP
of any interface on a known or unknown device, or an IP prefix (subnet) which
will cause C<netdisco-do> to run the action for all addresses in that range.
=head2 discover =head2 discover
@@ -184,7 +188,7 @@ Run a discover on the device (specified with C<-d>).
=head2 discoverall =head2 discoverall
Run a discover for all known devices. Queue a discover for all known devices.
=head2 macsuck =head2 macsuck
@@ -194,7 +198,7 @@ Run a macsuck on the device (specified with C<-d>).
=head2 macwalk =head2 macwalk
Run a macsuck for all known devices. Queue a macsuck for all known devices.
=head2 arpnip =head2 arpnip
@@ -204,7 +208,7 @@ Run an arpnip on the device (specified with C<-d>).
=head2 arpwalk =head2 arpwalk
Run an arpnip for all known devices. Queue an arpnip for all known devices.
=head2 delete =head2 delete
@@ -236,7 +240,7 @@ Run an nbtstat on the node (specified with C<-d>).
=head2 nbtwalk =head2 nbtwalk
Run an nbtstat for all known nodes. Queue an nbtstat for all known nodes.
=head2 expire =head2 expire

View File

@@ -40,8 +40,7 @@ BEGIN {
} }
use App::Netdisco; use App::Netdisco;
use App::Netdisco::Core::Arpnip 'store_arp'; use App::Netdisco::Util::Node qw/check_mac store_arp/;
use App::Netdisco::Util::Node 'check_mac';
use App::Netdisco::Util::FastResolver 'hostnames_resolve_async'; use App::Netdisco::Util::FastResolver 'hostnames_resolve_async';
use Dancer ':script'; use Dancer ':script';

View File

@@ -4,7 +4,7 @@ use strict;
use warnings; use warnings;
use 5.010_000; use 5.010_000;
our $VERSION = '2.036012_003'; our $VERSION = '2.037001';
use App::Netdisco::Configuration; use App::Netdisco::Configuration;
=head1 NAME =head1 NAME
@@ -219,13 +219,11 @@ Then the process below should be run for each installation:
# apply database schema updates, update MIBs and Vendor MACs # apply database schema updates, update MIBs and Vendor MACs
~/bin/netdisco-deploy ~/bin/netdisco-deploy
~/bin/netdisco-do stats
# restart web service (if you run it) # restart web service (if you run it)
~/bin/netdisco-web restart ~/bin/netdisco-web restart
# stop old daemon and start new backend worker (wherever you run them) # restart the backend workers (wherever you run them)
~/bin/netdisco-daemon stop
~/bin/netdisco-backend restart ~/bin/netdisco-backend restart
=head1 Tips and Tricks =head1 Tips and Tricks

View File

@@ -11,6 +11,7 @@ our @EXPORT = ();
our @EXPORT_OK = qw/ our @EXPORT_OK = qw/
check_mac check_mac
is_nbtstatable is_nbtstatable
store_arp
/; /;
our %EXPORT_TAGS = (all => \@EXPORT_OK); our %EXPORT_TAGS = (all => \@EXPORT_OK);
@@ -141,4 +142,54 @@ sub is_nbtstatable {
return 1; return 1;
} }
=head2 store_arp( \%host, $now? )
Stores a new entry to the C<node_ip> table with the given MAC, IP (v4 or v6)
and DNS host name. Host details are provided in a Hash ref:
{
ip => '192.0.2.1',
node => '00:11:22:33:44:55',
dns => 'myhost.example.com',
}
The C<dns> entry is optional. The update will mark old entries for this IP as
no longer C<active>.
Optionally a literal string can be passed in the second argument for the
C<time_last> timestamp, otherwise the current timestamp (C<now()>) is used.
=cut
sub store_arp {
my ($hash_ref, $now) = @_;
$now ||= 'now()';
my $ip = $hash_ref->{'ip'};
my $mac = NetAddr::MAC->new($hash_ref->{'node'});
my $name = $hash_ref->{'dns'};
return if !defined $mac or $mac->errstr;
schema('netdisco')->txn_do(sub {
my $current = schema('netdisco')->resultset('NodeIp')
->search(
{ ip => $ip, -bool => 'active'},
{ columns => [qw/mac ip/] })->update({active => \'false'});
schema('netdisco')->resultset('NodeIp')
->update_or_create(
{
mac => $mac->as_ieee,
ip => $ip,
dns => $name,
active => \'true',
time_last => \$now,
},
{
key => 'primary',
for => 'update',
});
});
}
1; 1;

View File

@@ -5,11 +5,10 @@ use App::Netdisco::Worker::Plugin;
use aliased 'App::Netdisco::Worker::Status'; use aliased 'App::Netdisco::Worker::Status';
use App::Netdisco::Transport::SNMP (); use App::Netdisco::Transport::SNMP ();
use App::Netdisco::Util::Node 'check_mac'; use App::Netdisco::Util::Node qw/check_mac store_arp/;
use App::Netdisco::Util::FastResolver 'hostnames_resolve_async'; use App::Netdisco::Util::FastResolver 'hostnames_resolve_async';
use Dancer::Plugin::DBIC 'schema'; use Dancer::Plugin::DBIC 'schema';
use Time::HiRes 'gettimeofday'; use Time::HiRes 'gettimeofday';
use NetAddr::MAC ();
register_worker({ phase => 'main', driver => 'snmp' }, sub { register_worker({ phase => 'main', driver => 'snmp' }, sub {
my ($job, $workerconf) = @_; my ($job, $workerconf) = @_;
@@ -64,54 +63,4 @@ sub get_arps {
return $resolved_ips; return $resolved_ips;
} }
=head2 store_arp( \%host, $now? )
Stores a new entry to the C<node_ip> table with the given MAC, IP (v4 or v6)
and DNS host name. Host details are provided in a Hash ref:
{
ip => '192.0.2.1',
node => '00:11:22:33:44:55',
dns => 'myhost.example.com',
}
The C<dns> entry is optional. The update will mark old entries for this IP as
no longer C<active>.
Optionally a literal string can be passed in the second argument for the
C<time_last> timestamp, otherwise the current timestamp (C<now()>) is used.
=cut
sub store_arp {
my ($hash_ref, $now) = @_;
$now ||= 'now()';
my $ip = $hash_ref->{'ip'};
my $mac = NetAddr::MAC->new($hash_ref->{'node'});
my $name = $hash_ref->{'dns'};
return if !defined $mac or $mac->errstr;
schema('netdisco')->txn_do(sub {
my $current = schema('netdisco')->resultset('NodeIp')
->search(
{ ip => $ip, -bool => 'active'},
{ columns => [qw/mac ip/] })->update({active => \'false'});
schema('netdisco')->resultset('NodeIp')
->update_or_create(
{
mac => $mac->as_ieee,
ip => $ip,
dns => $name,
active => \'true',
time_last => \$now,
},
{
key => 'primary',
for => 'update',
});
});
}
true; true;

View File

@@ -131,6 +131,7 @@ sidebar_defaults:
age_num: { default: 3 } age_num: { default: 3 }
age_unit: { default: months } age_unit: { default: months }
mac_format: { default: IEEE } mac_format: { default: IEEE }
neigh_id: { default: null }
report_moduleinventory: report_moduleinventory:
fruonly: {default: checked } fruonly: {default: checked }
matchall: {default: checked } matchall: {default: checked }

View File

@@ -18,11 +18,6 @@ database:
# RECOMMENDED SETTINGS # RECOMMENDED SETTINGS
# -------------------- # --------------------
# will be stripped from fqdn when displayed in the web UI
# also, do not forget the leading dot.
# ```````````````````````````````````````````````````````
#domain_suffix: '.example.com'
# SNMP community string(s) # SNMP community string(s)
# ```````````````````````` # ````````````````````````
device_auth: device_auth:
@@ -35,6 +30,11 @@ device_auth:
# read: false # read: false
# write: true # write: true
# will be stripped from fqdn when displayed in the web UI
# also, do not forget the leading dot.
# ```````````````````````````````````````````````````````
#domain_suffix: '.example.com'
# ¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸ # ¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸
# ¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸ # ¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸