spoon-feed slow switch, save output in log git repo
[dell-switch] / dell-switch.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5
6 use Net::OpenSSH;
7 use Data::Dump qw(dump);
8 use Time::HiRes qw(sleep);
9
10 our $login;
11 our $passwd;
12 our $debug = $ENV{DEBUG} || 0;
13
14 require 'config.pl';
15
16 #$Net::OpenSSH::debug = ~0;
17
18 my $ip = shift @ARGV || '10.20.0.2';
19 my @commands = @ARGV;
20 @commands = <DATA> unless @commands;
21
22 warn "## $ip\n";
23 my $ssh = Net::OpenSSH->new('auto@'.$ip);
24 my ($pty ,$pid) = $ssh->open2pty();
25
26 my $buff;
27
28 sub send_pty {
29         my $string = shift;
30         sleep 0.1; # we really need to wait for slow PowerConnect 5324
31         foreach (split //, $string) {
32                 print STDERR "[$_]" if $debug;
33                 syswrite $pty, $_;
34 #               $pty->flush;
35                 sysread $pty, my $echo, 1;
36                 print STDERR $echo;
37                 $buff .= $echo;
38         }
39 }
40
41 mkdir 'log' unless -d 'log';
42
43 chdir 'log';
44
45 sub save_log {
46         my ($ip, $hostname, $command, $buff) = @_;
47         
48         my $file = "${ip}_${hostname}_${command}.log";
49         open my $log, '>', $file;
50         $buff =~ s/\r//gs; # strip CR, leave LF only
51         print $log $buff;
52         if ( -e '.git' ) {
53                 system 'git', 'add', $file;
54                 system 'git', 'commit', '-m', "$ip $hostname", $file;
55         }
56 }
57
58 my $command;
59
60 while(1) {
61         my $data;
62         my $read = sysread($pty, $data, 1);
63         print STDERR $data;
64         $buff .= $data;
65         if ( $buff =~ m/User Name:/ ) {
66                 send_pty "$login\n";
67                 $buff = '';
68         } elsif ( $buff =~ m/Password:/ ) {
69                 send_pty "$passwd\n";
70                 $buff = '';
71         } elsif ( $buff =~ m/([\w\-]+)#$/ ) {
72                 my $hostname = $1;
73                 if ( $buff ) {
74                         save_log $ip, $hostname, $command, $buff;
75                         $buff = '';
76                 }
77                 if ( $command = shift @commands ) {
78                         $command =~ s/[\n\r]+$//;
79                         send_pty "$command\n";
80                         $buff = '';
81                 } else  {
82                         send_pty "exit\n";
83                         close($pty);
84                         last;
85                 }
86         } elsif ( $buff =~ m/% Unrecognized command/ ) {
87                 exit 1;
88         } elsif ( $buff =~ s{More: <space>,  Quit: q, One line: <return> }{} ) {
89                 send_pty " ";
90         } elsif ( $buff =~ s{\e\[0m\r\s+\r}{} ) {
91         }
92 }
93
94 __DATA__
95 show arp
96 show vlan
97 show running-config
98 show bridge address-table