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.…

Subir un directorio por ftp por consola

Tengo un cliente al que le tengo que migrar el servicio a un hosting de estos con cpanel y estas mierdas. Para subir los ficheros tengo que subirlos por FTP pero el wordpress que tengo que subir tiene mogollón de ficheros y subirlos uno a uno es para morirse. Además quiero hacer la transferencia de los ficheros directamente desde el servidor.

El cliente ftp básico no me permite subir un directorio completo, así que estoy usando otro cliente ftp, ncftp.

Lo instalo usando

# apt -y install ncftp

Y me posiciono en el directorio donde tengo el wordpress

# cd /var/www/

y lo subo usando

# ncftpput -avR -u  -p   

directorio_remoto: es el directorio del servidor remoto, en mi caso public_html
directorio_local: donde tengo el wordpress en mi servidor, wp…

Generar certificado autofirmado con openssl

Llega el momento de poner a producción un programa que llevas más de un año desarrollando, para montarlo necesito generar unos certificados autofirmados para cuando el dominio apunte a mi servidor generar los certificados de letsencrypt. De mientras el apunte de como generarlos con openssl:

# cd /etc/autosigned-certs/
# mkdir domain.com
# cd domain.com
# openssl req -nodes -newkey rsa:2048 -keyout domain.com.key -out domain.com.csr
# openssl x509 -req -in domain.com.csr -signkey domain.com.key -out domain.com.crt

En nginx comento las líneas que corresponderían al certificado de letsencrypt y añado los certificados autofirmados

        #ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # managed by Certbot
        #ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # managed by Certbot
        #include /etc/letsencrypt/options-ssl-nginx.conf;
        #ssl_trusted_certificate /etc/letsencrypt/live/domain.com/chain.pem;
        ssl_certificate /etc/autosigned-certs/domain.com/domain.com.crt;
        ssl_certificate_key /etc/autosigned-certs/domain.com/domain.com.key;

Tip del día.…

script para convertir pdf a png

Uno de los recursos que necesito al crear un informe pericial es convertir un documento pdf a imágenes png para poder añadirlo en el anexo el informe.

Os dejo el script que uso para convertir los pdf a png. Lo pones y lo ejecutas en el directorio donde tienes los pdf y te genera todos los png.

#!/bin/bash

for p in *.pdf
do
   pdftoppm "$p" "$p" -png
done

Para ejecutarlo, primero le damos permisos de ejecución y luego lo ejecutamos

$ chmod +x convert_pdf_to_png.sh
$ ./convert_pdf_to_png.sh

Y listos! Tip rápido y útil del día.…

Instalar imapsync en debian 11

Seguimos con temas de correo. Una de las herramientas que uso para migrar buzones de un servidor a otro es imapsync. Vamos a verlo como lo instalamos.

He usado este manual de clouding.io. Al ejecutar el proceso he descubierto una cosa que me ha encantado! normalmente para concatenar comandos de terminal uso &&, he visto que también es posible usar ;!!! me ha gustado esta! :D

Vamos a ver como lo instalamos

Dependencias

root@imapsync:~# apt update && apt install -y libtest-simple-perl libtest-requires-perl libtest-mock-guard-perl libtest-fatal-perl libpar-packer-perl libnet-ssleay-perl libio-compress-perl libdigest-hmac-perl libcrypt-ssleay-perl libssl-dev libauthen-ntlm-perl libclass-load-perl libcgi-pm-perl libcrypt-openssl-rsa-perl libdata-uniqid-perl libencode-imaputf7-perl libfile-copy-recursive-perl libfile-tail-perl libio-socket-inet6-perl libio-socket-ssl-perl libio-tee-perl libhtml-parser-perl libjson-webtoken-perl libmail-imapclient-perl libparse-recdescent-perl libmodule-scandeps-perl libreadonly-perl libregexp-common-perl libsys-meminfo-perl libterm-readkey-perl libtest-mockobject-perl libtest-pod-perl libunicode-string-perl liburi-perl libwww-perl libtest-nowarnings-perl libtest-deep-perl libtest-warn-perl make cpanminus git rcs gcc libproc-processtable-perl

Otra dependencia que me he encontrado que ha pedido instalar (donde he descubierto lo del ;)

root@imapsync:~# apt-get install apt-file; apt-file update

Configurar módulos

Ahora vamos a configurar algunos módulos que serán necesarios para hacer funcionar imapsync

root@imapsync:~# cpanm Crypt::OpenSSL::RSA Crypt::OpenSSL::Random --force
root@imapsync:~# cpanm Mail::IMAPClient JSON::WebToken Test::MockObject Dist::CheckConflicts
root@imapsync:~# cpanm Unicode::String Data::Uniqid --force
root@imapsync:~# cpanm Mail::IMAPClient IO::Socket::SSL

Instalar imapsync

Ahora para instalarlo, vamos a clonar el repositorio e instalaremos el programa

root@imapsync:~# cd /opt && git clone https://github.com/imapsync/imapsync.git
root@imapsync:~# cd imapsync && make install

