SmartOS: Stock "mkvtoolnix" crashes on 2023.4.0 with locale error

This post transcribes some emails I sent to the SmartOS mailing list some time ago. You can check the original thread:

Message-ID: <15dec164-940e-17d7-a7db-dcdf19f9ec2d@jcea.es>
Date: Tue, 12 Mar 2024 14:07:13 +0100
To: smartos-discuss <smartos-discuss@lists.smartos.org>
From: Jesus Cea <jcea@jcea.es>
List-Id: "smartos-discuss" <smartos-discuss.lists.smartos.org>
Subject: [smartos-discuss] Stock "mkvtoolnix" crashes on 2023.4.0 with locale
  error

Hi, there.

I install "pkgin install mkvtoolnix" with no issues (but a huge number
of dependencies, 1.6 Gigabytes total!).

Then, I run "mkvmerge" and it crashes:

"""
[jcea@test ~]$ mkvmerge
terminate called after throwing an instance of 'std::runtime_error'
what():  locale::facet::_S_create_c_locale name not valid
Abort (core dumped)
"""

This worked fine in 2022.4.0.

My environment variables are:

"""
MANPATH=/opt/local/man:/usr/share/man:/opt/local/lib/perl5/man:/opt/local/lib/perl5/vendor_perl/man
LC_MONETARY=es_ES.UTF-8
TERM=xterm
SHELL=/usr/bin/bash
SSH_CLIENT=***
LC_NUMERIC=es_ES.UTF-8
SSH_TTY=/dev/pts/26
USER=root
COLUMNS=80
PAGER=less
MAIL=/var/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/opt/local/sbin:/opt/local/bin:/usr/sbin:/usr/bin:/sbin
LC_COLLATE=es_ES.UTF-8
PWD=/home/jcea
LANG=en_US.UTF-8
TZ=Europe/Madrid
LINES=25
SHLVL=1
HOME=/home/jcea
TERMINFO=/opt/local/share/lib/terminfo
LOGNAME=jcea
SSH_CONNECTION=****
LC_TIME=es_ES.UTF-8
FTPMODE=auto
_=/opt/local/bin/env
"""

Jonathan Perkin replied:

Leer más…

Feed Slashdot: Modo "verboso" y peticiones HTTP incondicionales

Artículos previos sobre este proyecto para enviar por email las novedades diarias de un feed RSS:

Aunque el código va necesitando una refactorización y limpieza, sigo haciendo pequeñas modificaciones y mejoras:

  • Modo verboso: Normalmente cuando se invoca el programa hace su trabajo sin más. Pero a veces nos interesa saber qué ha hecho, si ha enviado un correo electrónico o no, por ejemplo, cuántas entradas nuevas hay en el feed RSS, etc.

  • Peticiones HTTP incondicionales: De vez en cuando el feed RSS de Slashdot da un error HTTP 50x, indicando un error interno. Cuando esto ocurre, el Sistema Operativo de mi servidor me envía un email indicando que el proceso ha fallado. Ejecutándolo manualmente compruebo que cuando ocurren esos errores el feed RSS de Slashdot no ha cambiado desde la petición anterior y que, de hecho, el problema se resuelve solo cuando aparece una entrada nueva.

    Esto tiene toda la pinta de ser un bug en el código de Slashdot y en realidad solo me afecta de forma cosmética (los correos electrónicos de errores que me llegan por ser administrador de la máquina que ejecuta este servicio), pero durante las pruebas comprobé que hacer una petición HTTP incondicional [1] no produce un error, así que añadí esa funcionalidad al programa.

    [1]

    Cuando mi programa detecta una actualización del feed RSS se queda con sus entradas y las siguientes peticiones no vuelven a pedir el feed RSS sin más, sino que envía al servidor HTTP de Slashdot lo que se llama una petición condicional que básicamente dice: "envíame el feed RSS solo si ha habido algún cambio desde la versión anterior. Si no no me mandes nada". Esto es ventajoso para todo el mundo, pero parece que Slashdot falla de vez en cuando cuando en realidad no ha habido un cambio en el feed RSS y simplemente tendría que haberme respondido con un código HTTP 304. Es así cómo debería ser y, de hecho, es lo que hace el 99.99% del tiempo. Pero falla ese 0.01%...

El parche es largo, pero fácil de entender:

Leer más…

"Nullmailer", "Return-Path" y GMail

En Generar un email diario a partir de un feed RSS (Slashdot), Mejoras a la hora de generar un email diario a partir de un feed RSS (Slashdot) y Los peligros de volcar a "pickle" cualquier cosa describo un programa para enviar por email las novedades diarias de un feed RSS.

Hace un tiempo modifiqué el programa para enviar los emails a varias direcciones de correo electrónico, no solo a mi cuenta. Todo ha ido bien hasta recientemente que añadí una dirección de GMail a la lista de destinatarios. GMail me rechazaba los mensajes por spam, sin un motivo claro a solucionar.

Tras dedicar unos ratos de diagnóstico y experimentos, he llegado a las siguientes conclusiones:

  • El remitente de mis emails era root@P2Ppriv.jcea.es. Ese dominio no existe. No es sorprendente que GMail no aceptase mis mensajes de las novedades diarias del feed RSS.

    No había tenido problemas hasta ese momento porque todos los destinatarios de las novedades diarias del feed RSS de Slashdot eran usuarios locales de mi propio servidor de correo electrónico.

  • Incluso poniendo un dominio remitente que exista en la cabecera From, nullmailer estaba usando un envelope SMTP con el mismo dominio inválido. Leyendo la documentación de nullmailer, en concreto el componente nullmailer-inject, podemos leer lo siguiente:

    -f sender

    Set the envelope sender address to sender.

    Esto es esperanzador, pero no estamos usando nullmailer directamente para inyectar los mensajes en el sistema de correo, sino el comando estándar mail, que no tiene un parámetro para controlar el envelope SMTP.

    Revisando otra vez el manual de nullmailer-inject, vemos algo interesante:

    If the Return-Path header field is present and contains a single address, its contents will be used to set the envelope sender address.

    Vaya, podemos utilizar la cabecera Return-Path para controlar el envelope SMTP utilizado por nullmailer.

Por tanto el parche es sencillo:

             msg = MIMEText(html, 'html')
             msg['Subject'] = f'Feed Slashdot {time.strftime("%Y-%m-%d", ts_max)}'
+            msg['From'] = 'slashdot-sender@jcea.es'
             msg['To'] = addr
             msg['Date'] = email.utils.formatdate()
             msg['List-Id'] = 'Notificaciones Slashdot'
             msg['Message-Id'] = email.utils.make_msgid(domain='P2Ppriv')
+            # Esto es para controlar el "sender" del envelope que pone "nullmailer".
+            # Ver "man nullmailer-inject".
+            msg['Return-Path'] = 'slashdot-sender@jcea.es'
+
             msg = msg.as_bytes()

Esta modificacion utiliza una cabecera From para indicar una dirección de correo electrónico que sí exista (en concreto, su dominio) y una cabecera Return-Path para controlar el envelope SMTP y que salga también con un dominio correcto.

Con esto GMail está satisfecho aceptando mis mensajes y tengo amigos felices con su dosis diaria de noticias curadas.