Re: script to log into cisco csm load balancer

From: Darby Weaver (ccie.weaver@gmail.com)
Date: Thu Jan 22 2009 - 21:56:03 ARST


Don't "expect" much if you don't ask the right people.... :)

Not a bad purchase at only $399

http://www.net-sense.com/

Lots of freebies:

Jim Marinelli wrote:
> Does anyone know where I can get an SSH application that is a Win32
> console application? I am trying to port an Expect script that I wrote
> on a Linux box to my Win XP laptop using ActiveTcl/Expect. The script
> attempts a Telnet connection to a Cisco devices; if that fails it
> attempts to connect with SSH. I have the script working with the XP
> Telnet program but I donb??t have an SSH console program to use.

I use Msys ssh, and there is also one in Putty.

> Incidentally b?? I had to disable DEP for the telnet program to make it
> work. I used the Windows Application Compatibility Database Tool from
> Microsoft to turn off DEP just for a copy of Telnet that I keep in the
> Tcl directory. I had to do the same thing with ping.

Did you notice this:

http://aspn.activestate.com/ASPN/Mail/Message/expect/3635465

Jeff

And guys... R-A-N-C-I-D... CiscoWorks, and others... get in and under the
covers - never know what you might find there...

Exploring Expect by O'Reilly:

http://my.safaribooksonline.com/9781565920903?portal=ciscopress

