aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-02-13 21:27:11 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-02-13 21:46:32 +0200
commitc9581808b72ff25623c87cf49c471ce7f017985d (patch)
tree3b6c7143eec966561e24c05ffb87e1d55b4acf58
parent3c774556e22cd30c42304614e14218a767e4d700 (diff)
downloadpies-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.texi19
-rw-r--r--src/comp.c3
-rw-r--r--src/ctl.c30
-rw-r--r--src/pies.h1
-rw-r--r--src/piesctl.c20
-rw-r--r--src/prog.h7
-rw-r--r--src/progman.c86
-rw-r--r--src/sysvinit.c66
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
diff --git a/src/comp.c b/src/comp.c
index 6a0e4ba..83818c2 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -731,2 +731,5 @@ component_finish (struct component *comp, grecs_locus_t *locus)
}
+
+ if (comp->mode == pies_comp_ondemand)
+ comp->flags |= CF_DISABLED;
}
diff --git a/src/ctl.c b/src/ctl.c
index 6f50246..f4154f6 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -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
diff --git a/src/pies.h b/src/pies.h
index 9fb87c6..14ea7b7 100644
--- a/src/pies.h
+++ b/src/pies.h
@@ -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++] = '-';
+ }
}
diff --git a/src/prog.h b/src/prog.h
index 2dc8591..1db2eee 100644
--- a/src/prog.h
+++ b/src/prog.h
@@ -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;

Return to:

Send suggestions and report system problems to the System administrator.