=================================================================== RCS file: /cvs/trango/Net-Telnet-Trango/lib/Net/Telnet/Trango.pm,v retrieving revision 1.10 retrieving revision 1.12 diff -u -r1.10 -r1.12 --- 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/31 22:29:53 1.12 @@ -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.11 2006/08/23 00:37:20 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??? @@ -472,6 +472,38 @@ =pod +=item su_ipconfig + +C + +=cut + +sub su_ipconfig +{ + my $self = shift; + + my $suid = shift; + my $new_ip = shift; + my $new_subnet = shift; + my $new_gateway = shift; + + return undef unless $suid =~ /^\d+$/; + return undef unless $new_ip; + return undef unless $new_subnet; + return undef unless $new_gateway; + + # su ipconfig + return $self->cmd(String => 'su ipconfig ' . + $suid . ' ' . + $new_ip . ' ' . + $new_subnet . ' ' . + $new_gateway, + expect => $success, + ); +} + +=pod + =item sudb_view returns a reference to an array of hashes each containing: @@ -789,6 +821,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 +958,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;