Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XOBUZAP

XOBUZAP.m

Go to the documentation of this file.
  1. XOBUZAP ;; mjk/alb - Terminate Jobs Utility ; 08/4/2005 13:00
  1. ;;1.6;Foundations;;May 08, 2009;Build 15
  1. ;Per VHA directive 2004-038, this routine should not be modified.
  1. QUIT
  1. ;
  1. ; ----------------------- Main Entry Points -----------------------
  1. ;
  1. EN(XOBSEL) ; -- Interactive and main entry point for XOBU TERMINATE JOBS tool
  1. ;
  1. ; Input: XOBSEL array that specifies selection criteria
  1. ; XOBSEL("ROUTINE")=<routine name>
  1. ; XOBSEL("STATE")=<job state#> (see STATE tag for list of states)
  1. ; XOBSEL("TITLE")=optional title text to be used by ListManager (upper right of LM screen)
  1. ; XOBSEL("VISTA INFO REF")=optional reference to array or global containing "CLIENT IP" and "DUZ" nodes
  1. ;
  1. ; -- verify job selection critera
  1. IF '$$VERSEL(.XOBSEL) DO GOTO ENQ
  1. . WRITE !,"Job selection criteria not specified correctly or is missing!"
  1. ;
  1. ; -- start 'Terminate Jobs Utility'
  1. DO EN^VALM("XOBU TERMINATE JOBS UTILITY")
  1. ENQ ;
  1. QUIT
  1. ;
  1. ZAP(XOBSEL) ; -- Non-interactive entry point for XOBU TERMINATE JOBS tool
  1. ; API terminates all jobs that job selection criteria
  1. ;
  1. ; Input: XOBSEL array that specifies selection criteria (See above EN tag for information)
  1. ;
  1. ; Return: Count of how many jobs terminated OR
  1. ; -1 if MUMPS implementation is not Cache
  1. ; -2 if XOBSEL arrary is not passed in or is invalid.
  1. ;
  1. NEW XOBJOBS,XOBPID,XOBCNS,XOBCNT
  1. ; -- check if this is a Cache implementation
  1. IF '$$CACHE() SET XOBCNT=-1 GOTO ZAPQ
  1. ;
  1. ; -- verify job selection critera
  1. IF '$$VERSEL(.XOBSEL) SET XOBCNT=-2 GOTO ZAPQ
  1. ;
  1. DO GETJOBS(.XOBJOBS)
  1. SET XOBCNS=$$CURNS()
  1. SET XOBCNT=0
  1. SET XOBPID=""
  1. FOR SET XOBPID=$ORDER(XOBJOBS(XOBPID)) QUIT:XOBPID="" DO
  1. . IF $$CHECK(.XOBSEL,XOBPID,XOBCNS) DO
  1. . . SET XOBRES=$$TERMJOB(XOBPID)
  1. . . IF XOBRES=1 SET XOBCNT=XOBCNT+1
  1. ZAPQ ;
  1. QUIT XOBCNT
  1. ;
  1. ; ----------------------- Listman Related Code -----------------------
  1. ;
  1. HDR ; -- header code
  1. SET VALMHDR(1)=" "_IOUON_"Job Selection Criteria"_IOUOFF_" (matches: "_+$GET(VALMCNT)_")"
  1. SET VALMHDR(2)=" Box-Volume Pair: "_IOINHI_$$BOXVOL()_IOINORM
  1. SET VALMHDR(3)=" Current Namespace: "_IOINHI_$$CURNS()_IOINORM
  1. SET VALMHDR(4)=" Routine: "_IOINHI_$GET(XOBSEL("ROUTINE"),"Unknown")_IOINORM
  1. SET VALMHDR(5)=" Job State: "_IOINHI_$PIECE($$GETSTATE^XOBUZAP0(+$GET(XOBSEL("STATE"),";;;Unknown")),";",4)_IOINORM
  1. QUIT
  1. ;
  1. INIT ; -- init variables and list array
  1. IF $DATA(XOBSEL("TITLE")) SET VALM("TITLE")=XOBSEL("TITLE")
  1. DO BUILD
  1. SET VALMSG=$$CPMSG()
  1. QUIT
  1. ;
  1. BUILD ; -- build list based on job selection criteria (XOBSEL)
  1. NEW XOBJOBS,XOBPID,XOBCNS
  1. DO KILL
  1. DO KILL^VALM10()
  1. IF '$$CACHE() DO GOTO BUILDQ
  1. . DO SET^VALM10(1,"",1)
  1. . DO SET^VALM10(2,"",2)
  1. . DO SET^VALM10(3," 'Terminate' actions not supported for the current M implementation ["_$$MUMPS()_"].",3)
  1. . SET VALMCNT=3
  1. SET XOBCNS=$$CURNS()
  1. DO GETJOBS(.XOBJOBS)
  1. SET VALMCNT=0
  1. SET XOBPID=""
  1. FOR SET XOBPID=$ORDER(XOBJOBS(XOBPID)) QUIT:XOBPID="" DO
  1. . IF $$CHECK(.XOBSEL,XOBPID,XOBCNS) DO
  1. . . NEW XOBJINFO
  1. . . DO JOBINFO(XOBPID,.XOBJINFO,.XOBSEL)
  1. . . SET VALMCNT=VALMCNT+1
  1. . . SET X=""
  1. . . SET X=$$SETFLD^VALM1($JUSTIFY(VALMCNT,4),X,"ENTRY")
  1. . . SET X=$$SETFLD^VALM1(XOBPID,X,"PID")
  1. . . SET X=$$SETFLD^VALM1($EXTRACT($GET(XOBJINFO("DEVICE"))_":"_$GET(XOBJINFO("CLIENT IP")),1,34),X,"DEVICE")
  1. . . SET X=$$SETFLD^VALM1($EXTRACT("User="_$SELECT($GET(XOBJINFO("CONNECTOR USER")):"*",1:"")_$GET(XOBJINFO("VISTA USER NAME")),1,30),X,"COMMENT")
  1. . . DO SET^VALM10(VALMCNT,X,VALMCNT)
  1. . . SET ^TMP("XOB TERMINATE JOBS","IDX",$JOB,VALMCNT,VALMCNT)=XOBPID
  1. ;
  1. BUILDQ ;
  1. QUIT
  1. ;
  1. KILL ; -- kill off list location
  1. KILL ^TMP("XOB TERMINATE JOBS",$JOB)
  1. KILL ^TMP("XOB TERMINATE JOBS","IDX",$JOB)
  1. QUIT
  1. ;
  1. HELP ; -- help code
  1. SET X="?" DO DISP^XQORM1 WRITE !!
  1. QUIT
  1. ;
  1. EXIT ; -- exit code
  1. QUIT
  1. ;
  1. EXPND ; -- expand code
  1. QUIT
  1. ;
  1. MSG ; -- set default message
  1. SET VALMSG="Use RE (Refresh) to display only alive jobs "
  1. QUIT
  1. ;
  1. CPMSG() ; -- connection proxy user message
  1. QUIT "* Connector Proxy User"
  1. ;
  1. REFRESH ; -- refresh display
  1. ; -- Protocol: XOBU TERMINATE JOBS REFRESH
  1. DO BUILD
  1. SET VALMSG=$$CPMSG()
  1. KILL VALMHDR
  1. SET VALMBCK="R"
  1. QUIT
  1. ;
  1. SS ; -- display M os system status
  1. ; -- Protocol: XOBU TERMINATE SYSTEM STATUS
  1. DO FULL^VALM1
  1. IF $DATA(^%ZOSF("SS")) DO
  1. . XECUTE ^%ZOSF("SS")
  1. ELSE DO
  1. . WRITE !,"Error: ^%ZOSF(""SS"") node is not defined."
  1. DO PAUSE^VALM1
  1. DO REFRESH
  1. QUIT
  1. ;
  1. TERMALL ; -- terminate all pid/job
  1. ; -- Protocol: XOBU TERMINATE ALL JOBS
  1. IF '$$ASK() GOTO TERMALLQ
  1. NEW XOBI,XOBPID
  1. SET XOBI=""
  1. FOR SET XOBI=$ORDER(^TMP("XOB TERMINATE JOBS","IDX",$JOB,XOBI)) QUIT:XOBI="" DO
  1. . SET XOBPID=$GET(^TMP("XOB TERMINATE JOBS","IDX",$JOB,XOBI,XOBI))
  1. . DO TERMONE(XOBPID,XOBI)
  1. DO MSG
  1. TERMALLQ ;
  1. SET VALMBCK=""
  1. QUIT
  1. ;
  1. TERMPID ; -- terminate pid/job
  1. ; -- Protocol: XOBU TERMINATE A JOB
  1. NEW XOBI,VALMY,XOBPID,XOBRES
  1. DO EN^VALM2(XQORNOD(0),"OS")
  1. SET XOBI=+$ORDER(VALMY(""))
  1. IF XOBI>0 DO
  1. . NEW XOBPID
  1. . SET XOBPID=$GET(^TMP("XOB TERMINATE JOBS","IDX",$JOB,XOBI,XOBI))
  1. . ; -- highlight entire line
  1. . DO SELECT^VALM10(XOBI,1)
  1. . IF XOBPID="<terminated>" DO QUIT
  1. . . WRITE !,"Job has already been terminated!" DO PAUSE^VALM1
  1. . ;
  1. . IF $$ASK() DO
  1. . . DO TERMONE(XOBPID,XOBI),MSG
  1. . ELSE DO
  1. . . ; -- unhighlight entire line
  1. . . DO SELECT^VALM10(XOBI,0)
  1. SET VALMBCK=""
  1. QUIT
  1. ;
  1. TERMONE(XOBPID,XOBI) ; -- zap one pid and update display
  1. NEW XOBRES
  1. ; -- quit if already terminated
  1. IF XOBPID="<terminated>" QUIT
  1. ; -- make sure criteris is still met
  1. IF '$$CHECK(.XOBSEL,XOBPID,$$CURNS()) DO QUIT
  1. . ; -- insert warning comment into display line
  1. . DO FLDTEXT^VALM10(XOBI,"COMMENT","Criteria not met!")
  1. . ; -- highlight entire line
  1. . DO SELECT^VALM10(XOBI,1)
  1. ; -- terminate job
  1. SET XOBRES=$$TERMJOB(XOBPID)
  1. ; -- insert comment into display line
  1. DO FLDTEXT^VALM10(XOBI,"COMMENT",$EXTRACT($$RESULT(XOBRES),1,25))
  1. ; -- highlight entire line
  1. DO SELECT^VALM10(XOBI,1)
  1. ; -- remove PID so it can't be terminated again
  1. SET ^TMP("XOB TERMINATE JOBS","IDX",$JOB,XOBI,XOBI)="<terminated>"
  1. QUIT
  1. ;
  1. ASK(PROMPT) ; -- ask if user is sure
  1. NEW DIR,Y
  1. SET DIR("A")=$GET(PROMPT,"Are you sure")
  1. SET DIR("B")="NO",DIR(0)="Y"
  1. DO ^DIR
  1. QUIT +$GET(Y)
  1. ;
  1. RESULT(RESULT) ; -- return result text
  1. ; -- Note: Code number conversions found in RESJOB routine in %SYS namespace
  1. IF RESULT=1 QUIT "Process terminated"
  1. IF RESULT=-1 QUIT "Process not responding"
  1. IF RESULT=-2 QUIT "Process died, not responding"
  1. IF RESULT=-3 QUIT "Process already died"
  1. QUIT RESULT_" --> unknown result type"
  1. ;
  1. ; ---------- Code used by Interactive and Non-Interactive Entry Points ----------
  1. ;
  1. VERSEL(XOBSEL) ; -- every job selection criteria
  1. NEW XOBOK
  1. IF $GET(XOBSEL("ROUTINE"))=""!($GET(XOBSEL("STATE"))="") SET XOBOK=0 GOTO VERSELQ
  1. SET XOBOK=1
  1. VERSELQ ;
  1. QUIT XOBOK
  1. ;
  1. GETJOBS(XOBJOBS) ; -- build XOBJOBS()=pid information
  1. NEW XOBPID,XOBCNT
  1. SET XOBPID="",XOBCNT=0
  1. FOR SET XOBPID=$ORDER(^$JOB(XOBPID)) QUIT:XOBPID="" DO
  1. . SET XOBCNT=XOBCNT+1,XOBJOBS(XOBPID)=""
  1. QUIT
  1. ;
  1. CHECK(XOBSEL,XOBPID,XOBNS) ; -- check job info against selection criteria
  1. ; -- use if 1) in correct namespace [XOBNS],
  1. ; 2) in correct routine [XOBSEL("ROUTINE")] and
  1. ; 3) in correct process state [XOBSEL("STATE")]
  1. NEW XOBJINFO
  1. DO JOBINFO(XOBPID,.XOBJINFO,.XOBSEL)
  1. IF XOBJINFO("NAMESPACE")=XOBNS,XOBJINFO("ROUTINE")=$GET(XOBSEL("ROUTINE")),XOBJINFO("STATE")=$GET(XOBSEL("STATE")) QUIT 1
  1. QUIT 0
  1. ;
  1. JOBINFO(XOBPID,XOBJINFO,XOBSEL) ; -- get PID info
  1. ; -- In future (Cache v5+) use instance proprties of %SYSTEM.Process
  1. SET XOBJINFO("STATE")=+$ZUTIL(67,4,XOBPID)
  1. SET XOBJINFO("ROUTINE")=$ZUTIL(67,5,XOBPID)
  1. SET XOBJINFO("NAMESPACE")=$ZUTIL(67,6,XOBPID)
  1. SET XOBJINFO("DEVICE")=$ZUTIL(67,7,XOBPID)
  1. SET XOBJINFO("OS USERNAME")=$ZUTIL(67,11,XOBPID) ; currently not used
  1. ;
  1. ; -- get VistA Info is available
  1. IF $GET(XOBSEL("VISTA INFO REF"))]"" DO
  1. . NEW XOBY,XOBREF
  1. . SET XOBREF=$$GETREF^XOBUZAP0(XOBSEL("VISTA INFO REF"),XOBPID)
  1. . ;
  1. . SET XOBJINFO("VISTA DUZ")=+$$GETDUZ^XOBUZAP0(XOBREF)
  1. . SET XOBY=$PIECE($GET(^VA(200,XOBJINFO("VISTA DUZ"),0)),U)
  1. . SET XOBJINFO("VISTA USER NAME")=$SELECT(XOBY]"":XOBY,1:"<unknown>")
  1. . SET XOBJINFO("CONNECTOR USER")=$$CPCHK^XUSAP(XOBJINFO("VISTA DUZ"))
  1. . ;
  1. . SET XOBY=$$GETIP^XOBUZAP0(XOBREF)
  1. . SET XOBJINFO("CLIENT IP")=$SELECT(XOBY]"":XOBY,1:"<unknown>")
  1. QUIT
  1. ;
  1. TERMJOB(XOBPID) ; -- terminate pid/job
  1. ; -- In future (Cache v5+) use instance method %SYSTEM.Process.Terminate()
  1. ;QUIT 1 ; -- used for testing
  1. QUIT $ZUTIL(4,XOBPID)
  1. ;
  1. BOXVOL() ; -- cpu volume pair
  1. NEW Y DO GETENV^%ZOSV
  1. QUIT $P(Y,U,4)
  1. ;
  1. CURNS() ; -- get current namespace
  1. QUIT $ZUTIL(5)
  1. ;
  1. MUMPS() ; -- get MUMPS implementation
  1. QUIT $SELECT(^%ZOSF("OS")["OpenM":"OpenM",^("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["MSM":"MSM",1:"")
  1. ;
  1. CACHE() ; -- is this a Cache implementation
  1. QUIT $$MUMPS()["OpenM"
  1. ;