Editado: Apocalipsis: Servicios de actualización

Articulo edidado y expandido con las últimas novedades.
Este es un articulo técnico donde explico lo que estoy haciendo para simplificar lo más posible la vida del usuario común que se instala la distribución «Apocalipsis». (Para expertos de Linux)

Lo primero que he hecho ha sido lo de crear un servicio de forma similar a este articulo escrito hace tiempo en https://www.preparandonos.es/2021/03/02/auto-tunnel-ssh/
El script del servicio se crea así:

sudo mcedit /etc/systemd/system/apocalipsis.upgrade.service

y escribimo esto:

[Unit]
   Description=Auto update local data
   After=network.target
[Service]
   Environment=""
   ExecStart=/usr/local/bin/apocalipsis.sh
[Install]
   WantedBy=multi-user.target

luego vamos a crear es segundo script en /usr/local/bin/apocalipsis.sh

mcedit /usr/local/bin/apocalipsis.sh

y escribimos en el:

#!/bin/bash

mkdir -p /var/run/apocalipsis
mkdir -p /var/cache/apocalipsis

PID="$(cat /var/run/apocalipsis/pid)"
testPID=$(ps -p "$PID" | tail -n1 | tr -d ' ' | grep -v "PIDTTYTIMECMD")
if [ -z "$testPID" ]; then
    echo "not running, continuing"
    rm /var/run/apocalipsis/pid
else
    echo "Script already running. Pid: $PID"
    exit 0
fi

if [ -e /var/run/apocalipsis/pid ]; then
    PID="$(cat /var/run/apocalipsis/pid)"
    echo "Script already running. Pid: $PID"
else
    echo "...continuing. No other process active."
    echo "$$" > /var/run/apocalipsis/pid
fi


NetworkUp=0
TestInternet() {
    Ping=$(ping -c4 8.8.8.8 | tail -n2 | head -n1 | cut -d ' ' -f 4)
    if [ "$Ping" = "4" ]; then
        NetworkUp=1
        echo "Interent is up"
    else
        NetworkUp=0
        echo "waiting 10 minuts" 
        sleep 600
    fi
}

if [ "$NetworkUp" = "0" ]; then
    TestInternet
fi

cd /tmp
wget https://www.preparandonos.es/apocalipsis.update
bash apocalipsis.update

# cleaning
echo "end of run"
rm /var/run/apocalipsis/pid
rm /tmp/apocalipsis.update

Ahora vamos a dar permisos de ejecución al script

chmod 755 /usr/local/bin/apocalipsis.sh

Como se puede ver el primer script arranco al principio y llama al segundo, lo cual comprueba si internet funciona con un ping a los servidores dns de google. Si funciona (envía 4 ping y recibe 4 respuestas afirmativas) entonces comprueba si hay otra copia de si mismo activa.
Si no hay ninguna entonces se conecta a www.preparandonos.es para saber lo que tiene que hacer.

Allí va a encontrar un fichero de texto que en el momento en que escribo es este:


#!/bin/bash

mkdir -p /home/user/.Apocalipsis
cp /tmp/apocalipsis.update /home/user/.Apocalipsis/00001.sh
chmod 744 /home/user/.Apocalipsis/00001.sh
mkdir -p /var/cache/apocalipsis


# Debian updates
apt update && DEBIAN_FRONTEND=noninteractive apt upgrade -y

########## Apocalipsis Updates

