| 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 | 
|---|