home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
ckscripts.tar.gz
/
ckscripts.tar
/
modemtest2
< prev
next >
Wrap
Text File
|
2001-02-23
|
15KB
|
431 lines
#!/usr/local/bin/kermit +
#
# m o d e m t e s t 2
#
# Modem test and statistics -- Works on Windows, UNIX, and VMS.
#
# Requires C-Kermit 7.1
# F. da Cruz, Columbia University, Feb 2001
#
# Sometimes it's easier to hardwire the parameters...
#
.device = com1
.modem = usr
.speed = 115200 ; For USR v.34 use 57600 and for V.90 use 115200
.origin = 212-316-3982
.\%1 = watsun
.\%2 = fdc
.\%3 = test.zip
; Note: phone numbers are fake
dcl \&n[] = 5551234 5551235 5551236 5551237 5551238 5551239 5551240 -
5551241 5551242 5551243 5551244 5551245 5551246 5551247
; Array of terminal server names
dcl \&p[] = ccts1 ccts2 ccts3 ccts4 ccts5 ccts6
.\%n := \fdimension(&n) ; Number of numbers
; Array of terminal server prompts (= name with ">" appended)
dcl \&q[\fdim(&p)]
for \%i 1 \fdim(&p) 1 {
.\&q[\%i] := \&p[\%i]>
}
; This script takes great care to recover from errors so it can run
; unattended for long periods of time and to record whatever data it got
; on each run even if the session terminated prematurely.
;
; As written, this script assumes a Cisco terminal server that has a
; "terminal autohangup" command. SET CARRIER-WATCH is OFF at first, so we
; can query and then dial the modem. After successful dialing, we set it
; ON so we can catch disconnections promptly. We also send "terminal
; autohangup" to the Cisco so when the host session terminates (as it
; should when we send it a BYE command), the terminal server hangs up the
; modem. All i/o's are tested for success or failure. Once the data
; transfer phase is complete, we SET CARRIER-WATCH OFF again so we can
; query the modem for stats.
;
; Modem queries are supported for US Robotics and Compaq modems, and
; tested with USR V.34 and "V.Everything" 56K, and Compaq Presario 56K-DF.
;
define badversion echo C-Kermit 7.1 or K95 1.1.21 or later required, exit
if LLT \v(version) 701199 badversion
if not def \v(buildid) badversion
if LLT \v(buildid) 20001116 badversion
; local model firmware \%i \%j
; local debug retrains blers ispeed ospeed
; local user pass host file upcps dncps head tsport seq
; Configuration parameters -- change as needed (*)
;; LOG SESSION session.log append ; (*) uncomment for extra debugging
SET DIAL TIMEOUT 30
SET SEND TIMEOUT 6 FIXED
SET INPUT BUFFER-LENGTH 10240
.debug = 1 ; (*) Change to 0 for minimal messages
.logfile = modem.log ; (*) Log file name
switch \v(system) { ; Device and modem defaults...
:win32 ; For Windows 95/98/NT/2000
if not def device .device = tapi ; (*) Change if necessary
if not def modem .modem = tapi ; (*) Ditto
if not def speed .speed = 115200 ; (*) Port speed - change if necessary
break
:unix ; For UNIX...
if not def device .device = /dev/cua ; (*) Change to your dialout device
if not def modem .modem = usrobotics ; (*) Change to match your modem
if not def speed .speed = 115200 ; (*) Port speed - change if necessary
break
:vms ; For VMS...
if not def device .device = TTA0: ; (*) Change to your dialout device
if not def modem .modem = usrobotics ; (*) Change to match your modem
if not def speed .speed = 57600 ; (*) Port speed - change if necessary
break
:default
; Add others here...
exit 1 Sorry - this script does not run on \v(platform).
}
if not def origin .origin = UNKNOWN
.model = UNKNOWN ; Modem model
.firmware = UNKNOWN ; Modem firmware
if def \%1 .host := \%1 ; Accept host, user, and filename
if def \%2 .user := \%2 ; from command line (UNIX only)
if def \%3 .file := \%3 ; or from TAKE command line.
; Macro definitions
def usrinfo { ; Get info about USR modem
; If we weren't cheating we'd do ATI6 and parse the results.
; See usrgetstats for a non-cheating example.
; Meanwhile change the strings to match your own modem.
if eq "\v(speed)" "115200" {
.model = USRobotics Courier V.Everything V.90
.firmware = 7.3.14 / 3.0.13
} else {
.model = USRobotics Courier V.32bis V.34+ Fax
.firmware = 6.2.3 / 1.2.4
}
}
def cpqinfo { ; Get info about Compaq modem
; If we weren't cheating we'd do ATI and parse the results.
; See cpqgetstats for a non-cheating example.
; Meanwhile change the strings to match your own modem.
.model = Compaq Presario 56K-DF
.firmware = 1.3.12
}
def getmdminfo { ; Get modem info.
switch \v(modem) {
:usrobotics
usrinfo, break
:tapi
:compaq
cpqinfo, break
}
}
; Get and parse a statistics report from a USR modem.
; This version parses the report on the fly.
def usrstats { ; Get USR connection statistics.
local \%x \%y \%z
clear input
output ATI6\13 ; Send ATI6 and parse output.
set flag off
set input echo on
while not flag {
minput 10 Blers Retrains Speed OK
switch \v(minput) {
:1, clear input, input 2 \10, .blers := \fword(\v(input),1), break
:2, clear input, input 2 \10, .retrains := \fword(\v(input),5), break
:3, clear input, input 2 \10, .ospeed := \fword(\v(input),1,,/), break
:4, set flag on, break
}
}
}
; Get and parse a statistics report from a USR modem.
; This version (which works but is not used) reads the whole report at
; once and parses it afterwards. The Compaq report parser (next macro)
; also uses this method.
def xusrstats { ; Get USR connection statistics.
local \%x \%y \%z
clear input
output ATI6\13 ; Send ATI6 and parse output.
input 20 OK
if fail end 1
.\%x := \findex(Retrains Granted,\v(input))
if \%x .retrains := \fword(\fsubstr(\v(input),\%x),3)
.\%x := \findex(Blers,\v(input),\%x+16)
if \%x .blers := \fword(\fsubstr(\v(input),\%x),2)
.\%x := \findex(Speed,\v(input),\%x+16)
if \%x .ospeed := \fword(\fsubstr(\v(input),\%x),2,,/)
}
; Get and parse a statistics report from a Compaq modem.
; This version reads the whole report at once and parses it afterwards.
def cpqstats { ; Get Compaq connection statistics.
local \%x \%y \%z
clear input
output ATI11\13 ; Send ATI11 and parse output.
if fail end 1
input 6 ESC to quit.
if fail end 1
output {\32} ; Tickle "press any key to continue"
minput 20 OK {NO CARRIER}
if fail end 1
.\%x := \findex(Final Transmit Carrier Rate,\v(input))
if \%x .\%y := \fword(\fsubstr(\v(input),\%x),5)
.\%x := \findex(Final Receive Carrier Rate,\v(input))
if \%x .\%z := \fword(\fsubstr(\v(input),\%x),5)
if \%x .ospeed := \%y/\%z
.\%x := \findex(Receive Frame Error Count,\v(input))
if \%x .blers := \fword(\fsubstr(\v(input),\%x),5)
.\%x := \findex(Retrain by Local Modem,\v(input))
if \%x .retrains := \fword(\fsubstr(\v(input),\%x),5)
}
def getmdmstats { ; Get modem connection statistics.
switch \v(modem) {
:usrobotics
usrstats, break
:tapi
:compaq
cpqstats, break
}
}
def openlog { ; Open the log file and write heading
fopen /append \%c \m(logfile)
if fail exit 1 Can't open log "\m(logfile)"
fwrite \%c
fwrite \%c {Time: \v(date) \v(time)}
fwrite \%c {Platform: \v(platform)}
fwrite \%c {Software: \v(xprogram) \v(xversion)}
fwrite \%c {Modem: \m(model)}
fwrite \%c {Firmware: \m(firmware)}
fwrite \%c {Interface Speed: \m(speed)}
fwrite \%c {Calling from: \m(origin)}
fwrite \%c {Log File: \m(logfile)}
fwrite \%c {Test File: \m(file)}
fwrite \%c {Test File Size: \fsize(\m(file))}
fwrite \%c
fwrite /string \%c {Date Time Number Line Speed Speed-After }
fwrite \%c {Blers Retr Upload Dnload}
fwrite /string \%c {---------- ------- -------- ----- ----------- }
fwrite \%c {----- ---- ------ ------}
fclose \%c
}
define logrecord { ; Write a log entry
if \f_status(\%c) fclose \%c
fopen /append \%c \m(logfile)
if fail exit 1 LOG OPEN FAILURE: "\m(logfile)"
fwrite \%c {\m(head) \%1}
if fail exit 1 LOG WRITE FAILURE: "\m(logfile)"
fclose \%c
if \m(debug) { echo, echo {\m(head) \%1} }
}
define dologin { ; Login from terminal server to host
output telnet \m(host)\13 ; and start Kermit in server mode there.
input 40 login:
if fail end 1
out \m(user)\13
input 20 Password:
if fail end 1
out \m(pass)\13
input 90 {$ }
output kermit -x\13
input 60 READY TO SERVE...
if fail end 1
}
def xmsg { ; Send message to file transfer display
if not def \v(buildid) end
if llt \v(buildid) 20001116 end
set xfer message \m(seq): \v(dialnumber) (\m(tsport)) \v(time)
}
def doio { ; Transfer a file back & forth
local rc ; and get performance statistics
.rc = 1
while exist \m(file) {
remote cd /tmp
if fail break
remote set file collision overwrite
do xmsg
send \m(file) delete.me
if fail break
.upcps := \v(cps)
do xmsg
get delete.me
if fail break
.dncps := \v(cps)
.rc = 0
break
}
if not open connection end 1
bye
end \m(rc)
}
; End of macro definitions
while not def host { ; Get hostname
ask host { Host: } ; if not given on command line...
}
while not def user { ; Ditto for username...
ask user { User: }
}
while not def pass { ; Always prompt for password.
askq pass { Password: }
}
while not def file { ; Get filename if not given
ask file { File to transfer: } ; on command line.
if exist \m(file) break
echo \m(file) not found.
}
if not equal "\m(device)" "tapi" { ; Except in K95...
set modem type \m(modem) ; Specify modem type
if fail { ; Check for error
exit 1 {Error: Modem type "\m(modem)" not known}
}
}
set carrier off ; Don't require carrier yet
set line \m(device) ; Open the device
if fail { ; Check for failure
exit 1 {Error: \m(device) not available}
}
set speed \m(speed) ; Set the desired speed
getmdminfo ; Get modem info
set xfer bell off ; Turn off annoying bell
if \m(debug) { ; Echo parameters for this run...
echo { Device: \m(device)}
echo { Speed: \m(speed)}
echo { Modem: \m(modem)}
echo { Model: \m(model)}
echo { Firmware: \m(firmware)}
echo { Host: \m(host)}
echo { User: \m(user)}
echo { Password: \frepeat(*,\flen(\m(pass)))}
echo { File: \m(file)}
echo { Size: \fsize(\m(file))}
set modem speaker on
set dial display on
set input echo on
set xfer display full
} else {
set modem speaker off
set dial display off
set input echo off
set quiet on
set xfer display brief
}
; Device is open...
set dial retries 0 ; No redialing
set dial speed-matching off ; No speed changing
def on_exit hangup ; In case of Ctrl-C
set exit warning off ; In case of misconfigured modem
set file collision overwrite ; Don't pile up lots of backup files
set bell off ; Silence please
if \m(debug) show comm
openlog ; Start logging
.seq = 0 ; Call number
while true { ; Loop till user types something
for \%i 1 \%n 1 { ; Call each phone number
incr seq ; Count this call
.status = ERRORS ; Assume there will be errors (for msg)
set carrier off ; For dialing
.\%9 := \fcvtdate(\v(date) \v(time))
.date := \fsubstr(\%9,5,2)/\fsubstr(\%9,7,2)
.time := \fsubstr(\%9,10,2)\fsubstr(\%9,13,2)
.head := \m(date) \m(time) \&n[\%i]
clear dial-status
dial \&n[\%i]
if fail {
switch \v(dialstatus) {
:8, logrecord {FAILED: Timed out}, break
:9, logrecord {FAILED: User canceled}, stop
:10, logrecord {FAILED: Modem not ready}, break
:default, logrecord {FAILED: "\v(dialresult)"}, break
}
continue
}
set carrier on ; For logging in and file transfer
.ispeed := \fword(\v(dialresult),2) ; Speed from CONNECT message
clear input
.\%x := 0
for \%j 1 10 1 { ; Get terminal server herald
output \13
xecho {#}
minput 10 \fjoin(&q,,2)
if success break
}
if > \%j 10 {
logrecord {FAILED: No terminal server prompt}
continue
}
.tmp := \v(input)
.\%x = \v(minput)
.\%y = \findex({\&p[\%x] line },\m(tmp))
.tsport = UNK
if > \%y 0 {
.tsport := \flpad(\fword(\s(tmp[\%y]),3),3,0)
}
.server := \&p[\%x]
.tsport := \m(server):\m(tsport)
.head := \m(head)\flpad(\m(tsport),12)
.upcps = FAILED
.dncps = FAILED
lineout term autohangup
minput 6 \fjoin(&q,,2)
if success {
dologin
if success doio
if success .status = OK
}
pause 1
set carrier off ; For getting modem statistics
hangup ; Hang up modem but don't close
pause 1
.retrains = UNK
.blers = UNK
.ospeed = UNKNOWN
output AT\13 ; Make sure we're in command mode.
input 3 OK
if success getmdmstats ; We are - Get statistics from modem.
.\%7 := \flpad(\m(ispeed),5)\flpad(\m(ospeed),13)
.\%8 := \flpad(\m(blers),6) \flpad(\m(retrains),4)
.\%9 := \flpad(\m(upcps),6) \flpad(\m(dncps),7)
logrec {\%7 \%8 \%9} ; Write log record
set ask-timer 5
echo
echo {----------------------------------------}
echo PASS \m(seq) DONE (\m(status))...
clear keyboard-buffer
getc \%j {PRESS ANY KEY WITHIN 5 SECONDS TO QUIT: }
echo {----------------------------------------}
if not asktimeout stop
set ask-timer 0
echo
echo Continuing...
}
}
exit