socsvn commit: r325765 - in soc2017/kneitinger/libbe-head: lib/libbe rescue/rescue sbin sbin/be
kneitinger at FreeBSD.org
kneitinger at FreeBSD.org
Mon Aug 7 07:25:22 UTC 2017
Author: kneitinger
Date: Mon Aug 7 07:25:18 2017
New Revision: 325765
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=325765
Log:
Add boot environment import/export to libbe/be via zfs send and receive.
Additionally, this commit adds be(1) the sbin Makefile's zfs specific SUBDIR,
so that it is copied to the system when appropriate.
Modified:
soc2017/kneitinger/libbe-head/lib/libbe/be.c
soc2017/kneitinger/libbe-head/lib/libbe/be.h
soc2017/kneitinger/libbe-head/lib/libbe/be_access.c
soc2017/kneitinger/libbe-head/rescue/rescue/Makefile
soc2017/kneitinger/libbe-head/sbin/Makefile
soc2017/kneitinger/libbe-head/sbin/be/be.c
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be.c
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be.c Mon Aug 7 03:14:45 2017 (r325764)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be.c Mon Aug 7 07:25:18 2017 (r325765)
@@ -32,8 +32,10 @@
#include <ctype.h>
#include <kenv.h>
#include <libgen.h>
+#include <libzfs_core.h>
#include <stdio.h>
#include <time.h>
+#include <unistd.h>
#include "be.h"
#include "be_impl.h"
@@ -448,3 +450,43 @@
return (set_error(lbh, err));
}
+
+
+int
+be_export(libbe_handle_t *lbh, char *bootenv, int fd)
+{
+ char buf[BE_MAXPATHLEN];
+ zfs_handle_t *zfs;
+ int err;
+
+ be_root_concat(lbh, bootenv, buf);
+
+ if ((zfs = zfs_open(lbh->lzh, buf, ZFS_TYPE_DATASET)) == NULL) {
+ return (BE_ERR_ZFSOPEN);
+ }
+
+ err = zfs_send_one(zfs, NULL, fd, 0);
+ return (err);
+}
+
+
+int
+be_import(libbe_handle_t *lbh, char *bootenv, int fd)
+{
+ char buf[BE_MAXPATHLEN];
+ int err;
+
+ if (err = be_root_concat(lbh, bootenv, buf)) {
+ // TODO error handle
+ return (-1);
+ }
+
+ // lzc_receive(SNAPNAME, PROPS, ORIGIN, FORCE, fd)) {
+ if (err = lzc_receive(buf, NULL, NULL, false, fd)) {
+ /* TODO: go through libzfs_core's recv_impl and find returned
+ * errors and set appropriate BE_ERR */
+ return (-1);
+ }
+
+ return (BE_ERR_SUCCESS);
+}
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be.h
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be.h Mon Aug 7 03:14:45 2017 (r325764)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be.h Mon Aug 7 07:25:18 2017 (r325765)
@@ -90,9 +90,6 @@
int be_mount(libbe_handle_t *, char *, char *, int);
int be_unmount(libbe_handle_t *, char *, int);
-/* Bootenv jail functions: be_access.c */
-int be_jail(libbe_handle_t *, char *);
-
/* Error related functions: be_error.c */
int libbe_errno(libbe_handle_t *);
const char *libbe_error_description(libbe_handle_t *);
@@ -104,4 +101,7 @@
int be_validate_snap(libbe_handle_t *, char *);
bool be_exists(libbe_handle_t *, char *);
+int be_export(libbe_handle_t *, char *, int fd);
+int be_import(libbe_handle_t *, char *, int fd);
+
#endif /* _LIBBE_H */
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be_access.c
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be_access.c Mon Aug 7 03:14:45 2017 (r325764)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be_access.c Mon Aug 7 07:25:18 2017 (r325765)
@@ -115,13 +115,3 @@
return (set_error(lbh, BE_ERR_SUCCESS));
}
-
-
-/*
- * usage
- */
-int
-be_jail(libbe_handle_t *lbh, char *bootenv)
-{
- return (BE_ERR_SUCCESS);
-}
Modified: soc2017/kneitinger/libbe-head/rescue/rescue/Makefile
==============================================================================
--- soc2017/kneitinger/libbe-head/rescue/rescue/Makefile Mon Aug 7 03:14:45 2017 (r325764)
+++ soc2017/kneitinger/libbe-head/rescue/rescue/Makefile Mon Aug 7 07:25:18 2017 (r325765)
@@ -120,6 +120,7 @@
.if ${MK_ZFS} != "no"
CRUNCH_PROGS_sbin+= zfs
+CRUNCH_PROGS_sbin+= zfsbootcfg
CRUNCH_PROGS_sbin+= zpool
CRUNCH_PROGS_usr.sbin+= zdb
.endif
Modified: soc2017/kneitinger/libbe-head/sbin/Makefile
==============================================================================
--- soc2017/kneitinger/libbe-head/sbin/Makefile Mon Aug 7 03:14:45 2017 (r325764)
+++ soc2017/kneitinger/libbe-head/sbin/Makefile Mon Aug 7 07:25:18 2017 (r325765)
@@ -87,6 +87,7 @@
SUBDIR.${MK_PF}+= pflogd
SUBDIR.${MK_QUOTAS}+= quotacheck
SUBDIR.${MK_ROUTED}+= routed
+SUBDIR.${MK_ZFS}+= be
SUBDIR.${MK_ZFS}+= zfsbootcfg
SUBDIR.${MK_TESTS}+= tests
Modified: soc2017/kneitinger/libbe-head/sbin/be/be.c
==============================================================================
--- soc2017/kneitinger/libbe-head/sbin/be/be.c Mon Aug 7 03:14:45 2017 (r325764)
+++ soc2017/kneitinger/libbe-head/sbin/be/be.c Mon Aug 7 07:25:18 2017 (r325765)
@@ -38,6 +38,8 @@
static int be_cmd_activate(int argc, char *argv[]);
static int be_cmd_create(int argc, char *argv[]);
static int be_cmd_destroy(int argc, char *argv[]);
+static int be_cmd_export(int argc, char *argv[]);
+static int be_cmd_import(int argc, char *argv[]);
static int be_cmd_jail(int argc, char *argv[]);
static int be_cmd_list(int argc, char *argv[]);
static int be_cmd_mount(int argc, char *argv[]);
@@ -52,18 +54,20 @@
{
FILE *fp = explicit ? stdout : stderr;
- fprintf(fp, "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
- "usage:\tbe ( -h | -? | subcommand [args...] )",
- "\tbe activate [-t] beName",
- "\tbe create [-r] [-e nonActiveBe | -e beName at snapshot] beName",
- "\tbe create [-r] beName at snapshot",
- "\tbe destroy [-F] ⟨beName | beName at snapshot⟩",
- "\tbe jail ⟨jailID | jailName⟩ bootenv",
- "\tbe list [-a] [-D] [-H] [-s]",
- "\tbe mount beName [mountpoint]",
- "\tbe rename origBeName newBeName",
- "\tbe { ujail | unjail } ⟨jailID | jailName⟩ bootenv",
- "\tbe { umount | unmount } [-f] beName");
+ fprintf(fp,
+ "usage:\tbe ( -h | -? | subcommand [args...] )\n"
+ "\tbe activate [-t] beName\n"
+ "\tbe create [-r] [-e nonActiveBe | -e beName at snapshot] beName\n"
+ "\tbe create [-r] beName at snapshot\n"
+ "\tbe destroy [-F] beName | beName at snapshot⟩\n"
+ "\tbe export sourceBe\n"
+ "\tbe import targetBe\n"
+ "\tbe jail ⟨jailID | jailName⟩ bootenv\n"
+ "\tbe list [-a] [-D] [-H] [-s]\n"
+ "\tbe mount beName [mountpoint]\n"
+ "\tbe rename origBeName newBeName\n"
+ "\tbe { ujail | unjail } ⟨jailID | jailName⟩ bootenv\n"
+ "\tbe { umount | unmount } [-f] beName\n");
return (explicit ? 0 : EX_USAGE);
}
@@ -83,6 +87,8 @@
{ "activate", be_cmd_activate },
{ "create", be_cmd_create },
{ "destroy", be_cmd_destroy },
+ { "export", be_cmd_export },
+ { "import", be_cmd_import },
{ "jail", be_cmd_jail },
{ "list", be_cmd_list },
{ "mount", be_cmd_mount },
@@ -205,6 +211,71 @@
static int
+be_cmd_export(int argc, char *argv[])
+{
+ int opt;
+ char *bootenv;
+
+
+ if (argc == 1) {
+ fprintf(stderr, "be export: missing boot environment name\n");
+ return (usage(false));
+ }
+
+ if (argc > 2) {
+ fprintf(stderr, "be export: extra arguments provided\n");
+ return (usage(false));
+ }
+
+ bootenv = argv[1];
+
+ if (isatty(STDOUT_FILENO)) {
+ fprintf(stderr, "be export: must redirect output\n");
+ return (EX_USAGE);
+ }
+
+ be_export(be, bootenv, STDOUT_FILENO);
+
+ return (0);
+}
+
+
+static int
+be_cmd_import(int argc, char *argv[])
+{
+ char *bootenv;
+
+
+ if (argc == 1) {
+ fprintf(stderr, "be import: missing boot environment name\n");
+ return (usage(false));
+ }
+
+
+ if (argc > 2) {
+ fprintf(stderr, "be import: extra arguments provided\n");
+ return (usage(false));
+ }
+
+ bootenv = argv[1];
+
+ if (isatty(STDIN_FILENO)) {
+ fprintf(stderr, "be import: input can not be from terminal\n");
+ return (EX_USAGE);
+ }
+
+ be_import(be, bootenv, STDIN_FILENO);
+
+
+ return (0);
+
+ // import logic
+
+ return (0);
+}
+
+
+static int
be_cmd_destroy(int argc, char *argv[])
{
int opt;
More information about the svn-soc-all
mailing list