diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-02-13 21:27:11 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-02-13 21:46:32 +0200 |
commit | c9581808b72ff25623c87cf49c471ce7f017985d (patch) | |
tree | 3b6c7143eec966561e24c05ffb87e1d55b4acf58 | |
parent | 3c774556e22cd30c42304614e14218a767e4d700 (diff) | |
download | pies-c9581808b72ff25623c87cf49c471ce7f017985d.tar.gz pies-c9581808b72ff25623c87cf49c471ce7f017985d.tar.bz2 |
Stop disabled components when switching runlevels.
* src/prog.h (status_enabled, status_disabled): Remove.
(status_stopped, status_running): New modes.
All uses updated.
* src/comp.c (component_finish): Disable ondemand component
by default.
* src/ctl.c (json_object_set_bool): New function.
(pies_status_str): Update.
(prog_serialize): Set "disabled" attribute.
(fun_stop, fun_start): Use CF_DISABLED flag.
(res_runlevel): Schedule ACTION_RELOAD.
* src/pies.h (json_object_set_bool): New proto.
* src/piesctl.c (status_trans): Reflect changes in modes.
(print_comp): Check the "disabled" attribute.
* src/progman.c (register_prog0)
(prog_open_socket,prog_start,prog_stop)
(progman_wake_sleeping)
(prog_start_prerequisites)
(react, progman_cleanup)
(progman_stop_component): Update.
(no_children_left): Fix.
* src/sysvinit.c (enablecomp): Make CF_DISABLED flag
persist for ondemand components.
(runlevel_setup_prog): Use CF_DISABLED flag.
(inittrans): Stop inactivated processes.
* doc/pies.texi: Update.
-rw-r--r-- | doc/pies.texi | 19 | ||||
-rw-r--r-- | src/comp.c | 3 | ||||
-rw-r--r-- | src/ctl.c | 30 | ||||
-rw-r--r-- | src/pies.h | 1 | ||||
-rw-r--r-- | src/piesctl.c | 20 | ||||
-rw-r--r-- | src/prog.h | 7 | ||||
-rw-r--r-- | src/progman.c | 86 | ||||
-rw-r--r-- | src/sysvinit.c | 66 |
8 files changed, 156 insertions, 76 deletions
diff --git a/doc/pies.texi b/doc/pies.texi index 46bd837..39a2694 100644 --- a/doc/pies.texi +++ b/doc/pies.texi @@ -2439,12 +2439,23 @@ describes the type: @headitem Flag @tab Meaning +@item 3 @tab SysV init @samp{ctrlaltdel} component @item A @tab Accept-style component +@item B @tab SysV init @samp{boot} component @item C @tab Init-style component +@item c @tab SysV init @samp{once} component +@item D @tab SysV init @samp{ondemand} component @item E @tab Command being executed +@item F @tab SysV init @samp{powerfail} component +@item f @tab SysV init @samp{powerwait} component @item I @tab Inetd-style component +@item i @tab SysV init @samp{sysinit} component +@item k @tab SysV init @samp{kbrequest} component +@item n @tab SysV init @samp{powerfailnow} component +@item o @tab SysV init @samp{powerokwait} component @item P @tab Pass-style component @item R @tab Output redirector +@item W @tab SysV init @samp{wait} component +@item w @tab SysV init @samp{bootwait} component @end multitable - The second flag is meaningful only for components, i.e. if the first -flag is one of @samp{CAIP}. Its values are: + The second flag is meaningful only for components. Its values are: @@ -2452,3 +2463,4 @@ flag is one of @samp{CAIP}. Its values are: @headitem Flag @tab Meaning -@item D @tab Disabled component +@item - @tab Disabled component +@item f @tab A finished @samp{once} component @item L @tab Inetd listener @@ -2457,2 +2469,3 @@ flag is one of @samp{CAIP}. Its values are: @item s @tab Component is sleeping +@item T @tab Component is stopped @end multitable @@ -731,2 +731,5 @@ component_finish (struct component *comp, grecs_locus_t *locus) } + + if (comp->mode == pies_comp_ondemand) + comp->flags |= CF_DISABLED; } @@ -465,2 +465,8 @@ json_object_set_number (struct json_value *obj, char const *name, double val) +void +json_object_set_bool (struct json_value *obj, char const *name, int val) +{ + json_object_set (obj, name, json_new_bool (val)); +} + static struct json_value * @@ -1451,4 +1457,4 @@ static char * const pies_comp_mode_str[] = { static char * const pies_status_str[] = { - [status_enabled] = "enabled", - [status_disabled] = "disabled", + [status_stopped] = "stopped", + [status_running] = "running", [status_listener] = "listener", @@ -1824,2 +1830,5 @@ prog_serialize (struct json_value *ret, struct prog *prog) FORMAT_IDX (ret, "status", pies_status_str, prog->v.p.status); + + json_object_set_bool (ret, "disabled", + prog->v.p.comp->flags & CF_DISABLED); @@ -1866,4 +1875,6 @@ fun_stop (struct json_value *result, struct prog *prog) { - if (prog->v.p.status == status_disabled) + if (prog->v.p.comp->flags & CF_DISABLED + && prog->v.p.status == status_stopped) { + json_object_set_string (result, "status", "ER"); @@ -1874,5 +1885,4 @@ fun_stop (struct json_value *result, struct prog *prog) { + prog->v.p.comp->flags |= CF_DISABLED; progman_stop_component (&prog); - if (prog) - prog->v.p.comp->flags |= CF_DISABLED; json_object_set_string (result, "status", "OK"); @@ -1887,5 +1897,4 @@ fun_start (struct json_value *result, struct prog *prog) { - case status_disabled: + case status_stopped: prog->v.p.comp->flags &= ~CF_DISABLED; - prog->v.p.status = status_enabled; json_object_set_string (result, "status", "OK"); @@ -1895,3 +1904,3 @@ fun_start (struct json_value *result, struct prog *prog) case status_finished: - prog->v.p.status = status_enabled; + prog->v.p.status = status_stopped; prog->v.p.failcount = 0; @@ -2051,3 +2060,6 @@ res_runlevel (struct ctlio *io, enum http_method meth, && sysvinit_set_runlevel (val->v.s[0]) == 0) - json_object_set_string (io->output.reply, "status", "OK"); + { + pies_schedule_action (ACTION_RELOAD); + json_object_set_string (io->output.reply, "status", "OK"); + } else @@ -589 +589,2 @@ void json_object_set_number (struct json_value *obj, char const *name, double val); +void json_object_set_bool (struct json_value *obj, char const *name, int val); diff --git a/src/piesctl.c b/src/piesctl.c index d6a39a2..5f26aec 100644 --- a/src/piesctl.c +++ b/src/piesctl.c @@ -1077,4 +1077,4 @@ struct kwtrans mode_trans[] = { struct kwtrans status_trans[] = { - { "enabled", 'R' }, - { "disabled", 'D' }, + { "running", 'R' }, + { "stopped", 'T' }, { "listener", 'L' }, @@ -1161,3 +1161,3 @@ print_comp (FILE *fp, struct json_value *v, size_t n) p = getval (v, "mode", json_string, 0); - if (v) + if (p) fbuf[fidx++] = kwtoc (p->v.s, mode_trans); @@ -1165,7 +1165,13 @@ print_comp (FILE *fp, struct json_value *v, size_t n) fbuf[fidx++] = '-'; - p = getval (v, "status", json_string, 0); - if (p) - fbuf[fidx++] = status = kwtoc (p->v.s, status_trans); - else + p = getval (v, "disabled", json_bool, 0); + if (p && p->v.b) fbuf[fidx++] = '-'; + else + { + p = getval (v, "status", json_string, 0); + if (p) + fbuf[fidx++] = status = kwtoc (p->v.s, status_trans); + else + fbuf[fidx++] = '-'; + } } @@ -25,5 +25,4 @@ enum prog_status { - status_enabled, /* Component enabled. prog->pid!=0 shows if it is - actually running */ - status_disabled, /* Component is disabled. */ + status_stopped, /* Component is stopped. */ + status_running, /* Component is running */ status_listener, /* Component is an inetd listener */ @@ -62,3 +61,3 @@ struct prog size_t num_instances; /* Number of running instances */ - /* If comp->type == pies_comp_inetd && status == status_enabled */ + /* If comp->type == pies_comp_inetd && status == status_running */ struct prog *listener; diff --git a/src/progman.c b/src/progman.c index 2c73b2b..29b5331 100644 --- a/src/progman.c +++ b/src/progman.c @@ -272,7 +272,7 @@ register_prog0 (struct component *comp) newp->v.p.socket = -1; - if (comp->flags & CF_DISABLED) - newp->v.p.status = status_disabled; - else if (comp->mode == pies_comp_inetd) + if (comp->mode == pies_comp_inetd) newp->v.p.status = status_listener; - + else + newp->v.p.status = status_stopped; + if (comp->mode != pies_comp_exec) @@ -940,3 +940,4 @@ prog_open_socket (struct prog *prog) { - prog->v.p.status = status_disabled; + prog->v.p.status = status_stopped; + prog->v.p.comp->flags |= CF_DISABLED; return 1; @@ -948,3 +949,4 @@ prog_open_socket (struct prog *prog) prog->v.p.socket = -1; - prog->v.p.status = status_disabled; + prog->v.p.status = status_stopped; + prog->v.p.comp->flags |= CF_DISABLED; return 1; @@ -1041,3 +1043,3 @@ prog_start (struct prog *prog) { - if (prog->v.p.status != status_disabled) + if (!(prog->v.p.comp->flags & CF_DISABLED)) { @@ -1045,3 +1047,4 @@ prog_start (struct prog *prog) prog_tag (prog)); - prog->v.p.status = status_disabled; + prog->v.p.status = status_stopped; + prog->v.p.comp->flags |= CF_DISABLED; } @@ -1050,3 +1053,2 @@ prog_start (struct prog *prog) prog->v.p.wait = is_comp_wait (prog->v.p.comp); - debug (1, ("ok to start %s", prog->v.p.comp->tag)); } @@ -1238,3 +1240,3 @@ prog_start (struct prog *prog) prog->pid = pid; - prog->v.p.status = status_enabled; + prog->v.p.status = status_running; debug (1, (_("%s started, pid=%lu"), prog_tag (prog), @@ -1436,3 +1438,3 @@ progman_create_sockets () if (fd == -1) - prog->v.p.status = status_disabled; + prog->v.p.comp->flags |= CF_DISABLED; else if (register_program_socket (comp->socket_type, fd, prog)) @@ -1440,3 +1442,3 @@ progman_create_sockets () close (fd); - prog->v.p.status = status_disabled; + prog->v.p.comp->flags |= CF_DISABLED; } @@ -1511,3 +1513,3 @@ progman_start () } - else if ((prog->v.p.status == status_enabled && prog->pid == 0) + else if (prog->v.p.status == status_stopped || prog->v.p.status == status_sleeping) @@ -1562,3 +1564,3 @@ progman_wake_sleeping (int onalrm) { - prog->v.p.status = status_enabled; + prog->v.p.status = status_running; prog->v.p.failcount = 0; @@ -1578,5 +1580,4 @@ progman_wake_sleeping (int onalrm) - case status_enabled: - if (prog->pid == 0) - prog_start (prog); + case status_stopped: + prog_start (prog); break; @@ -1599,3 +1600,3 @@ prog_start_prerequisites (struct prog *prog) - if (prog->v.p.status == status_disabled) + if (prog->v.p.comp->flags & CF_DISABLED) return 1; @@ -1614,2 +1615,9 @@ prog_start_prerequisites (struct prog *prog) } + + if (comp->flags & CF_DISABLED) + { + prog->v.p.comp->flags |= CF_DISABLED; + return 1; + } + p = comp->prog; @@ -1617,10 +1625,7 @@ prog_start_prerequisites (struct prog *prog) { - case status_enabled: - if (prog->pid != 0) - continue; - break; + case status_running: + continue; - case status_disabled: - prog->v.p.status = status_disabled; - return 1; + case status_stopped: + break; @@ -1642,4 +1647,4 @@ prog_start_prerequisites (struct prog *prog) prog_start (p); - if (p->v.p.comp->mode == pies_comp_once || - !(p->v.p.status == status_enabled && p->pid)) + if (p->v.p.comp->mode == pies_comp_once + || p->v.p.status != status_running)//FIXME ret = 1; @@ -1692,3 +1697,3 @@ prog_stop (struct prog *prog, int sig) { - if (prog->v.p.status == status_enabled) + if (prog->v.p.status == status_running) { @@ -1714,3 +1719,3 @@ prog_stop_all (int sig) if (IS_COMPONENT (prog) - && (prog->v.p.status == status_enabled + && (prog->v.p.status == status_running || prog->v.p.status == status_stopping)) @@ -1738,3 +1743,9 @@ no_children_left (void *p) { - return proghead == NULL; + struct prog *prog; + + for (prog = proghead; prog; prog = prog->next) + if (prog->pid > 0) + return 0; + + return 1; } @@ -2229,3 +2240,3 @@ react (struct prog *prog, int status, pid_t pid) prog_tag (prog)); - prog->v.p.status = status_disabled; + prog->v.p.comp->flags |= CF_DISABLED; /* FIXME: @@ -2315,5 +2326,3 @@ progman_cleanup (int expect_term) - prog->v.p.status = - (prog->v.p.comp->flags & CF_DISABLED) - ? status_disabled : status_enabled; + prog->v.p.status = status_stopped; prog_stop_dependents (prog); @@ -2360,3 +2369,3 @@ progman_stop_component (struct prog **progptr) { - case status_enabled: + case status_running: case status_listener: @@ -2366,10 +2375,5 @@ progman_stop_component (struct prog **progptr) - case status_disabled: + case status_stopped: if (!component_is_active (prog->v.p.comp)) destroy_prog (progptr); - else if (!(prog->v.p.comp->flags & CF_DISABLED)) - { - logmsg (LOG_INFO, _("enabling component `%s'"), prog_tag (prog)); - prog->v.p.status = status_enabled; - } break; diff --git a/src/sysvinit.c b/src/sysvinit.c index 9e918c7..c9447ff 100644 --- a/src/sysvinit.c +++ b/src/sysvinit.c @@ -221,3 +221,2 @@ enablecomp (struct prog *prog, void *data) struct enstate *s = data; - int rc; struct component *comp = prog->v.p.comp; @@ -242,3 +241,4 @@ enablecomp (struct prog *prog, void *data) case pies_comp_ondemand: - return prog->v.p.status == status_enabled; + /* Disabled flag persists: */ + return !(prog->v.p.comp->flags & CF_DISABLED); @@ -255,7 +255,9 @@ enablecomp (struct prog *prog, void *data) } - rc = !!strchr (comp->runlevels, runlevel); - if (!rc) - return rc; + + if (!strchr (comp->runlevels, runlevel)) + return 0; + if (prog->v.p.status == status_finished) return -1; + if (s && s->mask & PIES_COMP_WAIT) @@ -269,3 +271,4 @@ enablecomp (struct prog *prog, void *data) } - return rc; + + return 1; } @@ -281,8 +284,8 @@ runlevel_setup_prog (struct prog *prog, void *data) if (rc) - prog->v.p.status = status_enabled; + prog->v.p.comp->flags &= ~CF_DISABLED; else - prog->v.p.status = status_disabled; - debug (1, ("%s: %s", prog_tag (prog), - prog->v.p.status == status_enabled ? - "enabled" : "disabled")); + prog->v.p.comp->flags |= CF_DISABLED; + debug (2, ("%s: %s", prog_tag (prog), + prog->v.p.comp->flags & CF_DISABLED ? + "disabled" : "enabled")); } @@ -315,3 +318,3 @@ demand_prog (struct prog *prog, void *data) { - prog->v.p.status = status_enabled; + prog->v.p.comp->flags &= ~CF_DISABLED; debug (1, ("%s: %s", prog_tag (prog), "enabled")); @@ -710,2 +713,27 @@ sysvinit_begin () +#define IS_RUNNING_DISABLED_PROG(prog) \ + (IS_COMPONENT (prog) \ + && prog->v.p.status == status_running \ + && prog->v.p.comp->flags & CF_DISABLED) \ + +static int +cond_running_disabled (struct prog *prog, void *data) +{ + return IS_RUNNING_DISABLED_PROG (prog); +} + +static int +running_disabled (void *data) +{ + return progman_foreach (cond_running_disabled, NULL); +} + +static int +terminate_disabled (struct prog *prog, void *data) +{ + if (IS_RUNNING_DISABLED_PROG (prog)) + prog_stop (prog, *(int*)data); + return 0; +} + int @@ -771,2 +799,4 @@ inittrans () { + int sig; + envsetup (); @@ -779,2 +809,14 @@ inittrans () sysvinit_runlevel_setup (PIES_COMP_DEFAULT, NULL); + + /* Stop disabled programs */ + sig = SIGTERM; + progman_foreach (terminate_disabled, &sig); + if (progman_wait_until (running_disabled, NULL)) + { + sig = SIGKILL; + progman_foreach (terminate_disabled, &sig); + progman_wait_until (running_disabled, NULL); + } + + /* Clear the wait flag */ wait = 0; |