Date: Thu, 26 Jul 2018 18:56:50 +0000 (UTC) From: Kyle Evans <kevans@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r336747 - projects/bectl/sbin/bectl Message-ID: <201807261856.w6QIuo6C090934@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kevans Date: Thu Jul 26 18:56:50 2018 New Revision: 336747 URL: https://svnweb.freebsd.org/changeset/base/336747 Log: bectl(8): Hack together a more proper `bectl list` Note that the space is currently just the 'used' property of the dataset. Modified: projects/bectl/sbin/bectl/Makefile projects/bectl/sbin/bectl/bectl.c Modified: projects/bectl/sbin/bectl/Makefile ============================================================================== --- projects/bectl/sbin/bectl/Makefile Thu Jul 26 18:34:38 2018 (r336746) +++ projects/bectl/sbin/bectl/Makefile Thu Jul 26 18:56:50 2018 (r336747) @@ -6,6 +6,7 @@ MAN= bectl.8 LIBADD+= be LIBADD+= jail LIBADD+= nvpair +LIBADD+= util CFLAGS+= -I${SRCTOP}/cddl/contrib/opensolaris/lib/libzfs/common CFLAGS+= -I${SRCTOP}/sys/cddl/compat/opensolaris Modified: projects/bectl/sbin/bectl/bectl.c ============================================================================== --- projects/bectl/sbin/bectl/bectl.c Thu Jul 26 18:34:38 2018 (r336746) +++ projects/bectl/sbin/bectl/bectl.c Thu Jul 26 18:56:50 2018 (r336747) @@ -31,16 +31,24 @@ #include <sys/mount.h> #include <errno.h> #include <jail.h> +#include <libutil.h> #include <stdbool.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <sysexits.h> +#include <time.h> #include <unistd.h> #include <be.h> +#define HEADER_BE "BE" +#define HEADER_ACTIVE "Active" +#define HEADER_MOUNT "Mountpoint" +#define HEADER_SPACE "Space" +#define HEADER_CREATED "Created" + static int bectl_cmd_activate(int argc, char *argv[]); static int bectl_cmd_create(int argc, char *argv[]); static int bectl_cmd_destroy(int argc, char *argv[]); @@ -406,8 +414,14 @@ bectl_cmd_jail(int argc, char *argv[]) static int bectl_cmd_list(int argc, char *argv[]) { - nvlist_t *props; - int opt; +#define BUFSZ 64 + nvpair_t *cur; + nvlist_t *props, *dsprops; + unsigned long long ctimenum, space; + size_t be_maxcol; + int active_colsz, active_colsz_def, be_colsz, mount_colsz, opt, space_colsz; + char buf[BUFSZ], *creation, *mnt, *spacestr; + boolean_t active_now, active_reboot; bool show_all_datasets, show_space, hide_headers, show_snaps; props = NULL; @@ -450,10 +464,69 @@ bectl_cmd_list(int argc, char *argv[]) return (1); } - dump_nvlist(props, 0); + be_maxcol = strlen(HEADER_BE); + for (cur = nvlist_next_nvpair(props, NULL); cur != NULL; + cur = nvlist_next_nvpair(props, cur)) { + be_maxcol = MAX(be_maxcol, strlen(nvpair_name(cur))); + } + + be_colsz = -be_maxcol; + /* To be made negative after calculating final col sz */ + active_colsz_def = strlen(HEADER_ACTIVE); + mount_colsz = -(int)strlen(HEADER_MOUNT); + space_colsz = -(int)strlen(HEADER_SPACE); + printf("%*s %s %s %s %s\n", be_colsz, HEADER_BE, HEADER_ACTIVE, + HEADER_MOUNT, HEADER_SPACE, HEADER_CREATED); + buf[5] = '\0'; + cur = NULL; + for (cur = nvlist_next_nvpair(props, NULL); cur != NULL; + cur = nvlist_next_nvpair(props, cur)) { + printf("%*s ", be_colsz, nvpair_name(cur)); + // NR + active_colsz = active_colsz_def; + nvpair_value_nvlist(cur, &dsprops); + if (nvlist_lookup_boolean_value(dsprops, "active", + &active_now) == 0 && active_now) { + printf("N"); + active_colsz--; + } + if (nvlist_lookup_boolean_value(dsprops, "nextboot", + &active_reboot) == 0 && active_reboot) { + printf("R"); + active_colsz--; + } + if (active_colsz == active_colsz_def) { + printf("-"); + active_colsz--; + } + printf("%*s ", -active_colsz, " "); + if (nvlist_lookup_string(dsprops, "mountpoint", &mnt) == 0) + printf("%*s ", mount_colsz, mnt); + else + printf("%*s ", mount_colsz, "-"); + // used + if (nvlist_lookup_string(dsprops, "used", &spacestr) == 0) { + space = strtoull(spacestr, NULL, 10); + humanize_number(buf, 6, space, "", HN_AUTOSCALE, + HN_DECIMAL | HN_NOSPACE | HN_B); + printf("%*s ", space_colsz, buf); + } else + printf("%*s ", space_colsz, "-"); + + if (nvlist_lookup_string(dsprops, "creation", &creation) == 0) { + ctimenum = strtoull(creation, NULL, 10); + strftime(buf, BUFSZ, "%Y-%m-%d %H:%M", + localtime((time_t *)&ctimenum)); + printf("%s", buf); + } + + // creation + printf("\n"); + } be_prop_list_free(props); return (0); +#undef BUFSZ }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807261856.w6QIuo6C090934>