Si todo está correcto, copiamos el binario en el directorio de binarios

root@imapsync:~# cp imapsync /usr/bin/imapsync

Para comprobar que el programa se ha instalado correctamente usamos:

root@imapsync:~# imapsync --testslive

Usar imapsync

Cuando migramos un servidor de correo, tenemos el servidor antiguo …

Roundcube: cambiar color skin elastic

Hoy he instalado un roundcube y para hacérmelo más fácil he seguido éste post que hice hace un par de añitos (Gracias Blackhold del pasado por este post!).

Con la versión instalada hoy no me funcionaba el tema larry, así que me he quedado con el tema que viene por defecto, elastic. Al poner el logo, el azul de larry quedaba horrorosamente feo, así que he avanzado un poquito más con la personalización de roundcube. Buscando he llegado a este hilo del foro de roundcube. Decían de modificar el fichero styles.less y compilar los css (¿mande?)

Os lo cuento:

Para cambiar el color del botón de login he tenido que modificar el fichero skins/elastic/styles/styles.less y añadir lo siguiente

#login-form button.mainaction {
  background-color: #8a77b0;
  border-color: #123456;

  &:hover {
    background-color: #123456;
  }
}

Para cambiar el color global, por defecto azul claro, el otro fichero que es necesario modificar es skins/elastic/styles/colors.less y definir en @color-main el color que nos interese, en mi caso:

@color-main:                #8a77b0;

A continuación, para generar el css es necesario instalar el paquete “node-less”:

# apt -y install node-less

Y finalmente ejecutar lo siguiente para aplicar los cambios en los ficheros .less

lessc styles.less styles.min.css

Y ahora ya tienes el roundcube con el color que se adecue a tu empresa o la de tu cliente :)…

Saltando bloqueos de los ISP: HAProxy y autossh

¡Este último mes podríamos decir que he estado muy entretenida! Hace ya casi dos años, un cliente vino a mi harto de que los proveedores de hosting le cerrasen el servidor, durante todo este tiempo de maravilla, hasta que hace un mes y medio Movistar y Vodafone bloquearon el dominio. Ahí es cuando el cliente me contactó de nuevo para realizar un análisis y un informe pericial. El motivo es que el cliente no está realizando ningún acto delictivo que lleve a los proveedores de hosting e ISP a bloquear el servicio, aún así, lo hacen, estamos delante de un caso de Internet Blackout, bloqueo interesado de un servicio en concreto para que los usuarios no puedan acceder a él. ¿Algo ha tenido que ver el recién finalizado y polémico Mundial de Fútbol en Qatar?.

En la fecha del bloqueo del dominio del cliente, mi propuesta al identificar que el bloqueo se estaba realizando a nivel de dominio (que no de DNS, ya que estos si resolvían), le propuse al cliente de registrar otro dominio. La solución funcionó durante 2 semanas más hasta que Movistar y Vodafone bloquearon la dirección IP, como tal, la solución de añadir mas dominios apuntando al servidor, ya no era útil. Por mas INRI, el bloqueo se extendió a más ISP, aislando casi por completo el servidor de Internet (y no sólo en España, otros países de Europa y LatinoAmérica se vieron afectados), pero no todos lo bloquearon!

A partir de aquí se empezó a …

Crear USB Windows 11 con Debian 11

Primero, me da verguenza tener que instalar un windows, pero para un trabajo lo necesito.
Segundo, no dispongo de ningún otro windows para crear el instalable por USB de Windows 11.
Conclusión: Problemas

Así que vamos a ver que he hecho, que tenemos que tener en cuenta y que problemas me he encontrado.

Para crear un USB para instalar Windows, es necesario que este esté en formato FAT32, si algo sabes de sistemas de archivo, el tamaño máximo para los ficheros de FAT32 es de 4Gb, pero en la ISO de Windows 11, hay un ficherito de marras llamado install.wim que pesa exactamente 4.8Gb.

Mi primera opción ha sido usar el comando dd para tostar la ISO al pincho USB. Nada. Lo he probado primero sobre /dev/sdb y nada, lo segundo sobre /dev/sdb1 y tampoco.

La segunda ha sido usar unetbootin y tampoco. He probado de formatear el pincho USB en fat32, en exFAT y NTFS y nada. El problema es que el fichero install.wim no se pasa completamente al pesar mas de 4Gb.

Así que la solución ha pasado por usb el paquete de ubuntu mkusb.

Para ello añadiremos los sources de ubuntu

# vi /etc/apt/sources.list
deb http://ppa.launchpad.net/mkusb/ppa/ubuntu focal main

# apt-key adv --keyserver keyserver.ubuntu.com --recv 54B8C8AC
# apt update
# apt -y install mkusb sudo
$ sudo mkusb

En debian el root no está configurado para cargar aplicaciones gráficas, para ejecutar un comando como root, será necesario usar el comando sudo.

Seguiremos las instrucciones tal como indica esta …