home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
ckscripts
/
gethpconfig
< prev
next >
Wrap
Text File
|
2020-01-01
|
7KB
|
185 lines
#!/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: