dotfiles/.config/waybar/scripts/btrfs_module.sh
2025-06-24 20:14:07 +02:00

74 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
export LC_NUMERIC=C
ROOT="/"
HOME="/home"
[ -d "$HOME" ] || HOME=""
# Capturar salidas
df_home=$(sudo btrfs filesystem df "$HOME" 2>/dev/null)
usage_root=$(sudo btrfs filesystem usage "$ROOT" 2>/dev/null)
# Extraer solo el bloque Overall:
overall_block=$(awk '/^Overall:/{p=1} p' <<<"$usage_root")
# Función para obtener token numérico+unidad
get_tok(){
awk -v key="$1" 'index($0,key){
for(i=1;i<=NF;i++) if($i ~ /^[0-9]+(\.[0-9]+)?(KiB|MiB|GiB|TiB|PiB)$/) {print $i; exit}
}' <<<"$usage_root"
}
free_tok=$(get_tok "Free (estimated):")
tot_tok=$(get_tok "Device size:")
# Validar tokens
if [[ -z "$free_tok" || -z "$tot_tok" ]]; then
echo '{"text":"Err","tooltip":"Error extrayendo valores Btrfs","class":"error","color":"#ff5555"}'
exit 1
fi
# Separar número y unidad
free_num=${free_tok%[KMGTP]iB}; free_unit=${free_tok#"$free_num"}
tot_num=${tot_tok%[KMGTP]iB}; tot_unit=${tot_tok#"$tot_num"}
# Convertir coma a punto
free_num=${free_num//,/.}
tot_num=${tot_num//,/.}
# Conversión a GiB
to_gib(){
case "$2" in
KiB) factor=0.000001;; MiB) factor=0.001;; GiB) factor=1;;
TiB) factor=1024;; PiB) factor=1048576;; *) factor=1;;
esac
echo "$1 * $factor" | bc -l
}
free_gb=$(to_gib "$free_num" "$free_unit")
tot_gb=$(to_gib "$tot_num" "$tot_unit")
# Validar conversión
if [[ -z "$free_gb" || -z "$tot_gb" ]]; then
echo '{"text":"Err","tooltip":"Error conversión a GiB","class":"error","color":"#ff5555"}'
exit 1
fi
# Calcular % libre
pct=$(awk -v f="$free_gb" -v t="$tot_gb" 'BEGIN{printf "%.0f", (f/t)*100}')
# Color según umbral
if (( pct < 10 )); then color="#ff5555"
elif (( pct < 20 )); then color="#f1fa8c"
else color="#50fa7b"
fi
# Icono FontAwesome (U+F0A0)
icon=$'\uf0a0'
# Escapar para JSON
escape(){ sed ':a;N;$!ba;s/\\/\\\\/g;s/"/\\"/g;s/\n/\\n/g'; }
tooltip=$(echo -e "$overall_block" | escape)
# Salida JSON
printf '{"text":"%s %s%%","tooltip":"%s","color":"%s"}' "$icon" "$pct" "$tooltip" "$color"