Vasilisa la princesa rana o un script para borrar el directorio de descargas.

per Victor Carceler darrera modificació 2021-03-06T17:20:54+01:00

https://upload.wikimedia.org/wikipedia/commons/a/af/%D0%A6%D0%B0%D1%80%D0%B5%D0%B2%D0%BD%D0%B0_%D0%BB%D1%8F%D0%B3%D1%83%D1%88%D0%BA%D0%B0_2.jpgЦаревна-лягушка, la Princesa Rana, es un cuento tradicional ruso recogido por Afanásiev en sus compilaciones. En este cuento un joven príncipe acaba casándose con una ranita que resulta ser Vasilisa la muy sabia, una maga excepcional.

Durante una parte del cuento el príncipe se ahoga en problemas cotidianos y la ranita le dice: no te preocupes Iván, no llores, vete a dormir. Y mientras el príncipe duerme Vasilisa lo resuelve todo de una manera excepcional.

Realmente la historia da para más y en lugar de leer este artículo harías bien en salir corriendo a por una buena compilación de Afanásiev que incluya este y otros cuentos. A poder ser ilustrados por Iván Bilibin.

¿Y qué hace nuestra Vasilisa?

Pues trabaja diligentemente para que los ordenadores funcionen mejor.

Monitorizar los ordenadores del centro con Grafana/Influxdb/Telegraf lleva a descubrir que algunos usuarios no hacen limpieza nunca y llenan el disco duro hasta los topes. Por supuesto la opción más constructiva es educar a los usuarios para que hagan limpieza. Pero con tantos ordenadores siempre hay alguno en el que valdría la pena hacer limpieza.

Así que Vasilisa es un script que en cada arranque valora el porcentaje de espacio utilizado. Y si supera cierto nivel, que por defecto es el 50%, entonces borra el contenido del directorio descargas (~/Baixades) para cada uno de los usuarios.

Es decir, si los usuarios mantienen su máquina limpia Vasilisa no hace ninguna mágia, pero si el consumo de disco aumenta entonces les borra aquellos ficheros que, total, se pueden volver a descargar cuando sea necesario.

De todo esto informa puntualmente en el syslog de la máquina como se puede ver en el ejemplo, lena es el hostname de la máquina:

Apr  7 12:30:08 lena vasilisa: There is something to do?
Apr  7 12:30:08 lena vasilisa: Disk usage: 72% Threshold: 50%
Apr  7 12:30:08 lena vasilisa: Disk usage exceeds threshold. Deleting files in Baixades for every user.
Apr  7 12:30:08 lena vasilisa: removing 4,0K /home/usuario/Baixades
Apr  7 12:30:08 lena vasilisa: removed
Apr  7 12:30:13 lena vasilisa: removing 4,1G /home/usuario1/Baixades
Apr  7 12:30:24 lena vasilisa: removed
Apr  7 12:30:24 lena vasilisa: No more users
Apr  7 12:30:24 lena vasilisa: Final disk usage: 39%
Apr  7 12:30:24 lena vasilisa: There is nothing to do.

El propio script es, aunque práctico, muy sencillo:

#!/bin/bash
#
# This script checks the disk usage percent of the root filesystem. When the
# disk usage percent exceeds THRESHOLD, then deletes files in the
# DOWNLOAD_DIR for every user.
#


THRESHOLD=50
DOWNLOAD_DIR='Baixades'

SCRIPT=`basename $0`

function log () {
        logger -t $SCRIPT $1
}

log "There is something to do?"

DISK_USAGE=`df -h | grep -E \/$ | sed "s/  */ /g" | cut -f5 -d' ' | cut -f1 -d'%'`
log "Disk usage: $DISK_USAGE% Threshold: $THRESHOLD%"

if [ $DISK_USAGE -ge $THRESHOLD ]
then
    log "Disk usage exceeds threshold. Deleting files in $DOWNLOAD_DIR for every user."    

    for user in `ls /home`
    do
        download_dir="/home/$user/$DOWNLOAD_DIR"
        if [ -d $download_dir ]
        then
            size=`du -hs $download_dir 2>/dev/null`
            log "removing $size"
            rm -rf $download_dir/*
            log "removed"
        fi
    done

    log "No more users"
    DISK_USAGE=`df -h | grep -E \/$ | sed "s/  */ /g" | cut -f5 -d' ' | cut -f1 -d'%'`
    log "Final disk usage: $DISK_USAGE%"

fi

log "There is nothing to do."

¿Y cuándo actúa?

Pues en el cuento actúa cuando el príncipe Iván duerme y nuestros ordenadores lo hace cuando arrancan antes de que el usuario inicie sesión.

Así que es necesario crear una unidad de systemd para que se lance a Vasilisa en cada arranque. Afortunadamente es muy sencillo, basta con crear el fichero /etc/systemd/system/vasilisa.service con el siguiente contenido:

[Unit]
Description=Vasilisa la sabia cuida de que los discos duros tengan espacio libre.

[Service]
ExecStart=/opt/vasilisa

[Install]
WantedBy=default.target

y activar la unidad:

root@lena:~# systemctl daemon-reload 
root@lena:~# systemctl enable vasilisa.service
Created symlink from /etc/systemd/system/default.target.wants/vasilisa.service to /etc/systemd/system/vasilisa.service.
root@lena:~#

Después de reiniciar la máquina se puede comprobar que Vasilisa se ha lanzado durante el arranque.

usuario@lena:~$ systemctl status vasilisa.service 
● vasilisa.service - Vasilisa la sabia cuida de que los discos duros tengan espacio libre.
   Loaded: loaded (/etc/systemd/system/vasilisa.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since sáb 2018-04-07 13:53:00 CEST; 8min ago
  Process: 679 ExecStart=/opt/vasilisa (code=exited, status=0/SUCCESS)
 Main PID: 679 (code=exited, status=0/SUCCESS)

abr 07 13:53:00 lena systemd[1]: Started Vasilisa la sabia cuida de que los discos duros tengan espacio libre..
abr 07 13:53:00 lena vasilisa[710]: There is something to do?
usuario@lena:~$

Despliegue de Vasilisa

Afortunadamente en el centro utilizamos Ansible para gestionar el parque informático, de manera que el despliegue de Vasilisa se reduce a preparar un nuevo play tal que:

# Instala Vasilisa para borrar el directorio descargas si hay poco espacio.
- name: Copia el script vasilisa en /opt/vasilisa
  copy:
    src: scripts/vasilisa
    dest: /opt/vasilisa
    owner: root
    group: root
    mode: u=rwx,g=r,o=r

- name: Copia la unidad de Vasilisa en /etc/systemd/system
  copy:
    src: scripts/vasilisa.service
    dest: /etc/systemd/system/vasilisa.service
    owner: root
    group: root
    mode: u=rw,g=r,o=r

- name: Activa la unidad de Vasilisa
  file:
    src: /etc/systemd/system/vasilisa.service
    dest: /etc/systemd/system/default.target.wants/vasilisa.service
    state: link

# Ansible 2.2 soporta el módulo systemd
#- name: Activa Vasilisa
#  systemd:
#    daemon_reload: yes
#    name: vasilisa
#    enabled: True

En este caso se ha optado por crear directamente el enlace simbólico en /etc/systemd/system/default.target.wants a la unidad vasilisa.service porque el módulo de systemd para Ansible no está disponible hasta la versión 2.2 de Ansible.

 

 

Más información: