register_worker({
phase
=>
'main'
,
driver
=>
'snmp'
,
title
=>
'gather interfaces status from snmp'
},
sub
{
my
(
$job
,
$workerconf
) =
@_
;
my
$device
=
$job
->device;
my
$snmp
= App::Netdisco::Transport::SNMP->reader_for(
$device
)
or
return
Status->info(
"skip: could not SNMP connect to $device"
);
my
$interfaces
=
$snmp
->interfaces || {};
my
$reverse_interfaces
= {
reverse
%{
$interfaces
} };
my
$i_up
=
$snmp
->i_up;
my
$i_up_admin
=
$snmp
->i_up_admin;
foreach
my
$port
(
keys
%{ vars->{
'device_ports'
} }) {
my
$iid
=
$reverse_interfaces
->{
$port
} or
next
;
debug
sprintf
' [%s] macsuck - updating port %s status : %s/%s'
,
$device
->ip,
$port
, (
$i_up_admin
->{
$iid
} ||
'-'
), (
$i_up
->{
$iid
} ||
'-'
);
vars->{
'device_ports'
}->{
$port
}->set_column(
up
=>
$i_up
->{
$iid
});
vars->{
'device_ports'
}->{
$port
}->set_column(
up_admin
=>
$i_up_admin
->{
$iid
});
}
return
Status->info(
'interfaces status from snmp complete'
);
});
register_worker({
phase
=>
'store'
,
title
=>
'update interfaces status in database'
},
sub
{
my
(
$job
,
$workerconf
) =
@_
;
my
$device
=
$job
->device;
my
%port_seen
= ();
foreach
my
$vlan
(
reverse
sort
keys
%{ vars->{
'fwtable'
} }) {
foreach
my
$port
(
keys
%{ vars->{
'fwtable'
}->{
$vlan
} }) {
next
if
$port_seen
{
$port
};
++
$port_seen
{
$port
};
next
unless
scalar
keys
%{ vars->{
'fwtable'
}->{
$vlan
}->{
$port
} };
next
unless
exists
vars->{
'device_ports'
}->{
$port
};
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;