| 1 | XMKPR1 ;ISC-SF/GMB-^XMKPR (cont.) ;09/06/2002  09:11 | 
|---|
| 2 | ;;8.0;MailMan;**3**;Jun 28, 2002 | 
|---|
| 3 | ; Reference to ^XTV(8989.3 - IA #3749 | 
|---|
| 4 | SCRIPT(XMINST,XMSITE,XMB,XMOKTYPE) ; Get first/next Transmission Script | 
|---|
| 5 | ; XMINST   (in)  Pointer to domain file | 
|---|
| 6 | ; XMSITE   (in)  Name (.01 field) of domain pointed to by XMINST | 
|---|
| 7 | ; XMOKTYPE (in)  array of script types which are acceptable | 
|---|
| 8 | ; XMB      (out) XMB("SCR IEN")      Pointer to script within domain | 
|---|
| 9 | ;                XMB("FIRST SCRIPT") Pointer to first script tried | 
|---|
| 10 | ;                XMB("SCR REC")      Script zero node | 
|---|
| 11 | ;                XMB("ITERATIONS")   Number of cycles of scripts | 
|---|
| 12 | ;                XMB("TRIES")        Number of tries with one script | 
|---|
| 13 | ;                XMB("IP TRIED")     IP addresses tried so far | 
|---|
| 14 | ; If no transmission scripts are prioritized use old data/defaults. | 
|---|
| 15 | ; If failure, then XMB("SCR IEN")=0 | 
|---|
| 16 | ; XMPRI    Priority | 
|---|
| 17 | ; XMTYPE   Script type | 
|---|
| 18 | ; XMDEFALT Default script settings | 
|---|
| 19 | ; XMSLIST  Array of possible scripts | 
|---|
| 20 | ; XMSFIRST First possible script | 
|---|
| 21 | ; XMSNEXT  Next possible script | 
|---|
| 22 | N XMSLIST,XMSFIRST,XMSNEXT,XMPRI,XMTYPE,I,XMREC,XMIEN | 
|---|
| 23 | I $D(XMB("SCR REC")),(XMB("TRIES")+1)<$P(XMB("SCR REC"),U,3) D  Q | 
|---|
| 24 | . S XMB("TRIES")=XMB("TRIES")+1 | 
|---|
| 25 | . D DEFAULT(XMINST,XMSITE,.XMB) ; refresh the script | 
|---|
| 26 | . ;I $G(ER)=25,$$USEDNS D NEXTIP(XMSITE,.XMB) | 
|---|
| 27 | . I $G(ER)=25!($P(XMB("SCR REC"),U,6)=""),$$USEDNS D NEXTIP(XMSITE,.XMB) | 
|---|
| 28 | ; We are here because the # attempts made is more than the max allowed, | 
|---|
| 29 | ; or because we are about to make our first attempt. | 
|---|
| 30 | ; In either case, we need a (next) script to try. | 
|---|
| 31 | I '$D(XMOKTYPE) S (XMOKTYPE("SMTP"),XMOKTYPE("TCPCHAN"),XMOKTYPE("NONE"))="" | 
|---|
| 32 | S XMIEN=0 | 
|---|
| 33 | F  S XMIEN=$O(^DIC(4.2,XMINST,1,XMIEN)) Q:XMIEN'>0  D | 
|---|
| 34 | . S XMREC=$G(^DIC(4.2,XMINST,1,XMIEN,0)) | 
|---|
| 35 | . Q:$P(XMREC,U,7)  ; Out of service | 
|---|
| 36 | . S XMTYPE=$P(XMREC,U,4) | 
|---|
| 37 | . S:XMTYPE="" XMTYPE="NONE" | 
|---|
| 38 | . Q:'$D(XMOKTYPE(XMTYPE)) | 
|---|
| 39 | . S XMPRI=$P(XMREC,U,2) S:XMPRI="" XMPRI=9999 | 
|---|
| 40 | . S XMSLIST(XMPRI,XMIEN)=XMIEN | 
|---|
| 41 | I '$D(XMSLIST) S XMB("SCR IEN")=0 Q | 
|---|
| 42 | S XMIEN=+$G(XMB("SCR IEN")) | 
|---|
| 43 | S XMSFIRST="XMSLIST" | 
|---|
| 44 | S XMSFIRST=$Q(@XMSFIRST) | 
|---|
| 45 | I XMIEN=0!('$D(^DIC(4.2,XMINST,1,XMIEN,0))) D  ; First attempt, so take the first script | 
|---|
| 46 | . S XMB("SCR IEN")=@XMSFIRST | 
|---|
| 47 | . S XMB("FIRST SCRIPT")=XMB("SCR IEN") | 
|---|
| 48 | . S XMB("ITERATIONS")=0 | 
|---|
| 49 | E  D  ; Try the next script after the one we just tried. | 
|---|
| 50 | . ; If that was the last one, go back to the first. | 
|---|
| 51 | . S XMPRI=$P(^DIC(4.2,XMINST,1,XMIEN,0),U,2) S:XMPRI="" XMPRI=9999 | 
|---|
| 52 | . S XMSNEXT="XMSLIST(XMPRI,XMIEN)" | 
|---|
| 53 | . S XMSNEXT=$Q(@XMSNEXT) | 
|---|
| 54 | . I XMSNEXT="" D | 
|---|
| 55 | . . S XMB("SCR IEN")=@XMSFIRST | 
|---|
| 56 | . . S XMB("ITERATIONS")=XMB("ITERATIONS")+1 | 
|---|
| 57 | . E  S XMB("SCR IEN")=@XMSNEXT | 
|---|
| 58 | D INITSCR(XMINST,XMSITE,.XMB) | 
|---|
| 59 | Q | 
|---|
| 60 | NEXTIP(XMSITE,XMB) ; | 
|---|
| 61 | I ","_$G(XMB("IP TRIED"))_","[(","_$P(XMB("SCR REC"),U,6)_",")!($P(XMB("SCR REC"),U,6)="") D | 
|---|
| 62 | . N XMIP | 
|---|
| 63 | . S XMIP=$$NEXTIPF^XMKPRD(XMSITE,$G(XMB("IP TRIED"))) | 
|---|
| 64 | . I XMIP'="" S $P(XMB("SCR REC"),U,6)=XMIP | 
|---|
| 65 | I $P(XMB("SCR REC"),U,6)="" S $P(XMB("SCR REC"),U,6)=$P($G(XMB("IP TRIED")),",",1) | 
|---|
| 66 | I $G(XMB("IP TRIED"))="" S XMB("IP TRIED")=$P(XMB("SCR REC"),U,6) Q | 
|---|
| 67 | I ","_XMB("IP TRIED")_","[(","_$P(XMB("SCR REC"),U,6)_",") Q | 
|---|
| 68 | S XMB("IP TRIED")=XMB("IP TRIED")_","_$P(XMB("SCR REC"),U,6) | 
|---|
| 69 | Q | 
|---|
| 70 | INITSCR(XMINST,XMSITE,XMB) ; | 
|---|
| 71 | S:'$D(XMB("ITERATIONS")) XMB("ITERATIONS")=0 | 
|---|
| 72 | S XMB("TRIES")=0 | 
|---|
| 73 | S:'$D(XMB("FIRST SCRIPT")) XMB("FIRST SCRIPT")=XMB("SCR IEN") | 
|---|
| 74 | S XMB("IP TRIED")="" | 
|---|
| 75 | D DEFAULT(XMINST,XMSITE,.XMB) | 
|---|
| 76 | S:XMB("IP TRIED")="" XMB("IP TRIED")=$P(XMB("SCR REC"),U,6) | 
|---|
| 77 | Q | 
|---|
| 78 | DEFAULT(XMINST,XMSITE,XMB) ; | 
|---|
| 79 | N XMDEFALT,I | 
|---|
| 80 | ; Pickup data from selected script | 
|---|
| 81 | S XMB("SCR REC")=^DIC(4.2,XMINST,1,XMB("SCR IEN"),0) | 
|---|
| 82 | ;I $P(XMB("SCR REC"),U,6)="",$$USEDNS D NEXTIP(XMSITE,.XMB) | 
|---|
| 83 | ; Create defaults | 
|---|
| 84 | S XMDEFALT=^DIC(4.2,XMINST,0) | 
|---|
| 85 | ; Piece 17=Physical link device; Piece 12=Host IP Address; | 
|---|
| 86 | ; $P(^XMB(1,1,"NETWORK"),U,1) is the number of attempts before failure | 
|---|
| 87 | 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) | 
|---|
| 88 | ; | 
|---|
| 89 | I $P(XMDEFALT,U,5)="" D | 
|---|
| 90 | . N XMIO | 
|---|
| 91 | . S XMIO=$P($G(^XMB(1,1,"NETWORK")),U,5) | 
|---|
| 92 | . I XMIO'="" S $P(XMDEFALT,U,5)=XMIO | 
|---|
| 93 | ;Use defaults if no data in transmission script fields | 
|---|
| 94 | F I=3:1:$L(XMDEFALT,U) S:$P(XMB("SCR REC"),U,I)="" $P(XMB("SCR REC"),U,I)=$P(XMDEFALT,U,I) | 
|---|
| 95 | Q | 
|---|
| 96 | USEDNS() ; Function returns 1 if we can use DNS; 0 if we can't. | 
|---|
| 97 | Q:'$P($G(^XMB(1,1,"NETWORK")),U,2) 0  ; Site says don't use DNS | 
|---|
| 98 | Q:$T(^XLFNSLK)="" 0  ; DNS API is not present | 
|---|
| 99 | Q:$P($G(^XTV(8989.3,1,"DNS")),U,1)="" 0  ; No DNS IP address | 
|---|
| 100 | Q 1 | 
|---|