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