#!/usr/local/bin/kermit + ; ; ALPHAPAGE 6.0 for C-Kermit 8.0.201, 206, or 209 (but not 208) ; F. da Cruz, The Kermit Project, Columbia University ; ; TAP/IXO alphanumeric paging script for C-Kermit. ; For a detailed explanation, consult "Using C-Kermit", 2nd Ed., pp.454-456. ; if LLT \v(version) 800201 stop 1 C-Kermit 8.0.201 or later required. if EQU \v(version) 800208 stop 1 - "Sorry - This script doesn't work in 8.0.208; please use 201, 206, or 209. ; Set defaults here. define d_LINE /dev/ttyb ; Device modem is attached to ; The following are critical - the script won't work unless ; all of them are set appropriately for the specific paging service, ; Verizon PCS in this example. define d_APAGEPHONE 18668230501 ; Paging service phone number (VERIZON PCS) define d_MODEM usrobotics ; Actual specific modem type define d_SPEED 1200 ; Serial port speed define d_PARITY EVEN ; Parity (usually EVEN or NONE) define d_FLOW NONE ; Flow control define d_PACING 0 ; Output character pacing (milliseconds) ; Other defaults define d_REDIALS 20 ; Allow 20 redials (IF LEGAL!) define d_TESTING 0 ; Set to 1 or 2 for debugging ; You can override defaults with Kermit variables or environment variables: if not def APAGEPHONE assign APAGEPHONE \$(APAGEPHONE) if not def APAGEPHONE asg APAGEPHONE \m(d_APAGEPHONE) if not def LINE assign LINE \$(LINE) if not def LINE asg LINE \m(d_LINE) if not def SPEED asg SPEED \$(SPEED) if not def SPEED asg SPEED \m(d_SPEED) if not def MODEM assign MODEM \$(MODEM) if not def MODEM asg MODEM \m(d_MODEM) if not def PARITY assign PARITY \$(PARITY) if not def PARITY asg PARITY \m(d_PARITY) if not def FLOW assign FLOW \$(FLOW) if not def FLOW asg FLOW \m(d_FLOW) if not def PACING assign PACING \$(PACING) if not def PACING asg PACING \m(d_PACING) ; ; WARNING: Automatic redialing is restricted or illegal in some ; countries. Modify the lines marked "IF LEGAL!" above if this applies ; in your location. ; assign REDIALS \$(REDIALS) if not def REDIALS asg REDIALS \m(d_REDIALS) if not def TESTING { assign TESTING \$(TESTING) if not def TESTING asg TESTING \m(d_TESTING) if not def TESTING asg TESTING 0 if not numeric \m(TESTING) asg TESTING 1 } ; TAPMSG, defined below, is an alphanumeric pager dialing script that ; implements the Telocator Alphanumeric Protocol (TAP), also known as IXO, ; for sending one-line alphanumeric pages. TAPMSG assumes the connection ; to the paging service is already made. ; ; The APAGE macro makes a connection to the paging service using the ; device, modem, and phone number definitions at the top of this file, ; and then invokes TAPMSG to send the page. ; ; INSTRUCTIONS ; ; Edit the defaults at the top of this file as needed. ; ; Change the top line to indicate the full pathname of the C-Kermit 8.0 ; executable if necessary, then store this file in your PATH with a name like ; "verizon", give it execute permission, and then you can run it by name from ; the shell prompt: ; ; verizon pagerid message ; ; Command-line args containing spaces must be quoted. Example: ; ; verizon 9876543 "This is a message" ; ; You can also pass the pagerid and message as environment variables instead ; of command-line arguments: ; ; export PIN=19177654321 ; export MESSAGE="Everything is broken - come and fix!" ; verizon ; ; To use different paging services, make copies of this file with the ; appropriate names and configuration changes, e.g. skytel with skytel's ; phone number, pagenet, whatever. ; ; EDIT HISTORY ; ; Version 1.0: Sept 1996, for C-Kermit 6.0. ; Version 2.0: July 1997: ; 1. To make TAPMSG fit into 1K for small C-Kermit versions. ; 2. Change END to STOP within SWITCH to work around C-Kermit bug. ; Version 3.0: September 1997, for C-Kermit 7.0 Beta. ; 1. Change STOP back to END because bug is fixed. ; 2. Added robustness. ; Version 4.0: August 1998: ; 1. Additional robustness - requires 2K command buffer. ; 2. Diagnostics. ; Version 5.0: May 2000, for C-Kermit 7.0: ; 1. Improved portability, parameterization, and error checking. ; Version 6.0: Mar 2003, for C-Kermit 8.0: ; 1. More debugging. ; 2. Accept environment variables as well as command-line args. ; 3. Parameterize output pacing -- it can make all the difference. ; if \m(TESTING) { ; Set up debugging messages and logs set quiet off echo TESTING=\m(TESTING) echo COMMAND FILE: \fpathname(\v(cmdfile)) echo EXEDIR: \v(exedir) ; where Kermit is running from set dial display on ; Watch computer/modem dialog set command byte 7 ; Filter out the 8th bit when debugging if > \m(TESTING) 1 { ; serious debugging log session ; Creates session.log in current directory log debug ; Creates debug.log in current directory set input echo on ; Watch input (can mess up your screen) } } ; APSETUP - Set up dialing device and modem. define APSETUP { ; Set up the calling parameters. set exit warning off ; No warnings on exit. if eq \v(system) WIN32 { ; In Windows use the default TAPI device. set port tapi if fail end 1 } else { ; Elsewhere... set modem type \m(MODEM) ; Specify the modem type. if fail end 1 Bad modem type: "\m(MODEM)" if eq "\v(modem)" "multitech" { set modem command init ATQ0E1X4&E8&Q0&S0$BA0$MB\m(speed)\13 set modem command error-correction off AT&E0\13 } set line \m(LINE) ; Specify dialout port. if fail end 1 Can't SET LINE to "\m(LINE)" } if \m(TESTING) { echo "PHONE: \m(APAGEPHONE)" echo "PORT: \m(LINE)" echo "MODEM: \m(MODEM)" echo "SPEED: \m(SPEED)" echo "PARITY: \m(PARITY)" echo "FLOW: \m(FLOW)" echo "PACING: \m(PACING)" } set term byte 7 ; Ignore the 8th bit - TAP is ASCII only set input echo off ; (this can confuse the terminal) set speed \m(SPEED) ; Speed required by paging service if fail stop 1 Bad SPEED - "\m(SPEED)" set parity \m(PARITY) ; Parity required by paging service if fail stop 1 Bad PARITY - "\m(PARITY)" set flow \m(FLOW) ; Flow control (usually NONE) if fail stop 1 Bad FLOW-CONTROL - "\m(FLOW)" set dial interval 1 ; 1 sec between redial attempts set dial retries \m(REDIALS) if fail stop 1 Bad DIAL RETRIES - "\m(REDIALS)" if \m(TESTING) show comm ; Let's see the modem signals } ; APAGE - Make the call and send the page. ; \%1 = Pager ID (PIN) ; \%2 = Message (single line) ; define APAGE { ; Call the paging service and send a page. local rc t ; rc = Return code for this macro if < \v(argc) 2 end 1 Pager ID required if \m(TESTING) { asg t \v(ntime) echo echo "PIN: \%1" echo "MESSAGE: \%2" } do apsetup ; Make the call. if fail end 1 ; Quit if the call failed. set modem error-correction off ; Turn OFF error correction set modem data-compression off ; and data compression set modem speed-matching on ; and speed-buffering. if def PACING { ; Intercharacter pacing for OUTPUT. if numeric \m(PACING) set output pacing \m(PACING) } dial \m(APAGEPHONE) ; Call the pager service asg rc \v(status) ; Save DIAL status if = \m(rc) 0 { ; If the call is answered tapmsg \%1 {\%2} ; Send the page asg rc \v(status) ; Save the result } set dial display off ; Don't display garbage burst on hangup if k-95 set line ; Release the port ;; if c-kermit set line ; In UNIX or VMS: Uncomment previous command if running this script in a ; loop to send multiple pages AND job has a controlling terminal (if there ; is no controlling terminal, e.g. under Cron or Sendmail, the "set line" ; command can fail. if \m(TESTING) echo PORT RELEASED if not quiet { if = \m(rc) 0 { echo PAGE OK } else { echo PAGE FAILED } } if \m(TESTING) { echo TIME \feval(\v(ntime) - \m(t)) echo } ; ; For shared in-out ports you might need to reset the port's original ; speed here and maybe also send it some kind of reset command like ATZ. ; set modem type \v(modem) ; Restore default modem settings end \m(rc) ; Return } dcl \&m[] = "ACK" "NAK" "ID=" "FORCED DISCONNECT" def \&m[0] "TIMEOUT" ; TAPMSG Telocator Alphanumeric Protocol execution. Call with: ; \%1 = Pager ID (PIN) ; \%2 = Message (single line) ; Assumes connection is made. Uses TAP to send PIN and 1-line message. ; def TAPMSG { local \%i \%m \%s blk ; Local variables set case on ; INPUT is case sensitive asg \%m \2\%1\13\%2\13\3 ; IDmsg asg \%s \fchecksum(\%m) ; Get checksum and make block asg blk \%m\fchar(\fmod(\%s/256,16)+48)- \fchar(\fmod(\%s/16,16)+48)- \fchar(\fmod(\%s,16)+48)\13 ; Checksummed TAP block if \m(TESTING) { echo, echo WAITING FOR ID= PROMPT... } msleep 500 ; Wait half a sec... for \%i 1 6 1 { ; Try six times to get prompt out \13 ; Send if fail end 1 OUTPUT I/O ERROR if \m(TESTING) echo SENT (\%i) input 2 {ID=} ; Look for "ID=" prompt if success break if not open connection end 1 FATAL - Connection Lost if > \v(instatus) 2 end 1 FATAL INPUT ERROR } if > \%i 6 end 1 {FAILED: NO "ID=" PROMPT (TRIES=\feval(\%i-1))} if \m(TESTING) echo {RCVD "ID="} for \%i 1 8 1 { ; Send PG1, get msleep 500 ; First wait half a second output \27PG1\13 if \m(TESTING) echo SENT PG1(\%i) minput 3 {\6\13} {\21\13} {ID=} {\27\4\13} if \m(TESTING) echo RCVD \&m[\v(minput)] switch \v(minput) { :0, continue ; Timeout :1, break ; :2, continue ; :3, continue ; ID= again :4, end 1 FORCED DISCONNECT ; Forced disconnect - fatal } break } if > \%i 8 end 1 def \&m[3] "FORCED DISCONNECT" def \&m[4] "ERROR INDICATION" in 10 \27[p\13 ; Wait for go-ahead if fail end 1 NO GO-AHEAD ; Didn't get it for \%i 1 8 1 { ; Try eight times msleep 500 output \m(blk) ; Send block if \m(TESTING) echo SENT MESSAGE (\%i) minput 8 {\6\13} {\21\13} {\13\27\4\13} {\30\13} if \m(TESTING) echo RCVD \&m[\v(minput)] switch \v(minput) { ; Get response :0, continue ; Timeout :1, break ; - success :2, continue ; - transmission error :3, end 1 FORCED DISCONNECT :4, echo "ERROR - RETRYING", continue } out \4\13 ; Sign off with if \m(TESTING) echo SENT EOT in 8 \27\4\13 ; Get back if \m(TESTING) { if fail { echo "TIMEOUT (IGNORED)" } else { echo "RCVD ACK" } } break } if > \%i 8 end 1 Too many retries } ; If invoked as a "kerbang" script execute it now. ; Otherwise TAKE'ing this file simply defines the macros so you can ; use them interactively, e.g. 'apage 7654321 "this is a message"'. ; if kerbang { if not def \%1 asg \%1 \$(PIN) if not def \%2 asg \%1 \$(MESSAGE) if ( not def \%1 || not def \%2 ) exit 1 {usage: \%0 } apage {\%1} {\%2} exit \v(status) } else if > \v(argc) 1 { apage {\%1} {\%2} exit \v(status) } else { echo APAGE "" (defined) } ; (End)