Script para reiniciar nginx cuando han caducado los certificados de letsencrypt

Últimamente estoy de scripts para automatizar mi vida de sysadmin ;) aquí os dejo otro que comprueba si se han renovado los certificados y reinicia nginx en caso de que si haya ocurrido

# vi /root/scripts/check_certificates2.sh

#!/bin/bash

ADMIN_MAIL=""
DOMAINS=($(nginx -T |grep server_name |grep ";" |grep -v "#" |awk '{print $2}' |sed 's/;//' |grep -v "_" | sort -u))
CHECK_DIR="/root/scripts/check_domains"
REBOOT_NGINX=0

mkdir -p ${CHECK_DIR}

for i in "${DOMAINS[@]}"
do
   if [[ -f ${CHECK_DIR}/$i ]]; then
       OLD=`cat ${CHECK_DIR}/$i |awk '{print $1}'`
       CURRENT=`sha1sum /etc/letsencrypt/live/${i}/cert.pem |awk '{print $1}'`
       if [[ ${OLD} != ${CURRENT} ]]; then
           echo "hashes don't match for domain ${i}, please restart nginx"
           REBOOT_NGINX=1
           sha1sum /etc/letsencrypt/live/${i}/cert.pem ${CHECK_DIR}/$i
       fi
   else
       if [[ -f /etc/letsencrypt/live/${i}/cert.pem ]]; then
           sha1sum /etc/letsencrypt/live/${i}/cert.pem ${CHECK_DIR}/$i
       else
           echo "Domain ${i} has no certificate file"
       fi
   fi
done

if [[ ${REBOOT_NGINX} == "1" ]]; then
    echo "I reboot nginx due there are changes on certificates"
    service nginx restart
fi

Luego hago que se ejecute cada 10 minutos y listos

# vi /etc/crontab
*/10 *  * * *   root    /root/scripts/check_certificates2.sh

Script para realizar un sha1sum recursivo de los ficheros un directorio

Volvemos a la carga con mas scripts de bash. Esta vez necesito realizar un sha1sum para obtener el hash sha1 de unos ficheros que están dentro de muchos directorios. Como sha1sum no soporta la opción recursiva (en mi opinión un fallo), no queda otra que recurrir a nuestro amado bash.

Aquí el script para la ocasión

#!/bin/bash

DIRECTORY="material"

