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