-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathWalker.pm
83 lines (73 loc) · 1.82 KB
/
Walker.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package Walker;
use 5.010;
use strict;
use warnings;
use Net::SNMP;
my $lldpRemSysName = '.1.0.8802.1.1.2.1.4.1.1.9';
my $dontWalk = '\.server\.selfnet\.de$';
my $dontShow = '^\(none\)\.\(none\)$';
sub new {
my $class = shift;
my $self = {
nodes => {},
edges => [],
};
bless($self, $class);
return $self;
}
sub walk {
my ($self, $node_name) = @_;
say "Walking $node_name...";
my $node = $self->{nodes}->{$node_name};
if (!$node) {
$node = {};
$self->{nodes}->{$node_name} = $node;
}
my @neighbors = grep(!/$dontShow/, get_neighbors($node_name));
$node->{neighbors} = @neighbors;
for my $neighbor_name (@neighbors) {
my $neighbor = $self->{nodes}->{$neighbor_name};
if (!$neighbor || !$neighbor->{neighbors}) {
push $self->{edges}, [$node_name, $neighbor_name];
}
}
for my $neighbor_name (@neighbors) {
if (!$self->{nodes}->{$neighbor_name} && $neighbor_name !~ /$dontWalk/) {
$self->walk($neighbor_name);
}
}
}
sub get_neighbors {
my ($host) = @_;
my ($session, $error) = Net::SNMP->session(
-hostname => $host,
-version => '2',
#-domain => 'udp6',
-maxMsgSize => 65535,
);
if (!$session) {
say "ERROR: $error";
return;
}
my $result = $session->get_entries(
-columns => [$lldpRemSysName],
);
if (!$result) {
say 'ERROR: ', $session->error();
return;
}
return map(lc, values $result);
}
sub save {
my $self = shift;
my $path = shift;
say "Saving...";
open(my $output, '>', $path);
say $output 'graph {';
for my $edge (@{$self->{edges}}) {
my ($n1, $n2) = @{$edge};
say $output " \"$n1\" -- \"$n2\";";
}
say $output '}';
}
1;