save commands and output into log/ip-hostname.log
[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 List::Util qw(first);
9 use Time::HiRes;
10
11 our $login;
12 our $passwd;
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 while(1) {
29         my $data;
30         my $read = sysread($pty, $data, 1);
31         print STDERR $data;
32         $buff .= $data;
33         if ( $buff =~ m/User Name:/ ) {
34                 print $pty "$login\n";
35                 $buff = '';
36         } elsif ( $buff =~ m/Password:/ ) {
37                 print $pty "$passwd\n";
38                 $buff = '';
39         } elsif ( $buff =~ m/([\w\-]+)#$/ ) {
40                 my $hostname = $1;
41                 if ( $buff ) {
42                         mkdir 'log' unless -d 'log';
43                         open my $log, '>>', "log/$ip-$hostname.log";
44                         print $log $buff;
45                         $buff = '';
46                 }
47                 if ( my $command = shift @commands ) {
48                         $command .= "\n" unless $command =~ m/\n$/;
49                         warn ">> $command\n";
50                         print $pty "$command";
51                         $buff = '';
52                 } else  {
53                         print $pty "exit\n";
54                         close($pty);
55                         last;
56                 }
57         } elsif ( $buff =~ m/% Unrecognized command/ ) {
58                 exit 1;
59         } elsif ( $buff =~ s{More: <space>,  Quit: q, One line: <return> }{} ) {
60                 print $pty " ";
61         } elsif ( $buff =~ s{\e\[0m\r\s+\r}{} ) {
62         }
63 }
64
65 __DATA__
66 show arp
67 show vlan
68 show running-config
69 show bridge address-table