[1595] | 1 | C0PTRAK ;KBAZ/ZAG/GPL - eRx debugging utilities; 4/1/2012 ; 5/8/12 5:12pm
|
---|
| 2 | ;;1.0;C0P;;Apr 25, 2012;Build 84
|
---|
| 3 | ;Copyright 2012 George Lilly. Licensed under the terms of the GNU
|
---|
| 4 | ;General Public License See attached copy of the License.
|
---|
| 5 | ;
|
---|
| 6 | ;This program is free software; you can redistribute it and/or modify
|
---|
| 7 | ;it under the terms of the GNU General Public License as published by
|
---|
| 8 | ;the Free Software Foundation; either version 2 of the License, or
|
---|
| 9 | ;(at your option) any later version.
|
---|
| 10 | ;
|
---|
| 11 | ;This program is distributed in the hope that it will be useful,
|
---|
| 12 | ;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 13 | ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 14 | ;GNU General Public License for more details.
|
---|
| 15 | ;
|
---|
| 16 | ;You should have received a copy of the GNU General Public License along
|
---|
| 17 | ;with this program; if not, write to the Free Software Foundation, Inc.,
|
---|
| 18 | ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
---|
| 19 | ;
|
---|
| 20 | QUIT ;do not call from the top
|
---|
| 21 | ;
|
---|
| 22 | ;INTRP(JOB) ;send interrupt to an interactive job.
|
---|
| 23 | ;
|
---|
| 24 | LOG(JOB,TAG) ;send interrupt and log results
|
---|
| 25 | ;copied from ZJOB to here for silently interrupting one job.
|
---|
| 26 | N $ET,$ES S $ET="D IRTERR^ZJOB"
|
---|
| 27 | ; shouldn't interrupt ourself, but commented out to test
|
---|
| 28 | ;I JOB=$JOB Q 0
|
---|
| 29 | ;We need a LOCK to guarantee commands from two processes don't conflict
|
---|
| 30 | N X,OLDINTRPT,TMP,ZSYSCMD,ZPATH,%J
|
---|
| 31 | L +^XUTL("XUSYS","COMMAND"):10 Q:'$T 0
|
---|
| 32 | ;
|
---|
| 33 | S ^XUTL("XUSYS","COMMAND")="EXAM",^("COMMAND",0)=$J_":"_$H
|
---|
| 34 | K ^XUTL("XUSYS",JOB,"JE")
|
---|
| 35 | S OLDINTRP=$ZINTERRUPT,%J=$J
|
---|
| 36 | S TMP=0,$ZINTERRUPT="S TMP=1"
|
---|
| 37 | ;
|
---|
| 38 | ;convert PID for VMS systems
|
---|
| 39 | I $ZV["VMS" D
|
---|
| 40 | . S JOB=$$FUNC^%DH(JOB,8)
|
---|
| 41 | . S %J=$$FUNC^%DH(%J,8)
|
---|
| 42 | ;
|
---|
| 43 | S ZSYSCMD="mupip intrpt "_JOB_" > /dev/null 2>&1" ; interrupt other job
|
---|
| 44 | I $ZV["VMS" S ZPATH="@gtm$dist:" ; VMS path
|
---|
| 45 | E S ZPATH="$gtm_dist/" ;Unix path
|
---|
| 46 | ZSYSTEM ZPATH_ZSYSCMD ; System Request
|
---|
| 47 | ;Now send to self
|
---|
| 48 | ; wait is too long 60>>30
|
---|
| 49 | H 1 S TMP=1 ; wait for interrupt, will set TMP=1
|
---|
| 50 | ;
|
---|
| 51 | ; Restore old $ZINTERRPT
|
---|
| 52 | S $ZINTERRUPT=OLDINTRP
|
---|
| 53 | K ^XUTL("XUSYS","COMMAND") ;Cleanup
|
---|
| 54 | L -^XUTL("XUSYS","COMMAND")
|
---|
| 55 | ;get values to report back on
|
---|
| 56 | K ^TMP("C0PERXLOG",JOB)
|
---|
| 57 | M ^TMP("C0PERXLOG",JOB)=^XUTL("XUSYS",JOB) ;merge off array for reporting
|
---|
| 58 | S ^TMP("C0PERXLOG",JOB,"LOGPOINT")=$G(TAG)
|
---|
| 59 | ;
|
---|
| 60 | ;D LOG(JOB) ;create the C0PLOG
|
---|
| 61 | ;K ^C0PTRAK(JOB) ;clean up temp log
|
---|
| 62 | ;
|
---|
| 63 | QUIT ;end of INTRP
|
---|
| 64 | ;
|
---|
| 65 | NEWLOG(JOB,TAG) ;report on JOB interrupted
|
---|
| 66 | ; TAG identifies the location creating the log. it is text
|
---|
| 67 | K ^C0PLOG(JOB)
|
---|
| 68 | N VARLOG ;build variable log array for further inspection
|
---|
| 69 | N VARTYP S VARTYP=""
|
---|
| 70 | F D Q:VARTYP=""
|
---|
| 71 | . S VARTYP=$O(^KBAZ(JOB,VARTYP)) ;type of variable
|
---|
| 72 | . Q:VARTYP="" ;exit if no more variable are types found
|
---|
| 73 | . N VARCNT S VARCNT=""
|
---|
| 74 | . F D Q:'VARCNT
|
---|
| 75 | . . S VARCNT=$O(^KBAZ(JOB,VARTYP,VARCNT)) ;variable count
|
---|
| 76 | . . Q:'VARCNT ;exit if no more variables are found
|
---|
| 77 | . . N VAR S VAR=$G(^KBAZ(JOB,VARTYP,VARCNT)) ;get the variable
|
---|
| 78 | . . N VARNM S VARNM=$P(VAR,"=") ;variable name
|
---|
| 79 | . . N VARIABLE S VARIABLE=$P(VAR,"=",2)
|
---|
| 80 | . . S VARIABLE=$TR(VARIABLE,"""") ;remove the extra quotes
|
---|
| 81 | . . S VARLOG(VARNM)=VARIABLE ;variable
|
---|
| 82 | . . N %H S %H=$G(VARLOG("$HOROLOG")) ;current $H
|
---|
| 83 | . . N PC S PC=$G(VARLOG("IO(""CLNM"")")) ;pc/client name
|
---|
| 84 | . . N IP S IP=$G(VARLOG("IO(""GTM-IP"")")) ;pc/client IP address
|
---|
| 85 | . . N USER S USER=$G(VARLOG("DUZ")) ;current user
|
---|
| 86 | . . N CURPAT S CURPAT=$G(VARLOG("VALUE(2)")) ;current patient
|
---|
| 87 | . . ;
|
---|
| 88 | . . ;build the final log
|
---|
| 89 | . . S ^TMP("C0PERXLOG",JOB,"LOGPOINT")=$G(TAG)
|
---|
| 90 | . . S ^TMP("C0PERXLOG",JOB,"TIME")=$$HTE^XLFDT(%H)
|
---|
| 91 | . . S ^TMP("C0PERXLOG",JOB,"CLNM")=PC
|
---|
| 92 | . . S ^TMP("C0PERXLOG",JOB,"IP")=IP
|
---|
| 93 | . . S ^TMP("C0PERXLOG",JOB,"DUZ")=USER
|
---|
| 94 | . . S ^TMP("C0PERXLOG",JOB,"PT")=CURPAT
|
---|
| 95 | ;
|
---|
| 96 | QUIT ;end of LOG
|
---|
| 97 | ;
|
---|
| 98 | ;
|
---|
| 99 | UNLOG(JOB) ; clean up a log entry
|
---|
| 100 | K ^TMP("C0PERXLOG",JOB)
|
---|
| 101 | Q
|
---|
| 102 | ;
|
---|
| 103 | RUNAWAY ; called from Batch to kill runaway eRx jobs
|
---|
| 104 | ; looks at every entry in the table looking for marked jobs to kill
|
---|
| 105 | ; if a job is not marked, it will mark it so that next time it
|
---|
| 106 | ; will be killed.
|
---|
| 107 | ; This insures that jobs logged to the table have at least 15 minutes
|
---|
| 108 | ; to unlog or they will be killed.
|
---|
| 109 | ; this is implemented to catch and kill runaway eRX webservice calls
|
---|
| 110 | ; uses STOP^XVJK($JOB) written by Zach Gonzales to kill jobs in GT.M linux
|
---|
| 111 | ; gpl 4/18/2012
|
---|
| 112 | ;
|
---|
| 113 | N GN,ZI
|
---|
| 114 | S GN=$NA(^TMP("C0PERXLOG"))
|
---|
| 115 | S GNOLD=$NA(^TMP("C0POLDLOG"))
|
---|
| 116 | S ZI=""
|
---|
| 117 | F S ZI=$O(@GN@(ZI)) Q:+ZI=0 D ; for every entry in the table
|
---|
| 118 | . I $D(@GN@(ZI,"KILLED")) Q ; job already killed
|
---|
| 119 | . I $D(@GN@(ZI,"MARKED")) D Q ; found a job to kill then quit
|
---|
| 120 | . . D STOP^XVJK(ZI) ; kill the job
|
---|
| 121 | . . S @GN@(ZI,"KILLED")=$$NOW^XLFDT ; record the kill
|
---|
| 122 | . . S @GN@(ZI,"KILLEDBY")=DUZ
|
---|
| 123 | . . M @GNOLD@(ZI,$H)=@GN@(ZI)
|
---|
| 124 | . . K @GN@(ZI)
|
---|
| 125 | . S @GN@(ZI,"MARKED")=$$NOW^XLFDT ; mark for a kill next time
|
---|
| 126 | Q
|
---|
| 127 | ;
|
---|
| 128 | EOR ;end of C0PTRAK
|
---|