75 |
static void do_unmonitor(Service_T); |
static void do_unmonitor(Service_T); |
76 |
static void *wait_start(void *); |
static void *wait_start(void *); |
77 |
static int wait_stop(Service_T); |
static int wait_stop(Service_T); |
78 |
static void do_depend(Service_T, const char *); |
static void do_depend(Service_T, int); |
79 |
|
|
80 |
|
|
81 |
/* ------------------------------------------------------------------ Public */ |
/* ------------------------------------------------------------------ Public */ |
94 |
ASSERT(S); |
ASSERT(S); |
95 |
ASSERT(action); |
ASSERT(action); |
96 |
|
|
97 |
|
if(Util_getAction(action) == ACTION_IGNORE) { |
98 |
|
log("%s: Cannot %s service '%s' -- invalid action %s\n", |
99 |
|
prog, action, S, action); |
100 |
|
return; |
101 |
|
} |
102 |
|
|
103 |
s= socket_new(Run.bind_addr?Run.bind_addr:"localhost", |
s= socket_new(Run.bind_addr?Run.bind_addr:"localhost", |
104 |
Run.httpdport, SOCKET_TCP, Run.httpdssl, NET_TIMEOUT); |
Run.httpdport, SOCKET_TCP, Run.httpdssl, NET_TIMEOUT); |
131 |
*/ |
*/ |
132 |
void control_service(const char *S, const char *action) { |
void control_service(const char *S, const char *action) { |
133 |
|
|
134 |
Service_T s= NULL; |
Service_T s = NULL; |
135 |
|
int _action = ACTION_IGNORE; |
136 |
|
|
137 |
ASSERT(S); |
ASSERT(S); |
138 |
ASSERT(action); |
ASSERT(action); |
139 |
|
|
140 |
if(!(s= Util_getService(S))) { |
if(!(s= Util_getService(S))) { |
141 |
log("%s: Cannot %s service '%s' -- not found in %s\n", |
log("%s: Cannot %s service '%s' -- not found in %s\n", |
142 |
prog, action, S, Run.controlfile); |
prog, action, S, Run.controlfile); |
143 |
return; |
return; |
144 |
} |
} |
145 |
|
|
146 |
if(IS(action, "start")) { |
if((_action = Util_getAction(action)) == ACTION_IGNORE) { |
147 |
|
log("%s: Cannot %s service '%s' -- invalid action %s\n", |
148 |
if(s->type==TYPE_PROCESS && Util_isProcessRunning(s)) { |
prog, action, S, action); |
149 |
DEBUG("%s: Process already running -- process %s\n", prog, S); |
return; |
150 |
Util_monitorSet(s); |
} |
|
return; |
|
|
} |
|
|
|
|
|
if(s->type==TYPE_PROCESS && !s->start) { |
|
|
DEBUG("%s: Start method not defined -- process %s\n", prog, S); |
|
|
Util_monitorSet(s); |
|
|
return; |
|
|
} |
|
|
|
|
|
do_depend(s, "stop"); |
|
|
do_start(s); |
|
|
do_depend(s, "start"); |
|
|
|
|
|
} else if(IS(action, "stop")) { |
|
|
|
|
|
if(s->type==TYPE_PROCESS && !s->stop) { |
|
|
DEBUG("%s: Stop method not defined -- process %s\n", prog, S); |
|
|
Util_monitorUnset(s); |
|
|
return; |
|
|
} |
|
|
|
|
|
do_depend(s, "stop"); |
|
|
do_stop(s); |
|
|
|
|
|
} else if(IS(action, "restart")) { |
|
|
|
|
|
if(s->type==TYPE_PROCESS && (!s->start || !s->stop)) { |
|
|
DEBUG("%s: Start or stop method not defined -- process %s\n", prog, S); |
|
|
Util_monitorSet(s); |
|
|
return; |
|
|
} |
|
151 |
|
|
152 |
log("'%s' trying to restart\n", s->name); |
switch(_action) { |
153 |
|
|
154 |
do_depend(s, "stop"); |
case ACTION_START: |
155 |
if(do_stop(s)) { |
if(s->type==TYPE_PROCESS && Util_isProcessRunning(s)) { |
156 |
/* Only start if stop succeeded */ |
DEBUG("%s: Process already running -- process %s\n", prog, S); |
157 |
|
Util_monitorSet(s); |
158 |
|
return; |
159 |
|
} |
160 |
|
if(s->type==TYPE_PROCESS && !s->start) { |
161 |
|
DEBUG("%s: Start method not defined -- process %s\n", prog, S); |
162 |
|
Util_monitorSet(s); |
163 |
|
return; |
164 |
|
} |
165 |
|
do_depend(s, ACTION_STOP); |
166 |
do_start(s); |
do_start(s); |
167 |
do_depend(s, "start"); |
do_depend(s, ACTION_START); |
168 |
} |
break; |
169 |
|
|
170 |
} else if(IS(action, "monitor")) { |
case ACTION_STOP: |
171 |
|
if(s->type==TYPE_PROCESS && !s->stop) { |
172 |
/* We only enable monitoring of this service and all prerequisite |
DEBUG("%s: Stop method not defined -- process %s\n", prog, S); |
173 |
* services. Chain of services which depends on this service keep |
Util_monitorUnset(s); |
174 |
* its state */ |
return; |
175 |
do_monitor(s); |
} |
176 |
|
do_depend(s, ACTION_STOP); |
177 |
} else if(IS(action, "unmonitor")) { |
do_stop(s); |
178 |
|
break; |
179 |
/* We disable monitoring of this service and all services which |
|
180 |
* depends on it */ |
case ACTION_RESTART: |
181 |
do_depend(s, "unmonitor"); |
if(s->type==TYPE_PROCESS && (!s->start || !s->stop)) { |
182 |
do_unmonitor(s); |
DEBUG("%s: Start or stop method not defined -- process %s\n", prog, S); |
183 |
|
Util_monitorSet(s); |
184 |
|
return; |
185 |
|
} |
186 |
|
log("'%s' trying to restart\n", s->name); |
187 |
|
do_depend(s, ACTION_STOP); |
188 |
|
if(do_stop(s)) { |
189 |
|
/* Only start if stop succeeded */ |
190 |
|
do_start(s); |
191 |
|
do_depend(s, ACTION_START); |
192 |
|
} |
193 |
|
break; |
194 |
|
|
195 |
|
case ACTION_MONITOR: |
196 |
|
/* We only enable monitoring of this service and all prerequisite |
197 |
|
* services. Chain of services which depends on this service keep |
198 |
|
* its state */ |
199 |
|
do_monitor(s); |
200 |
|
break; |
201 |
|
|
202 |
|
case ACTION_UNMONITOR: |
203 |
|
/* We disable monitoring of this service and all services which |
204 |
|
* depends on it */ |
205 |
|
do_depend(s, ACTION_UNMONITOR); |
206 |
|
do_unmonitor(s); |
207 |
|
break; |
208 |
|
|
209 |
|
default: |
210 |
|
/* when the action handler i not implemented, we will refuse it even |
211 |
|
in the case that monit generaly knows it */ |
212 |
|
log("%s: Cannot %s service '%s' -- invalid action %s\n", |
213 |
|
prog, action, S, action); |
214 |
|
break; |
215 |
} |
} |
216 |
|
|
217 |
|
return; |
218 |
} |
} |
219 |
|
|
220 |
|
|
383 |
* @param s A Service_T object |
* @param s A Service_T object |
384 |
* @param action An action to do on the dependant services |
* @param action An action to do on the dependant services |
385 |
*/ |
*/ |
386 |
static void do_depend(Service_T s, const char *action) { |
static void do_depend(Service_T s, int action) { |
387 |
|
|
388 |
Service_T child; |
Service_T child; |
389 |
|
|
399 |
|
|
400 |
if(IS(d->dependant, s->name)) { |
if(IS(d->dependant, s->name)) { |
401 |
|
|
402 |
if(IS(action, "start")) |
if(action == ACTION_START) |
403 |
do_start(child); |
do_start(child); |
404 |
else if(IS(action, "monitor")) |
else if(action == ACTION_MONITOR) |
405 |
do_monitor(child); |
do_monitor(child); |
406 |
|
|
407 |
do_depend(child, action); |
do_depend(child, action); |
408 |
|
|
409 |
if(IS(action, "stop")) |
if(action == ACTION_STOP) |
410 |
do_stop(child); |
do_stop(child); |
411 |
else if(IS(action, "unmonitor")) |
else if(action == ACTION_UNMONITOR) |
412 |
do_unmonitor(child); |
do_unmonitor(child); |
413 |
|
|
414 |
break; |
break; |