home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/kermit +
- #
- # Script gethpconfig - Get and save configuration of HP switch.
- # Requires C-Kermit 9.0 or later to filter out escape sequences.
- #
- # Give this file execute permission and change the first line
- # to indicate the full path of the C-Kermit executable followed by " +".
- #
- # Arguments:
- # 1. Name of file containing list of devices
- # 2. Access password for switches
- #
- # To make debugging and progress messages come out, set the environment
- # variable DEBUG to (say) 1:
- #
- # DEBUG=1 gethpconfig /somepath/devicefilename secretpassword
- #
- # Change the following command to indicate the directory where the
- # the device list file is and where the logs are to be created.
- #
- define directory /hplogs
-
- ############################################################################
- #
- # Everything from here down should be site independent...
-
- assign myname \fbasename(\v(cmdfile)) # Name of this file (without path)
-
- define errquit { # Fatal error handler
- if not def \%1 def \%1 Unspecified error
- if open connection close connection
- exit 1 "FATAL [\m(myname)] - \%1"
- }
- if llt "\v(version)" "900000" errquit "C-Kermit 9.0 or later required"
-
- # To enable debug messages define an environment variable DEBUG; e.g.:
- # DEBUG=1 gethpconfig filename password
- #
- if def \$(DEBUG) set debug message on # environment variable DEBUG defined.
-
- message Checking network...
- check network
- if fail errquit "This version of Kermit does not support network connections"
-
- message \m(myname) parameters: 0=\%0 1=\%1 2=\%2
- # 0=Script Name
- # 1=List of switches, or any CLI device category.
- # 2=Password.
-
- define usage exit 1 "Usage: \m(myname) devicelistfile password"
- if not def \%1 usage
-
- # Prompt for password if not given on command line
-
- while not def \%2 {
- askq /echo:* \%2 "Password: "
- }
- cd \m(directory) # Change to the right directory
- if fail errquit "\m(directory): \v(errstring)"
-
- # Try to open the specified device list file.
- # If it can't be opened, quit right here.
- #
- assign infile \fcontents(\%1) # Global copy of input file name
- assign passwd \fcontents(\%2) # and password
-
- fopen /read \%c \m(infile) # Open the list of devices
- if fail errquit {Device list file \m(infile): \v(errstring)}
-
- log cx ./GetSwitchConfig.cx.out # Create connection log
-
- set telopt start-tls refuse # Do not use START_TLS option
- set telopt authentication refuse # Do not use AUTH option
- set telopt encrypt refuse refuse # Do not use ENCRYPT option
- if debug set telnet debug on # Show telnet negotiations if debugging
-
- set exit on-disconnect off # Don't exit if connection broken
- set exit warning off # Don't give connection warning on exit
-
- set session-log text # Filter escape sequences from log
- set input buffer-length 16384 # Increase input buffer size
-
- # Display most recent record from the devicelist file (only when debugging)
- #
- define displayRecord {
- echo ....................Device Name: \m(deviceName)
- echo ....................Device Brand: \m(deviceBrand)
- echo ....................Device Make: \m(deviceMake)
- echo ....................Device IP: \m(deviceIP);
- }
-
- define n 0 # Record (switch) counter
-
- # Read a record from the devicelist file.
- # There are four lines in the file per device.
- # 1: Device name (appears in device's console prompt)
- # 2: Manufacturer (info only)
- # 3: Device Model
- # 4: IP address
- # 5: Blank line (end of record) or EOF: end of file
- #
- define readFileRecord {
- if \f_eof(\%c) {
- message \m(infile): EOF... \m(n) records processed.
- fclose \%c
- exit 0
- }
- fread /line \%c deviceName
- if fail errquit {\m(infile): Bad Device Name}
- fread /line \%c deviceBrand
- if fail errquit {\m(infile): Bad Device Brand}
- fread /line \%c deviceMake
- if fail errquit {\m(infile): Bad Device Make}
- fread /line \%c deviceIP
- if fail errquit {\m(infile): Bad DeviceIP}
- fread /line \%c blankLine
- if fail errquit {\m(infile): Bad blankLine}
- increment n
- if debug displayRecord
- }
- # commSession does the actual communication and logging.
-
- define commSession {
- lineout # Force a new line, even if switch flags password error.
- input 5 Password:
- if success {
- message Sending... \m(passwd)
- lineout \m(passwd)
- input 4 "\m(deviceName)# "
- if fail end 1 "Timeout [1]"
- message Asking for no page...
- lineout no page
- message Asking for configs...
- input 4 "\m(deviceName)# "
- if fail end 1 "Timeout [2]"
- message Setting session... \m(deviceName)
- lineout show config
- input 10 "Startup configuration:" # Wait for heading
-
- # Start logging now - this way we only see the 'show config' output
-
- assign logname ./output/\m(deviceName).pre_cfg
- log session \m(logname) new
- if fail errquit "Session log: \m(deviceName).pre_cfg: \v(errstring)"
- input 20 "\m(deviceName)# "
- if fail end 1 "Timeout [3]"
- close session # Close session log now
- lineout exit # exit from CLI
- input 4 "\m(deviceName)> "
- if fail end 1 "Timeout [4]"
- lineout exit
- input 4 "Do you want to log out [y/n]? "
- if fail { hangup, end 0 } # Don't worry if this fails
- lineout y
- }
- }
- while 1 {
- readFileRecord # Read info record for switch
- message "Connecting to host \m(deviceName) at \m(deviceIP)..."
- set host \m(deviceIP) 23 /telnet # Connect to switch console
- if fail { # On failure try the next one
- echo "WARNING - \v(lastcommand): Connection failed"
- continue
- }
- commSession # Success - get the config
- if fail { # On failure warn and try next
- local newname
- .newname := \freplace(\m(logname),pre_cf,CHECK_ME)
- echo "WARNING: Session \m(deviceName) did not end normally."
- xecho "Renaming \m(deviceName) to \m(newname)..."
- if open session close session # Close session log if still open.
- rename \m(logname) \m(newname) # Rename the log
- if fail { echo " [FAILED]" } else { echo " [OK]" }
- }
- }
- exit 0 # 0 = success
-
- # The following are for the EMACS text editor used to compose this script.
- # They are executed by EMACS but for the script itself they are comments.
-
- # Local Variables:
- # comment-column:40
- # comment-start:"# "
- # End:
-