[ad name=”ad-articlebodysq”]In one of my previous posts entitled, Network Time Protocol (NTP), I discussed how to setup a network time protocol sever and how to configure the Nortel Ethernet Switch and Ethernet Routing Switches for NTP including Daylight Saving Time (DST) support.
I recently received a message from someone looking for someway to automated the re-configuration of over 100 switches with the correct Daylight Saving Time configuration. I explained to the person that the best long term solution would probably be to use the SNMP MIB but a quick and dirty solution might be to use Expect and call it from a Bash script looping over all the switches that needed to be re-configured. In short Expect is a scripting language that mimics user input at a TTY. The Except script is written to issue a set of commands, as if a human were typing them, and expects various responses.
The script I wrote below only support a limited number of switches. If you have a particular switch you’re welcome to modify the script to support that particular switch. The script will attempt to determine if the switch is running the software that has the features we’re looking to implement. I didn’t have a whole lot of time to test so buyer beware!
Here’s the expect script that I authored;
#!/usr/bin/expect -f # ############################################################################## # # Filename: /usr/local/etc/set-nortel-timezone.exp # # Purpose: Expect script designed to telnet into Nortel Ethernet Switches # and execute the CLI commands to confgure the appropriate timezone # information, including Day Light Saving time. # # Switches: Ethernet Switch 460 v3.7.x # Ethernet Switch 470 v3.7.x # Ethernet Switch 4500 v5.2.x # Ethernet Switch 5500 v5.1.x # # Author: Michael McNamara # # Date: June 1, 2008 # # Version: 1.1 # # Changes: # # June 8, 2008 (M.McNamara) # - added documentation and ARGV command line checks # June 14, 2008 (M.McNamara) # - added check for switch version and exit if v3.6 switch software # - added check for Username introduced in v3.7 switch software # # ############################################################################## # # This Expect script was generated by autoexpect on Wed Jul 27 17:25:28 2005 # Expect and autoexpect were both written by Don Libes, NIST. # set force_conservative 1 ;# set to 1 to force conservative mode even if ;# script wasn't run conservatively originally if {$force_conservative} { set send_slow {1 .1} proc send {ignore arg} { sleep .1 exp_send -s -- $arg } } if {[llength $argv] != 2} { puts "usage: set-nortel-timezone.exp < SWITCH > < PASSWORD >>" exit 1 } # set PATH "/usr/local/etc/" set TELNET "/usr/bin/telnet" set SWITCH [lindex $argv 0] set PASSWORD [lindex $argv 1] set TODAY [timestamp -format %y%m%d ] set WEEKDAY [timestamp -format %a ] set DATE [timestamp -format %c ] set send_human {.1 .3 1 .05 2} #log_file $PATH/$SWITCH.expect.log log_file /usr/local/etc/password.expect.log log_user 0 # Disable logging to STDOUT #log_user 1 # Enable logging to STDOUT set timeout 10 spawn $TELNET $SWITCH match_max 100000 expect "Trying" expect { "Connected" { expect "SW:v3.6" { send_log "\n\nThis version of software doesn't support the CLI commands!\n" send_user "\n\nThis version of software doesn't support the CLI commands!\n" exit 1 } sleep 1 send -- "" } Timeout { send_log "We're unable to connect to the switch $SWITCH" send_user "We're unable to connect to the switch $SWITCH" exit 1; } } expect { "Username" { send -- "RW\r" } } expect "Enter Password" send -- "$PASSWORD\r" expect { "Main Menu" { } "Incorrect Password" { send_log "$SWITCH : Incorrect Password" exit 1 } "Incorrect Credentials" { send_log "$SWITCH: Incorrect Credentials" exit 1 } } sleep 1 # Let's get into the CLI interface from the menu prompts send -- "C" # Depending on the version of software we sometimes need a CR/LF send -- "\r" sleep 1 # Let's wait for the CLI prompt which includes the # expect "#" send -- "config term\r" send -- "clock time-zone EST -5\r" send -- "clock summer-time EDT date 9 Mar 2008 2:00 2 Nov 2008 2:00 +60\r" send -- "exit\r" send -- "logout\r" expect eof
You can download the entire Expect script from this URL; set-nortel-timezone.exp.
The command line arguments are fairly straight forward;
usage: set-nortel-timezone.exp <SWITCH> <PASSWORD>
Where the SWITCH is the fully qualified domain name (FQDN) or the IP address of the switch in question and the PASSWORD is the Read-Write password for the switch.
If you had hundreds of switches to reconfigure you could wrap this Except script in a Bash shell script similar to the following;
#!/bin/bash # ##################################################################### # # Language: Bash Shell Script # # Filename: /usr/local/etc/set-nortel-timezone.sh # # Purpose: This script will kickoff the Expect script that will # configure the Daylight Saving Time features for each switch # # Author: Michael McNamara # # Date: June 1, 2008 # # Version: 1.0 # # Changes: # # June 10, 2006 (M.McNamara) # - added remote sites into shell script processing # ##################################################################### # # Variables PATH_TO=/usr/local/etc UPGRADE=set-nortel-timezone.exp MAIL_LIST='' PAGER_LIST='' ERROR_FLAG=0 MAILEXE='/usr/bin/mutt' LOCKFILE=/tmp/trace.lck # Check paramaters if [ "$#" != 2 ] then echo "Usage: `basename $0` <password>" exit 1 fi PASSWORD=$1 ##################################################################### ##################################################################### # YOU SHOULD EDIT THE "SWITCHES" VARIABLE BELOW TO INCLUDE ALL THE # SWITCHES THAT YOU WISH TO HAVE THE EXPECT SCRIPT RUN AGAINST ##################################################################### ##################################################################### SWITCHES='sw1-5520.acme.org sw2-5520.acme.org sw3-5520.acme.org' for SWITCH in $SWITCHES do $PATH_TO/$UPGRADE $SWITCH $PASSWORD done exit
You can download the Bash shell script from this URL; set-nortel-timezone.sh.
I’ve only tested this on CentOS v5.2 but it should work on any Linux host with Expect installed although you may need to modify the path locations.
Cheers!
David Ryba says
Hi,
I’m looking for a script to change password of lot of “RW passowrd” on ers25xx-T-pwr.
I find your script very intersting, and I looking for modify your’script to do it.
Do you think it’s possible ? Perhaps you have already make it or can you help me to do it ?
Best regards,
David.
P.S : sorry for my poor english.
Michael McNamara says
Hi David,
You could most certainly modify the Expect script above to change the password. You may need to tweak the script right after the login portion since we’re checking for a specific version of software on the ES 460/470 switches.
Instead of setting the time just change the commands to the following;
cli password read-only readpass
cli password read-write writepass
Just replace “readpass” and “writepass” with whatever password you wish.
Good Luck!
Maik Garbade says
Hey,
how to modify this script to connct to a switch without password … i have to input ctrl-y to get next step
Best regards,
Maik
Maik Garbade says
solved
i generated my own script with autoexpect.
thx
Michael McNamara says
Hi Maik,
You’ve got to really appreciate autoexpect… great script!
Cheers!
Franck says
Hello, on switch Nortel Ethernet Routing Switch 4548GT-PWR, I need “Enter Ctrl-Y to begin” to go next step
But it will not work in my expect script.
could you please give me your script ?
thanks
Franck
Michael McNamara says
When I converted this document to TXT/HTML it looks like the Ctrl-Y was lost in the translation. You need to insert a Ctrl-Y into your Expect script. Assuming you are using VI you can do this pretty ease. You can also use autoexpect to record your keystrockes and then just cut-n-paste that value using VI.
Good Luck!