use bro if mac is not found in local arp
[dell-switch] / dell-switch.pl
index 158c8e4..efff4ba 100755 (executable)
@@ -11,6 +11,7 @@ our $login;
 our $passwd;
 our $debug = $ENV{DEBUG} || 0;
 
+use lib '.';
 require 'config.pl';
 
 #$Net::OpenSSH::debug = ~0;
@@ -19,9 +20,13 @@ my $ip = shift @ARGV || die "usage: $0 IP command[ command ...]\n";
 my @commands = @ARGV;
 @commands = <DATA> unless @commands;
 
-warn "## $ip\n";
-my $ssh = Net::OpenSSH->new('auto@'.$ip);
+warn "\n## ssh $ip\n";
+my $ssh = Net::OpenSSH->new($ip, user => $login, passwd => $passwd);
 my ($pty ,$pid) = $ssh->open2pty();
+if ( ! $pty ) {
+       warn "ERROR: can't connect to $ip, skipping";
+       exit 0;
+}
 
 my $buff;
 
@@ -31,7 +36,9 @@ sub send_pty {
        foreach (split //, $string) {
                print STDERR "[$_]" if $debug;
                syswrite $pty, $_;
-#              $pty->flush;
+               #$pty->flush;
+               sleep 0.05;
+
                sysread $pty, my $echo, 1;
                print STDERR $echo;
                $buff .= $echo;
@@ -46,6 +53,7 @@ sub save_log {
        my ($ip, $hostname, $command, $buff) = @_;
 
        return unless $command;
+       return if $ENV{NO_LOG};
        
        my $file = "${ip}_${hostname}_${command}.log";
        open my $log, '>', $file;
@@ -58,8 +66,9 @@ sub save_log {
 }
 
 my $command;
+my @commands_while = ( @commands );
 
-while(1) {
+while() {
        my $data;
        my $read = sysread($pty, $data, 1);
        print STDERR $data;
@@ -70,13 +79,13 @@ while(1) {
        } elsif ( $buff =~ m/Password:/ ) {
                send_pty "$passwd\n";
                $buff = '';
-       } elsif ( $buff =~ m/([\w\-]+)#$/ ) {
+       } elsif ( $buff =~ m/([\w\-\(\)]+)#$/ ) {
                my $hostname = $1;
                if ( $buff ) {
                        save_log $ip, $hostname, $command, $buff;
                        $buff = '';
                }
-               if ( $command = shift @commands ) {
+               if ( $command = shift @commands_while ) {
                        $command =~ s/[\n\r]+$//;
                        send_pty "$command\n";
                        $buff = '';
@@ -87,14 +96,27 @@ while(1) {
                }
        } elsif ( $buff =~ m/% Unrecognized command/ ) {
                exit 1;
-       } elsif ( $buff =~ s{More: <space>,  Quit: q.*One line: <return> }{} ) {
+       } elsif ( $buff =~ s{More: <space>,  Quit: q.*One line: <return>\s*}{} ) {
+               send_pty " ";
+       } elsif ( $buff =~ s{\Q--More-- or (q)uit\E}{} ) {
                send_pty " ";
-       } elsif ( $buff =~ s{\e\[0m\r\s+\r}{} ) {
+       } elsif ( $buff =~ s{\e\[0m\s*\r\s+\r}{} ) {
+               # nop
+       } elsif ( $buff =~ m/^[\r\n]+[\w\-]+>$/ ) {
+               send_pty "enable\n";
+       } elsif ( $buff =~ m{\QOverwrite file [startup-config] ?[Yes/press any key for no]....\E} ) {
+               send_pty "y";
+               $buff = '';
+       } elsif ( $buff =~ s{Management access will be blocked for the duration of the transfer.*Are you sure you want to start\? \(y/n\) }{}s ) {
+               send_pty 'y';
        }
 }
 
 __DATA__
+show system
 show arp
 show vlan
 show running-config
-show bridge address-table
+show bridge address
+show interfaces status
+