* initial work * initial work * initial work * some fixes for time and Layer3 weird spec * store again the snapshot after update for specific * resolve the enums * monkeypatch SNMP::translateObj to avoid hardware exception on macOS * only save cache to db in the late phase worker * no need to check for cache on transport, can just go ahead and try * use database only for oidmap instead of netdisco-mibs * rewrite device snapshot to gather loaded mib leafs only * remove old walker code from snapshot worker * allow snmp browser to work without snapshot * only store snapshot leafs which the device responded on * refactor to separate snapshot work from snmp transport work * refactor to separate snapshot work from snmp transport work * allow typeahead on MIB qualified leafs * fixes for snmpwalk input after previous refactor * add the extra stuff SNMP::Info device class uses into snapshot * better width for snmp search box * fix css for snmp options * add spinner while snmp loading * add spinner while snmp loading * add spinner while snmp loading * support SNMP::Info device class or named MIBs as extra on snapshot * add final tidy and bug fix
69 lines
2.0 KiB
Perl
69 lines
2.0 KiB
Perl
package App::Netdisco::Worker::Plugin::Snapshot;
|
|
|
|
use Dancer ':syntax';
|
|
use App::Netdisco::Worker::Plugin;
|
|
use aliased 'App::Netdisco::Worker::Status';
|
|
|
|
use App::Netdisco::Transport::SNMP;
|
|
use App::Netdisco::Util::Snapshot qw/
|
|
gather_every_mib_object
|
|
dump_cache_to_browserdata
|
|
add_snmpinfo_aliases
|
|
/;
|
|
|
|
use MIME::Base64 qw/encode_base64/;
|
|
use Storable qw/nfreeze/;
|
|
use File::Spec::Functions qw(catdir catfile);
|
|
use File::Slurper 'write_text';
|
|
use File::Path 'make_path';
|
|
|
|
register_worker({ phase => 'check' }, sub {
|
|
return Status->error('Missing device (-d).')
|
|
unless defined shift->device;
|
|
return Status->done('Snapshot is able to run');
|
|
});
|
|
|
|
register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|
my ($job, $workerconf) = @_;
|
|
my $device = $job->device;
|
|
|
|
if (not ($device->in_storage
|
|
and not $device->is_pseudo)) {
|
|
return Status->error('Can only snapshot a real discovered device.');
|
|
}
|
|
|
|
my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
|
|
or return Status->defer("snapshot failed: could not SNMP connect to $device");
|
|
|
|
if ($snmp->offline) {
|
|
return Status->error('Can only snapshot a real device.');
|
|
}
|
|
|
|
gather_every_mib_object( $device, $snmp, split m/,/, ($job->extra || '') );
|
|
add_snmpinfo_aliases($snmp);
|
|
dump_cache_to_browserdata( $device, $snmp );
|
|
|
|
if ($job->port) {
|
|
my $frozen = encode_base64( nfreeze( $snmp->cache ) );
|
|
|
|
if ($job->port =~ m/^(?:both|db)$/) {
|
|
debug "snapshot $device - saving snapshot to database";
|
|
$device->update_or_create_related('snapshot', { cache => $frozen });
|
|
}
|
|
|
|
if ($job->port =~ m/^(?:both|file)$/) {
|
|
my $target_dir = catdir(($ENV{NETDISCO_HOME} || $ENV{HOME}), 'logs', 'snapshots');
|
|
make_path($target_dir);
|
|
my $target_file = catfile($target_dir, $device->ip);
|
|
|
|
debug "snapshot $device - saving snapshot to $target_file";
|
|
write_text($target_file, $frozen);
|
|
}
|
|
}
|
|
|
|
return Status->done(
|
|
sprintf "Snapshot data captured from %s", $device->ip);
|
|
});
|
|
|
|
true;
|