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

BMXMON.m

Go to the documentation of this file.
  1. BMXMON ; IHS/OIT/HMW - BMXNet MONITOR ; 04 Jun 2010 3:10 PM
  1. ;;4.0;BMX;**2**;OCT 27, 2011;Build 2
  1. ;
  1. ;IHS/OIT/HMW Patch 1 added validity check for passed-in namespace
  1. ;
  1. STRT(BMXPORT,NS,IS,VB) ;EP
  1. ;Interactive monitor start
  1. ;Optional NS = namespace. If undefined, start in current ns
  1. ;Optional IS = Integrated Security. Default is 1
  1. ;Optional VB = Verbose. Default is 1
  1. ;
  1. N Y,BMXNS,BMXWIN
  1. ;
  1. ;Verbose
  1. S BMXVB=$G(VB,1)
  1. ;
  1. ;Check if port already running
  1. I '$$SEMAPHOR(BMXPORT,"LOCK") W:BMXVB "BMXNet Monitor on port "_BMXPORT_" appears to be running already.",! Q
  1. S %=$$SEMAPHOR(BMXPORT,"UNLOCK")
  1. ;
  1. D MARKER(BMXPORT,1) ;record problem marker
  1. ; -- start the monitor
  1. ;
  1. ;Namespace
  1. X ^%ZOSF("UCI")
  1. S BMXNS=$G(NS,$P(Y,","))
  1. ;
  1. ;Integrated security
  1. S BMXWIN=$G(IS,1)
  1. ;
  1. ;J DEBUG^%Serenji("MON^BMXMON("_BMXPORT_","_BMXNS_","_BMXWIN_")")
  1. J MON^BMXMON(BMXPORT,BMXNS,BMXWIN)::5 I '$T W:BMXVB "Unable to run BMXNet Monitor in background.",! Q ;IHS/OIT/HMW SAC Exemption Applied For
  1. F %=1:1:5 D Q:%=0
  1. . W:BMXVB "Checking if BMXNet Monitor has started...",!
  1. . H 1
  1. . S:'$$MARKER(BMXPORT,0) %=0
  1. I $$MARKER(BMXPORT,0) D
  1. . W:BMXVB !,"BMXNet Monitor could not be started!",!
  1. . W:BMXVB "Check if port "_BMXPORT_" is busy on this CPU.",!
  1. . D MARKER(BMXPORT,-1) ;clear marker
  1. E W:BMXVB "BMXNet Monitor started successfully."
  1. ;
  1. Q
  1. ;
  1. RESTART ;EP
  1. ;Stop and Start all monitors in BMX MONITOR file
  1. ;Called by option BMX MONITOR START
  1. ;
  1. D STOPALL
  1. D STRTALL
  1. Q
  1. ;
  1. STRTALL ;EP
  1. ;Start all monitors in BMX MONITOR file
  1. ;
  1. N BMXIEN
  1. S BMXIEN=0 F S BMXIEN=$O(^BMXMON(BMXIEN)) Q:'+BMXIEN D
  1. . S BMXNOD=$G(^BMXMON(BMXIEN,0))
  1. . Q:'+BMXNOD
  1. . Q:'+$P(BMXNOD,U,2)
  1. . S BMXWIN=$P(BMXNOD,U,3)
  1. . S BMXNS=$P(BMXNOD,U,4)
  1. . D STRT($P(BMXNOD,U),BMXNS,BMXWIN,0)
  1. . Q
  1. Q
  1. ;
  1. STOPALL ;EP
  1. ;Stop all monitors in BMXNET MONITOR file
  1. ;
  1. N BMXIEN,BMXPORT
  1. S BMXIEN=0 F S BMXIEN=$O(^BMXMON(BMXIEN)) Q:'+BMXIEN D
  1. . S BMXNOD=$G(^BMXMON(BMXIEN,0))
  1. . Q:'+BMXNOD
  1. . S BMXPORT=+BMXNOD
  1. . D STOP(BMXPORT,0)
  1. Q
  1. ;
  1. STOP(BMXPORT,VB) ;EP Stop monitor on BMXPORT
  1. ;Open a channel to monitor on BMXPORT and send shutdown request
  1. ;Optional VB = Verbose. Default is 1
  1. ;
  1. N IP,REF,X,DEV
  1. S U="^" D HOME^%ZIS
  1. ;
  1. ;Verbose
  1. S BMXVB=$G(VB,1)
  1. ;
  1. D:BMXVB EN^DDIOL("Stop BMXNet Monitor...")
  1. X ^%ZOSF("UCI") S REF=Y
  1. S IP="0.0.0.0" ;get server IP
  1. IF $G(BMXPORT)="" S BMXPORT=9200
  1. ; -- make sure the listener is running
  1. I $$SEMAPHOR(BMXPORT,"LOCK") D Q
  1. . S %=$$SEMAPHOR(BMXPORT,"UNLOCK")
  1. . D:BMXVB EN^DDIOL("BMXNet Monitor does not appear to be running.")
  1. ; -- send the shutdown message to the TCP Listener process
  1. D CALL^%ZISTCP("127.0.0.1",BMXPORT) I POP D Q
  1. . S %=$$SEMAPHOR(BMXPORT,"UNLOCK")
  1. . D:BMXVB EN^DDIOL("BMXNet Monitor does not appear to be running.")
  1. U IO
  1. S X=$T(+2),X=$P(X,";;",2),X=$P(X,";")
  1. IF X="" S X=0
  1. S X=$C($L(X))_X
  1. W "{BMX}00011TCPshutdown",!
  1. R X#3:5 ;IHS/OIT/HMW SAC Exemption Applied For
  1. D CLOSE^%ZISTCP
  1. I X="ack" D:BMXVB EN^DDIOL("BMXNet Monitor has been shutdown.")
  1. E D:BMXVB EN^DDIOL("Shutdown Failed!")
  1. ;change process name
  1. D CHPRN($J)
  1. Q
  1. ;
  1. MON(BMXPORT,NS,IS) ;Monitor port for connection & shutdown requests
  1. ;NS = Namespace to Start monitor
  1. ;IS = 1: Enable integrated security
  1. ;
  1. N BMXDEV,BMXQUIT,BMXDTIME,BMXLEN,BMXACT,BMXWIN,BMXNS
  1. S BMXQUIT=0,BMXDTIME=999999
  1. ;
  1. ;Set lock
  1. Q:'$$SEMAPHOR(BMXPORT,"LOCK")
  1. ;Clear problem marker
  1. D MARKER(BMXPORT,-1)
  1. ;H 1
  1. ;
  1. ;Namespace
  1. X ^%ZOSF("UCI")
  1. I $G(NS)="" S BMXNS=$P(Y,",")
  1. E S BMXNS=NS
  1. ;
  1. ;Integrated security
  1. S BMXWIN=$G(IS,1)
  1. ;
  1. ;Open server port;
  1. S BMXDEV="|TCP|"_BMXPORT
  1. RELOAD C BMXDEV ;IHS/OIT/HMW SAC Exemption Applied For ; IHS/OIT/GIS 10/4/2011
  1. O BMXDEV:(:BMXPORT:"S"):5 I '$T Q ;IHS/OIT/HMW SAC Exemption Applied For
  1. ;
  1. ;S BMXDTIME(1)=BMXDTIME ; TODO: Set timeouts
  1. S BMXDTIME(1)=.5 ;HMW 20050120
  1. U BMXDEV
  1. F D Q:BMXQUIT
  1. . R BMXACT#5:BMXDTIME ;Read first 5 chars from TCP buffer, timeout=BMXDTIME ;IHS/OIT/HMW SAC Exemption Applied For
  1. . I BMXACT="" S BMXQUIT=1 Q ; LISTENER TIMED OUT AFTER 999999 SECONDS (10 DAYS) ; IHS/OIT/GIS 10/4/2011
  1. . I BMXACT'="{BMX}" S BMXQUIT=2 Q ; PRIMARY MESSSAGE IS INVALID. NEED TO CLEAN OUT TCP BUFFER AND START OVER ; IHS/OIT/GIS 10/4/2011
  1. . R BMXACT#5:BMXDTIME ;Read next 5 chars - message length ;IHS/OIT/HMW SAC Exemption Applied For
  1. . S BMXLEN=+BMXACT
  1. . R BMXACT#BMXLEN:BMXDTIME ;IHS/OIT/HMW SAC Exemption Applied For
  1. . I $P(BMXACT,"^")="TCPconnect" D Q
  1. . . N BMXNSJ,X,Y,ZCHILD,%
  1. . . S BMXNSJ=$P(BMXACT,"^",2) ;Namespace
  1. . . S BMXNSJ=$P(BMXNSJ,",")
  1. . . I BMXNSJ="" S BMXNSJ=BMXNS
  1. . . S X=BMXNSJ
  1. . . X ^%ZOSF("UCICHECK") I Y=0 S BMXNSJ=BMXNS
  1. . . S STATUS=$S(Y'=0:"CONNECTION OK",1:"CONNECTION FAILED, INVALID NAMESPACE") ; SET CONNECTION STATUS BASED ON NAMESPACE VALIDITY
  1. . . J SESSION^BMXMON(BMXWIN)[BMXNSJ]:(:5:BMXDEV:BMXDEV):5 ;IHS/OIT/HMW SAC Exemption Applied For
  1. . . X ("S ZCHILD="_$C(36,90)_"CHILD")
  1. . . I ZCHILD S ^BMXTMP("CONNECT STATUS",ZCHILD)=STATUS
  1. . . Q
  1. . I $P(BMXACT,"^")="TCPshutdown" S BMXQUIT=1 W "ack",!
  1. I BMXQUIT=2 S BMXQUIT=0 G RELOAD ; PRIMARY MSG IS INVALID. CLEAR TCP BUFFER AND START ITERATING AGAIN. ; IHS/OIT/GIS 10/4/2011
  1. S %=$$SEMAPHOR(BMXPORT,"UNLOCK") ; destroy 'running flag'
  1. Q
  1. ;
  1. SESSION(BMXWIN) ;EP
  1. ;Start session monitor
  1. ;BMXWIN = 1: Enable integrated security
  1. SESSRES ;EP - reentry point from trap
  1. ;IHS/OIT/HMW SAC Exemption Applied For
  1. N $ESTACK S $ETRAP="D ETRAP^BMXMON"
  1. S DIQUIET=1,U="^" D DT^DICRW
  1. D UNREGALL^BMXMEVN ;Unregister all events for this session
  1. U $P D SESSMAIN
  1. ;Turn off the error trap for the exit
  1. S $ETRAP=""
  1. I $G(DUZ) D LOGOUT^XUSRB
  1. K BMXR,BMXARY
  1. C $P ;IHS/OIT/HMW SAC Exemption Applied For
  1. Q
  1. ;
  1. SESSMAIN ;
  1. N BMXTBUF
  1. D SETUP^BMXMSEC(.RET) ;Setup required system vars
  1. S U="^"
  1. U $P
  1. F D Q:BMXTBUF="#BYE#"
  1. . R BMXTBUF#11:BMXDTIME IF '$T D TIMEOUT S BMXTBUF="#BYE#" Q ;IHS/OIT/HMW SAC Exemption Applied For
  1. . I BMXTBUF["XQKEY" S HWMP=1
  1. . I BMXTBUF="#BYE#" Q
  1. . S BMXHTYPE=$S($E(BMXTBUF,1,5)="{BMX}":1,1:0) ;check HDR
  1. . I 'BMXHTYPE S BMXTBUF="#BYE#" D SNDERR W BMXTBUF,$C(4),! Q
  1. . S BMXTLEN=$E(BMXTBUF,6,10),L=$E(BMXTBUF,11,11)
  1. . R BMXTBUF#4:BMXDTIME(1) S BMXTBUF=L_BMXTBUF ;IHS/OIT/HMW SAC Exemption Applied For
  1. . S BMXPLEN=BMXTBUF
  1. . R BMXTBUF#BMXPLEN:BMXDTIME(1) ;IHS/OIT/HMW SAC Exemption Applied For
  1. . I $P(BMXTBUF,U)="TCPconnect" D Q
  1. . . D SNDERR W "accept",$C(4),! ;Ack
  1. . IF BMXHTYPE D
  1. . . K BMXR,BMXARY
  1. . . IF BMXTBUF="#BYE#" D SNDERR W "#BYE#",$C(4),! Q
  1. . . S BMXTLEN=BMXTLEN-15
  1. . . D CALLP^BMXMBRK(.BMXR,BMXTBUF)
  1. . . S BMXPTYPE=$S('$D(BMXPTYPE):1,BMXPTYPE<1:1,BMXPTYPE>6:1,1:BMXPTYPE)
  1. . IF BMXTBUF="#BYE#" Q
  1. . U $P
  1. . D SNDERR ;Clears SNDERR parameters
  1. . D SND
  1. . D WRITE($C(4)) W *-3 ;send eot and flush buffer
  1. D UNREGALL^BMXMEVN ;Unregister all events for this session
  1. Q ;End Of Main
  1. ;
  1. ;
  1. SNDERR ;send error information
  1. ;BMXSEC is the security packet, BMXERROR is application packet
  1. N X
  1. S X=$E($G(BMXSEC),1,255)
  1. W $C($L(X))_X W *-3
  1. S X=$E($G(BMXERROR),1,255)
  1. W $C($L(X))_X W *-3
  1. S BMXERROR="",BMXSEC="" ;clears parameters
  1. Q
  1. ;
  1. WRITE(BMXSTR) ;Write a data string
  1. ;
  1. I $L(BMXSTR)<511 W *-3 W BMXSTR Q
  1. ;Handle a long string
  1. W *-3 ;Flush the buffer
  1. F Q:'$L(BMXSTR) W $E(BMXSTR,1,510),*-3 S BMXSTR=$E(BMXSTR,511,99999)
  1. Q
  1. SND ; -- send data for all, Let WRITE sort it out
  1. N I,T
  1. ;
  1. ; -- error or abort occurred, send null
  1. IF $L(BMXSEC)>0 D WRITE("") Q
  1. ; -- single value
  1. IF BMXPTYPE=1 S BMXR=$G(BMXR) D WRITE(BMXR) Q
  1. ; -- table delimited by CR+LF
  1. IF BMXPTYPE=2 D Q
  1. . S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE(BMXR(I)),WRITE($C(13,10))
  1. ; -- word processing
  1. IF BMXPTYPE=3 D Q
  1. . S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE(BMXR(I)) D:BMXWRAP WRITE($C(13,10))
  1. ; -- global array
  1. IF BMXPTYPE=4 D Q
  1. . S I=$G(BMXR) Q:I="" S T=$E(I,1,$L(I)-1) D:$D(@I)>10 WRITE(@I)
  1. . F S I=$Q(@I) Q:I=""!(I'[T) W *-3 W @I W:BMXWRAP&(@I'=$C(13,10)) $C(13,10)
  1. . IF $D(@BMXR) K @BMXR
  1. ; -- global instance
  1. IF BMXPTYPE=5 S BMXR=$G(@BMXR) D WRITE(BMXR) Q
  1. ; -- variable length records only good upto 255 char)
  1. IF BMXPTYPE=6 S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE($C($L(BMXR(I)))),WRITE(BMXR(I))
  1. Q
  1. ;
  1. TIMEOUT ;Do this on MAIN loop timeout
  1. I $G(DUZ)>0 D SNDERR,WRITE("#BYE#"_$C(4)) Q
  1. ;Sign-on timeout
  1. S BMXR(0)=0,BMXR(1)=1,BMXR(2)="",BMXR(3)="TIME-OUT",BMXPTYPE=2
  1. D SNDERR,SND,WRITE($C(4))
  1. Q
  1. ;
  1. SEMAPHOR(BMXTSKT,BMXACT) ;Lock/Unlock BMXMON semaphore
  1. N RESULT
  1. S U="^",RESULT=1
  1. D GETENV^%ZOSV ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system
  1. I BMXACT="LOCK" D
  1. . L +^BMXMON("BMXMON",$P(Y,U,2),$P(Y,U),$P(Y,U,4),BMXTSKT):1
  1. . S RESULT=$T
  1. E L -^BMXMON("BMXMON",$P(Y,U,2),$P(Y,U),$P(Y,U,4),BMXTSKT)
  1. Q RESULT
  1. ;
  1. CHPRN(N) ;Change process name to N.
  1. D SETNM^%ZOSV($E(N,1,15))
  1. Q
  1. ;
  1. CKSTAT(OUT,IN) ; EP - RPC: BMX CONNECT STATUS ; CONFIRMS THAT THAT A VALID PROCESS HAS BEEN SPAWNED BY BMXMON
  1. N PORT,STATUS,JOBID
  1. S PORT=+$P($P,"|",3)
  1. S JOBID=$P($J,":",1)
  1. I $G(^BMXTMP("CONNECT STATUS",JOBID))="" HANG 1 ;Wait for job to spawn ZCHILD to be set in MON^
  1. I $G(^BMXTMP("CONNECT STATUS",JOBID))="" HANG 1
  1. I $G(^BMXTMP("CONNECT STATUS",JOBID))="" HANG 1
  1. S STATUS=$G(^BMXTMP("CONNECT STATUS",JOBID))
  1. K ^BMXTMP("CONNECT STATUS",JOBID)
  1. I STATUS="" S STATUS="CONNECTION STATUS UNKNOWN"
  1. S OUT=PORT_"|"_STATUS_"|"_JOBID
  1. Q
  1. ;
  1. MARKER(BMXPORT,BMXMODE) ;Set/Test/Clear Problem Marker, BMXMODE=0 is a function
  1. N IP,Y,%,REF X ^%ZOSF("UCI") S REF=Y,IP="0.0.0.0",%=0
  1. L +^BMX(IP,REF,BMXPORT,"PROBLEM MARKER"):1
  1. I BMXMODE=1 S ^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")=1
  1. I BMXMODE=0 S:$D(^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")) %=1
  1. I BMXMODE=-1 K ^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")
  1. L -^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")
  1. Q:BMXMODE=0 % Q
  1. ;
  1. ETRAP ; -- on trapped error, send error info to client
  1. N BMXERC,BMXERR,BMXLGR
  1. ;Change trapping during trap.
  1. S $ETRAP="D ^%ZTER HALT" ;IHS/OIT/HMW SAC Exemption Applied For
  1. S BMXERC=$$EC^%ZOSV
  1. S BMXERR="M ERROR="_BMXERC_$C(13,10)_"LAST REF="
  1. S BMXLGR=$$LGR^%ZOSV_$C(4)
  1. S BMXERR=BMXERR_BMXLGR
  1. D ^%ZTER ;%ZTER clears $ZE and $ECODE
  1. I (BMXERC["READ")!(BMXERC["WRITE")!(BMXERC["SYSTEM-F") D:$G(DUZ) LOGOUT^XUSRB G ^XUSCLEAN
  1. U $P
  1. D SNDERR,WRITE(BMXERR) W *-3
  1. S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" G SESSRES^BMXMON",$ECODE=",U99," ;IHS/OIT/HMW SAC Exemption Applied For
  1. Q
  1. ;
  1. ;
  1. N BMX,BMXVER
  1. ;VERSION
  1. D
  1. . S BMXN="BMXNET ADO.NET DATA PROVIDER" I $D(^DIC(9.4,"B",BMXN)) Q
  1. . S BMXN="BMXNET RPMS .NET UTILITIES" I $D(^DIC(9.4,"B",BMXN)) Q
  1. . S BMXN=""
  1. . Q
  1. ;
  1. S BMXVER=""
  1. I BMXN]"",$D(^DIC(9.4,"B",BMXN)) D
  1. . S BMX=$O(^DIC(9.4,"B",BMXN,0))
  1. . I $D(^DIC(9.4,BMX,"VERSION")) S BMXVER=$P(^DIC(9.4,BMX,"VERSION"),"^")
  1. . E S BMXVER="VERSION NOT FOUND"
  1. S:BMXVER="" BMXVER="VERSION NOT FOUND"
  1. ;
  1. ;LOCATION
  1. N BMXLOC
  1. S BMXLOC=""
  1. I $G(DUZ(2)),$D(^DIC(4,DUZ(2),0)) S BMXLOC=$P(^DIC(4,DUZ(2),0),"^")
  1. S:BMXLOC="" BMXLOC="LOCATION NOT FOUND"
  1. ;
  1. ;WRITE
  1. W !
  1. W !,"BMXNet Version: ",BMXVER
  1. W !,"Location: ",BMXLOC
  1. Q