svn commit: r352211 - head/sbin/bectl
Kyle Evans
kevans at FreeBSD.org
Wed Sep 11 13:27:11 UTC 2019
Author: kevans
Date: Wed Sep 11 13:27:10 2019
New Revision: 352211
URL: https://svnweb.freebsd.org/changeset/base/352211
Log:
bectl(8): Add a "check" command
This command simply returns 0 at the moment and explicitly takes no
arguments. This should be used by utilities wanting to see if bectl can
operate on the system they're running, or with a specific root (`bectl -r`).
It may grow more checks than "will libbe successfully init" in the future,
but for now this is enough as that checks for the dataset mounted at "/" and
that it looks capable of being a BE root (e.g. it's not a top-level dataset)
bectl commands can now specify if they want to be silent, and this will turn
off libbe_print_on_error so they can control the output as needed. This is
already used in `bectl check`, and may be turned on in the future for some
other commands where libbe errors are better suppressed as the failure mode
may be obvious.
Requested by: David Fullard
MFC after: 3 days
Modified:
head/sbin/bectl/bectl.8
head/sbin/bectl/bectl.c
Modified: head/sbin/bectl/bectl.8
==============================================================================
--- head/sbin/bectl/bectl.8 Wed Sep 11 13:01:59 2019 (r352210)
+++ head/sbin/bectl/bectl.8 Wed Sep 11 13:27:10 2019 (r352211)
@@ -18,7 +18,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 4, 2019
+.Dd September 11, 2019
.Dt BECTL 8
.Os
.Sh NAME
@@ -30,6 +30,8 @@
.Op Fl t
.Ar beName
.Nm
+.Cm check
+.Nm
.Cm create
.Op Fl r
.Op Fl e Brq Ar nonActiveBe | Ar beName Ns Cm @ Ns Ar snapshot
@@ -103,6 +105,15 @@ as the default boot filesystem.
If the
.Op Fl t
flag is given, this takes effect only for the next boot.
+.It Xo
+.Cm check
+.Xc
+Performs a silent sanity check on the current system.
+If boot environments are supported and used,
+.Nm
+will exit with a status code of 0.
+Any other status code is not currently defined and may, in the future, grow
+special meaning for different degrees of sanity check failures.
.It Xo
.Cm create
.Op Fl r
Modified: head/sbin/bectl/bectl.c
==============================================================================
--- head/sbin/bectl/bectl.c Wed Sep 11 13:01:59 2019 (r352210)
+++ head/sbin/bectl/bectl.c Wed Sep 11 13:27:10 2019 (r352211)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include "bectl.h"
static int bectl_cmd_activate(int argc, char *argv[]);
+static int bectl_cmd_check(int argc, char *argv[]);
static int bectl_cmd_create(int argc, char *argv[]);
static int bectl_cmd_destroy(int argc, char *argv[]);
static int bectl_cmd_export(int argc, char *argv[]);
@@ -72,6 +73,7 @@ usage(bool explicit)
"\tbectl add (path)*\n"
#endif
"\tbectl activate [-t] beName\n"
+ "\tbectl check\n"
"\tbectl create [-r] [-e {nonActiveBe | beName at snapshot}] beName\n"
"\tbectl create [-r] beName at snapshot\n"
"\tbectl destroy [-F] {beName | beName at snapshot}\n"
@@ -97,40 +99,40 @@ usage(bool explicit)
struct command_map_entry {
const char *command;
int (*fn)(int argc, char *argv[]);
+ /* True if libbe_print_on_error should be disabled */
+ bool silent;
};
static struct command_map_entry command_map[] =
{
- { "activate", bectl_cmd_activate },
- { "create", bectl_cmd_create },
- { "destroy", bectl_cmd_destroy },
- { "export", bectl_cmd_export },
- { "import", bectl_cmd_import },
+ { "activate", bectl_cmd_activate,false },
+ { "create", bectl_cmd_create, false },
+ { "destroy", bectl_cmd_destroy, false },
+ { "export", bectl_cmd_export, false },
+ { "import", bectl_cmd_import, false },
#if SOON
- { "add", bectl_cmd_add },
+ { "add", bectl_cmd_add, false },
#endif
- { "jail", bectl_cmd_jail },
- { "list", bectl_cmd_list },
- { "mount", bectl_cmd_mount },
- { "rename", bectl_cmd_rename },
- { "unjail", bectl_cmd_unjail },
- { "unmount", bectl_cmd_unmount },
+ { "jail", bectl_cmd_jail, false },
+ { "list", bectl_cmd_list, false },
+ { "mount", bectl_cmd_mount, false },
+ { "rename", bectl_cmd_rename, false },
+ { "unjail", bectl_cmd_unjail, false },
+ { "unmount", bectl_cmd_unmount, false },
+ { "check", bectl_cmd_check, true },
};
-static int
-get_cmd_index(const char *cmd, int *idx)
+static struct command_map_entry *
+get_cmd_info(const char *cmd)
{
- int map_size;
+ size_t i;
- map_size = nitems(command_map);
- for (int i = 0; i < map_size; ++i) {
- if (strcmp(cmd, command_map[i].command) == 0) {
- *idx = i;
- return (0);
- }
+ for (i = 0; i < nitems(command_map); ++i) {
+ if (strcmp(cmd, command_map[i].command) == 0)
+ return (&command_map[i]);
}
- return (1);
+ return (NULL);
}
@@ -509,14 +511,28 @@ bectl_cmd_unmount(int argc, char *argv[])
return (err);
}
+static int
+bectl_cmd_check(int argc, char *argv[] __unused)
+{
+ /* The command is left as argv[0] */
+ if (argc != 1) {
+ fprintf(stderr, "bectl check: wrong number of arguments\n");
+ return (usage(false));
+ }
+
+ return (0);
+}
+
int
main(int argc, char *argv[])
{
+ struct command_map_entry *cmd;
const char *command;
char *root;
- int command_index, rc;
+ int rc;
+ cmd = NULL;
root = NULL;
if (argc < 2)
return (usage(false));
@@ -544,18 +560,17 @@ main(int argc, char *argv[])
if ((strcmp(command, "-?") == 0) || (strcmp(command, "-h") == 0))
return (usage(true));
- if (get_cmd_index(command, &command_index)) {
+ if ((cmd = get_cmd_info(command)) == NULL) {
fprintf(stderr, "unknown command: %s\n", command);
return (usage(false));
}
-
if ((be = libbe_init(root)) == NULL)
return (-1);
- libbe_print_on_error(be, true);
+ libbe_print_on_error(be, !cmd->silent);
- rc = command_map[command_index].fn(argc, argv);
+ rc = cmd->fn(argc, argv);
libbe_close(be);
return (rc);
More information about the svn-src-all
mailing list