From 3da577280a137ff98fffd67d307372b8c881f6eb Mon Sep 17 00:00:00 2001 From: Tino Reichardt Date: Mon, 13 Mar 2023 23:31:44 +0100 Subject: [PATCH] Add colored output to zfs list Use a bold header row and colorize the AVAIL column based on the used space percentage of volume. We define these colors: - when > 80%, use yellow - when > 90%, use red Reviewed-by: WHR Reviewed-by: Brian Behlendorf Signed-off-by: Ethan Coe-Renner Signed-off-by: Tino Reichardt Closes #14621 Closes #14350 --- cmd/zfs/zfs_main.c | 30 ++++++++++++++++++++++++++++++ man/man8/zfs.8 | 2 ++ 2 files changed, 32 insertions(+) diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c index 02b19e7163..7191fbdf47 100644 --- a/cmd/zfs/zfs_main.c +++ b/cmd/zfs/zfs_main.c @@ -3474,6 +3474,8 @@ print_header(list_cbdata_t *cb) boolean_t first = B_TRUE; boolean_t right_justify; + color_start(ANSI_BOLD); + for (; pl != NULL; pl = pl->pl_next) { if (!first) { (void) printf(" "); @@ -3500,9 +3502,31 @@ print_header(list_cbdata_t *cb) (void) printf("%-*s", (int)pl->pl_width, header); } + color_end(); + (void) printf("\n"); } +/* + * Decides on the color that the avail value should be printed in. + * > 80% used = yellow + * > 90% used = red + */ +static const char * +zfs_list_avail_color(zfs_handle_t *zhp) +{ + uint64_t used = zfs_prop_get_int(zhp, ZFS_PROP_USED); + uint64_t avail = zfs_prop_get_int(zhp, ZFS_PROP_AVAILABLE); + int percentage = (int)((double)avail / MAX(avail + used, 1) * 100); + + if (percentage > 20) + return (NULL); + else if (percentage > 10) + return (ANSI_YELLOW); + else + return (ANSI_RED); +} + /* * Given a dataset and a list of fields, print out all the properties according * to the described layout. @@ -3565,6 +3589,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb) right_justify = B_FALSE; } + if (pl->pl_prop == ZFS_PROP_AVAILABLE) + color_start(zfs_list_avail_color(zhp)); + /* * If this is being called in scripted mode, or if this is the * last column and it is left-justified, don't include a width @@ -3576,6 +3603,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb) (void) printf("%*s", (int)pl->pl_width, propstr); else (void) printf("%-*s", (int)pl->pl_width, propstr); + + if (pl->pl_prop == ZFS_PROP_AVAILABLE) + color_end(); } (void) printf("\n"); diff --git a/man/man8/zfs.8 b/man/man8/zfs.8 index 2fc2f3166a..23220b7f3e 100644 --- a/man/man8/zfs.8 +++ b/man/man8/zfs.8 @@ -708,6 +708,8 @@ command will be undone if the share is ever unshared (like via a reboot). .It Sy ZFS_COLOR Use ANSI color in .Nm zfs Cm diff +and +.Nm zfs Cm list output. .El .Bl -tag -width "ZFS_MOUNT_HELPER"