From owner-svn-soc-all@freebsd.org Mon Aug 7 07:25:21 2017 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E900ADC07EF for ; Mon, 7 Aug 2017 07:25:21 +0000 (UTC) (envelope-from kneitinger@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id CDA7B82BEA for ; Mon, 7 Aug 2017 07:25:21 +0000 (UTC) (envelope-from kneitinger@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id v777PLPZ011488 for ; Mon, 7 Aug 2017 07:25:21 GMT (envelope-from kneitinger@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id v777PJqI011410 for svn-soc-all@FreeBSD.org; Mon, 7 Aug 2017 07:25:19 GMT (envelope-from kneitinger@FreeBSD.org) Date: Mon, 7 Aug 2017 07:25:19 GMT Message-Id: <201708070725.v777PJqI011410@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to kneitinger@FreeBSD.org using -f From: kneitinger@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r325765 - in soc2017/kneitinger/libbe-head: lib/libbe rescue/rescue sbin sbin/be MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Aug 2017 07:25:22 -0000 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 #include #include +#include #include #include +#include #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@snapshot] beName", - "\tbe create [-r] beName@snapshot", - "\tbe destroy [-F] ⟨beName | beName@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@snapshot] beName\n" + "\tbe create [-r] beName@snapshot\n" + "\tbe destroy [-F] beName | beName@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;