Compter les caractères et non les octets, dans le tableau des disques
Ces trois correctifs avaient été éprouvés sur alpicache jeudi soir — commit 5d606ab du dépôt du serveur, 22 h 56 — cinq minutes après que ce dépôt-ci ait repris le relevé. Ils n'ont donc jamais été versés ici, et la version amont, celle que le serveur redistribue, les ignorait. Les voilà. « printf %-10s » compte les octets : « mécanique » en pèse dix pour neuf signes, et le tableau des disques glissait d'un cran à partir de la deuxième colonne. La fonction « colonne » compte les caractères, ce que Bash sait faire quand la locale le permet — d'où la locale forcée plutôt qu'espérée. Le contrôle affiche par ailleurs les chiffres sur lesquels il se fonde, et pas seulement ce qui cloche : modèle, type, taille, état SMART, heures de marche pour un disque mécanique ou usure pour un SSD, et les trois compteurs de secteurs. On peut répondre à qui demande comment se porte son disque, même quand tout va bien. Cette version est désormais identique, au seul en-tête d'usage près, à celle qui tourne sur la machine. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BssvzfDMeXVoUQHEcnavW7
This commit is contained in:
parent
790874682b
commit
e301327f45
1 changed files with 39 additions and 6 deletions
|
|
@ -47,6 +47,10 @@
|
||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
|
# Bash ne compte les caractères — et non les octets — que si la locale le dit.
|
||||||
|
# C'est ce qui aligne les colonnes du tableau des disques.
|
||||||
|
export LC_ALL="${LC_ALL:-C.UTF-8}"
|
||||||
|
|
||||||
# Le temps que met la collecte, en millisecondes.
|
# Le temps que met la collecte, en millisecondes.
|
||||||
#
|
#
|
||||||
# Une machine n'est relevée qu'une fois quand elle n'a pas connu de session
|
# Une machine n'est relevée qu'une fois quand elle n'a pas connu de session
|
||||||
|
|
@ -247,6 +251,25 @@ BARRETTES="$BARRETTES]"
|
||||||
|
|
||||||
TABLE_DISQUES=""
|
TABLE_DISQUES=""
|
||||||
|
|
||||||
|
# Remplir une colonne à la bonne largeur.
|
||||||
|
#
|
||||||
|
# « printf %-10s » compte les octets, pas les caractères : « mécanique » en
|
||||||
|
# pèse dix pour neuf signes, et la colonne suivante glisse d'un cran. Bash,
|
||||||
|
# lui, sait compter les caractères quand la locale est en UTF-8 — on lui
|
||||||
|
# laisse ce travail, et l'on force la locale plutôt que d'espérer.
|
||||||
|
colonne() {
|
||||||
|
local texte="$1" largeur="$2" cote="${3:-gauche}" n
|
||||||
|
n=${#texte}
|
||||||
|
if [ "$n" -gt "$largeur" ]; then
|
||||||
|
printf '%s' "${texte:0:$largeur}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
local blancs=""
|
||||||
|
while [ "$n" -lt "$largeur" ]; do blancs="$blancs "; n=$((n + 1)); done
|
||||||
|
if [ "$cote" = droite ]; then printf '%s%s' "$blancs" "$texte"
|
||||||
|
else printf '%s%s' "$texte" "$blancs"; fi
|
||||||
|
}
|
||||||
|
|
||||||
# --- Les disques -----------------------------------------------------------
|
# --- Les disques -----------------------------------------------------------
|
||||||
#
|
#
|
||||||
# lsblk donne la taille et le type ; le drapeau « rotational » du noyau
|
# lsblk donne la taille et le type ; le drapeau « rotational » du noyau
|
||||||
|
|
@ -331,10 +354,14 @@ for chemin in /sys/block/*; do
|
||||||
else
|
else
|
||||||
case "$usure" in ''|*[!0-9]*) ;; *) usure_dite="usé à $usure %" ;; esac
|
case "$usure" in ''|*[!0-9]*) ;; *) usure_dite="usé à $usure %" ;; esac
|
||||||
fi
|
fi
|
||||||
TABLE_DISQUES="$TABLE_DISQUES$(printf '%-7s %-20s %-10s %9s %-8s %-7s %s' \
|
TABLE_DISQUES="$TABLE_DISQUES$(
|
||||||
"$nom" "$(printf '%.20s' "${modele:-—}")" \
|
colonne "$nom" 7; printf ' '
|
||||||
"$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)" \
|
colonne "${modele:-—}" 20; printf ' '
|
||||||
"$taille_go Go" "${sante:-—}" "${heures:-—}" "$secteurs")"$'\n'
|
colonne "$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)" 10; printf ' '
|
||||||
|
colonne "$taille_go Go" 10 droite; printf ' '
|
||||||
|
colonne "${sante:-—}" 8; printf ' '
|
||||||
|
colonne "$usure_dite" 16; printf ' '
|
||||||
|
printf '%s' "$secteurs")"$'\n'
|
||||||
|
|
||||||
[ "$premier" = 0 ] && DISQUES="$DISQUES,"
|
[ "$premier" = 0 ] && DISQUES="$DISQUES,"
|
||||||
premier=0
|
premier=0
|
||||||
|
|
@ -602,8 +629,14 @@ if [ "$CHECK" = 1 ]; then
|
||||||
esac
|
esac
|
||||||
echo
|
echo
|
||||||
if [ -n "$TABLE_DISQUES" ]; then
|
if [ -n "$TABLE_DISQUES" ]; then
|
||||||
printf " %s%-7s %-20s %-10s %9s %-8s %-7s %s%s\n" "$D" \
|
printf ' %s' "$D"
|
||||||
"Disque" "Modèle" "Type" "Taille" "SMART" "Heures" "Secteurs R/P/I" "$Z"
|
colonne "Disque" 7; printf ' '
|
||||||
|
colonne "Modèle" 20; printf ' '
|
||||||
|
colonne "Type" 10; printf ' '
|
||||||
|
colonne "Taille" 10 droite; printf ' '
|
||||||
|
colonne "SMART" 8; printf ' '
|
||||||
|
colonne "Marche / usure" 16; printf ' '
|
||||||
|
printf 'Secteurs R/P/I%s\n' "$Z"
|
||||||
printf '%s' "$TABLE_DISQUES" | sed "s/^/ /"
|
printf '%s' "$TABLE_DISQUES" | sed "s/^/ /"
|
||||||
printf " %sR : remplacés · P : illisibles en attente · I : perdus%s\n" "$D" "$Z"
|
printf " %sR : remplacés · P : illisibles en attente · I : perdus%s\n" "$D" "$Z"
|
||||||
echo
|
echo
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue