Mas chuletas

La mejor sintaxis sieve que he encontrado: https://mailutils.org/manual/html_chapter/Sieve-Language.html

STATUS:

tengo el ejemplo de configuración de abajo en /etc/dovecot/local.conf

y un guión bash /usr/local/lib/sieve/execute/test

y esto es la prueba en el guión sieve:

pruebas

if allof(header :contains ["subject"] ["prueba", "sieve"], execute "test") { fileinto "pendiente"; }

doc:

Existe un plugin para sieve que permite ejecutar programas externos pre-definidos mediante su ubicación en un lugar predeterminado.

El plugin activa tres extensiones, que habilitan tres acciones pipe, filter y execute.

Todo ello, plugin, las extensiones que se habilitan y el directorio donde se ubican los programas se define en configuración.

Los programas se pueden ejecutar de dos maneras: directamente mediante un fork del programa a ejecutar o mediante un servicio dovecot específico para esto que permite ejecutar bajo otro usuario.

En los casos de filter y execute, se pueden utilizar en lugar de como acciones, como tests, de forma que si el programa termina sin código de error el test se ha pasado y si no, el test no se ha pasado.

En https://github.com/dovecot/pigeonhole/blob/main/doc/plugins/sieve_extprograms.txt dice: Standard error is written to the LDA log file, que en nuestro caso es syslog, y ahí no aparece nada; tampoco en ~/.dovecot.sieve.log => hacemos log en ~/.log

Y también: If a shell script is expected to read a message or string data, it must fully read the provided input until the data ends with EOF, otherwise the Sieve action invoking the program will fail

Las variables de entorno que recibe el script con execute (con pipe no recibe nada) son: USER, HOME, HOST (local), SENDER (address), RECIPIENT (address) y ORIG_RECIPIENT (address).

Configuración

Se realiza dentro de un bloque plugin { ... }, que puede repetirse tantas veces
como interese dentro de la configuración local doveconf; dentro de ese bloque,
todo lo relativo al plugin sieve lleva el prefijo 'sieve_'.

/etc/dovecot/local.conf es, pues, un buen lugar para esta configuración

Declaración del plugin sieve:

		sieve_plugins = sieve_extprograms [ ... ]
		
Declaración de las extensiones a utilizar del plugin:

		sieve_global_extensione = +vnd.dovecot.pipe [ ... ]
		
		sieve_extensions = +vnd.dovecot.execute [ ... ]
		
... en el primer caso, no es utilizable por scripts sieve de usuario.

Declaración de directorios:

		sieve_{pipe|filter|execute}_bin_dir
		
Ejemplo para utilizar solo la extensión 'execute':

		plugin {
			sieve_plugins = sieve_extprograms
			# enable for user script (once working, we should move to global extensions)
			sieve_extensions = +vnd.dovecot.execute
			sieve_execute_bin_dir = /usr/local/lib/sieve/execute
		}

Uso en script sieve:

require [ "vnd.dovecot.pipe" ] [ "vnd.dovecot.filter" ] [ "vnd.dovecot.execute" ]

Interfaz con los programas:

documentada en https://github.com/dovecot/pigeonhole/blob/main/doc/rfc/spec-bosch-sieve-extprograms.txt

cuando el programa lee el mensaje en su entrada estándar, ha de tragarse el mensaje completo: todo el input que le llega.

La salida de error estándar del programa va al log del LDA (dovecot-lda). Teóricamente
pq en mi instalación no aparece en log, lo que es una putada para debug, pq obliga abajo
que el propio programa grabe fichero de log.

Operación pipe:

	Entrega el mensaje a la entrada estándar del programa y considera el mensaje
	entregado: no sigue evaluando reglas si el programa se ejecuta y no devuelve fallo,
	excepto que se use con ':copy', cuando se considera que pipe entrega una copia
	del mensaje y no el mensaje en sí.
	
	Si el programa no se puede ejecutar, entonces si pipe se usa con 'try' es como
	si no se hubiera intentaod, mientras que sin ':try' el script sieve entero falla.
	
	Si el programa termina con código de error, entonces el mensaje no se da x entregado.

Operación filter:

	Se entrega el mensaje en entrada estádar del programa y se recoge en salida estándar
	lo que se considera en adelante el mensaje.
	
	Tanto si el programa no se puede ejecutar como si devuelve error o no proporciona
	nada en salida, el mensaje original se mantiene tal cual (y la ejecución completa
	del script sieve puede darse por fallida, según la implementación).
	
	Operaciones como reject o vacation no utilizan la nueva versión del mensaje, sino
	el original, y si otra operación provoca el fallo del script sieve, igualmente
	el mensaje que cuenta es el original.
	
Operación execute:

	Se ejecuta el programa externo con el mensaje u otra info como entrada estándar y
	se puede recoger la salida para otros fines, pero el mensaje original no se altera
	ni se da por entregado en ningún caso.