From a9602ad6e018afd7621052e1263d3cae0e6da5f3 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 18 Mar 2019 18:38:27 +0100 Subject: [PATCH] Cleanup status reporting - mimic format of initd - skip formatting if not a tty - distinguish exited because failed vs exited because done Signed-off-by: David Oberhollenzer --- cmd/service/status.c | 30 +++++++++++++++++------------- initd/supervisor.c | 15 +++++++++++++-- lib/include/initsock.h | 3 ++- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/cmd/service/status.c b/cmd/service/status.c index c8e87c4..3be2f3e 100644 --- a/cmd/service/status.c +++ b/cmd/service/status.c @@ -53,31 +53,35 @@ static int cmd_status(int argc, char **argv) switch (resp.state) { case ESS_RUNNING: if (!is_tty) { - state = "Running"; + state = "UP"; break; } - state = "\033[22;32mRunning\033[0m"; + state = "\033[22;32m UP \033[0m"; break; case ESS_ENQUEUED: - state = " Queue "; + state = "SCHED"; break; - case ESS_EXITED: + case ESS_FAILED: if (!is_tty) { - state = "Exited "; + state = "FAIL"; break; } - if (resp.exit_status == EXIT_SUCCESS) { - state = "\033[22;33mExited \033[0m"; - } else { - state = "\033[22;31mExited \033[0m"; + state = "\033[22;31mFAIL\033[0m"; + break; + case ESS_DONE: + if (!is_tty) { + state = "DONE"; + break; } + + state = "\033[22;33mDONE\033[0m"; break; default: if (!is_tty) { - state = "Unknown"; + state = "UNKNOWN"; break; } - state = "\033[22;31mUnknown\033[0m"; + state = "\033[22;31mUNKNOWN\033[0m"; break; } @@ -98,8 +102,8 @@ static command_t status = { .usage = "", .s_desc = "report the status of the currently enabled services", .l_desc = "Gathers a list of all currently running services and the " - "state that they are in (currently running, exited, wating " - "to get scheduled).", + "state that they are in (currently running, done, failed, " + "wating to get scheduled).", .run_cmd = cmd_status, }; diff --git a/initd/supervisor.c b/initd/supervisor.c index 3743ad6..cd38469 100644 --- a/initd/supervisor.c +++ b/initd/supervisor.c @@ -8,6 +8,7 @@ static service_t *running = NULL; static service_t *terminated = NULL; static service_t *queue = NULL; static service_t *completed = NULL; +static service_t *failed = NULL; static int singleshot = 0; static bool waiting = false; @@ -38,7 +39,7 @@ static void handle_terminated_service(service_t *svc) if (svc->rspwn_limit == 0) { print_status(svc->desc, STATUS_FAIL, false); - break; + goto out_failure; } } @@ -51,6 +52,8 @@ static void handle_terminated_service(service_t *svc) STATUS_OK : STATUS_FAIL, true); if (singleshot == 0 && queue == NULL) target_completed(target); + if (svc->status != EXIT_SUCCESS) + goto out_failure; break; case SVC_ONCE: singleshot -= 1; @@ -59,10 +62,16 @@ static void handle_terminated_service(service_t *svc) STATUS_OK : STATUS_FAIL, false); if (singleshot == 0 && queue == NULL && !waiting) target_completed(target); + if (svc->status != EXIT_SUCCESS) + goto out_failure; break; } svc->next = completed; completed = svc; + return; +out_failure: + svc->next = failed; + failed = svc; } void supervisor_handle_exited(pid_t pid, int status) @@ -185,7 +194,9 @@ void supervisor_answer_status_request(int fd, const void *dst, size_t addrlen) { if (send_svc_list(fd, dst, addrlen, ESS_RUNNING, running)) return; - if (send_svc_list(fd, dst, addrlen, ESS_EXITED, completed)) + if (send_svc_list(fd, dst, addrlen, ESS_DONE, completed)) + return; + if (send_svc_list(fd, dst, addrlen, ESS_FAILED, failed)) return; if (send_svc_list(fd, dst, addrlen, ESS_ENQUEUED, queue)) return; diff --git a/lib/include/initsock.h b/lib/include/initsock.h index 9c84f3e..75d859c 100644 --- a/lib/include/initsock.h +++ b/lib/include/initsock.h @@ -15,7 +15,8 @@ typedef enum { ESS_NONE = 0x00, ESS_RUNNING = 0x01, ESS_ENQUEUED = 0x02, - ESS_EXITED = 0x03, + ESS_DONE = 0x03, + ESS_FAILED = 0x04 } E_SERVICE_STATE; typedef struct {