#### wikipedia Local +  EN
limit="200k"
LOCAL=$(cat /home/user/.config/user-dirs.locale | cut ' -f1)
languages="$LOCAL en"
wikipedia="wikipedia"
wikitype="all_maxi"
url="https://download.kiwix.org/zim/wikipedia"

HddSize=$(df -h | grep "persistence" | sed 's|  | |g' | sed 's|  | |g' | sed 's|  | |g' | tr ' ' '\t' | cut -f4 | tr -d 'G' | tr -d 'M' | tail -n1 )
if [ "$HddSize" -gt "150" ]; then
    mkdir -p /home/yunohost.app/kiwix/tmp
    cd /home/yunohost.app/kiwix/tmp
    touch index.html
    for lang in $(echo $languages); do
        echo "downloading $last"
        rm index.html
        wget "$url" -q  -O index.html
        last=$(cat index.html | tr '"' '\n' | grep -v ">" | grep "${wikipedia}_${lang}_${wikitype}" | tail -n1)
        echo "testing $last"
        existing=$(ls /home/yunohost.app/kiwix/ | grep "${wikipedia}_${lang}_${wikitype}")
        if [ ! -z "$existing" ]; then
            echo "already downloades an old copy of wikipedia in $lang. Skipping"
        else
            echo "I'll try to download $last"
            wget -c --limit="$limit" $url/$last
            mv $last ../
            /var/www/kiwix/kiwix-manage /home/yunohost.app/kiwix/library.xml add /home/yunohost.app/kiwix/*.zim
            yunohost service restart kiwix
            echo "Hola, he descargado e instalado $last en tu biblioteca" |  mail -s "Nueva enciclopedia: $last!" yo@mi.local

        fi
    done
fi

#### phet 

limit="200k"
LOCAL=$(cat /home/user/.config/user-dirs.locale | cut ' -f1)
languages="$LOCAL en"
wikipedia="phet"
wikitype=""
url="https://download.kiwix.org/zim/phet"

HddSize=$(df -h | grep "persistence" | sed 's|  | |g' | sed 's|  | |g' | sed 's|  | |g' | tr ' ' '\t' | cut -f4 | tr -d 'G' | tr -d 'M' | tail -n1 )
if [ "$HddSize" -gt "120" ]; then
    mkdir -p /home/yunohost.app/kiwix/tmp
    cd /home/yunohost.app/kiwix/tmp
    touch index.html
    for lang in $(echo $languages); do
        echo "downloading $last"
        rm index.html
        wget "$url" -q  -O index.html
        last=$(cat index.html | tr '"' '\n' | grep -v ">" | grep "${wikipedia}_${lang}_${wikitype}" | tail -n1)
        echo "testing $last"
        existing=$(ls /home/yunohost.app/kiwix/ | grep "${wikipedia}_${lang}_${wikitype}")
        if [ ! -z "$existing" ]; then
            echo "already downloades an old copy of wikipedia in $lang. Skipping"
        else
            echo "I'll try to download $last"
            wget -c --limit="$limit" $url/$last
            mv $last ../
            /var/www/kiwix/kiwix-manage /home/yunohost.app/kiwix/library.xml add /home/yunohost.app/kiwix/*.zim
            yunohost service restart kiwix
            echo "Hola, he descargado e instalado $last en tu biblioteca" |  mail -s "Nueva enciclopedia: $last!" yo@mi.local


        fi
    done
fi

#### gutenberg

limit="200k"
LOCAL=$(cat /home/user/.config/user-dirs.locale | cut ' -f1)
languages="$LOCAL en"
wikipedia="gutenberg"
wikitype="all"
url="https://download.kiwix.org/zim/gutenberg"

HddSize=$(df -h | grep "persistence" | sed 's|  | |g' | sed 's|  | |g' | sed 's|  | |g' | tr ' ' '\t' | cut -f4 | tr -d 'G' | tr -d 'M' | tail -n1 )
if [ "$HddSize" -gt "80" ]; then
    mkdir -p /home/yunohost.app/kiwix/tmp
    cd /home/yunohost.app/kiwix/tmp
    touch index.html
    for lang in $(echo $languages); do
        echo "downloading $last"
        rm index.html
        wget "$url" -q  -O index.html
        last=$(cat index.html | tr '"' '\n' | grep -v ">" | grep "${wikipedia}_${lang}_${wikitype}" | tail -n1)
        echo "testing $last"
        existing=$(ls /home/yunohost.app/kiwix/ | grep "${wikipedia}_${lang}_${wikitype}")
        if [ ! -z "$existing" ]; then
            echo "already downloades an old copy of wikipedia in $lang. Skipping"
        else
            echo "I'll try to download $last"
            wget -c --limit="$limit" $url/$last
            mv $last ../
            /var/www/kiwix/kiwix-manage /home/yunohost.app/kiwix/library.xml add /home/yunohost.app/kiwix/*.zim
            yunohost service restart kiwix
            echo "Hola, he descargado e instalado $last en tu biblioteca" |  mail -s "Nueva enciclopedia: $last!" yo@mi.local

        fi
    done
fi

#### wikibooks

limit="200k"
LOCAL=$(cat /home/user/.config/user-dirs.locale | cut ' -f1)
languages="$LOCAL en"
wikipedia="wikibooks"
wikitype="all_maxi"
url="https://download.kiwix.org/zim/wikibooks"

HddSize=$(df -h | grep "persistence" | sed 's|  | |g' | sed 's|  | |g' | sed 's|  | |g' | tr ' ' '\t' | cut -f4 | tr -d 'G' | tr -d 'M' | tail -n1 )
if [ "$HddSize" -gt "10" ]; then
    mkdir -p /home/yunohost.app/kiwix/tmp
    cd /home/yunohost.app/kiwix/tmp
    touch index.html
    for lang in $(echo $languages); do
        echo "downloading $last"
        rm index.html
        wget "$url" -q  -O index.html
        last=$(cat index.html | tr '"' '\n' | grep -v ">" | grep "${wikipedia}_${lang}_${wikitype}" | tail -n1)
        echo "testing $last"
        existing=$(ls /home/yunohost.app/kiwix/ | grep "${wikipedia}_${lang}_${wikitype}")
        if [ ! -z "$existing" ]; then
            echo "already downloades an old copy of wikipedia in $lang. Skipping"
        else
            echo "I'll try to download $last"
            wget -c --limit="$limit" $url/$last
            mv $last ../
            /var/www/kiwix/kiwix-manage /home/yunohost.app/kiwix/library.xml add /home/yunohost.app/kiwix/*.zim
            yunohost service restart kiwix
            echo "Hola, he descargado e instalado $last en tu biblioteca" |  mail -s "Nueva enciclopedia: $last!" yo@mi.local

        fi
    done
fi

echo "00001" >> /var/cache/apocalipsis/updates

# ITALIANO

if [ "$LOCAL" = "it" ]; then
    echo "Ciao,
Ho preparato uno .zip con dentro una marea di documenti di pdf in italiano.
Sono documenti molto utili un po' per tutti i campi e ti consiglio
di tenere una copia in casa, e, se possibile stampare alcuni pdf.

Li puoi scaricare da qui:

https://almacen.tormentasolar.win/Libros/ITALIANO.zip

Poi li puoi aggiungere alla tua nube privata semplicemente scompattantoli
e trascinando la cartella dentro a Public nella tua nube.

Nota: tra pochi mesi cambierá il link con sará questo: 
https://almacen.preparandonos.es/Libros/ITALIANO.zip)

Qui puoi vedere un video a riguardo
https://  youtu.be/  RfRrx5ynFvI
# He puesto espacios en la url de youtube para evitar que mi blog 
# muestre el vídeo en el script en lugar de la url :-) 
# Claramente hay que quitar los espacios en el script real

" |  mail -s "Italiano: Documenti in pdf" yo@mi.local

fi

# Español

if [ "$LOCAL" = "es" ]; then
    echo "Hola,
He preparado un fichero .zip con dentro los manuales de mecánica para
Land Rover y Santana (Series I, II y III)

Si el tema te interesa  puede llegar a interesarte te aconsejo descargues 
estos documentos. Se trata de manuales de raparación de este fabulosa mezccla 
entre un coche y un tractor que puede aguantar incluso un pulso 
electromagnetico militar.

Lo puedes descargar desde este enlace:
https://almacen.tormentasolar.win/Libros/LandRover+Santana.zip

Si no te funciona, prueba este otro, dado que el dominio de arriba voy
a cerrarlo en pocos meses.

https://almacen.preparandonos.es/Libros/LandRover+Santana.zip

Luego puedes copiar estos fichero en tu nube particular:

Decomprime el .zip, y arrarstra la carpeta obtenida en la carpeta Public de tu 
nube, En pocos minutos ya estárá listo

" |  mail -s "Italiano: Documenti in pdf" yo@mi.local

fi



Claramente este es un agujero de seguridad, pero… sitio web www.preparandonos.es, está en mi casa y solo yo puedo controlarlo y de todas formas en los clientes solo hay documentos y videos públicos sin posibilidad de que yo ni nadie pueda conectarse, al estar protegido por el NAT de su router. Bueno la forma existiría… pero sería complicado por mi parte ni tampoco sería ni en mi naturaleza hacerlo ni interesante. Ya tengo en casa todo lo que va haber en estos pequeños servidores personales.

De todas formas estoy pensando como mejorar el sistema de descarga automática y cerrar este agujero de seguridad. En la segunda edición he empezado a copiar el fichero en la home del usuario, para que un día sea el usuario mismo a lanzar la actualización… o no.

Como se puede ver en el tercer script se lanza la actualización del sistema operativo por si hay algún paquete para actualizar, y luego de comprobar si hay espacio suficiente en el disco, descarga la wikipedia, phet, gutenberg y wikibooks enteras en español e inglés.
Esta última versión en realidad descarga fichero según la lengua que haya puesto tu escritorio. Si la pones en italiano o en francés o en alemán, te bajará las respectivas enciclopedias además del inglés.

Y por al final escribe un número de serien en un fichero que utilizaré más adelante para no volver a repetir actualizaciones que ya están hechas

Esto es muy simple de momento, pero más adelante voy implementar la descarga automática de videos desde youtube, la cual mientras tanto ha llegado a la versión 18, reutilizando el script que he publicado en estas páginas y otras cosas para libros en pdf dentro la nube usando rsync supongo… veremos lo que me viene en mente.

y para terminar he añadido un comando en cron para que cada 12 horas se lance en script de apocalipsis.sh haciendo todas la comprobaciones. Si no hay internet se apaga y si hay una copia ya activa se apaga también. Más adelante haré de forma que compruebe se hay actualizaciones por hacer y si no hay ninguna se termina a la espera de otras 12 horas.

crontab - e

inserta es linea

* */12 * * * /usr/local/bin/apocalipsis.sh >/dev/null 2>&1

Ahora vamos a dar permisos de ejecución al script

chmod 700 /usr/local/bin/apocalipsis.sh

Al final como que los 3 script están todos en su sitio vamos activar el servicio que hemos preparado al principio

systemctl enable apocalipsis.upgrade.service
systemctl start apocalipsis.upgrade.service

Y con esto termina el articulo

Comentarios cerrados.