App-Netdisco

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

2.051002 - 2021-11-23

  [BUG FIXES]

  * Support names as well as IPs in SNMP report

2.051001 - 2021-11-14

  [BUG FIXES]

  * Remove patched CPAN::Uploader as the dist has been updated now

2.051000 - 2021-11-13

  [NEW FEATURES]

  * Feature to gather SNMP Walk, use as Pseudo Device, and Browse Objects

  [ENHANCEMENTS]

  * Allow contact|location|portname|snapshot to run on pseudo devices

Changes  view on Meta::CPAN

2.038009 - 2018-01-10

  [BUG FIXES]

  * Fix for VLAN setting missing a variable declaration

2.038008 - 2018-01-09

  [BUG FIXES]

  * Add updated Test::More dependency to get tests passing again.

2.038007 - 2018-01-09

  [BUG FIXES]

  * Fix for VLAN setting missing a variable declaration

2.038006 - 2018-01-08

  [ENHANCEMENTS]

Changes  view on Meta::CPAN


  * Request net-snmp-devel on Fedora/Red-Hat builds
  * [#101] Add BSD install notes
  * Update IP Inventory to show MAC address and have working Last Used sort

  [BUG FIXES]

  * Fix for node search on some formats of IPv6 addr being seen as MAC
  * [#190] Ignore entries in the discover form that don't look like IP/hostname
  * Delete all job queue entries (regardless of status) when deleting device
  * [#15] Undiscovered Neighbor report JOIN fixed, and updated to include
    the ports where Macsuck saw the MAC address of a known Device
  * [#193] DBI Exception for Cisco ACE MacAddr format

2.029014 - 2014-11-19

  [ENHANCEMENTS]

  * [#133] Custom reports respect sorting in SQL
  * [#159] Macsuck archive behaviour same as ND1 (unseen nodes remain active)
  * [#161] Updated IOS-XR SSHCollector

Changes  view on Meta::CPAN

  * Additional debug levels for netdisco-do to show DBIx::Class and net-snmp
  * [#107] navbar_autocomplete config item to disable main navbar autocomplete

  [ENHANCEMENTS]

  * Reports config is now a list (see ReleaseNotes)
  * Add "AP" as a hint for WAP support
  * Attempt to keep PID and logfile as netdisco user even when running as root
  * Show netdisco-do docs on options error
  * Do not leak SNMP community string into debug output (unless SHOW_COMMUNITY=1)
  * Process tree updated to show daemon worker status/activity
  * Handle management IP of one device being in use on another device
  * Log at debug the vlan reindexing in macsuck
  * Add docs note about database backups
  * Always set DBIC_TRACE_PROFILE=console in environment
  * Push a row into Device Modules for the chassis even if no module info

  [BUG FIXES]

  * Missing action to netdisco-do should not throw Perl error
  * Sort CDP/LLDP data to be more consistent when multiple neighbors on a port

Changes  view on Meta::CPAN

  * Fixes to allow output of get_init_file to be used as init script
  * Legitimate for same MAC to be in two VLANs on same switchport
  * Fix for broken [#82] (/etc/hosts check during ARP IP resolv)
  * Discover nodes on ports which have broken near-edge topology
  * Use password instead of pass for Dancer::Plugin::DBIC

2.025001 - 2014-04-08

  [NEW FEATURES]

  * Web and Backend daemons will restart when deployment.yml is updated
  * Web and Backend daemons will drop privilege to same uid/gid as their
    on-disk files (to allow run-control symlink as non-root)

  [ENHANCEMENTS]

  * Use daterange for IP Subnets (same as IP Inventory)
  * Run daemons as target binary's owning user (supports run control)
  * Clean up library path fiddling across all scripts
  * Rename housekeeping expiry task to be expire
  * Refactor nbtstat to group probes by device where node was arped

Changes  view on Meta::CPAN

0.4 2012-02-19

  [NEW FEATURES]

  * Sidebar can be pinned in place to keep it visible when scrolling.

0.3  2011-02-03

  [NEW FEATURES]

  * Browser History is updated with each tab change (HTML5 State). Also
    the browser url is updated, meaning the Bookmark icon is no longer
    necessary.

  * Sidebar is now on the right hand side of the window, and is only
    displayed when there are options for the current tab.

  [ENHANCEMENTS]

  * Refactor Javascript to place most in a static file, speed templating.
  * Refactor Stylsheets to better organise and comment the settings.
  * When Device Search sidebar is in use, strikethrough the navbar search.

bin/netdisco-backend  view on Meta::CPAN

      });

      my ($hupit, $rotate) = (0, 0);
      next unless @restart;

      foreach my $f (@restart) {
          if ($f->{path} eq $log_file) {
              ++$rotate;
          }
          else {
              warn "-- $f->{path} updated.\n";
              ++$hupit;
          }
      }
      $child = rotate_logs($child, $daemon, @program_args) if $rotate;
      if ($hupit) {
          signal_child('TERM', $child);
          $child = fork_and_start($daemon, @program_args);
          exit(1) unless $child;
      }
  }

bin/netdisco-do  view on Meta::CPAN

B<p>reserve).

 ~/bin/netdisco-do delete -d 192.0.2.1
 ~/bin/netdisco-do delete -d 192.0.2.1 -e 'older than the sun'
 ~/bin/netdisco-do delete -d 192.0.2.1 -e 'older than the sun' -p yes

=head2 renumber

Change the canonical IP address of a device (specified with C<-d>). Pass the
new IP address in the C<-e> parameter. All related records such as topology,
log and node information will also be updated to refer to the new device.

Note that I<no> check is made as to whether the new IP is reachable for future
polling.

 ~/bin/netdisco-do renumber -d 192.0.2.1 -e 192.0.2.254

=head2 nbtstat

Run an nbtstat on the node (specified with C<-d>).

bin/netdisco-web  view on Meta::CPAN

      });

      my ($hupit, $rotate) = (0, 0);
      next unless @restart;

      foreach my $f (@restart) {
          if ($f->{path} eq $log_file) {
              ++$rotate;
          }
          else {
              warn "-- $f->{path} updated.\n";
              ++$hupit;
          }
      }

      rotate_logs($child) if $rotate;
      if ($hupit) {
          signal_child('TERM', $child);
          warn "successfully terminated! Restarting the web server process.\n";
          $child = fork_and_start($daemon, @program_args);
          return unless $child;

lib/App/Netdisco/JobQueue.pm  view on Meta::CPAN

job is booked but the processing node changes its mind and decides to return
the job to the queue. The C<$job> parameter must be an object which implements
the Netdisco job instance interface (see below).

Returns true if successful else returns false.

=head2 jq_complete( $job )

Marks a job as complete. The C<$job> parameter must be an object which
implements the Netdisco job instance interface (see below). The queue item's
status, log and finished fields will be updated from the passed C<$job>.

Returns true if successful else returns false.

=head2 jq_insert( \%job | [ \%job, \%job ...] )

Adds the passed jobs to the queue.

=head2 jq_delete( $id? )

If passed the ID of a job, deletes it from the queue. Otherwise deletes ALL

lib/App/Netdisco/JobQueue/PostgreSQL.pm  view on Meta::CPAN

  })->get_column('device')->all;
}

sub jq_lock {
  my $job = shift;
  return true unless $job->id;
  my $happy = false;

  # lock db row and update to show job has been picked
  try {
    my $updated = schema(vars->{'tenant'})->resultset('Admin')
      ->search({ job => $job->id, status => 'queued' }, { for => 'update' })
      ->update({
          status  => 'queued',
          backend => setting('workers')->{'BACKEND'},
          started => \"LOCALTIMESTAMP",
      });

    $happy = true if $updated > 0;
  }
  catch {
    error $_;
  };

  return $happy;
}

sub jq_defer {
  my $job = shift;

lib/App/Netdisco/Util/PortAccessEntity.pm  view on Meta::CPAN

our @EXPORT_OK = qw/update_pae_attributes/;
our %EXPORT_TAGS = (all => \@EXPORT_OK);

=head1 NAME

App::Netdisco::Util::PortAccessEntity

=head1 DESCRIPTION

Helper subroutines to update PAE details in device_port_properties
These are updated both during discover and macsuck.

=cut

sub update_pae_attributes {
  my ($device) = @_;
  no warnings "uninitialized";

  my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
    or return Status->defer("pae failed: could not SNMP connect to $device");
  debug sprintf ' [%s] pae - updating PortAccessEntity details', $device->ip;

lib/App/Netdisco/Worker/Plugin/Arpnip/Nodes.pm  view on Meta::CPAN

use Regexp::Common 'net';
use NetAddr::MAC ();
use Time::HiRes 'gettimeofday';

register_worker({ phase => 'early',
  title => 'prepare common data' }, sub {

  my ($job, $workerconf) = @_;
  my $device = $job->device;

  # would be possible just to use LOCALTIMESTAMP on updated records, but by using this
  # same value for them all, we can if we want add a job at the end to
  # select and do something with the updated set (see set archive, below)
  vars->{'timestamp'} = ($job->is_offline and $job->entered)
    ? (schema('netdisco')->storage->dbh->quote($job->entered) .'::timestamp')
    : 'to_timestamp('. (join '.', gettimeofday) .')::timestamp';

  # initialise the cache
  vars->{'arps'} = [];
});

register_worker({ phase => 'store' }, sub {
  my ($job, $workerconf) = @_;

lib/App/Netdisco/Worker/Plugin/Discover.pm  view on Meta::CPAN


  return Status->error('discover failed: unable to interpret device param')
    unless defined $device;

  return Status->error("discover failed: no device param (need -d ?)")
    if $device->ip eq '0.0.0.0';

  return Status->info("discover skipped: $device is not discoverable")
    unless is_discoverable_now($device);

  # would be possible just to use LOCALTIMESTAMP on updated records, but by using this
  # same value for them all, we can if we want add a job at the end to
  # select and do something with the updated set (see set archive, below)
  vars->{'timestamp'} = ($job->is_offline and $job->entered)
    ? (schema('netdisco')->storage->dbh->quote($job->entered) .'::timestamp')
    : 'to_timestamp('. (join '.', gettimeofday) .')::timestamp';

  return Status->done('Discover is able to run.');
});

true;

lib/App/Netdisco/Worker/Plugin/Expire.pm  view on Meta::CPAN

        schema('netdisco')->resultset('UserLog')->search({
          creation => \[q/< (LOCALTIMESTAMP - ?::interval)/,
              (setting('expire_userlog') * 86400)],
        })->delete();
      });
  }

  # now update stats
  update_stats();

  return Status->done('Checked expiry and updated stats');
});

true;

lib/App/Netdisco/Worker/Plugin/LoadMIBs.pm  view on Meta::CPAN

        foreach my $row (@rows) {
            my $value = (@{ thaw( decode_base64( from_json($row->{value}) ) ) })[0];
            $value = (ref {} eq ref $value)
              ? { map {($_ => (defined $value->{$_} ? encode_base64($value->{$_}, '') : undef))}
                  keys %$value }
              : (defined $value ? encode_base64($value, '') : undef);
            $row->{value} = to_json([$value]);
        }

        schema('netdisco')->resultset('DeviceBrowser')->populate(\@rows);
        debug sprintf 'loadmibs - updated %d legacy snapshot rows', scalar @rows;
    }
  });

  return Status->done('Loaded MIBs');
});

true;

__DATA__
ad_lag_ports	SNMP::Info::munge_port_list

lib/App/Netdisco/Worker/Plugin/Macsuck/InterfacesStatus.pm  view on Meta::CPAN

        next if vars->{'device_ports'}->{$port}->is_master;

        debug sprintf ' [%s] macsuck - updating port %s status up/up due to node presence',
          $device->ip, $port;

        vars->{'device_ports'}->{$port}->set_column(up => 'up');
        vars->{'device_ports'}->{$port}->set_column(up_admin => 'up');
    }
  }

  my $updated = 0;
  foreach my $port (values %{ vars->{'device_ports'} }) {
    next unless $port->is_changed();
    $port->update();
    ++$updated;
  }

  return Status->info(sprintf '%s interfaces status updated in database', $updated);
});

true;

lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm  view on Meta::CPAN

use Regexp::Common 'net';
use NetAddr::MAC ();
use List::MoreUtils ();

register_worker({ phase => 'early',
  title => 'prepare common data' }, sub {

  my ($job, $workerconf) = @_;
  my $device = $job->device;

  # would be possible just to use LOCALTIMESTAMP on updated records, but by using this
  # same value for them all, we can if we want add a job at the end to
  # select and do something with the updated set (see set archive, below)
  vars->{'timestamp'} = ($job->is_offline and $job->entered)
    ? (schema('netdisco')->storage->dbh->quote($job->entered) .'::timestamp')
    : 'to_timestamp('. (join '.', gettimeofday) .')::timestamp';

  # initialise the cache
  vars->{'fwtable'} = {};

  # cache the device ports to save hitting the database for many single rows
  vars->{'device_ports'} = {map {($_->port => $_)}
                          $device->ports(undef, {prefetch => ['properties',

share/public/swagger-ui/swagger-ui-bundle.js.map  view on Meta::CPAN

{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 396b8c743e9ffbc09e47","webpack:///./node_modules/react/react.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/babel-run...

share/public/swagger-ui/swagger-ui-json-tree-plugin.js  view on Meta::CPAN

 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */var c=n(4),r="function"==typeof Symbol&&Symbol.for,f=r?Symbol.for("react.element"):60103,l=r?Symbol.for("react.portal"):60106,a=r?Symbol.for("react.fragment"):60107,o=r?Symbol.for("react.strict_mode"):60108,i=r?Symbol.for("react.profiler"):60114,s...
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/var u=Object.getOwnPropertySymbols,l=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;fo...
//# sourceMappingURL=swagger-ui-json-tree-plugin.js.map

share/public/swagger-ui/swagger-ui-json-tree-plugin.js.map  view on Meta::CPAN

{"version":3,"sources":["webpack://jsonTreePlugin/webpack/bootstrap","webpack://jsonTreePlugin/./node_modules/react/index.js","webpack://jsonTreePlugin/./src/index.js","webpack://jsonTreePlugin/./src/JSONTree.js","webpack://jsonTreePlugin/./node_modu...

share/public/swagger-ui/swagger-ui-standalone-preset.js.map  view on Meta::CPAN

{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 5e373a31950a06c8d2bb","webpack:///./node_modules/@kyleshockey/js-yaml/lib/js-yaml/type.js","webpack:///./node_modules/core-js/modules/_wks.js","webpa...

share/public/swagger-ui/swagger-ui.js.map  view on Meta::CPAN

{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap fb516ccd71e38bfe6f58","webpack:///external \"react\"","webpack:///external \"prop-types\"","webpack:///./node_modules/babel-runtime/helpers/classCall...

share/views/js/common.js  view on Meta::CPAN

  // csv download icon on any table page
  // needs to be dynamically updated to use current search options
  function update_csv_download_link (type, tab, show) {
    var form = '#' + tab + '_form';
    var query = $(form).serialize();

    if (show.length) {
      $('#nd_csv-download')
        .attr('href', uri_base + '/ajax/content/' + type + '/' + tab + '?' + query)
        .attr('download', 'netdisco-' + type + '-' + tab + '.csv')
        .show();
    }

share/views/js/device.js  view on Meta::CPAN

    $('#ports_pane').on('click', '.nd_collapse-vlans', function() {
        $(this).siblings('.nd_collapsing').toggle();
        if ($(this).find('.nd_arrow-up-down-left').hasClass('icon-chevron-up')) {
          $(this).html('<div class="nd_arrow-up-down-left icon-chevron-down icon-large"></div>Hide VLANs');
        }
        else {
          $(this).html('<div class="nd_arrow-up-down-left icon-chevron-up icon-large"></div>Show VLANs');
        }
    });

    // refresh tooltips when the datatables table is updated
    $('#ports_pane').on('draw.dt', function() {
        $("[rel=tooltip]").tooltip({live: true});
    });

    // netmap show controls
    $('#nd_showips').change(function() {
      if ($(this).prop('checked')) {
        graph.inspect().main.nodes.each(function(n) {
          if (n['ORIG_LABEL'] != n['ID']) {
            n['LABEL'] = n['ORIG_LABEL'] + ' ' + n['ID'];

share/views/password.tt  view on Meta::CPAN

<div class="container">
  <div class="row nd_hero-row">
    <div class="span8 offset2">
      [% IF vars.passchange_ok %]
      <div class="alert alert-success fade in">
        <a class="close" data-dismiss="alert">×</a>
        Password successfully updated.
      </div>
      [% END %]
      [% IF vars.passchange_failed %]
      <div class="alert alert-error fade in">
        <a class="close" data-dismiss="alert">×</a>
        Incorrect current password, or new passwords did not match. Please try again.
      </div>
      [% END %]
      <div class="hero-unit">
        <h2>Change Password</h2>



( run in 0.571 second using v1.01-cache-2.11-cpan-05444aca049 )