| 1 | HLEVSRV1 ;O-OIFO/LJA - Event Monitor SERVER ;02/04/2004 14:42 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | OPENM ; Open/close access to M code... | 
|---|
| 5 | D OFFBEF | 
|---|
| 6 | D HDM,EXM,STM,SWM | 
|---|
| 7 | Q | 
|---|
| 8 | ; | 
|---|
| 9 | OKCODE(CODE) ; Check if license available and if so, mark used... | 
|---|
| 10 | N XTMP | 
|---|
| 11 | D OFFBEF | 
|---|
| 12 | S XTMP=$O(^XTMP("HLEV SERVER M 9999999"),-1) QUIT:XTMP']"" "" ;-> | 
|---|
| 13 | QUIT:'$D(^XTMP(XTMP,"LIC",CODE)) "" ;-> | 
|---|
| 14 | QUIT:$G(^XTMP(XTMP,"LIC",CODE))]"" "" ;-> | 
|---|
| 15 | S ^XTMP(XTMP,"LIC",CODE)=$$NOW^XLFDT_U_.5_U_$G(XMZ)_U_$G(ZTSK) | 
|---|
| 16 | Q 1 | 
|---|
| 17 | ; | 
|---|
| 18 | OFFBEF ; Turn off all but last M code entry... | 
|---|
| 19 | N XTMP | 
|---|
| 20 | S XTMP=$O(^XTMP("HLEV SERVER M 9999999"),-1) QUIT:XTMP']""  ;-> | 
|---|
| 21 | F  S XTMP=$O(^XTMP(XTMP),-1) Q:XTMP']""  D | 
|---|
| 22 | .  D SETOFF(XTMP) | 
|---|
| 23 | Q | 
|---|
| 24 | ; | 
|---|
| 25 | SWM ; Switch state... | 
|---|
| 26 | N STAT | 
|---|
| 27 | S STAT=$$MST | 
|---|
| 28 | I +STAT=0 D UPM | 
|---|
| 29 | I +STAT=1 D DOWNM | 
|---|
| 30 | W ! | 
|---|
| 31 | S X=$$BTE^HLCSMON("Press RETURN to exit... ") | 
|---|
| 32 | Q | 
|---|
| 33 | ; | 
|---|
| 34 | DOWNM ; Turn off M code execution... | 
|---|
| 35 | ; STAT -- req | 
|---|
| 36 | N END,START,XTMP | 
|---|
| 37 | S XTMP=$O(^XTMP("HLEV SERVER M 9999999"),-1) | 
|---|
| 38 | I XTMP']"" D  QUIT  ;-> | 
|---|
| 39 | .  W !!,"M code execution is OFF already..." | 
|---|
| 40 | W ! | 
|---|
| 41 | I '$$YN^HLCSRPT4("Turn off M code execution") D  QUIT  ;-> | 
|---|
| 42 | .  W "  nothing changed..." | 
|---|
| 43 | D SETOFF(XTMP) | 
|---|
| 44 | W "   M code execution disallowed..." | 
|---|
| 45 | Q | 
|---|
| 46 | ; | 
|---|
| 47 | UPM ; Turn on M code execution... | 
|---|
| 48 | ; STAT -- req | 
|---|
| 49 | N CODES,END,IOBOFF,IOBON,NOC,START,X,XTMP | 
|---|
| 50 | ; | 
|---|
| 51 | S X="IOBOFF;IOBON" D ENDR^%ZISS | 
|---|
| 52 | S XTMP="HLEV SERVER M "_$$NOW^XLFDT | 
|---|
| 53 | ; | 
|---|
| 54 | W ! | 
|---|
| 55 | I '$$YN^HLCSRPT4("Turn on M code execution","No") D  QUIT  ;-> | 
|---|
| 56 | .  W "  nothing changed..." | 
|---|
| 57 | ; | 
|---|
| 58 | W !!,"Before M code execution can be turned on, you must answer a few questions..." | 
|---|
| 59 | W !!,"Please include ",IOBON,"time",IOBOFF | 
|---|
| 60 | W " when entering the start and end date/times..." | 
|---|
| 61 | ; | 
|---|
| 62 | W ! | 
|---|
| 63 | S START=$$ASKDATE^HLEVAPI2("Enter START TIME","","NOW") | 
|---|
| 64 | I START'?7N1"."1.N D  QUIT  ;-> | 
|---|
| 65 | .  W "  exiting..." | 
|---|
| 66 | ; | 
|---|
| 67 | W !!,"Prompting START+24 hours..." | 
|---|
| 68 | W ! | 
|---|
| 69 | S END=$$ASKDATE^HLEVAPI2("Enter END TIME","",$$FMTE^XLFDT($$FMADD^XLFDT(START,1))) | 
|---|
| 70 | I END'?7N1"."1.N D  QUIT  ;-> | 
|---|
| 71 | .  W "  exiting..." | 
|---|
| 72 | ; | 
|---|
| 73 | W ! | 
|---|
| 74 | S NOC=$$ASKCODES(.CODES) I 'NOC D  QUIT  ;-> | 
|---|
| 75 | .  W "   exiting..." | 
|---|
| 76 | W !!,$S(NOC=1:"The '"_$O(CODES(""))_"' license",1:"These licenses") | 
|---|
| 77 | W " will be installed if you turn on M code execution now:" | 
|---|
| 78 | ; | 
|---|
| 79 | I NOC>1 D | 
|---|
| 80 | .  W !!,?5 | 
|---|
| 81 | .  S CODES="" | 
|---|
| 82 | .  F  S CODES=$O(CODES(CODES)) Q:CODES']""  D | 
|---|
| 83 | .  .  W:($X+$L(CODES))>IOM !,?5 | 
|---|
| 84 | .  .  W $E(CODES_"          ",1,10) | 
|---|
| 85 | ; | 
|---|
| 86 | W ! | 
|---|
| 87 | I '$$YN^HLCSRPT4("OK to turn on M code execution") D  QUIT  ;-> | 
|---|
| 88 | .  W "  nothing changed..." | 
|---|
| 89 | ; | 
|---|
| 90 | D SETON(XTMP,START,END) | 
|---|
| 91 | W "   M code execution allowed..." | 
|---|
| 92 | ; | 
|---|
| 93 | W !!,"Be sure to pass on ",$S(NOC>1:"these licenses",1:"the license") | 
|---|
| 94 | W " to the VistA HL7 team..." | 
|---|
| 95 | D LICENSE(XTMP,.CODES) | 
|---|
| 96 | ; | 
|---|
| 97 | W ! | 
|---|
| 98 | S X=$$BTE^HLCSMON("Press RETURN to exit...") | 
|---|
| 99 | ; | 
|---|
| 100 | Q | 
|---|
| 101 | ; | 
|---|
| 102 | LICENSE(XTMP,CODES) ; Install licenses | 
|---|
| 103 | N CODE | 
|---|
| 104 | W !!,"Codes:    " | 
|---|
| 105 | ; | 
|---|
| 106 | S CODE="" | 
|---|
| 107 | F  S CODE=$O(CODES(CODE)) Q:CODE']""  D | 
|---|
| 108 | .  S ^XTMP(XTMP,"LIC",CODE)="" ; Mailman server uses stored on this node | 
|---|
| 109 | .  S X=$E(CODE_"                   ",1,20) W:($X+$L(X))>IOM !,?10 W X | 
|---|
| 110 | ; | 
|---|
| 111 | Q | 
|---|
| 112 | ; | 
|---|
| 113 | ASKCODES(CODES) ; Ask user for codes... | 
|---|
| 114 | N CODE,NOC | 
|---|
| 115 | ; | 
|---|
| 116 | W !!,"You must now give the VistA HL7 team ""licences"" for M code execution.  One" | 
|---|
| 117 | W !,"license is used for every Mailman server request containing executable M " | 
|---|
| 118 | W !,"code." | 
|---|
| 119 | W ! | 
|---|
| 120 | ; | 
|---|
| 121 | S NOC=0 | 
|---|
| 122 | F  D  QUIT:CODE']"" | 
|---|
| 123 | .  S CODE=$$CODE QUIT:CODE']""  ;-> | 
|---|
| 124 | .  S ANS=$$YN^HLCSRPT4("Install the license# ["_CODE_"]","Yes") | 
|---|
| 125 | .  I ANS'=1 S CODE="" W "   not intalled..." QUIT  ;-> | 
|---|
| 126 | .  S NOC=NOC+1,CODES(CODE)="" | 
|---|
| 127 | ; | 
|---|
| 128 | Q NOC | 
|---|
| 129 | ; | 
|---|
| 130 | SETON(XTMP,START,END) ; Allow M code execution | 
|---|
| 131 | S ^XTMP(XTMP,0)=$$FMADD^XLFDT($$NOW^XLFDT,7)_U_$$NOW^XLFDT_U_"VistA HL7 Mailman Server M Control" | 
|---|
| 132 | S ^XTMP(XTMP,"STATUS")=START_U_END_U_$G(DUZ) | 
|---|
| 133 | Q | 
|---|
| 134 | ; | 
|---|
| 135 | SETOFF(XTMP) ; Disallow M code execution... | 
|---|
| 136 | S $P(^XTMP(XTMP,"STATUS"),U,4,5)=$$NOW^XLFDT_U_$G(DUZ) | 
|---|
| 137 | Q | 
|---|
| 138 | ; | 
|---|
| 139 | STM ; What is the status of M code execution? | 
|---|
| 140 | W !!,$$CJ^XLFSTR("------ M Code Execution Status: "_$P($$MST,U,3)_" ------",IOM) | 
|---|
| 141 | Q | 
|---|
| 142 | ; | 
|---|
| 143 | MST() ; Status? | 
|---|
| 144 | ; Piece 1 = 0 -> DOWN                        UP OR DOWN | 
|---|
| 145 | ;         = 1 -> UP | 
|---|
| 146 | ; Piece 2 = 1 -> No XTMP data exists...      DOWN REASONS | 
|---|
| 147 | ;         = 2 -> Invalid START/ENDs | 
|---|
| 148 | ;         = 3 -> Before cutoff time | 
|---|
| 149 | ;         = 4 -> After cutoff time | 
|---|
| 150 | ;         = 5 -> Inactive date (p4) found | 
|---|
| 151 | ;         = 0 -> Not DOWN!!! | 
|---|
| 152 | ; Piece 3 = Status text information | 
|---|
| 153 | ; | 
|---|
| 154 | ; NOW -- req | 
|---|
| 155 | N NOW,END,IDATE,START,STAT,XTMP | 
|---|
| 156 | S NOW=$$NOW^XLFDT | 
|---|
| 157 | S XTMP=$O(^XTMP("HLEV SERVER M 9999999"),-1) QUIT:XTMP']"" "0^1^DOWN" ;-> | 
|---|
| 158 | S STAT=$G(^XTMP(XTMP,"STATUS")),START=+STAT,END=$P(STAT,U,2),IDATE=$P(STAT,U,4) | 
|---|
| 159 | I IDATE?7N1"."1.N QUIT "0^5^DOWN" ;-> | 
|---|
| 160 | I START'?7N1"."1.N!(END'?7N1"."1.N) QUIT "0^2^DOWN" ;-> | 
|---|
| 161 | I START>NOW QUIT "0^3^DOWN - (Too early ("_$$SDT^HLEVX001(+START)_")" ;-> | 
|---|
| 162 | I END<NOW QUIT "0^4^DOWN - (Too late ("_$$SDT^HLEVX001(+END)_")" ;-> | 
|---|
| 163 | ; | 
|---|
| 164 | Q "1^0^UP" | 
|---|
| 165 | ; | 
|---|
| 166 | HDM W @IOF,$$CJ^XLFSTR("Open Access to Mailman Server M Code",IOM) | 
|---|
| 167 | W !,$$REPEAT^XLFSTR("=",IOM) | 
|---|
| 168 | QUIT | 
|---|
| 169 | ; | 
|---|
| 170 | EXM N I,T F I=1:1 S T=$T(EXM+I) QUIT:T'[";;"  W !,$P(T,";;",2,99) | 
|---|
| 171 | ;;Mailman server requests can be sent to your site requesting HL7 data be | 
|---|
| 172 | ;;returned to the VistA HL7 team.  (These requests are only sent to the VistA | 
|---|
| 173 | ;;HL7 team, and under no circumstances are sent to any other mail groups or | 
|---|
| 174 | ;;individuals.)  Under very rare circumstances, in order to debug problems on | 
|---|
| 175 | ;;your site, or to collect diagnostic information, it might be desired to run | 
|---|
| 176 | ;;some M code embedded in the Mailman server requests. | 
|---|
| 177 | ;; | 
|---|
| 178 | ;;In order to provide a high level of security, no M code will ever be run by | 
|---|
| 179 | ;;the Mailman server option unless you explicity allow M code execution.  This | 
|---|
| 180 | ;;option allows you to allow, or disallow, M code execution. | 
|---|
| 181 | QUIT | 
|---|
| 182 | ; | 
|---|
| 183 | CODE() ; Return license code... | 
|---|
| 184 | N CODE,EX,NOP,TYPE | 
|---|
| 185 | F EX=39,44,95,96 S EX(EX)="" | 
|---|
| 186 | S CODE="",NOP=0 | 
|---|
| 187 | F EX=1:1:6 D | 
|---|
| 188 | .  S TYPE=$P("A^P",U,$R(2)+1) | 
|---|
| 189 | .  I EX=6,NOP=0 S TYPE="P" ; Must be at least one punctuation | 
|---|
| 190 | .  I TYPE="P" S NOP=NOP+1 | 
|---|
| 191 | .  S:NOP>1 TYPE="A" | 
|---|
| 192 | .  S CODE=CODE_$$RNO(TYPE) | 
|---|
| 193 | .  I EX=3 S CODE=CODE_"-" | 
|---|
| 194 | Q CODE | 
|---|
| 195 | ; | 
|---|
| 196 | RNO(TYPE) ; Return random number between 33 and 122 (w/exceptions) | 
|---|
| 197 | ; NOP -- req | 
|---|
| 198 | N NO,OK | 
|---|
| 199 | F  S NO=$R(89)+33 D  Q:OK | 
|---|
| 200 | .  S OK=0 | 
|---|
| 201 | .  I $D(EX(NO)) QUIT  ;-> Is it in exclusion list? | 
|---|
| 202 | .  I TYPE="A" D  QUIT  ;-> Is it an alpha character | 
|---|
| 203 | .  .  I $$ALPHA(NO) S OK=1 | 
|---|
| 204 | .  I '$$ALPHA(NO) S OK=1 ; Need punctuation... | 
|---|
| 205 | Q $C(NO) | 
|---|
| 206 | ; | 
|---|
| 207 | ALPHA(NO) ; Is it ALPHA character? | 
|---|
| 208 | N X | 
|---|
| 209 | S X=$A($$UP^XLFSTR($C(NO))) QUIT:X>64&(X<91) 1 ;-> | 
|---|
| 210 | Q "" | 
|---|
| 211 | ; | 
|---|
| 212 | GBLTOXM ; Place global data in Mailman message global... | 
|---|
| 213 | N DATA,FILE,GBL,IEN,LP,REF,ST,TXT | 
|---|
| 214 | ; | 
|---|
| 215 | ; Add data found... | 
|---|
| 216 | S GBL=$NA(^XTMP(XTMP,"DATA")) | 
|---|
| 217 | ; | 
|---|
| 218 | S FILE=0 | 
|---|
| 219 | F  S FILE=$O(@GBL@(FILE)) Q:FILE'>0  D | 
|---|
| 220 | .  D ADDMAIL^HLEVSRV("") | 
|---|
| 221 | .  D ADDMAIL^HLEVSRV($$CJ^XLFSTR(" "_$P($G(^HLEV(+FILE,0)),U)_" [#"_FILE_"] ",74,"-")) | 
|---|
| 222 | .  S IEN=0 | 
|---|
| 223 | .  F  S IEN=$O(@GBL@(FILE,IEN)) Q:IEN'>0  D | 
|---|
| 224 | .  .  S TXT="#"_IEN | 
|---|
| 225 | .  .  S LP="^XTMP("""_XTMP_""",""DATA"","_FILE_","_IEN,ST=LP_"," | 
|---|
| 226 | .  .  S LP=LP_")" | 
|---|
| 227 | .  .  F  S LP=$Q(@LP) Q:LP'[ST  D | 
|---|
| 228 | .  .  .  S REF="#"_IEN_","_$P(LP,ST,2)_"=",POSX=$L(REF) | 
|---|
| 229 | .  .  .  S DATA=@LP | 
|---|
| 230 | .  .  .  F  D  QUIT:$TR(REF," ","")']""&(DATA']"")  ;-> | 
|---|
| 231 | .  .  .  .  S TXT=REF_$E(DATA,1,74-$L(REF)) | 
|---|
| 232 | .  .  .  .  D ADDMAIL^HLEVSRV(TXT) | 
|---|
| 233 | .  .  .  .  S DATA=$E(DATA,74-$L(REF)+1,999) | 
|---|
| 234 | .  .  .  .  S REF=$$REPEAT^XLFSTR(" ",POSX) | 
|---|
| 235 | ; | 
|---|
| 236 | Q | 
|---|
| 237 | ; | 
|---|
| 238 | TEST ; Test server... | 
|---|
| 239 | N CT,HLEVQUIT,LASTXTMP,XTMP,XMREC,XMZ | 
|---|
| 240 | ; | 
|---|
| 241 | W !!,"The current time is ",$$NOW^XLFDT,"..." | 
|---|
| 242 | ; | 
|---|
| 243 | W !!,"Displaying all existing ^XTMP(""HLEV SERVER ..."") entries..." | 
|---|
| 244 | ; | 
|---|
| 245 | ; Find last 6 entries to show... | 
|---|
| 246 | S XTMP="HLEV SERVER 9999999",CT=0 | 
|---|
| 247 | F  S XTMP=$O(^XTMP(XTMP),-1) Q:XTMP'?1"HLEV SERVER "7N1"."1.N!(CT>6)  D | 
|---|
| 248 | .  S CT=CT+1 | 
|---|
| 249 | ; | 
|---|
| 250 | S CT=0 | 
|---|
| 251 | S XTMP=$S(XTMP?1"HLEV SERVER "7N1"."1.N:XTMP,1:"HLEV SERVER 0000000") | 
|---|
| 252 | F  S XTMP=$O(^XTMP(XTMP)) Q:XTMP'?1"HLEV SERVER "7N1"."1.N  D | 
|---|
| 253 | .  W:'CT !! | 
|---|
| 254 | .  W $E("^XTMP("""_XTMP_""""_$$REPEAT^XLFSTR(" ",40),1,40) | 
|---|
| 255 | .  S CT=CT+1 | 
|---|
| 256 | ; | 
|---|
| 257 | I 'CT W !!,"No XTMP server data exists..." QUIT  ;-> | 
|---|
| 258 | ; | 
|---|
| 259 | S LASTXTMP=$O(^XTMP("HLEV SERVER 9999999"),-1) | 
|---|
| 260 | D SHOWXTMP("Last XTMP entry",LASTXTMP) | 
|---|
| 261 | ; | 
|---|
| 262 | T1 W !!,"Enter XTMP to rerun: ",LASTXTMP,"// " | 
|---|
| 263 | R XTMP:999 QUIT:XTMP[U  ;-> | 
|---|
| 264 | S:XTMP']"" XTMP=LASTXTMP | 
|---|
| 265 | I '$D(^XTMP(XTMP)) D  G T1 ;-> | 
|---|
| 266 | .  W "  entry not found..." | 
|---|
| 267 | ; | 
|---|
| 268 | S XMZ=$P($G(^XTMP(XTMP,"MAIL")),U) | 
|---|
| 269 | I $G(^XMB(3.9,+XMZ,0))']"" D  QUIT  ;-> | 
|---|
| 270 | .  W !!,"There is no Mailman message recorded..." | 
|---|
| 271 | ; | 
|---|
| 272 | S XMREC="D REC^XMS3" | 
|---|
| 273 | ; | 
|---|
| 274 | W !!,"Calling SERVER^HLEVSRV with XTMP=",XTMP,"..." | 
|---|
| 275 | ; | 
|---|
| 276 | D SERVER^HLEVSRV | 
|---|
| 277 | ; | 
|---|
| 278 | D SHOWXTMP("Last (and newly created) XTMP entry",$O(^XTMP("HLEV SERVER 9999999"),-1)) | 
|---|
| 279 | ; | 
|---|
| 280 | W !!,"The last 776 IEN = ",$O(^HLEV(776,":"),-1),"..." | 
|---|
| 281 | W ! | 
|---|
| 282 | ; | 
|---|
| 283 | D ^%G | 
|---|
| 284 | ; | 
|---|
| 285 | Q | 
|---|
| 286 | ; | 
|---|
| 287 | SHOWXTMP(TXT,XTMP) ; Show the XTMP data... | 
|---|
| 288 | N DATA,LP,POSX,ST | 
|---|
| 289 | ; | 
|---|
| 290 | I '$D(^XTMP(XTMP)) QUIT  ;-> | 
|---|
| 291 | ; | 
|---|
| 292 | W !!,$$CJ^XLFSTR(" "_TXT_" ",IOM,"=") | 
|---|
| 293 | ; | 
|---|
| 294 | S LP=$NA(^XTMP(XTMP)),ST=$E(LP,1,$L(LP)-1)_"," | 
|---|
| 295 | F  S LP=$Q(@LP) Q:LP'[ST  D | 
|---|
| 296 | .  W !,LP," = " | 
|---|
| 297 | .  S POSX=$X,DATA=@LP | 
|---|
| 298 | .  F  Q:DATA']""  D | 
|---|
| 299 | .  .  W:$X>POSX ! W:$X<POSX ?POSX | 
|---|
| 300 | .  .  W $E(DATA,1,IOM-POSX-1) | 
|---|
| 301 | .  .  S DATA=$E(DATA,IOM-POSX,999) | 
|---|
| 302 | ; | 
|---|
| 303 | W !,$$REPEAT^XLFSTR("=",IOM) | 
|---|
| 304 | ; | 
|---|
| 305 | Q | 
|---|
| 306 | ; | 
|---|
| 307 | EOR ;HLEVSRV1 - Event Monitor SERVER ;5/16/03 14:42 | 
|---|