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
c1a6d1f9a4
commit
15e50ff49b
1 changed files with 39 additions and 6 deletions
|
|
@ -47,6 +47,10 @@
|
|||
|
||||
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.
|
||||
#
|
||||
# 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=""
|
||||
|
||||
# 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 -----------------------------------------------------------
|
||||
#
|
||||
# lsblk donne la taille et le type ; le drapeau « rotational » du noyau
|
||||
|
|
@ -331,10 +354,14 @@ for chemin in /sys/block/*; do
|
|||
else
|
||||
case "$usure" in ''|*[!0-9]*) ;; *) usure_dite="usé à $usure %" ;; esac
|
||||
fi
|
||||
TABLE_DISQUES="$TABLE_DISQUES$(printf '%-7s %-20s %-10s %9s %-8s %-7s %s' \
|
||||
"$nom" "$(printf '%.20s' "${modele:-—}")" \
|
||||
"$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)" \
|
||||
"$taille_go Go" "${sante:-—}" "${heures:-—}" "$secteurs")"$'\n'
|
||||
TABLE_DISQUES="$TABLE_DISQUES$(
|
||||
colonne "$nom" 7; printf ' '
|
||||
colonne "${modele:-—}" 20; printf ' '
|
||||
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
|
||||
|
|
@ -602,8 +629,14 @@ if [ "$CHECK" = 1 ]; then
|
|||
esac
|
||||
echo
|
||||
if [ -n "$TABLE_DISQUES" ]; then
|
||||
printf " %s%-7s %-20s %-10s %9s %-8s %-7s %s%s\n" "$D" \
|
||||
"Disque" "Modèle" "Type" "Taille" "SMART" "Heures" "Secteurs R/P/I" "$Z"
|
||||
printf ' %s' "$D"
|
||||
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 " %sR : remplacés · P : illisibles en attente · I : perdus%s\n" "$D" "$Z"
|
||||
echo
|
||||
|
|
|
|||
Loading…
Reference in a new issue