1 | %ZMGWSI ; Service Integration - Core Server
|
---|
2 | ;
|
---|
3 | ; ----------------------------------------------------------------------------
|
---|
4 | ; | m_apache |
|
---|
5 | ; | Copyright (c) 2004-2009 M/Gateway Developments Ltd, |
|
---|
6 | ; | Surrey UK. |
|
---|
7 | ; | All rights reserved. |
|
---|
8 | ; | |
|
---|
9 | ; | http://www.mgateway.com |
|
---|
10 | ; | |
|
---|
11 | ; | This program is free software: you can redistribute it and/or modify |
|
---|
12 | ; | it under the terms of the GNU Affero General Public License as |
|
---|
13 | ; | published by the Free Software Foundation, either version 3 of the |
|
---|
14 | ; | License, or (at your option) any later version. |
|
---|
15 | ; | |
|
---|
16 | ; | This program is distributed in the hope that it will be useful, |
|
---|
17 | ; | but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
---|
18 | ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
---|
19 | ; | GNU Affero General Public License for more details. |
|
---|
20 | ; | |
|
---|
21 | ; | You should have received a copy of the GNU Affero General Public License |
|
---|
22 | ; | along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
---|
23 | ; ----------------------------------------------------------------------------
|
---|
24 | ;
|
---|
25 | A0 D VERS^%ZMGWSIS
|
---|
26 | q
|
---|
27 | ;
|
---|
28 | START(port) ; Start daemon
|
---|
29 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":STARTE"
|
---|
30 | k ^%MGWSI("STOP")
|
---|
31 | j M($g(port))
|
---|
32 | q
|
---|
33 | STARTE ; Error
|
---|
34 | q
|
---|
35 | ;
|
---|
36 | EeeStart ; Start
|
---|
37 | d START(0)
|
---|
38 | Q
|
---|
39 | ;
|
---|
40 | STOP ; Stop
|
---|
41 | ;s ^%MGWSI("STOP")=1
|
---|
42 | w !,"Stopping MGWSI ... "
|
---|
43 | d STOP1(0,1)
|
---|
44 | ;f q:'$d(^%MGWSI("STOP")) h 3 w "."
|
---|
45 | w !!,"MGWSI stopped",!
|
---|
46 | Q
|
---|
47 | ;
|
---|
48 | STOP1(port,context) ; Stop daemon
|
---|
49 | ; context==0: stop child processes
|
---|
50 | ; context==1: stop master and child processes
|
---|
51 | s pport=+$g(port)
|
---|
52 | i pport D STOP2(pport,context) q
|
---|
53 | s pport="" f s pport=$o(^%MGWSI("TCP_PORT",pport)) q:pport="" D STOP2(pport,context)
|
---|
54 | q
|
---|
55 | ;
|
---|
56 | STOP2(pport,context) ; Stop series
|
---|
57 | s cport="" f s cport=$o(^%MGWSI("TCP_PORT",pport,cport)) q:cport="" D
|
---|
58 | . s pid=$g(^%MGWSI("TCP_PORT",pport,cport))
|
---|
59 | . D STOP3(cport,pid)
|
---|
60 | . k ^%MGWSI("TCP_PORT",pport,cport)
|
---|
61 | . q
|
---|
62 | i context=1 s pid=$g(^%MGWSI("TCP_PORT",pport)) D STOP3(pport,pid) k ^%MGWSI("TCP_PORT",pport)
|
---|
63 | q
|
---|
64 | ;
|
---|
65 | STOP3(port,pid) ; Stop this listener
|
---|
66 | i '$l(pid) q
|
---|
67 | w !,"stop: "_pid
|
---|
68 | zsy "kill -TERM "_pid
|
---|
69 | q
|
---|
70 | ;
|
---|
71 | M(port) ; Non-Concurrent TCP service (Old MUMPS systems)
|
---|
72 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":MH"
|
---|
73 | s $ZS="",dev=""
|
---|
74 | s port=+$g(port)
|
---|
75 | i 'port s port=7041
|
---|
76 | ; Initialize list of 'used' TCP server ports
|
---|
77 | k ^%MGWSI("TCP_PORT",port)
|
---|
78 | s ^%MGWSI("TCP_PORT",port)=$j
|
---|
79 | ;
|
---|
80 | MA ; Set TCP server device
|
---|
81 | Set dev="server$"_$j,timeout=30
|
---|
82 | ;
|
---|
83 | ; Open TCP server device
|
---|
84 | Open dev:(ZLISTEN=port_":TCP":attach="server"):timeout:"SOCKET"
|
---|
85 | ;
|
---|
86 | ; Use TCP server device
|
---|
87 | Use dev
|
---|
88 | Write /listen(1)
|
---|
89 | ;
|
---|
90 | M0 set %ZNSock="",%ZNFrom=""
|
---|
91 | S OK=1 F D Q:OK I $D(^%MGWSI("STOP")) S OK=0 k ^%MGWSI("STOP") Q
|
---|
92 | . Write /wait(timeout)
|
---|
93 | . I $KEY'="" S OK=1 Q
|
---|
94 | . S OK=0
|
---|
95 | . Q
|
---|
96 | I 'OK G MX
|
---|
97 | set %ZNSock=$piece($KEY,"|",2),%ZNFrom=$piece($KEY,"|",3)
|
---|
98 | d EVENT^%ZMGWSIS("Incoming connection from "_%ZNFrom_", starting child server process ("_%ZNSock_")")
|
---|
99 | ;
|
---|
100 | ; d CHILD^%ZMGWSIS(port,port,1,"")
|
---|
101 | ;
|
---|
102 | s errors=0
|
---|
103 | D VARS^%ZMGWSIS
|
---|
104 | M1 ; Read the next command from the MGWSI gateway
|
---|
105 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":ME"
|
---|
106 | s $ZS=""
|
---|
107 | s req="" f i=1:1 r *x q:x=10!(x=0) i i<300 s req=req_$c(x)
|
---|
108 | ;D EVENT^%ZMGWSIS("command::"_(req[$c(10))_":"_req)
|
---|
109 | i x=0 C dev G MA
|
---|
110 | s errors=0
|
---|
111 | s cmnd=$p(req,"^",2)
|
---|
112 | ;
|
---|
113 | ; Only interested in the request to start a new service job
|
---|
114 | ; and the close-down command - discard everything else
|
---|
115 | k res
|
---|
116 | i cmnd="S" D DINT ; start a new service job
|
---|
117 | i cmnd="X" G MX ; close-down this service
|
---|
118 | ;
|
---|
119 | ; Flush output buffer
|
---|
120 | d END^%ZMGWSIS
|
---|
121 | C dev G MA
|
---|
122 | ;
|
---|
123 | ME ; Error - probably client disconnect (which is normal)
|
---|
124 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":MX"
|
---|
125 | s errors=errors+1 i errors<37 C dev G MA
|
---|
126 | ; Too many errors
|
---|
127 | d EVENT^%ZMGWSIS("Accept Loop - Too many errors - Closing Down ("_$ZS_")")
|
---|
128 | MX ; Exit
|
---|
129 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":MH"
|
---|
130 | d EVENT^%ZMGWSIS("Closing Server")
|
---|
131 | ;
|
---|
132 | ; Close TCP server device
|
---|
133 | c dev
|
---|
134 | h
|
---|
135 | ;
|
---|
136 | MH ; Start-up error - Halt
|
---|
137 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":MH1"
|
---|
138 | d EVENT^%ZMGWSIS("Service start-up error: "_$ZS) Q
|
---|
139 | ;
|
---|
140 | ; Close TCP server device
|
---|
141 | i $l($g(dev)) c dev
|
---|
142 | h
|
---|
143 | MH1 ; Halt
|
---|
144 | h
|
---|
145 | ;
|
---|
146 | DINT ; Start-up and initialise a new service job
|
---|
147 | N %uci,%touci,systype,cport,dev,i,txt,timeout,x
|
---|
148 | S %touci=$p($p(req,"uci=",2),"&",1) ; UCI for service job
|
---|
149 | s %uci=$$getuci^%ZMGWSIS() ; This UCI (should be manager)
|
---|
150 | s systype=$$getsys^%ZMGWSIS() ; System type
|
---|
151 | ;
|
---|
152 | ; Get the next available TCP port for server child process
|
---|
153 | f cport=port+1:1 i '$d(^%MGWSI("TCP_PORT",port,cport)),'$d(^%MGWSI("TCP_PORT_EXCLUDED",cport)) q
|
---|
154 | ; Mark the port as in-use
|
---|
155 | s ^%MGWSI("TCP_PORT",port,cport)=""
|
---|
156 | ;
|
---|
157 | ; Start server child process
|
---|
158 | new $ZTRAP set $ZTRAP="ZGOTO "_$ZLEVEL_":DINTE"
|
---|
159 | s ok=1,timeout=10
|
---|
160 | j CHILD^%ZMGWSIS(port,cport,0,%touci)
|
---|
161 | s ^%zewd("mgwsis",$zjob)=""
|
---|
162 | i 'ok g DINTE
|
---|
163 | ; Send confirmation of a successful child start-up to the MGWSI gateway
|
---|
164 | s txt="pid="_$J_"&uci="_%UCI_"&server_type="_systype_"&version="_$p($$V^%ZMGWSIS(),".",1,3)_"&child_port="_cport
|
---|
165 | k res s res="" s res(1)="00000cv"_$C(10),maxlen=$$getslen^%ZMGWSIS() d send^%ZMGWSIS(txt)
|
---|
166 | q
|
---|
167 | DINTE ; Probably a NameSpace/UCI error
|
---|
168 | s x="" f s x=$o(^%MGWSI("TCP_PORT",x)) q:x="" k ^%MGWSI("TCP_PORT",x,cport)
|
---|
169 | d EVENT^%ZMGWSIS("Unable to start a child process: "_$ZS)
|
---|
170 | s txt="Error# "_$ZS
|
---|
171 | k res s res="" s res(1)="00000ce"_$C(10),maxlen=$$getslen^%ZMGWSIS() d send^%ZMGWSIS(txt)
|
---|
172 | q
|
---|
173 | ;
|
---|