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 <msl0000023508@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ethan Coe-Renner <coerenner1@llnl.gov>
Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
Closes #14621
Closes #14350
This commit is contained in:
Tino Reichardt 2023-03-13 23:31:44 +01:00 committed by Brian Behlendorf
parent 7bde396aa2
commit 2bd0490faf
2 changed files with 32 additions and 0 deletions

View File

@ -3441,6 +3441,8 @@ print_header(list_cbdata_t *cb)
boolean_t first = B_TRUE; boolean_t first = B_TRUE;
boolean_t right_justify; boolean_t right_justify;
color_start(ANSI_BOLD);
for (; pl != NULL; pl = pl->pl_next) { for (; pl != NULL; pl = pl->pl_next) {
if (!first) { if (!first) {
(void) printf(" "); (void) printf(" ");
@ -3467,9 +3469,31 @@ print_header(list_cbdata_t *cb)
(void) printf("%-*s", (int)pl->pl_width, header); (void) printf("%-*s", (int)pl->pl_width, header);
} }
color_end();
(void) printf("\n"); (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 * Given a dataset and a list of fields, print out all the properties according
* to the described layout. * to the described layout.
@ -3532,6 +3556,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb)
right_justify = B_FALSE; 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 * 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 * last column and it is left-justified, don't include a width
@ -3543,6 +3570,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb)
(void) printf("%*s", (int)pl->pl_width, propstr); (void) printf("%*s", (int)pl->pl_width, propstr);
else else
(void) printf("%-*s", (int)pl->pl_width, propstr); (void) printf("%-*s", (int)pl->pl_width, propstr);
if (pl->pl_prop == ZFS_PROP_AVAILABLE)
color_end();
} }
(void) putchar('\n'); (void) putchar('\n');

View File

@ -740,6 +740,8 @@ command will be undone if the share is ever unshared (like via a reboot).
.It Sy ZFS_COLOR .It Sy ZFS_COLOR
Use ANSI color in Use ANSI color in
.Nm zfs Cm diff .Nm zfs Cm diff
and
.Nm zfs Cm list
output. output.
.It Sy ZFS_MOUNT_HELPER .It Sy ZFS_MOUNT_HELPER
Cause Cause