=================================================================== RCS file: /cvs/trango/Net-Telnet-Trango/lib/Net/Telnet/Trango.pm,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- trango/Net-Telnet-Trango/lib/Net/Telnet/Trango.pm 2006/07/31 23:16:52 1.10 +++ trango/Net-Telnet-Trango/lib/Net/Telnet/Trango.pm 2006/08/23 01:37:20 1.11 @@ -1,5 +1,5 @@ package Net::Telnet::Trango; -# $RedRiver: Trango.pm,v 1.9 2006/07/14 01:17:29 andrew Exp $ +# $RedRiver: Trango.pm,v 1.10 2006/07/31 22:16:52 andrew Exp $ use strict; use warnings; use base 'Net::Telnet'; @@ -289,7 +289,7 @@ save_sudb => { String => 'save sudb', expect => $success }, syslog => { expect => $success }, 'pipe' => { }, # XXX needs a special decode - maclist => { }, # XXX needs a special decode and a special expect + maclist => { decode => 'maclist' }, maclist_reset => { String => 'maclist reset', expect => 'done' }, eth_link => { String => 'eth link', expect => $success }, # eth r, w and reset??? @@ -789,6 +789,8 @@ $vals = _decode_each_line(@lines); } elsif ($cfg{'decode'} eq 'sulog') { $vals = _decode_sulog(@lines); + } elsif ($cfg{'decode'} eq 'maclist') { + $vals = _decode_maclist(@lines); } else { $vals = _decode_lines(@lines); } @@ -924,6 +926,51 @@ } } return \@decoded; +} + +#=item _decode_maclist + +sub _decode_maclist +{ + my @lines = @_; + my @decoded; + my $total_entries = 0; + foreach my $line (@lines) { + $line =~ s/\r?\n$//; + my ($mac, $loc, $tm) = $line =~ / + ([0-9a-fA-F ]{17})\s+ + (.*)\s+ + tm\s+ + (\d+) + /x; + + if ($mac) { + $mac =~ s/\s+//g; + $loc =~ s/^\s+//; + $loc =~ s/\s+$//; + + my $suid = undef; + if ($loc =~ /suid\s+=\s+(\d+)/) { + $suid = $1; + $loc = undef; + } + + push @decoded, { + mac => $mac, + loc => $loc, + tm => $tm, + suid => $suid, + }; + } elsif ($line =~ /(\d+)\s+entries/) { + $total_entries = $1; + } + } + if (scalar @decoded == $total_entries) { + return \@decoded; + } else { + # XXX we should have a way to set last error, not sure why we don't + return undef; + } } 1;