find "$DIRECTORY" -type d -print0 -maxdepth 4 | while read -r -d '' d; do
  echo "#### SHA1SUM Directorio: $d #####"
  sha1sum $d/*
done

script para dividir pdf en pdf mas pequeños con pdftk o pdfjam

Mi buen amigo Bruno, hace unos días me pasó una extracción de un teléfono móvil con la friolera de más de 51.000 páginas. Mi pobre y humilde portátil sacaba humo sólo al abrirlo así que he tenido que ingeniármelas para dividir el fichero en ficheros más pequeños y poder gestionar la información cómodamente. La solución, un script.

El script tiene dos opciones, usar pdftk o pdfjam. Deberemos comentar y descomentar la línea que nos interese.

Si queremos usar pdftk será necesario instalarlo

# apt install pdftk

Para usar pdfjam, que me ha procesado la información más rápido que con pdftk, será necesario instalar texlive-extra-utils

# apt install texlive-extra-utils

Otra herramienta que será necesario instalar es pdfinfo que se encuentra dentro del paquete poppler-utils

# apt install poppler-utils

A continuación el script

#!/bin/bash

INPUT_FILE=Redmi7-ASPERTIC.pdf
PAGES=`pdfinfo ${INPUT_FILE} |grep Pages |awk -F '           ' '{print $2}'`
FILENAME=`basename ${INPUT_FILE} |awk -F '.' '{print $1}'`
SPLIT=500
START=1
echo "Total Pages: ${PAGES}"
echo 

COUNTER=$START
ITER=1

while [ "$COUNTER" -le "$PAGES" ]
do
    START=$(($COUNTER))
    END=$(($START + $SPLIT - 1))
    echo 
    echo "#################"
    echo "start ${START} end ${END} iter ${ITER}"
    if [[ "$PAGES" -le "$END" ]]
    then
       END=$PAGES
       echo "last end is ${END} of total pages ${PAGES}"
    fi
    #pdftk ${INPUT_FILE} cat ${START}-${END} output ${FILENAME}_${ITER}.pdf
    pdfjam ${INPUT_FILE} ${START}-${END} -o ${FILENAME}_${ITER}.pdf
    COUNTER=$(($COUNTER + $SPLIT))
    ITER=$(($ITER + 1))
done

Y listos, lo mismo de siempre, crear el fichero, darle permisos de ejecución y ejecutarlo!

Aquí una captura del final de la ejecución del script sobre el susodicho fichero

Una utilidad …

Instalar dudle con debian 12

Por fin otra tarea menos! Esta ya daba vergüenzilla y todo al tener la instalación anterior de dudle aún con Debian 6!!! Así que directamente lo que he planteado es hacer una instalación limpia y los datos que puedan estar ahí, que pasen a mejor vida! Aunque creo que los datos aún serían compatibles, parece que tienen el mismo formato.

Vamos a ver como se hace ahora la instalación. Para ello he seguido el repositorio de github del proyecto que omite la información de la instalación y configuración de apache.

Primero vamos a instalar las dependencias:

# apt -y install apache2 git ruby-dev libxml2-dev zlib1g-dev
# gem install ratom

A continuación clonamos el repositorio en algún sitio del servidor, en mi caso lo he dejado en /var/www/dudle

# cd /var/www
# git clone https://github.com/kellerben/dudle.git

Ahora vamos a descargar los ficheros .mo correspondientes a los ficheros de idioma compilados. Vamos a crear un script, le damos permisos de ejecución, lo ejecutamos y finalmente borramos el fichero.

# cd dudle/locale

# vi download_mo.sh
for i in ??; do
	wget -O $i/dudle.mo https://dudle.inf.tu-dresden.de/locale/`basename $i`/dudle.mo
done

# chmod +x download_mo.sh

# ./download_mo.sh

# rm download_mo.sh

Ahora configuramos apache:

# cd /etc/apache2/sites-available

# vi dudle.conf
<VirtualHost *:80>
        ServerName      dudle.marsupi.org
        ServerAlias     *.dudle.marsupi.org dudle.lamardebits.org *.dudle.lamardebits.org dudle.lamardebits.cat *.dudle.lamardebits.cat
        ServerAdmin     xxx@lamardebits.org
        DocumentRoot    /var/www/dudle/

        ErrorLog        /var/log/apache2/dudle.error.log
        CustomLog       /var/log/apache2/dudle.access.log combined

	<Directory "/var/www/dudle">
		AllowOverride All

    		SetEnv RUBYLIB /var/www/dudle/
    		SetEnv RUBYOPT "-E UTF-8:UTF-8"
    		SetEnv GIT_AUTHOR_NAME="Blackhold"
    		SetEnv GIT_AUTHOR_EMAIL=xxx@domain.com
    		SetEnv GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
    		SetEnv GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

		Order allow,deny
		Allow from all
	</Directory>
</VirtualHost>

# cd /etc/apache2/sites-enabled/; rm 

Thinkpad no suspende con debian 12 (bookworm)

Otra vez he encontrado el tiempo para reinstalar el sistema, 4 meses más tarde, nada mal!

Vamos, pues con una nueva versión del “Thinkpad no suspende con debian” pero ahora para debian 12 llamada bookworm.

Seguí el artículo pero no servía, así que para solucionar el problema de suspensión con esta nueva versión es distinto. Olvida todo lo otro del otro artículo.

Al iniciar me salía este error:

de nov. 12 00:55:59 melatonina kernel: hpet_acpi_add: no address or irqs in _CRS
de nov. 12 00:55:59 melatonina kernel: Linux agpgart interface v0.103
de nov. 12 00:55:59 melatonina kernel: DMAR: DRHD: handling fault status reg 3
de nov. 12 00:55:59 melatonina kernel: DMAR: [DMA Read NO_PASID] Request device [00:12.4] fault addr 0xd7fff000 [fault reason 0x02] Present bde nov. 12 00:55:59 melatonina kernel: tsc: Refined TSC clocksource calibration: 2592.007 MHz
de nov. 12 00:55:59 melatonina kernel: clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x255cbd4609f, max_idle_ns: 440795221428 ns
de nov. 12 00:55:59 melatonina kernel: clocksource: Switched to clocksource tsc
de nov. 12 00:55:59 melatonina kernel: tpm tpm0: Operation Timed out
de nov. 12 00:55:59 melatonina kernel: tpm tpm0: Operation Timed out
de nov. 12 00:55:59 melatonina kernel: tpm_crb: probe of MSFT0101:00 failed with error -62
de nov. 12 00:55:59 melatonina kernel: AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.

La solución:

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="intel_iommu=off"

Recargamos la configuración de grub

# grub-mkconfig -o /boot/grub/grub.cfg

Reiniciamos y listos, funcionando!…

Django runserver sobre https

Estos dos últimos meses he estado trabajando con una tienda virtual desarrollada con django llamada django oscar. Muy interesante el juguete, tunearla ha habido momentos de todo, en algunos momentos era una delicia por la documentación que tienen y por otros iba más perdida que un pingüino en el desierto y los atascos eran monumentales además de la presión del cliente que tenía que tener el proyecto en funcionamiento un mes y pico antes de que se me diese acceso al código para poder arreglar y aplicar las funcionalidades extra que se requerían. El proyecto era uno que había dejado a medias otro desarrollador y tuve que rehacer todo el código porqué tal como se me entregó la aplicación había cosas básicas de funcionamiento rotas, además de variables en inglés, en castellano y catalán (no es el primer proyecto que me encuentro así).

Django oscar se usa como aplicación de Backend y de frontend hay desplegado un NextJS que tras dar alguna que otra vuelta he terminado modificando alguna cosa.

En entorno local de desarrollo todo funcionaba correctamente, pero al ponerlo en producción la cosa se ha puesto divertida y ha requerido investigar varias cosas que voy a exponer en este post en modo de notas.

La aplicación de frontend se conecta con django oscar por API y hasta que no añadí la opción CSRF_TRUSTED_ORIGINS la comunicación era infructuosa.

# vi settings.py
# this allows nextjs to connect to django without using csrf_token
CSRF_TRUSTED_ORIGINS = 'http://127.0.0.1'
CSRF_COOKIE_SAMESITE = "None"

Conectar moodle y wordpress

Hay algunas tareas de estas que se convierten en titánicas y no sabes muy bien el porqué y esta lo ha sido. Así que traigo este post para que otra persona que quiera montar este sistema no tenga que dar tantas vueltas y poder hacerlo a la primera :)

Hace unos meses que estamos preparando cursos bajo la marca escueladeeuropa. Los cursos la idea es montarlos en el LMS Moodle (learning management system), pero luego quedaba la cosa como los vendíamos… nos dijimos, sería chulo que los cursos se vendiesen solos a través de la página web hecha con wordpress… y ahí empezó la carrera.

Conectar wordpress y moodle es posible gracias a dos plugins, el primero edwiser y el segundo lmsace. El primero es mucho más intuitivo pero a la que quieres empezar a conectarlo con woocommerce, paga. El segundo… ¡ay el segundo! ¡vamos a verlo!

Concepto
La idea es que en tu moodle tienes unos cursos y en tu wordpress el woocommerce. Para conectar moodle y wordpress es necesario primero de todo crear los usuarios en wordpress que luego se crearán automáticamente en moodle. Esto se llama “user enrolment”.

Para conectar ambos programas será necesario instalar 1 plugin en wordpress y (atención) 2 en moodle! todo lo que necesitas saber lo encontrarás en la wiki de lmsace.

Moodle

Empezamos con moodle, será necesario instalar los dos plugins, lmsace-connect-moodle y lmsace-connect-moodleauth. El segundo aunque en la wiki pone que es opcional, hasta que no lo he …

script para identificar registros duplicados en sqlite3

En uno de mis proyectos estamos ya en la recta final a punto de poner en producción el nuevo programa. A último momento siempre te encuentras con aquellas puñetitas que hacen que la migración no salga como es lo esperado, es por esto que es muy importante practicar la migración al igual que si de una audición se tratase.

La puñetita con la que me he encontrado trata precisamente de la importación de datos mas grande, la de una tabla de 4Gb de datos, que contiene las lecturas de unos sensores, he decidido separarlas en alrededor de 4.000 ficheros de base de datos sqlite3, uno para cada uno de los sensores. Al realizar la importación de cada uno de los sensores de forma individual, de maravilla, pero a la que se hace el proceso de migración de todos los sensores, algunas de las lecturas se duplican y no he conseguido hallar el porqué ocurre.

Ya hace unos días puse un par de controles que si el fichero ya existía o la base de datos estaba siendo usada, pasase al siguiente sensor, aún así seguían duplicandose los datos. La solución era añadir un tercer control que comprobase que el registro ya estaba guardado, pero que ralentizaría la migración de los datos de forma significativa y la primera migración el interés es que sea lo más ágil posible. Así que dándole un par de vueltas y muy importante, tras más de 24h de no tocar el código (se llama descansar), he encontrado …

Instalar php8.2 en debian 11

La versión de php de debian 11 es la 7.4 y algunas aplicaciones ya piden sólo php 8, así que vamos a ver como instalamos php 8.

# echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" /etc/apt/sources.list.d/php.list
# apt -y install gnupg2
# wget -qO - https://packages.sury.org/php/apt.gpg | apt-key add -
# apt update

Ahora lo siguiente será ver qué librerías tenemos instaladas, instalar las nuevas y cambiar la configuración de apache2 o nginx

# dpkg -l |grep php

Una vez esté todo funcionando, eliminamos las versiones antiguas de php

# apt remove --purge php7.3* php7.4* libapache2-mod-php7.3 libapache2-mod-php7.4
# apt-get clean

Gitlab: configurar el envío de correos electrónicos

Gilab es un software para gestionar repositorios de software. Existe github y gitlab tiene también su repositorio público. Gitlab permite la instalación del software en tu propia infraestructura.

En éste otro post explicaba como instalarlo y actualizarlo con sus repositorios. Hoy veremos como configurar gitlab para que mande correos electrónicos.

Lo primero que tendremos que hacer es modificar el fichero de configuración que se encuentra en /etc/gitlab/gitlab.rb, buscar las siguientes líneas, descomentarlas y configurarlas de la siguiente forma (para que funcione con la configuración del servidor de correo electrónico instalado con modoboa)

# vi /etc/gitlab/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "mail.capa8.net"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "noreply@capa8.net"
gitlab_rails['smtp_password'] = "xxxxxxxxxxx"
gitlab_rails['smtp_domain'] = "capa8.net"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_pool'] = true

gitlab_rails['gitlab_email_enabled'] = true

gitlab_rails['gitlab_email_from'] = 'noreply@capa8.net'
gitlab_rails['gitlab_email_display_name'] = 'GitLab Capa8'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@capa8.net'

A continuación ejecutamos lo siguiente para aplicar la nueva configuración

# gitlab-ctl reconfigure

Una vez realizado el reconfigure, entramos en la consola de gitlab y comprobamos que la configuración se haya aplicado y mandamos un correo electrónico de prueba

# gitlab-rails console -e production
--------------------------------------------------------------------------------
 Ruby:         ruby 3.0.6p216 (2023-03-30 revision 23a532679b) [x86_64-linux]
 GitLab:       15.11.0 (96ee37680b6) FOSS
 GitLab Shell: 14.18.0
 PostgreSQL:   13.8
------------------------------------------------------------[ booted in 32.38s ]
Loading production environment (Rails 6.1.7.2)

irb(main):001:Notify.test_email('info@capa8.net', 'Hello World', 'This is a test message').deliver_now

Y si todo es correcto, deberías recibir un correo electrónico de prueba.…