| 1 | XWBTCP ;ISC-SF/EG - Control TCP listener ;07/08/2004  16:11
 | 
|---|
| 2 |  ;;1.1;RPC BROKER;**1,9,35**;Mar 28, 1997
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | EN ; -- entry point for interactive use
 | 
|---|
| 5 |  N X1,X2,XWBTDBG,XWBIP
 | 
|---|
| 6 |  S XWBIP=""
 | 
|---|
| 7 |  S:$G(IO("IP"))]"" XWBIP=IO("IP")
 | 
|---|
| 8 |  W !,"Enter client address: "_XWBIP_"//" R X1:300 Q:'$T  Q:X1="^"
 | 
|---|
| 9 |  W !,"   Enter client port: " R X2:300 Q:'$T  Q:X2="^"
 | 
|---|
| 10 |  W ! S XWBTDBG=""
 | 
|---|
| 11 |  IF X1="" S X1=XWBIP
 | 
|---|
| 12 |  IF $L(X1),$L(X2) D EN^XWBTCPC(X1,X2,"","1.08")
 | 
|---|
| 13 |  Q
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 | STATSCRN(XWBNEW) ;Port STATUS field screen
 | 
|---|
| 16 |  ;DA: FileMan DA array.  See STATCHG tag bellow for detailed descr.
 | 
|---|
| 17 |  ;XWBCUR: Current value of STATUS field
 | 
|---|
| 18 |  ;XWBNEW: New/requested value of STATUS field
 | 
|---|
| 19 |  ;        The domain for XWBCUR and XWBNEW is the same as for the
 | 
|---|
| 20 |  ;        ACTION variable, described at STATCHG tag bellow.
 | 
|---|
| 21 |  N C,XWBCUR,RESULT
 | 
|---|
| 22 |  S C=","
 | 
|---|
| 23 |  S XWBCUR=$$GET1^DIQ(8994.171,DA_C_DA(1)_C_DA(2)_C,"STATUS","I")
 | 
|---|
| 24 |  S RESULT=0
 | 
|---|
| 25 |  I XWBCUR=3,XWBNEW=4 S RESULT=1 ;if stopping a running listener
 | 
|---|
| 26 |  I XWBCUR=6,XWBNEW=1 S RESULT=1 ;if starting a stopped listener
 | 
|---|
| 27 |  ;    the next two cases are most usefull whenever some error occurs
 | 
|---|
| 28 |  ;    and the STATUS field is stuck in STARTING or RUNNING state
 | 
|---|
| 29 |  I XWBCUR=2,XWBNEW=3 S RESULT=1 ;change to RUNNING if it's starting
 | 
|---|
| 30 |  I XWBCUR=5,XWBNEW=6 S RESULT=1 ;change to STOPPED if it's stopping
 | 
|---|
| 31 |  Q RESULT
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 | STATCHG(DA,ACTION) ;STATUS field X-ref SET logic
 | 
|---|
| 35 |  ;DA: FileMan DA array
 | 
|---|
| 36 |  ;  DA    =IEN of the port
 | 
|---|
| 37 |  ;  DA(1) =IEN of the BOX-VOLUME
 | 
|---|
| 38 |  ;  DA(2) =IEN of site/domain
 | 
|---|
| 39 |  ;ACTION: Requested value for the STATUS field.  Possible values are:
 | 
|---|
| 40 |  ;  1 = START, 2 = STARTING, 3 = RUNNING,
 | 
|---|
| 41 |  ;  4 = STOP,  5 = STOPPING, 6 = STOPPED
 | 
|---|
| 42 |  N C,ZTCPU,TYPE,XWBPORT,XWBFDA
 | 
|---|
| 43 |  S C=","
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  I ACTION=1!(ACTION=4) D
 | 
|---|
| 46 |  . S ZTCPU=$$GET1^DIQ(8994.17,DA(1)_C_DA(2)_C,"BOX-VOLUME PAIR")
 | 
|---|
| 47 |  . S XWBPORT=$$GET1^DIQ(8994.171,DA_C_DA(1)_C_DA(2)_C,"PORT")
 | 
|---|
| 48 |  . S TYPE=$$GET1^DIQ(8994.171,DA_C_DA(1)_C_DA(2)_C,"TYPE OF LISTENER","I")
 | 
|---|
| 49 |  . ;UCI is no longer derived from the file, but comes from current
 | 
|---|
| 50 |  . ;environment.  The reason for that is it makes no sense to start
 | 
|---|
| 51 |  . ;a listener in a UCI where ^XWB can't be reached to change status.
 | 
|---|
| 52 |  . D GETENV^%ZOSV
 | 
|---|
| 53 |  . S ZTUCI=$P(Y,U),ZTIO="",ZTREQ="@",ZTDTH=$H ;run it ASAP
 | 
|---|
| 54 |  . I ACTION=1 D    ; -- START listener
 | 
|---|
| 55 |  . . S ZTDESC="RPC Broker Listener START on "_ZTUCI_"-"_ZTCPU_", port "_XWBPORT
 | 
|---|
| 56 |  . . S ZTRTN=$S(TYPE=1:"ZISTCP^XWBTCPM1("_XWBPORT_")",1:"EN^XWBTCPL("_XWBPORT_")")
 | 
|---|
| 57 |  . E  D            ; -- STOP listener
 | 
|---|
| 58 |  . . S ZTDESC="RPC Broker Listener STOP on "_ZTUCI_"-"_ZTCPU_", port "_XWBPORT
 | 
|---|
| 59 |  . . S ZTRTN="STOP^XWBTCP("_XWBPORT_")"
 | 
|---|
| 60 |  . D EN^DDIOL("Task: "_ZTDESC,"","!?10") ;inform user
 | 
|---|
| 61 |  . D ^%ZTLOAD      ; queue it
 | 
|---|
| 62 |  . D EN^DDIOL("has been queued as task "_ZTSK,"","!?10") ;inform user
 | 
|---|
| 63 |  . ; --  change STATUS from START to STARTING or from STOP to STOPPING
 | 
|---|
| 64 |  . D FDA^DILF(8994.171,DA_C_DA(1)_C_DA(2)_C,1,"R",ACTION+1,"XWBFDA")
 | 
|---|
| 65 |  . D FILE^DIE("K","XWBFDA")
 | 
|---|
| 66 |  Q
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 | STRT(XWBTSKT) ;start TCP Listener.  Interactive entry point
 | 
|---|
| 70 |  N IP,REF,Y,%
 | 
|---|
| 71 |  S U="^" D HOME^%ZIS
 | 
|---|
| 72 |  W "Start TCP Listener...",!
 | 
|---|
| 73 |  X ^%ZOSF("UCI") S REF=Y
 | 
|---|
| 74 |  S IP="0.0.0.0" ;get server IP at some point
 | 
|---|
| 75 |  IF $G(XWBTSKT)="" S XWBTSKT=9000 ;default service port is 9000
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  ; -- see if 'running flag' for listener is set
 | 
|---|
| 78 |  I '$$SEMAPHOR^XWBTCPL(XWBTSKT,"LOCK") W "TCP Listener on port "_XWBTSKT_" appears to be running already.",! Q
 | 
|---|
| 79 |  S %=$$SEMAPHOR^XWBTCPL(XWBTSKT,"UNLOCK")
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  D MARKER(XWBTSKT,1) ;record problem marker
 | 
|---|
| 82 |  ; -- start the listener
 | 
|---|
| 83 |  J EN^XWBTCPL(XWBTSKT)::5 ;Used in place of TaskMan, Need to start on any node.
 | 
|---|
| 84 |  I '$T W "Unable to run TCP Listener in background.",! Q
 | 
|---|
| 85 |  F %=1:1:5 D  Q:%=0
 | 
|---|
| 86 |  . W "Checking if TCP Listener has started...",!
 | 
|---|
| 87 |  . H 3
 | 
|---|
| 88 |  . S:'$$MARKER(XWBTSKT,0) %=0
 | 
|---|
| 89 |  I $$MARKER(XWBTSKT,0) D
 | 
|---|
| 90 |  . W !,"TCP Listener could not be started!",!
 | 
|---|
| 91 |  . W "Check if port "_XWBTSKT_" is busy on this CPU.",!
 | 
|---|
| 92 |  . D MARKER(XWBTSKT,-1) ;clear marker
 | 
|---|
| 93 |  E  W "TCP Listener started successfully."
 | 
|---|
| 94 |  Q
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 | MARKER(PORT,MODE) ;Set/Test/Clear Problem Marker, Mode=0 is a function
 | 
|---|
| 97 |  N IP,Y,%,REF X ^%ZOSF("UCI") S REF=Y,IP="0.0.0.0",%=0
 | 
|---|
| 98 |  L +^XWB(IP,REF,XWBTSKT,"PROBLEM MARKER")
 | 
|---|
| 99 |  I MODE=1 S ^XWB(IP,REF,XWBTSKT,"PROBLEM MARKER")=1
 | 
|---|
| 100 |  I MODE=0 S:$D(^XWB(IP,REF,XWBTSKT,"PROBLEM MARKER")) %=1
 | 
|---|
| 101 |  I MODE=-1 K ^XWB(IP,REF,XWBTSKT,"PROBLEM MARKER")
 | 
|---|
| 102 |  L -^XWB(IP,REF,XWBTSKT,"PROBLEM MARKER")
 | 
|---|
| 103 |  Q:MODE=0 % Q
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 | STRTALL ;XWB LISTENER STARTER option entry point
 | 
|---|
| 106 |  ;here all listener entries in RPC Broker Site Parameters file that
 | 
|---|
| 107 |  ;have CONTROLLED BY LISTENER STARTER set to 1/Yes will be started.
 | 
|---|
| 108 |  N E,LSTN,LSTNID,LSTNIENS,PORTID,XWBSCR,XWBDA
 | 
|---|
| 109 |  ;XWBDA: Namespaced FileMan DA array
 | 
|---|
| 110 |  ;  XWBDA    =IEN of the port
 | 
|---|
| 111 |  ;  XWBDA(1) =IEN of the BOX-VOLUME
 | 
|---|
| 112 |  ;  XWBDA(2) =IEN of site/domain
 | 
|---|
| 113 |  S E=""
 | 
|---|
| 114 |  S XWBDA(2)=1 ;hard set IEN of site/domain
 | 
|---|
| 115 |  ; -- screen out RUNNING (STATUS=3) listeners and those that aren't controlled by XWB LISTENER STARTER option.
 | 
|---|
| 116 |  S XWBSCR="I $P(^(0),U,2)'=3,$P(^(0),U,4)"
 | 
|---|
| 117 |  ; -- get top level listners box-volume
 | 
|---|
| 118 |  D LIST^DIC(8994.17,",1,",E,E,E,E,E,E,E,E,$NA(LSTN("LSTNR")))
 | 
|---|
| 119 |  S LSTNID=""
 | 
|---|
| 120 |  F  S LSTNID=$O(LSTN("LSTNR","DILIST",1,LSTNID)) Q:LSTNID=""  D
 | 
|---|
| 121 |  . S XWBDA(1)=LSTN("LSTNR","DILIST",2,LSTNID) ;IEN of each listener
 | 
|---|
| 122 |  . S LSTNIENS=","_XWBDA(1)_","_XWBDA(2)_","
 | 
|---|
| 123 |  . D LIST^DIC(8994.171,LSTNIENS,E,"P",E,E,E,E,XWBSCR,E,$NA(LSTN("PORT")))
 | 
|---|
| 124 |  . S PORTID=0
 | 
|---|
| 125 |  . F  S PORTID=$O(LSTN("PORT","DILIST",PORTID)) Q:PORTID=""  D
 | 
|---|
| 126 |  . . S XWBDA=$P(LSTN("PORT","DILIST",PORTID,0),U,1)
 | 
|---|
| 127 |  . . D STATCHG(.XWBDA,1) ;use STATUS field X-ref SET logic to queue up start of a listener
 | 
|---|
| 128 |  Q
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 | STOPALL ;XWB LISTENER STOP ALL entry point
 | 
|---|
| 131 |  ;here all listener entries in RPC Broker Site Parameters file that
 | 
|---|
| 132 |  ;have CONTROLLED BY LISTENER STARTER set to 1/Yes will be stopped.
 | 
|---|
| 133 |  N E,LSTN,LSTNID,LSTNIENS,PORTID,XWBSCR,XWBDA
 | 
|---|
| 134 |  ;XWBDA: Namespaced FileMan DA array
 | 
|---|
| 135 |  ;  XWBDA    =IEN of the port
 | 
|---|
| 136 |  ;  XWBDA(1) =IEN of the BOX-VOLUME
 | 
|---|
| 137 |  ;  XWBDA(2) =IEN of site/domain
 | 
|---|
| 138 |  S E=""
 | 
|---|
| 139 |  S XWBDA(2)=1 ;hard set IEN of site/domain
 | 
|---|
| 140 |  ; -- screen out STOPPED (STATUS=3) listeners and those that aren't controlled by XWB LISTENER STARTER option.
 | 
|---|
| 141 |  S XWBSCR="I $P(^(0),U,2)'=6,$P(^(0),U,4)"
 | 
|---|
| 142 |  ; -- get top level listners box-volume
 | 
|---|
| 143 |  D LIST^DIC(8994.17,",1,",E,E,E,E,E,E,E,E,$NA(LSTN("LSTNR")))
 | 
|---|
| 144 |  S LSTNID=""
 | 
|---|
| 145 |  F  S LSTNID=$O(LSTN("LSTNR","DILIST",1,LSTNID)) Q:LSTNID=""  D
 | 
|---|
| 146 |  . S XWBDA(1)=LSTN("LSTNR","DILIST",2,LSTNID) ;IEN of each listener
 | 
|---|
| 147 |  . S LSTNIENS=","_XWBDA(1)_","_XWBDA(2)_","
 | 
|---|
| 148 |  . D LIST^DIC(8994.171,LSTNIENS,E,"P",E,E,E,E,XWBSCR,E,$NA(LSTN("PORT")))
 | 
|---|
| 149 |  . S PORTID=0
 | 
|---|
| 150 |  . F  S PORTID=$O(LSTN("PORT","DILIST",PORTID)) Q:PORTID=""  D
 | 
|---|
| 151 |  . . S XWBDA=$P(LSTN("PORT","DILIST",PORTID,0),U,1)
 | 
|---|
| 152 |  . . D STATCHG(.XWBDA,4) ;use STATUS field X-ref SET logic to queue up stop of a listener
 | 
|---|
| 153 |  Q
 | 
|---|
| 154 |  ;
 | 
|---|
| 155 | RESTART ;Stop and then Start all listeners.
 | 
|---|
| 156 |  D STOPALL H 15 D STRTALL
 | 
|---|
| 157 |  Q
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 | STOP(XWBTSKT) ;stop TCP Listener.  Interactive and TaskMan entry point
 | 
|---|
| 160 |  N IP,REF,X,DEV,XWBOS,XWBIP,XWBENV
 | 
|---|
| 161 |  S U="^" D HOME^%ZIS,GETENV^%ZOSV S XWBENV=Y
 | 
|---|
| 162 |  D EN^DDIOL("Stop TCP Listener...")
 | 
|---|
| 163 |  X ^%ZOSF("UCI") S REF=Y
 | 
|---|
| 164 |  S IP="0.0.0.0" ;get server IP
 | 
|---|
| 165 |  IF $G(XWBTSKT)="" S XWBTSKT=9000 ;default service port is 9000
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 |  S XWBOS=$S(^%ZOSF("OS")["DSM":"DSM",^("OS")["MSM":"MSM",^("OS")["OpenM":"OpenM",1:"") ;RWF
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 |  ; -- make sure the listener is running
 | 
|---|
| 170 |  I $$SEMAPHOR^XWBTCPL(XWBTSKT,"LOCK") D  Q
 | 
|---|
| 171 |  . S %=$$SEMAPHOR^XWBTCPL(XWBTSKT,"UNLOCK")
 | 
|---|
| 172 |  . D EN^DDIOL("TCP Listener does not appear to be running.")
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  S X=$$NODE^XWBTCPM1(XWBTSKT) ;Get node
 | 
|---|
| 175 |  I $P(X,"^",3)=1 D  Q
 | 
|---|
| 176 |  . D EN^DDIOL("New listener should stop on its own")
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  ; -- send the shutdown message to the TCP Listener process
 | 
|---|
| 179 |  ;    using loopback address
 | 
|---|
| 180 |  S XWBIP="127.0.0.1"
 | 
|---|
| 181 |  D CALL^%ZISTCP("127.0.0.1",XWBTSKT) I POP D  Q
 | 
|---|
| 182 |  . S %=$$SEMAPHOR^XWBTCPL(XWBTSKT,"UNLOCK")
 | 
|---|
| 183 |  . D EN^DDIOL("TCP Listener does not appear to be running.")
 | 
|---|
| 184 |  U IO
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  S X=$T(+2),X=$P(X,";;",2),X=$P(X,";")
 | 
|---|
| 187 |  IF X="" S X=0
 | 
|---|
| 188 |  S X=$C($L(X))_X
 | 
|---|
| 189 |  W "{XWB}00020|"_X_"00011TCPshutdown",!
 | 
|---|
| 190 |  R X:5
 | 
|---|
| 191 |  D CLOSE^%ZISTCP
 | 
|---|
| 192 |  IF X["ack" D EN^DDIOL("TCP Listener has been shutdown.")
 | 
|---|
| 193 |  ELSE  D EN^DDIOL("Shutdown Failed!")
 | 
|---|
| 194 |  Q
 | 
|---|
| 195 |  ;
 | 
|---|
| 196 | DEBUG ;Edit the debug parameter
 | 
|---|
| 197 |  W !!
 | 
|---|
| 198 |  D EDITPAR^XPAREDIT("XWBDEBUG")
 | 
|---|
| 199 |  W !!
 | 
|---|
| 200 |  Q
 | 
|---|