
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