home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
scripts
/
ckermit
/
malphapage.~1~
< prev
next >
Wrap
Text File
|
2004-07-25
|
11KB
|
362 lines
#!/usr/local/bin/kermit8
; --------------------------------------------------------------------
;
; cook2.ksc
;
;
; Author
; ------
; R. M. Almeria, Anteon Corp., 2003
;
;
; Purpose
; -------
; This kermit script is designed to take 1 to N times two arguments
; (a pager-id and a message) and to connect to Arch's paging service
; via a modem using their special service number.
;
; So you can basically connect to the service and issue several pages
; or just one. You could send a message to someone's pager like so:
;
; cook2.ksc 4441111 "hello world"
;
; or you could send multiple messages to multiple pagers like so:
;
; cook2.ksc 4441111 "test1" 4442222 "test2" 4443333 "test3"
;
;
; Special Remarks
; ---------------
; This program implements the TAP (Telocator Alphanumeric Protocol)
; for pagers.
;
;
; Language
; --------
; This program is written in Kermit script. Please read the book
; "Using C-KERMIT" by Frank da Cruz et al., for more details.
;
;
; Revision History
; ----------------
; v1.1 -- February 5, 2003 @ 3:48 PM
; Added copious debug statements that are toggled (0/1) via
; the DEBUG constant (it is defined in the initialization section).
;
; v1.0 -- January 28, 2003 @ 5:55 PM
; Initial revision.
;
; --------------------------------------------------------------------
; --------------------------------------------------------------------
; Check the number of command line arguments and exit if insufficient.
; --------------------------------------------------------------------
xif < \v(args) 4 {
echo \10This kermit8 paging script accepts unlimited alphanumeric-
pager-id/message pairs.\10
echo {SYNTAX:\10\9cook2.ksc pagerid1 message1 pagerid2 message2-
pagerid3 message3 . . . \10}
echo { EX:\10\9./cook2.ksc 9992322 "Hello World!"\10}
exit
}
; --------------------------------------------------------------------
; Define the SendBlock function which sends a message (block) to the
; paging service. This function is also called initially to send the
; first message.
; --------------------------------------------------------------------
def SENDBLOCK {
local \%b \%c \%s blk
; Create a string composed of the pager-id and message with
; appropriate control chars.
assign \%b \2\&p[\%m]\13\&m[\%m]\13\3
; Calculate the checksum required for TAP and add to the final
; message string that will be sent to the paging service.
assign \%c \fchecksum(\%b)
assign blk \%b\fchar(\fmod(\%c/256,16)+48)\fchar(\fmod(\%c/16,16)+48)\fchar(\fmod(\%c,16)+48)\13
assign \%s \flength(blk)
; Make sure that the size of the block is less than MaxBlockSize.
xif < \%s \%y {
if \m(DEBUG) echo {DEBUG: {SENDBLOCK} Sending '\&m[\%m]' to '\&p[\%m]'}
output \m(blk)
return 1
} else {
return 0
}
}
; --------------------------------------------------------------------
; Define the SendNextBlock function which sends the second thru last
; messages (blocks) to the paging service (one block sent per
; function call). This function calls SendBlock to send its messages.
; --------------------------------------------------------------------
def SENDNEXTBLOCK {
xif < \%m+1 \%n {
; There are still messages to send so send them.
assign \%q 0 ; Reset the retries counter.
assign \%m \feval(\%m + 1)
sendblock
return \v(return)
} else {
; We are done with the paging service so disconnect.
output \4\13 ; Send <EOT><CR>
if \m(DEBUG) echo {DEBUG: {SENDNEXTBLOCK} Sending <EOT><CR>.}
input 3 {\27\4\13} ; Look for <ESC><EOT><CR>
assign \%f 1 ; Set Finished to true.
return 0
}
}
; --------------------------------------------------------------------
; Define the TAP (Telocator Alphanumeric Protocol) function.
; --------------------------------------------------------------------
def SENDTAPMSG {
assign \%o \6\13 ; OK = <ACK><CR>
assign \%t \21\13 ; TRY AGAIN = <NAK><CR>
assign \%a \30\13 ; ABANDON = <RS><CR>
assign \%d \27\4\13 ; DISCONNECT = <ESC><EOT><CR>
assign \%x 0 ; Initialize the loop variable.
assign \%f 0 ; Initialize Finished flag to false.
assign \%w 5 ; Initialize MaxIDAttempts.
:dowhile
; Look for 'ID=' string for at least MaxIDAttempts before exiting.
xif = \%f 0 {
xif < \%x \%w {
output \13
input 3 {ID=}
xif success {
assign \%f 1
} else {
assign \%x \feval(\%x + 1)
}
goto dowhile
}
}
; Exit if we didn't get the 'ID=' string.
xif = \%f 0 {
assign \%e 0
end
}
assign \%q 0 ; Initialize protocol Retries and NOT dialing retries.
assign \%u 1 ; Initialize First to true.
assign \%f 0 ; Reset Finished to false.
assign \%v 0 ; Initialize SentBlock to false.
assign \%y 233 ; Define MaxBlockSize. Typically 256 according to the
; protocol but Cook limits this to 233.
assign \%z 3 ; Define MaxRetries.
while = \%f 0 {
xif = \%u 1 {
xif < \%q \%z {
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} Sending <ESC>PG1<CR>.}
; Tell the paging service that we want to send an
; alphanumeric page.
output {\27PG1\13} ; Sending <ESC>PG1<CR>
; Wait for a response from the paging service...
; either OK, TRY AGAIN, DISCONNECT, 'ID=' or
; TIMEOUT.
minput 3 {\%o} {\%t} {\%d} {ID=}
switch \v(minput) {
:0, break ; TIMEOUT
:1, ; OK = <ACK><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} Received OK.}
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} Waiting for <ESC>[p<CR>.}
; Wait for the go-ahead from the paging service.
input 3 {\27[p\13}
xif success {
msleep 500
xif < \%m \%n {
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} Calling SENDBLOCK.}
sendblock ; Send first block.
assign \%v \v(return)
assign \%u 0
} else {
assign \%f 1 ; Set Finished to true.
}
} else {
assign \%f 1 ; Set Finished to true.
}
break
:2, ; TRY AGAIN = <NAK><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} Received TRY AGAIN.}
break
:3, ; DISCONNECT = <ESC><EOT><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} Received DISCONNECT.}
assign \%f 1 ; Set Finished to true.
break
:4, break ; Received 'ID=' send <ESC>PG1<CR> again
}
; Increment the Retries counter.
assign \%q \feval(\%q + 1)
} else {
assign \%f 1 ; Set Finished to true.
}
} else {
; Look for the response to the first and succeeding blocks that
; were sent to the paging service. We are waiting for an OK,
; ABANDON, TRY AGAIN, DISCONNECT or TIMEOUT response.
minput 3 {\%o} {\%a} {\%t} {\%d}
switch \v(minput) {
:0, break ; TIMEOUT
:1, ; OK = <ACK><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} - Received OK.}
msleep 500
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} - Calling SENDNEXTBLOCK.}
sendnextblock
assign \%v \v(return)
break
:2, ; ABANDON = <RS><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} - Received ABANDON.}
msleep 500
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} - Calling SENDNEXTBLOCK.}
sendnextblock
assign \%v \v(return)
break
:3, ; TRY AGAIN = <NAK><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} - Received TRY AGAIN.}
msleep 500
xif = \%v 1 {
xif < \%q \%z {
sendblock
assign \%v \v(return)
; Increment the retries counter.
assign \%q \feval(\%q + 1)
} else {
sendnextblock
assign \%v \v(return)
}
} else {
sendnextblock
assign \%v \v(return)
}
break
:4, ; DISCONNECT = <ESC><EOT><CR>
if \m(DEBUG) echo {DEBUG: {SENDTAPMSG} - Received DISCONNECT.}
assign \%f 1 ; Set Finished to true.
break
}
}
}
xif < \%m+1 \%n {
assign \%e 0 ; Return false (Didn't send all messages due to errors).
} else {
assign \%e 1 ; Return true (We sent all of the messages).
}
}
; --------------------------------------------------------------------
; Initialization.
; --------------------------------------------------------------------
assign DEBUG 1
; Calculate the number of messages to send.
assign \%n \feval( (\v(args) - 2)/2)
declare \&p[\%n] ; Declare the pager-id array.
declare \&m[\%n] ; Declare the message array.
; Populate the pager-id and message arrays with the args.
for \%x 0 \%n-1 1 {
assign \%i \feval(2 + (\%x * 2)) ; Compute the pager-id index.
assign \%j \feval(3 + (\%x * 2)) ; Compute the message index.
assign \&p[\%x] \&@[\%i] ; Add pager-id to pager-id array.
assign \&m[\%x] \&@[\%j] ; Add message to message array.
}
assign \%m 0 ; Initialize message index (MIndex).
assign \%r 0 ; Initialize the Reconnects counter.
assign \%s 3 ; Define MaxReconnects.
assign COOKPDX 9,5037783050 ; Define the service's portland
; area phone number.
assign \%e 0 ; Initialize TAP Error Flag to false.
; --------------------------------------------------------------------
; Try to connect to the paging service.
; --------------------------------------------------------------------
:restart
if \m(DEBUG) echo {\10DEBUG: RESTART NO. \%r}
set modem hangup-method modem-command
if \m(DEBUG) echo {DEBUG: Issuing initial HANGUP.}
hangup
if \m(DEBUG) echo {DEBUG: Setting modem type}
set modem type att-dataport
if \m(DEBUG) echo {DEBUG: Setting the port to '/dev/cua/4'}
set port /dev/cua/4
xif failure {
echo {ERROR: I could not connect to /dev/cua/4}
goto terminate
}
if \m(DEBUG) echo {DEBUG: Setting up the terminal.}
set speed 2400
set parity even
set stop-bits 1
set flow-control xon/xoff
set modem flow none
set modem error-correction off
set modem data-compression off
set modem speed-matching off
;set carrier-watch off
set output pacing 200
set dial retries 5
set dial interval 1
if \m(DEBUG) echo {DEBUG: DIALING....}
dial \m(COOKPDX)
xif success {
if \m(DEBUG) echo {DEBUG: Calling SENDTAPMSG.}
sendtapmsg
xif = \%e 0 {
xif < \%r \%s {
xif < \%m \%n {
assign \%r \feval(\%r + 1)
goto restart
}
}
}
}
:terminate
if \m(DEBUG) echo {DEBUG: Hanging up.}
hangup
if \m(DEBUG) echo {DEBUG: Exiting.}
exit