initctl: Remove experimental cond set/clear commands

The commands are both unsafe (insecure) and send the wrong message,
that initctl can be used to script conditions.  Only plugins are
officially supported to manage conditions.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson committed 2020-01-07 00:35:13 +01:00
1 parent 7bf2fcb6e3
commit 744719219e
5 files changed
+10 -87

No files matched your search

-2
View File
@@ -429,8 +429,6 @@ Commands:
touch <CONF> Mark .conf in /etc/finit.d/ for reload touch <CONF> Mark .conf in /etc/finit.d/ for reload
reload Reload *.conf in /etc/finit.d/ (activates changes) reload Reload *.conf in /etc/finit.d/ (activates changes)
cond set <COND> Set (assert) condition => +COND
cond clear <COND> Clear (deassert) condition => -COND
cond show Show condition status cond show Show condition status
cond dump Dump all conditions and their status cond dump Dump all conditions and their status
+9 -17
View File
@@ -47,17 +47,7 @@ service's PID file being created.
Triggering Triggering
---------- ----------
Conditions are triggered by built-in plugins, but can for debugging Conditions can only be triggered by built-in plugins.
purposes also be controlled using the `cond set` and `cond clear`
sub-commands to the `initctl` control tool:
* `initctl cond set your/cond/here`
To set a condition
* `initctl cond clear your/cond/here`
To clear a condition
Conditions retain their current state until the next reconfiguration or Conditions retain their current state until the next reconfiguration or
runlevel change. At that point all set conditions transition into the runlevel change. At that point all set conditions transition into the
@@ -133,12 +123,13 @@ To fake interface `vlan1` suddenly appearing, and test what happens to
```shell ```shell
~ # initctl debug ~ # initctl debug
~ # initctl cond set net/vlan1/exist ~ # mkdir -p /var/run/finit/cond/net/vlan1
~ # cp /var/run/finit/cond /var/run/finit/cond/net/vlan1/exist
``` ```
Then watch the console for the debug messages and then check the output Then watch the console for the debug messages and then check the output
from `initctl cond show` again. (The client will likely have failed to from `initctl cond show` again. The client will likely have failed to
start, but at least the condition is now satisfied.) start, but at least the condition is now satisfied.
There is also the `initctl cond dump` command, which dumps all known There is also the `initctl cond dump` command, which dumps all known
conditions and their current status. conditions and their current status.
@@ -147,9 +138,10 @@ conditions and their current status.
Internals Internals
--------- ---------
Conditions are implemented as simple files in the file system, in the As shown previously, conditions are implemented as simple files in the
`/var/run/finit/cond/` sub-directory. Use the `initctl cond set/clear` file system, in the `/var/run/finit/cond/` sub-directory. The files
commands to add/remove files in this hierarchy. are created, updated, and removed by condition plugins. To debug them,
see the previous section.
A condition is always in one of three states: A condition is always in one of three states:
-46
View File
@@ -181,47 +181,6 @@ ev_t ev_list[] = {
{ NULL, NULL } { NULL, NULL }
}; };
static int do_handle_event(char *event)
{
int i;
for (i = 0; ev_list[i].event; i++) {
ev_t *e = &ev_list[i];
size_t len = MAX(strlen(e->event), strlen(event));
if (!strncasecmp(e->event, event, len)) {
e->cb();
return 0;
}
}
if (event[0] == '-')
cond_clear(&event[1]);
else if (event[0] == '+')
cond_set(&event[1]);
else
cond_set(event);
return 0;
}
static int do_handle_emit(char *buf, size_t len)
{
int result = 0;
char *input, *event, *pos;
input = sanitize(buf, len);
if (!input)
return -1;
event = strtok_r(input, " ", &pos);
while (event) {
result += do_handle_event(event);
event = strtok_r(NULL, " ", &pos);
}
return result;
}
static void send_svc(int sd, svc_t *svc) static void send_svc(int sd, svc_t *svc)
{ {
svc_t empty; svc_t empty;
@@ -339,11 +298,6 @@ static void api_cb(uev_t *w, void *arg, int events)
break; break;
#endif #endif
case INIT_CMD_EMIT:
_d("emit %s", rq.data);
result = do_handle_emit(rq.data, sizeof(rq.data));
break;
case INIT_CMD_GET_RUNLEVEL: case INIT_CMD_GET_RUNLEVEL:
_d("get runlevel"); _d("get runlevel");
rq.runlevel = runlevel; rq.runlevel = runlevel;
+1 -1
View File
@@ -75,7 +75,7 @@
#define INIT_CMD_RELOAD_SVC 12 /* SIGHUP service */ #define INIT_CMD_RELOAD_SVC 12 /* SIGHUP service */
#define INIT_CMD_RESTART_SVC 13 /* STOP + START service */ #define INIT_CMD_RESTART_SVC 13 /* STOP + START service */
#define INIT_CMD_QUERY_INETD 14 #define INIT_CMD_QUERY_INETD 14
#define INIT_CMD_EMIT 15 #define INIT_CMD_UNUSED1 15 /* Unused, was INIT_CMD_EMIT */
#define INIT_CMD_GET_RUNLEVEL 16 #define INIT_CMD_GET_RUNLEVEL 16
#define INIT_CMD_WDOG_HELLO 128 /* Watchdog register and hello */ #define INIT_CMD_WDOG_HELLO 128 /* Watchdog register and hello */
#define INIT_CMD_SVC_ITER 129 #define INIT_CMD_SVC_ITER 129
-21
View File
@@ -140,7 +140,6 @@ static int do_svc(int cmd, char *arg)
return client_send(&rq, sizeof(rq)); return client_send(&rq, sizeof(rq));
} }
static int do_emit (char *arg) { return do_svc(INIT_CMD_EMIT, arg); }
static int do_reload (char *arg) { return do_svc(INIT_CMD_RELOAD, arg); } static int do_reload (char *arg) { return do_svc(INIT_CMD_RELOAD, arg); }
/* /*
@@ -202,22 +201,6 @@ static void show_cond_one(const char *_conds)
putchar('>'); putchar('>');
} }
static int do_cond_magic(char op, char *cond)
{
char event[367]; /* sizeof(init_request.data) */
if (!cond || strlen(cond) < 1)
return 1;
event[0] = op;
strlcpy(&event[1], cond, sizeof(event) - 1);
return do_emit(event);
}
static int do_cond_set (char *cond) { return do_cond_magic('+', cond); }
static int do_cond_clear(char *cond) { return do_cond_magic('-', cond); }
static int dump_one_cond(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf) static int dump_one_cond(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf)
{ {
int len; int len;
@@ -279,8 +262,6 @@ static int do_cond(char *cmd)
char *arg; char *arg;
struct command command[] = { struct command command[] = {
{ "show", do_cond_show }, { "show", do_cond_show },
{ "set", do_cond_set },
{ "clear", do_cond_clear },
{ "dump", do_cond_dump }, { "dump", do_cond_dump },
{ NULL, NULL } { NULL, NULL }
}; };
@@ -596,8 +577,6 @@ static int usage(int rc)
" reload Reload *.conf in /etc/finit.d/ (activates changes)\n" " reload Reload *.conf in /etc/finit.d/ (activates changes)\n"
// " reload <JOB|NAME>[:ID] Reload (SIGHUP) service by job# or name\n" // " reload <JOB|NAME>[:ID] Reload (SIGHUP) service by job# or name\n"
"\n" "\n"
" cond set <COND> Set (assert) condition => +COND\n"
" cond clear <COND> Clear (deassert) condition => -COND\n"
" cond show Show condition status\n" " cond show Show condition status\n"
" cond dump Dump all conditions and their status\n" " cond dump Dump all conditions and their status\n"
"\n" "\n"