Fix #278: enforce conditions also for running pre: scripts

The whole point of pre: scripts is that they run just before the actual
run/task/service process, hence they need to be locked behind the same
conditions as the process.  Otherwise pre: scripts would be nothing more
than plain tasks.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2022-06-25 15:05:16 +02:00
1 parent d9dbfa23c7
commit fbcd7d2384
2 files changed
+29 -19

No files matched your search

+28 -19
View File
@@ -1886,13 +1886,8 @@ restart:
switch (svc->state) { switch (svc->state) {
case SVC_HALTED_STATE: case SVC_HALTED_STATE:
if (enabled) { if (enabled)
if (svc_has_pre(svc)) { svc_set_state(svc, SVC_READY_STATE);
svc_set_state(svc, SVC_SETUP_STATE);
service_pre_script(svc);
} else
svc_set_state(svc, SVC_READY_STATE);
}
break; break;
case SVC_DONE_STATE: case SVC_DONE_STATE:
@@ -1942,7 +1937,7 @@ restart:
case SVC_SETUP_STATE: case SVC_SETUP_STATE:
if (!svc->pid) if (!svc->pid)
svc_set_state(svc, SVC_READY_STATE); svc_set_state(svc, SVC_STARTING_STATE);
break; break;
case SVC_READY_STATE: case SVC_READY_STATE:
@@ -1953,22 +1948,36 @@ restart:
if (sm_is_in_teardown(&sm)) if (sm_is_in_teardown(&sm))
break; break;
err = service_start(svc); if (svc_has_pre(svc)) {
if (err) { svc_set_state(svc, SVC_SETUP_STATE);
if (svc_is_missing(svc)) { service_pre_script(svc);
svc_set_state(svc, SVC_HALTED_STATE);
break;
}
(*restart_cnt)++;
break; break;
} }
svc_set_state(svc, SVC_STARTING_STATE);
/* Everything went fine, clean and set state */
svc_mark_clean(svc);
svc_set_state(svc, SVC_RUNNING_STATE);
} }
break; break;
case SVC_STARTING_STATE:
if (!enabled) {
svc_set_state(svc, SVC_HALTED_STATE);
break;
}
err = service_start(svc);
if (err) {
if (svc_is_missing(svc)) {
svc_set_state(svc, SVC_HALTED_STATE);
break;
}
(*restart_cnt)++;
break;
}
/* Everything went fine, clean and set state */
svc_mark_clean(svc);
svc_set_state(svc, SVC_RUNNING_STATE);
break;
case SVC_RUNNING_STATE: case SVC_RUNNING_STATE:
if (!enabled) { if (!enabled) {
service_stop(svc); service_stop(svc);
+1
View File
@@ -63,6 +63,7 @@ typedef enum {
SVC_SETUP_STATE, /* Running pre: script */ SVC_SETUP_STATE, /* Running pre: script */
SVC_WAITING_STATE, /* Condition is in flux, process SIGSTOPed */ SVC_WAITING_STATE, /* Condition is in flux, process SIGSTOPed */
SVC_READY_STATE, /* Enabled but condition not satisfied */ SVC_READY_STATE, /* Enabled but condition not satisfied */
SVC_STARTING_STATE, /* Conditions OK and pre: script done, start */
SVC_RUNNING_STATE, /* Process running */ SVC_RUNNING_STATE, /* Process running */
} svc_state_t; } svc_state_t;