#!/usr/local/bin/expect
#
# rtrcfg.exp -- a script to perform mass configuration changes to
# a list of routers using Telnet and Expect
#
#
# Set Behavior
set tftp "172.25.1.1"
set workingdir /home/cisco/rtr
#
puts stdout "Enter user name:"
gets stdin userid
system stty -echo
puts stdout "Enter login password:"
gets stdin vtypasswd
puts stdout "\nEnter enable password:"
gets stdin enablepwd
system stty echo
system "cp $workingdir/NEWCONFIG /tftpboot/NEWCONFIG"
set RTR [open "$workingdir/RTR_LIST" r]
set LOG [open "$workingdir/RESULT" w]
while {[gets $RTR router] != -1} {
   if {[ string range $router 0 0 ] != "#"} {
     set timeout 10
     spawn telnet; expect "telnet>"; send "open $router\n"
     expect {
              {Username} { send "$userid\r"
                             expect {
                                       {*Password*} { send "$vtypasswd\r" }
                                    }
                           }
              {Password} { send "$vtypasswd\r" }
              timeout { puts $LOG "$router - telnet failed"
                             close; wait; continue
                           }
            }

     expect {
              {Password} { puts $LOG "$router - vty login failed"
                             close; wait; continue
                           }
              {Username} { puts $LOG "$router - vty login failed"
                             close; wait; continue
                           }
              {>} { puts $LOG "$router - vty login ok" }

              timeout { puts $LOG "$router - vty login failed"
                             close; wait; continue
                           }
            }

      send "enable\r"
      expect "Password"
      send "$enablepwd\r"
      #
      expect {
               {*#} { puts $LOG "$router - enable login ok" }

               {*>} { puts $LOG "$router - enable login failed"
                             close; wait; continue
                           }

              timeout { puts $LOG "$router - enable login failed"
                             close; wait; continue
                           }
             }
     # CMDs
     set timeout 30
     send "copy tftp://$tftp/NEWCONFIG running-config\r"
     expect "running-config"
     send "\r"
     expect {
               {OK} { puts $LOG "$router - TFTP successful"}
               timeout { puts $LOG "$router - TFTP failed"
                             close; wait; continue }
             }
     send "copy running-config startup-config\r\r\r"
     expect {
               {OK} { puts $LOG "$router - config saved"}
               timeout { puts $LOG "$router - config failed"
                             close; wait; continue }
             }
     #CMDs
     send "exit\r"; close; wait
    }
}
close $RTR; close $LOG
system "rm /tftpboot/NEWCONFIG"

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# ciscocheckpoint
# ciscoconfigure
# ciscoget
# ciscoget.exp
# ciscologin.expect
# cleanconfig
# This archive created: Fri May 3 10:56:52 1991
export PATH; PATH=/bin:$PATH
if test -f 'ciscocheckpoint'
then
        echo shar: will not over-write existing file "'ciscocheckpoint'"
else
cat << \SHAR_EOF > 'ciscocheckpoint'
#!/usr/local/bin/expect -f
#
# restart IP accounting statistics
#
# args: ciscoget router passwd enablepasswd
#

set router [index $argv 1]
set password [index $argv 2]
set enablepass [index $argv 3]

proc timedout {args} {
        send_user "Expect timed out" $args \n
        exit
}

source ciscologin.expect

if {[length $argv] < 4} {
        print "Invalid number of arguments\n"
        exit
}

send_user \n\n\n
spawn telnet $router
login $enablepass
send clear ip accounting\r
expect *#*
send QUIT\r
expect *Closed*
exit 0
SHAR_EOF
chmod +x 'ciscocheckpoint'
fi # end of overwriting check
if test -f 'ciscoconfigure'
then
        echo shar: will not over-write existing file "'ciscoconfigure'"
else
cat << \SHAR_EOF > 'ciscoconfigure'
#!/usr/local/bin/expect -f
#
# Fetch configuration information from the specified cisco router
#
# args: ciscoget router passwd enablepasswd filename
#
set localhost [exec hostname]
set tftpdir /private/tftpboot

set router [index $argv 1]
set password [index $argv 2]
set enablepass [index $argv 3]
set filename [index $argv 4]

proc timedout {args} {
        send_user "Expect timed out" $args \n
        exit
}

source ciscologin.expect

if {[length $argv] < 5} {
        print "Invalid number of arguments\n"
        exit
}

send_user \n\n\n
spawn telnet $router
login $enablepass
send configure network\r

expect {*configuration\ file*\?\ } {} \
        timeout {timedout waiting for config file prompt}

send network\r
expect {*IP\ address\ of\ remote\ host*\?\ } {} \
        timeout {timedout waiting for remote host prompt}

send $localhost

expect {*configuration\ file*?\ } {} \
        timeout {timedout waiting for filename prompt}

send ${filename}\r

expect {*Configure\ using*\[confirm\]*} {} \
        timeout {timedout waiting for confirm}

send "Y"

expect {*Failed*#} {send_user TFTP get failed\n; exit 1} \
        {*OK*#} {send_user TFTP get succeeded\n}

send "write\r"
expect {*\[OK\]*} {} \
        timeout {send_user Write failed\n; exit 1}
send QUIT\r
expect *Closed*
exit 0
SHAR_EOF
chmod +x 'ciscoconfigure'
fi # end of overwriting check
if test -f 'ciscoget'
then
        echo shar: will not over-write existing file "'ciscoget'"
else
cat << \SHAR_EOF > 'ciscoget'
#!/bin/sh
tftpdir=/private/tftpboot
export tftpdir
ciscoget.exp cschub-gw Password EnablePassword cschub-gw
ciscoget.exp dcs1hub-gw Password EnablePassword dcs1hub-gw
ciscoget.exp dcs2hub-gw Password EnablePassword dcs2hub-gw
ciscoget.exp sdnhub-gw Password EnablePassword sdnhub-gw
ciscoget.exp madhub-gw Password EnablePassword madhub-gw
ciscoget.exp avwhub-gw Password EnablePassword avwhub-gw
ciscoget.exp rchhub-gw Password EnablePassword rchhub-gw

SHAR_EOF
chmod +x 'ciscoget'
fi # end of overwriting check
if test -f 'ciscoget.exp'
then
        echo shar: will not over-write existing file "'ciscoget.exp'"
else
cat << \SHAR_EOF > 'ciscoget.exp'
#!/usr/local/bin/expect -f
#
# Fetch configuration information from the specified cisco router
#
# args: ciscoget router passwd enablepasswd filename
#
set localhost [exec hostname]
set tftpdir /private/tftpboot
set archivedir /n/netmap/HUBS/config

set router [index $argv 1]
set password [index $argv 2]
set enablepass [index $argv 3]
set filename [index $argv 4]

proc timedout {args} {
        send_user "Expect timed out" $args \n
        exit
}

source ciscologin.expect

if {[length $argv] < 5} {
        print "Invalid number of arguments\n"
        exit
}

spawn telnet $router
login $enablepass
send write network\r

expect {*Remote\ host*\?\ } {} \
        timeout {timedout waiting for Remote host prompt}

send ${localhost}

expect {*write*?*} {} \
        timeout {timedout waiting for filename prompt}

if {[file ${tftpdir}/${filename} exists]} {
        if {[file ${tftpdir}/${filename}.old exists]} {
                if {[file ${tftpdir}/${filename}.old isfile] == 0} {
                      send_user "${tftpdir}/${filename}.old: Not a plain file\n"
                      exit 1
                }
                system rm -f ${tftpdir}/${filename}.old
        }
        system mv -f ${tftpdir}/${filename} ${tftpdir}/${filename}.old
}
system touch ${tftpdir}/${filename}
system chmod 666 ${tftpdir}/${filename}

send ${filename}\r
expect {*Write\ file*\[confirm\]*} {} \
        timeout {timed out waiting for confirm}

send "Y"
expect {*Failed*#} {set failed 1; send_user \nTFTP Write failed\n} \
        {*OK*#} {set failed 0; send_user \nTFTP Write succeeded\n}

send QUIT\r
if {$failed == 0} {
        system cp ${tftpdir}/${filename} ${archivedir}/${filename}
        send_user "Saved configuration.. "
}
system cleanconfig ${tftpdir}/${filename}
send_user " cleaned configuration\n"
exit
SHAR_EOF
chmod +x 'ciscoget.exp'
fi # end of overwriting check
if test -f 'ciscologin.expect'
then
        echo shar: will not over-write existing file "'ciscologin.expect'"
else
cat << \SHAR_EOF > 'ciscologin.expect'

proc login {args} {
        global password
        global enablepass

        expect {*Password:*} {} \
                timeout {timedout waiting for password prompt}
        # ugly!
        system sleep 1
        send ${password}\r
        expect {*Password:*} {send_user Bad password\n; exit} \
                {*>} {} \
                timeout {timedout waiting for login prompt}

        if {[length $args]} {
                send enable\r
                expect {*Password:*} {} \
                        timeout {timedout waiting for enable password prompt; exit}
                # ugly!
                system sleep 1
                send [index $args 0]\r
                expect {*#} {} \
                   {*Password:*} {send_user Wrong enable password\n; exit} \
                   timeout {timedout waiting for enabled prompt; exit}
        }
}

SHAR_EOF
fi # end of overwriting check
if test -f 'cleanconfig'
then
        echo shar: will not over-write existing file "'cleanconfig'"
else
cat << \SHAR_EOF > 'cleanconfig'
#!/usr/bin/perl

$file = $ARGV[0];
$newfile = $file . ".new";
die "No file specified\n" unless $file;

open(CFG, "<$file") || die "Can't open $file\n";
open(NEWCFG, ">$newfile") || die "Can't open $newfile\n";

print NEWCFG <<"EOM";
!
! Note: this file ($file) has had the passwords removed for
! security reasons.
!
EOM
while (<CFG>) {
        if (/^(enable-password|password)\s+/) {
                print NEWCFG "! $1 CENSORED\n";
                next;
        }
        print NEWCFG;
}
close(CFG);
close(NEWCFG);

rename($newfile, $file) || die "Can't rename $newfile to $file: $!\n";

SHAR_EOF
chmod +x 'cleanconfig'
fi # end of overwriting check
# End of shell archive
exit 0

 Look for Matt Crawford of FERMILAB, available from Cisco's ftp.cisco.com.
They're in pub/cisco-expect.shar.

On Thu, Jan 22, 2009 at 4:16 PM, shiran guez <shiranp3@gmail.com> wrote:

> As I say don't "expect" too much :-)
>
>
>
>
> On Thu, Jan 22, 2009 at 7:36 PM, Tyson Scott <tscott@ipexpert.com> wrote:
>
> > testing,
> >
> > I am going to have to do a little defending here ;-) There is nothing
> more
> > simple and powerful than expect in network administration. There is a
> > reason Cisco put TCL on the routers. And expect is an
> extension/improvement
> > upon TCL. The downfall of expect, (I will admit), is there are not a lot
> of
> > good examples out there on it and there is only one reference book,
> written
> > by Don Libes (The person that developed expect). Over half the people
> that
> > use expect aren't even familiar with how powerful of a tool it is.
> >
> >
> >
> > #!/usr/bin/expect
> >
> >
> >
> > spawn telnet <hostname>
> >
> > expect {
> >
> > "Username:" {
> >
> > send "<username>\r"
> >
> > exp_continue
> >
> > }
> >
> > "Password:" {
> >
> > send "<password>\r"
> >
> > exp_continue
> >
> > }
> >
> > ">" {
> >
> > send "enable\r<enablepass>\r"
> >
> > exp_continue
> >
> > }
> >
> > "#" {
> >
> > send "show ip interface brief | exclude
> > unav\r"
> >
> > expect "show ip interface brief | exclude
> > unav"
> >
> > expect "#" { send "exit\r" }
> >
> > expect "Connection closed by foreign host"
> >
> > }
> >
> > expect eof
> >
> >
> >
> > I have shown a very brief and simple expect script. You can build in a
> lot
> > more error checking functionality into this that would greatly improve
> the
> > functionality of the script. As is seen it will continue to loop thru
> > username/password until it gets to the enable prompt and then it will
> issue
> > the commands needed.
> >
> >
> >
> > Regards,
> >
> >
> >
> > Tyson Scott - CCIE #13513 R&S and Security
> >
> > Technical Instructor - IPexpert, Inc.
> >
> >
> > Telephone: +1.810.326.1444
> > Cell: +1.248.504.7309
> > Fax: +1.810.454.0130
> > Mailto: tscott@ipexpert.com
> >
> >
> >
> >
> >
> > *From:* shiran guez [mailto:shiranp3@gmail.com]
> > *Sent:* Thursday, January 22, 2009 11:02 AM
> > *To:* Tyson Scott
> > *Cc:* testing testing123; ccielab@groupstudy.com
> > *Subject:* Re: script to log into cisco csm load balancer
> >
> >
> >
> > I use python as it is more flexible then expect and much easy syntax then
> > perl here is an real small exmple but you can actually do what you
> described
> > you need in not much more code lines:
> >
> > ============================================================
> >
> > #!/usr/bin/python
> >
> >
> >
> > import getpass
> > import sys
> > import telnetlib
> >
> >
> >
> > HOST = raw_input("Enter your remote address: ")
> > user = "user"
> > password = "pass"
> > enable = "enapass"
> >
> > tn = telnetlib.Telnet(HOST)
> >
> > tn.read_until("Username: ")
> > tn.write(user + "\n")
> > if password:
> > tn.read_until("Password: ")
> > tn.write(password + "\n")
> >
> > tn.write("enable\n")
> > if password:
> > tn.read_until("Password: ")
> > tn.write(enable + "\n")
> > tn.write("show ip int b | ex una\n")
> > tn.write("exit\n")
> >
> > print tn.read_all()
> >
> > ========================================================
> >
> >
> >
> >
> >
> > Good luck
> >
> > On Wed, Jan 21, 2009 at 1:02 AM, Tyson Scott <tscott@ipexpert.com>
> wrote:
> >
> > Perl or Expect will provide you the greatest functionality and
> > customization
> > in my opinion. Perl has a lot more examples that you can easily obtain
> off
> > of the internet. Expect is a great tool for network admins.
> >
> > Regards,
> >
> > Tyson Scott - CCIE #13513 R&S and Security
> > Technical Instructor - IPexpert, Inc.
> >
> > Telephone: +1.810.326.1444
> > Cell: +1.248.504.7309
> > Fax: +1.810.454.0130
> > Mailto: tscott@ipexpert.com
> >
> >
> >
> > -----Original Message-----
> > From: nobody@groupstudy.com [mailto:nobody@groupstudy.com] On Behalf Of
> > testing testing123
> > Sent: Tuesday, January 20, 2009 5:27 PM
> > To: ccielab@groupstudy.com
> > Subject: script to log into cisco csm load balancer
> >
> > What language should I use to write a script to log into my cisco csm
> > load balancer and check the usage ? The place I work for doesn't have
> > any industry tools like HP Openview, CIscoworks, solarwinds, or
> > anything like that. I want it to log into the csm once every half
> > hour and check the connections of the serverfarms and export it to a
> > spreadsheet that will automatically graph that data.
> >
> > thanks
> >
> >
> > Blogs and organic groups at http://www.ccie.net
> >
> > _______________________________________________________________________
> > Subscription information may be found at:
> > http://www.groupstudy.com/list/CCIELab.html
> >
> >
> > Blogs and organic groups at http://www.ccie.net
> >
> > _______________________________________________________________________
> > Subscription information may be found at:
> > http://www.groupstudy.com/list/CCIELab.html
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > --
> > Shiran Guez
> > MCSE CCNP NCE1 JNCIA-ER CCIE #20572
> > http://cciep3.blogspot.com
> > http://www.linkedin.com/in/cciep3
> >
>
>
>
> --
> Shiran Guez
> MCSE CCNP NCE1 JNCIA-ER CCIE #20572
> http://cciep3.blogspot.com
> http://www.linkedin.com/in/cciep3
>
>
> Blogs and organic groups at http://www.ccie.net
>
> _______________________________________________________________________
> Subscription information may be found at:
> http://www.groupstudy.com/list/CCIELab.html

Blogs and organic groups at http://www.ccie.net



This archive was generated by hypermail 2.1.4 : Sun Mar 01 2009 - 09:43:39 ARST