XMKPR1 ;ISC-SF/GMB-^XMKPR (cont.) ;09/06/2002 09:11
;;8.0;MailMan;**3**;Jun 28, 2002
; Reference to ^XTV(8989.3 - IA #3749
SCRIPT(XMINST,XMSITE,XMB,XMOKTYPE) ; Get first/next Transmission Script
; XMINST (in) Pointer to domain file
; XMSITE (in) Name (.01 field) of domain pointed to by XMINST
; XMOKTYPE (in) array of script types which are acceptable
; XMB (out) XMB("SCR IEN") Pointer to script within domain
; XMB("FIRST SCRIPT") Pointer to first script tried
; XMB("SCR REC") Script zero node
; XMB("ITERATIONS") Number of cycles of scripts
; XMB("TRIES") Number of tries with one script
; XMB("IP TRIED") IP addresses tried so far
; If no transmission scripts are prioritized use old data/defaults.
; If failure, then XMB("SCR IEN")=0
; XMPRI Priority
; XMTYPE Script type
; XMDEFALT Default script settings
; XMSLIST Array of possible scripts
; XMSFIRST First possible script
; XMSNEXT Next possible script
N XMSLIST,XMSFIRST,XMSNEXT,XMPRI,XMTYPE,I,XMREC,XMIEN
I $D(XMB("SCR REC")),(XMB("TRIES")+1)<$P(XMB("SCR REC"),U,3) D Q
. S XMB("TRIES")=XMB("TRIES")+1
. D DEFAULT(XMINST,XMSITE,.XMB) ; refresh the script
. ;I $G(ER)=25,$$USEDNS D NEXTIP(XMSITE,.XMB)
. I $G(ER)=25!($P(XMB("SCR REC"),U,6)=""),$$USEDNS D NEXTIP(XMSITE,.XMB)
; We are here because the # attempts made is more than the max allowed,
; or because we are about to make our first attempt.
; In either case, we need a (next) script to try.
I '$D(XMOKTYPE) S (XMOKTYPE("SMTP"),XMOKTYPE("TCPCHAN"),XMOKTYPE("NONE"))=""
S XMIEN=0
F S XMIEN=$O(^DIC(4.2,XMINST,1,XMIEN)) Q:XMIEN'>0 D
. S XMREC=$G(^DIC(4.2,XMINST,1,XMIEN,0))
. Q:$P(XMREC,U,7) ; Out of service
. S XMTYPE=$P(XMREC,U,4)
. S:XMTYPE="" XMTYPE="NONE"
. Q:'$D(XMOKTYPE(XMTYPE))
. S XMPRI=$P(XMREC,U,2) S:XMPRI="" XMPRI=9999
. S XMSLIST(XMPRI,XMIEN)=XMIEN
I '$D(XMSLIST) S XMB("SCR IEN")=0 Q
S XMIEN=+$G(XMB("SCR IEN"))
S XMSFIRST="XMSLIST"
S XMSFIRST=$Q(@XMSFIRST)
I XMIEN=0!('$D(^DIC(4.2,XMINST,1,XMIEN,0))) D ; First attempt, so take the first script
. S XMB("SCR IEN")=@XMSFIRST
. S XMB("FIRST SCRIPT")=XMB("SCR IEN")
. S XMB("ITERATIONS")=0
E D ; Try the next script after the one we just tried.
. ; If that was the last one, go back to the first.
. S XMPRI=$P(^DIC(4.2,XMINST,1,XMIEN,0),U,2) S:XMPRI="" XMPRI=9999
. S XMSNEXT="XMSLIST(XMPRI,XMIEN)"
. S XMSNEXT=$Q(@XMSNEXT)
. I XMSNEXT="" D
. . S XMB("SCR IEN")=@XMSFIRST
. . S XMB("ITERATIONS")=XMB("ITERATIONS")+1
. E S XMB("SCR IEN")=@XMSNEXT
D INITSCR(XMINST,XMSITE,.XMB)
Q
NEXTIP(XMSITE,XMB) ;
I ","_$G(XMB("IP TRIED"))_","[(","_$P(XMB("SCR REC"),U,6)_",")!($P(XMB("SCR REC"),U,6)="") D
. N XMIP
. S XMIP=$$NEXTIPF^XMKPRD(XMSITE,$G(XMB("IP TRIED")))
. I XMIP'="" S $P(XMB("SCR REC"),U,6)=XMIP
I $P(XMB("SCR REC"),U,6)="" S $P(XMB("SCR REC"),U,6)=$P($G(XMB("IP TRIED")),",",1)
I $G(XMB("IP TRIED"))="" S XMB("IP TRIED")=$P(XMB("SCR REC"),U,6) Q
I ","_XMB("IP TRIED")_","[(","_$P(XMB("SCR REC"),U,6)_",") Q
S XMB("IP TRIED")=XMB("IP TRIED")_","_$P(XMB("SCR REC"),U,6)
Q
INITSCR(XMINST,XMSITE,XMB) ;
S:'$D(XMB("ITERATIONS")) XMB("ITERATIONS")=0
S XMB("TRIES")=0
S:'$D(XMB("FIRST SCRIPT")) XMB("FIRST SCRIPT")=XMB("SCR IEN")
S XMB("IP TRIED")=""
D DEFAULT(XMINST,XMSITE,.XMB)
S:XMB("IP TRIED")="" XMB("IP TRIED")=$P(XMB("SCR REC"),U,6)
Q
DEFAULT(XMINST,XMSITE,XMB) ;
N XMDEFALT,I
; Pickup data from selected script
S XMB("SCR REC")=^DIC(4.2,XMINST,1,XMB("SCR IEN"),0)
;I $P(XMB("SCR REC"),U,6)="",$$USEDNS D NEXTIP(XMSITE,.XMB)
; Create defaults
S XMDEFALT=^DIC(4.2,XMINST,0)
; Piece 17=Physical link device; Piece 12=Host IP Address;
; $P(^XMB(1,1,"NETWORK"),U,1) is the number of attempts before failure
S XMDEFALT=$P(XMDEFALT,U)_"^0^"_$S(+$G(^XMB(1,1,"NETWORK")):+^("NETWORK"),1:10)_"^SMTP^"_$P(XMDEFALT,U,17)_U_$P(XMDEFALT,U,12)
;
I $P(XMDEFALT,U,5)="" D
. N XMIO
. S XMIO=$P($G(^XMB(1,1,"NETWORK")),U,5)
. I XMIO'="" S $P(XMDEFALT,U,5)=XMIO
;Use defaults if no data in transmission script fields
F I=3:1:$L(XMDEFALT,U) S:$P(XMB("SCR REC"),U,I)="" $P(XMB("SCR REC"),U,I)=$P(XMDEFALT,U,I)
Q
USEDNS() ; Function returns 1 if we can use DNS; 0 if we can't.
Q:'$P($G(^XMB(1,1,"NETWORK")),U,2) 0 ; Site says don't use DNS
Q:$T(^XLFNSLK)="" 0 ; DNS API is not present
Q:$P($G(^XTV(8989.3,1,"DNS")),U,1)="" 0 ; No DNS IP address
Q 1
XMKPR1 ;ISC-SF/GMB-^XMKPR (cont.) ;09/06/2002 09:11
+1 ;;8.0;MailMan;**3**;Jun 28, 2002
+2 ; Reference to ^XTV(8989.3 - IA #3749
SCRIPT(XMINST,XMSITE,XMB,XMOKTYPE) ; Get first/next Transmission Script
+1 ; XMINST (in) Pointer to domain file
+2 ; XMSITE (in) Name (.01 field) of domain pointed to by XMINST
+3 ; XMOKTYPE (in) array of script types which are acceptable
+4 ; XMB (out) XMB("SCR IEN") Pointer to script within domain
+5 ; XMB("FIRST SCRIPT") Pointer to first script tried
+6 ; XMB("SCR REC") Script zero node
+7 ; XMB("ITERATIONS") Number of cycles of scripts
+8 ; XMB("TRIES") Number of tries with one script
+9 ; XMB("IP TRIED") IP addresses tried so far
+10 ; If no transmission scripts are prioritized use old data/defaults.
+11 ; If failure, then XMB("SCR IEN")=0
+12 ; XMPRI Priority
+13 ; XMTYPE Script type
+14 ; XMDEFALT Default script settings
+15 ; XMSLIST Array of possible scripts
+16 ; XMSFIRST First possible script
+17 ; XMSNEXT Next possible script
+18 NEW XMSLIST,XMSFIRST,XMSNEXT,XMPRI,XMTYPE,I,XMREC,XMIEN
+19 IF $DATA(XMB("SCR REC"))
IF (XMB("TRIES")+1)<$PIECE(XMB("SCR REC"),U,3)
Begin DoDot:1
+20 SET XMB("TRIES")=XMB("TRIES")+1
+21 ; refresh the script
DO DEFAULT(XMINST,XMSITE,.XMB)
+22 ;I $G(ER)=25,$$USEDNS D NEXTIP(XMSITE,.XMB)
+23 IF $GET(ER)=25!($PIECE(XMB("SCR REC"),U,6)="")
IF $$USEDNS
DO NEXTIP(XMSITE,.XMB)
End DoDot:1
QUIT
+24 ; We are here because the # attempts made is more than the max allowed,
+25 ; or because we are about to make our first attempt.
+26 ; In either case, we need a (next) script to try.
+27 IF '$DATA(XMOKTYPE)
SET (XMOKTYPE("SMTP"),XMOKTYPE("TCPCHAN"),XMOKTYPE("NONE"))=""
+28 SET XMIEN=0
+29 FOR
SET XMIEN=$ORDER(^DIC(4.2,XMINST,1,XMIEN))
IF XMIEN'>0
QUIT
Begin DoDot:1
+30 SET XMREC=$GET(^DIC(4.2,XMINST,1,XMIEN,0))
+31 ; Out of service
IF $PIECE(XMREC,U,7)
QUIT
+32 SET XMTYPE=$PIECE(XMREC,U,4)
+33 IF XMTYPE=""
SET XMTYPE="NONE"
+34 IF '$DATA(XMOKTYPE(XMTYPE))
QUIT
+35 SET XMPRI=$PIECE(XMREC,U,2)
IF XMPRI=""
SET XMPRI=9999
+36 SET XMSLIST(XMPRI,XMIEN)=XMIEN
End DoDot:1
+37 IF '$DATA(XMSLIST)
SET XMB("SCR IEN")=0
QUIT
+38 SET XMIEN=+$GET(XMB("SCR IEN"))
+39 SET XMSFIRST="XMSLIST"
+40 SET XMSFIRST=$QUERY(@XMSFIRST)
+41 ; First attempt, so take the first script
IF XMIEN=0!('$DATA(^DIC(4.2,XMINST,1,XMIEN,0)))
Begin DoDot:1
+42 SET XMB("SCR IEN")=@XMSFIRST
+43 SET XMB("FIRST SCRIPT")=XMB("SCR IEN")
+44 SET XMB("ITERATIONS")=0
End DoDot:1
+45 ; Try the next script after the one we just tried.
IF '$TEST
Begin DoDot:1
+46 ; If that was the last one, go back to the first.
+47 SET XMPRI=$PIECE(^DIC(4.2,XMINST,1,XMIEN,0),U,2)
IF XMPRI=""
SET XMPRI=9999
+48 SET XMSNEXT="XMSLIST(XMPRI,XMIEN)"
+49 SET XMSNEXT=$QUERY(@XMSNEXT)
+50 IF XMSNEXT=""
Begin DoDot:2
+51 SET XMB("SCR IEN")=@XMSFIRST
+52 SET XMB("ITERATIONS")=XMB("ITERATIONS")+1
End DoDot:2
+53 IF '$TEST
SET XMB("SCR IEN")=@XMSNEXT
End DoDot:1
+54 DO INITSCR(XMINST,XMSITE,.XMB)
+55 QUIT
NEXTIP(XMSITE,XMB) ;
+1 IF ","_$GET(XMB("IP TRIED"))_","[(","_$PIECE(XMB("SCR REC"),U,6)_",")!($PIECE(XMB("SCR REC"),U,6)="")
Begin DoDot:1
+2 NEW XMIP
+3 SET XMIP=$$NEXTIPF^XMKPRD(XMSITE,$GET(XMB("IP TRIED")))
+4 IF XMIP'=""
SET $PIECE(XMB("SCR REC"),U,6)=XMIP
End DoDot:1
+5 IF $PIECE(XMB("SCR REC"),U,6)=""
SET $PIECE(XMB("SCR REC"),U,6)=$PIECE($GET(XMB("IP TRIED")),",",1)
+6 IF $GET(XMB("IP TRIED"))=""
SET XMB("IP TRIED")=$PIECE(XMB("SCR REC"),U,6)
QUIT
+7 IF ","_XMB("IP TRIED")_","[(","_$PIECE(XMB("SCR REC"),U,6)_",")
QUIT
+8 SET XMB("IP TRIED")=XMB("IP TRIED")_","_$PIECE(XMB("SCR REC"),U,6)
+9 QUIT
INITSCR(XMINST,XMSITE,XMB) ;
+1 IF '$DATA(XMB("ITERATIONS"))
SET XMB("ITERATIONS")=0
+2 SET XMB("TRIES")=0
+3 IF '$DATA(XMB("FIRST SCRIPT"))
SET XMB("FIRST SCRIPT")=XMB("SCR IEN")
+4 SET XMB("IP TRIED")=""
+5 DO DEFAULT(XMINST,XMSITE,.XMB)
+6 IF XMB("IP TRIED")=""
SET XMB("IP TRIED")=$PIECE(XMB("SCR REC"),U,6)
+7 QUIT
DEFAULT(XMINST,XMSITE,XMB) ;
+1 NEW XMDEFALT,I
+2 ; Pickup data from selected script
+3 SET XMB("SCR REC")=^DIC(4.2,XMINST,1,XMB("SCR IEN"),0)
+4 ;I $P(XMB("SCR REC"),U,6)="",$$USEDNS D NEXTIP(XMSITE,.XMB)
+5 ; Create defaults
+6 SET XMDEFALT=^DIC(4.2,XMINST,0)
+7 ; Piece 17=Physical link device; Piece 12=Host IP Address;
+8 ; $P(^XMB(1,1,"NETWORK"),U,1) is the number of attempts before failure
+9 SET XMDEFALT=$PIECE(XMDEFALT,U)_"^0^"_$SELECT(+$GET(^XMB(1,1,"NETWORK")):+^("NETWORK"),1:10)_"^SMTP^"_$PIECE(XMDEFALT,U,17)_U_$PIECE(XMDEFALT,U,12)
+10 ;
+11 IF $PIECE(XMDEFALT,U,5)=""
Begin DoDot:1
+12 NEW XMIO
+13 SET XMIO=$PIECE($GET(^XMB(1,1,"NETWORK")),U,5)
+14 IF XMIO'=""
SET $PIECE(XMDEFALT,U,5)=XMIO
End DoDot:1
+15 ;Use defaults if no data in transmission script fields
+16 FOR I=3:1:$LENGTH(XMDEFALT,U)
IF $PIECE(XMB("SCR REC"),U,I)=""
SET $PIECE(XMB("SCR REC"),U,I)=$PIECE(XMDEFALT,U,I)
+17 QUIT
USEDNS() ; Function returns 1 if we can use DNS; 0 if we can't.
+1 ; Site says don't use DNS
IF '$PIECE($GET(^XMB(1,1,"NETWORK")),U,2)
QUIT 0
+2 ; DNS API is not present
IF $TEXT(^XLFNSLK)=""
QUIT 0
+3 ; No DNS IP address
IF $PIECE($GET(^XTV(8989.3,1,"DNS")),U,1)=""
QUIT 0
+4 QUIT 1