#!/bin/bash # # Adapted from Eridan's "fs" (cleanup, enhancements and switch to bash/Linux) # JM, 10/12/2004 # # Integrated into Lain in september 2013 # https://github.com/copycat-killer/lain # Requires gawk # ------------------------------------------------------------------------- # Decoding options # ------------------------------------------------------------------------- USAGE="Usage: $0 [-h(elp)] | [-n(arrow mode)] | [-w(eb output) | --type= | --exclude-type=]" NARROW_MODE=0 WEB_OUTPUT=0 DF_OPTIONS="" while [ $# -gt 0 ]; do case "$1" in "-h" ) echo $USAGE exit ;; "-d" ) DEBUG=1 ;; "-n" ) NARROW_MODE=1 ;; "-w" ) WEB_OUTPUT=1 ;; --type=*) DF_OPTIONS+=" $1" ;; --exclude-type=*) DF_OPTIONS+=" $1" ;; * ) echo $USAGE exit ;; esac shift done # ------------------------------------------------------------------------- # Preparations # ------------------------------------------------------------------------- SYSTEM=`uname -s` PATTERN="/" case "$SYSTEM" in "Linux" ) DF_COMMAND="/usr/bin/env df -k" SORT_COMMAND="/usr/bin/env sort -k6" AWK_COMMAND="/usr/bin/env awk" ;; * ) DF_COMMAND="/bin/df -k" SORT_COMMAND="/usr/bin/sort -k6" AWK_COMMAND="/usr/bin/env gawk" ;; esac # Add additional df options DF_COMMAND+=$DF_OPTIONS # ------------------------------------------------------------------------- # Grabbing "df" result # ------------------------------------------------------------------------- DF_RESULT=`$DF_COMMAND` if [ ! -z $DEBUG ]; then echo "--> DF_RESULT:" echo "$DF_RESULT" echo "" fi # ------------------------------------------------------------------------- # Preprocessing "df" result, to join split logical lines # ------------------------------------------------------------------------- PREPROCESSING_RESULT=` \ echo "$DF_RESULT" | $AWK_COMMAND -v PATTERN=$PATTERN \ ' NF == 1 { printf ("%s", $0) } NF == 5 { printf ("%s\n", $0) } NF > 6 { } NF == 6 { printf ("%s\n", $0) }' ` if [ ! -z $DEBUG ]; then echo "--> PREPROCESSING_RESULT:" echo "$PREPROCESSING_RESULT" echo "" fi SORTED_FILE_SYSTEMS_INFO=`echo "$PREPROCESSING_RESULT" | $SORT_COMMAND` if [ ! -z $DEBUG ]; then echo "--> SORTED_FILE_SYSTEMS_INFO:" echo "$SORTED_FILE_SYSTEMS_INFO" echo "" fi # ------------------------------------------------------------------------- # Computing mount point max length # ------------------------------------------------------------------------- MOUNT_POINT_MAX_LENGTH=` \ echo "$SORTED_FILE_SYSTEMS_INFO" | $AWK_COMMAND -v PATTERN=$PATTERN \ ' BEGIN { mount_point_length_max = 15; } END { printf ("%d", mount_point_length_max); } $0 ~ PATTERN { # printf ("$6 = %s\n", $6); mount_point = $6; # printf ("mount_point = %s\n", mount_point); mount_point_length = length (mount_point); # printf ("mount_point_length = %d\n", mount_point_length); if (mount_point_length > mount_point_length_max) mount_point_length_max = mount_point_length; }' ` if [ ! -z $DEBUG ]; then echo "MOUNT_POINT_MAX_LENGTH: $MOUNT_POINT_MAX_LENGTH" fi # ------------------------------------------------------------------------- # Computing mount point data max size # ------------------------------------------------------------------------- MOUNT_POINT_MAX_SIZE=` \ echo "$SORTED_FILE_SYSTEMS_INFO" | $AWK_COMMAND -v PATTERN=$PATTERN \ ' BEGIN { mount_point_size_max = 0; } END { printf ("%d", mount_point_size_max); } $0 ~ PATTERN { # df -k shows k_bytes! # printf ("$2 = %s\n", $2); mount_point_size = $2 * 1024; # printf ("mount_point_size = %d\n", mount_point_size); if (mount_point_size > mount_point_size_max) mount_point_size_max = mount_point_size; }' ` if [ ! -z $DEBUG ]; then echo "MOUNT_POINT_MAX_SIZE: $MOUNT_POINT_MAX_SIZE" fi # ------------------------------------------------------------------------- # Let's go! # ------------------------------------------------------------------------- echo "$SORTED_FILE_SYSTEMS_INFO" | $AWK_COMMAND -v DEBUG=$DEBUG -v PATTERN=$PATTERN -v NARROW_MODE=$NARROW_MODE -v LEFT_COLUMN=$MOUNT_POINT_MAX_LENGTH -v MAX_SIZE=$MOUNT_POINT_MAX_SIZE -v SCALE=$SCALE -v WEB_OUTPUT=$WEB_OUTPUT \ ' # {printf ("$0 = %s\n", $0);} # {printf ("$1 = %s\n", $1);} # {printf ("PATTERN = %s\n", PATTERN);} # {printf ("LEFT_COLUMN = %s\n", LEFT_COLUMN);} BEGIN { k_bytes = 1024.0; m_bytes = 1024.0 * k_bytes; g_bytes = 1024.0 * m_bytes; t_bytes = 1024.0 * g_bytes; if (WEB_OUTPUT) { all_stars = "**************************************************"; current_date = strftime ("%d-%m-%Y @ %H:%M:%S", localtime (systime ())); free_threshold = 10; # % printf ("\n"); printf ( \ "\n" \ "

%s -- STATUS OF ALCOR FILE SYSTEMS


\n", current_date ) printf ("\n"); printf ( \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" ); } else { narrow_margin = " "; # printf ("%-*s", LEFT_COLUMN + 2, "Mount point"); if (NARROW_MODE) printf ("\n%s", narrow_margin); else printf ("%-*s", LEFT_COLUMN + 2, ""); print " Used Free Total "; if (! NARROW_MODE) print ""; } } END { if (WEB_OUTPUT) { printf ("
Mount point%% Usato (*)" \ " - %% Free (*)%% UsedFreeTotal
\n"); printf ("\n"); } else { if (NARROW_MODE) printf ("%s", narrow_margin); else printf ("%-*s", LEFT_COLUMN + 2, ""); print "|----|----|----|----|----|----|----|----|----|----|" if (NARROW_MODE) printf ("\n%s", narrow_margin); else printf ("%-*s", LEFT_COLUMN + 2, ""); print "0 10 20 30 40 50 60 70 80 90 100"; print ""; } } $0 ~ PATTERN { if (index ($0, "members") == 0 && index ($0, "Download") == 0 && index ($0, "admin") == 0) { # df -k shows k_bytes! total_size = $2 * k_bytes; free_size = $4 * k_bytes; percentage_occupied = substr($5, 0, 3); mount_point = $6; percentage_free = int (100 - percentage_occupied); # reduction_factor: 2 stars_number = int (percentage_occupied / 2); if (WEB_OUTPUT) { posGroup = index (mount_point, "scratch"); if (posGroup == 0) posGroup = index (mount_point, "u1"); if (posGroup == 0) posGroup = index (mount_point, "u2"); if (posGroup == 0) posGroup = index (mount_point, "u4"); if (posGroup == 0) posGroup = index (mount_point, "u5"); printf ("\n"); if (posGroup > 0 || percentage_free < free_threshold) { if (percentage_free < free_threshold) { class = "titlered"; if (posGroup == 0) posGroup = 1; # to display the whole mount_point in this color anyway } else if ((index (mount_point, "scratch") != 0) || (index (mount_point, "u1") != 0) || (index (mount_point, "u2") != 0)) { class = "titleorange"; posGroup = 1; # to display the whole mount_point in this color } else if ((index (mount_point, "u4") != 0) || (index (mount_point, "u5") != 0)) { class = "titlebrown"; posGroup = 1; # to display the whole mount_point in this color } printf ( \ "%s%s\n", substr (mount_point, 1, posGroup - 1), class, substr (mount_point, posGroup) ); } else { printf ("%s\n", mount_point); } printf ( \ "%s%s\n", substr (all_stars, 1, stars_number), substr (all_stars, stars_number + 1, 49) ); if (percentage_free < free_threshold) { color_beginning = ""; color_end = "" } else { color_beginning = ""; color_end = "" } if (total_size > 1 * t_bytes) printf ( \ "%s%3d%%%s%5.1f Tb%5.1f Tb\n", \ color_beginning, percentage_occupied, color_end, free_size / t_bytes, total_size / t_bytes \ ); else if (total_size > 1 * g_bytes) printf ( \ "%s%3d%%%s%5.1f Gb%5.1f Gb\n", \ color_beginning, percentage_occupied, color_end, free_size / g_bytes, total_size / g_bytes \ ); else if (total_size > 1 * m_byptes) printf ( \ "%s%3d%%%s%5.1f Mb%5.1f Mb\n", \ color_beginning, percentage_occupied, color_end, free_size / m_bytes, total_size / m_bytes \ ); else printf ( \ "%s%3d%%%s%5.1f Kb%5.1f Kb\n", \ color_beginning, percentage_occupied, color_end, free_size / k_bytes, total_size / k_bytes \ ); printf ("\n"); } else { # printf ("percentage_occupied = %d\n", percentage_occupied); # printf ("percentage_free = %d\n", percentage_free); printf ("%-*s", LEFT_COLUMN + 2, mount_point); if (NARROW_MODE) printf ("\n%s", narrow_margin); # printf ("stars_number = %d\n", stars_number); printf ("|"); for (i = 1; i <= stars_number && i <= 49; i++) { printf ("%s", "*"); } for (i = stars_number + 1; i <= 49; i++) { printf ("%s", "-"); } if (total_size > 1 * t_bytes) printf ( \ "| %3d%% %6.1f %6.1f Tb\n", \ percentage_occupied, free_size / t_bytes, total_size / t_bytes \ ); else if (total_size > 1 * g_bytes) printf ( \ "| %3d%% %6.1f %6.1f Gb\n", \ percentage_occupied, free_size / g_bytes, total_size / g_bytes \ ); else if (total_size > 1 * m_byptes) printf ( \ "| %3d%% %6.1f %6.1f Mb\n", \ percentage_occupied, free_size / m_bytes, total_size / m_bytes \ ); else printf ( \ "| %3d%% %6.1f %6.1f Kb\n", \ percentage_occupied, free_size / k_bytes, total_size / k_bytes \ ); } } # if }'