
Tenemos una expresión regular header_checks pasada al proceso de "limpieza", pero no procesa el encabezado como un solo encabezado si está en varias líneas.
header_check (pasar valor del encabezado a FILTRO):
/^X-OurHeader:\s+(.*?)/ FILTER $1
maestro.cf:
cleanup_service. unix n - y - 0 cleanup
-o header_checks=regexp:/etc/postfix/header_check
Ejemplo de encabezado de varias líneas donde falla:
X-OurHeader: a_special_filter_command:my.sub.domain
b.mail.whatever.com
El encabezado completo original antes de tener varias líneas es:
X-OurHeader: a_special_filter_command:my.sub.domainb.mail.whatever.com
El resultado pasado a FILTER es entonces: a_special_filter_command:my.sub.domain
y falta el nombre de host restante de la segunda línea b.mailwhatever.com
.
Si cambio header_check a esto, capturará la siguiente línea:
/^X-OurHeader:\s+([\s\S]*)/ FILTER $1
El grupo de captura $1 contiene la segunda línea, pero todavía hay un espacio (y presumiblemente una nueva línea) en el texto capturado también, por lo que eso no funciona. Eso se parece a esto:
X-OurHeader: a_special_filter_command:my.sub.domain b.mail.whatever.com
Mirando los registros con el primer enfoque, vemos
postfix/cleanup[123456]: 27429A1FE8: filter: header X-OurHeader: a_special_filter_command:my.sub.domain? b.mail.whatever.com
¿Existe algún enfoque alternativo para esto que alguien pueda sugerir? El objetivo final es etiquetar un encabezado con un cmd especial: valores de nombre de host que deben enviarse al FILTRO, pero queremos admitir que el valor hdr se divida en varias líneas para que un encabezado largo cumpla con la "longitud DEBE ser < Estándar de 78".
Respuesta1
Si sabe o puede asegurarse de que solo haya una cierta cantidad de variaciones, agregue expresiones adicionales para capturarlas por separado /..:(.*) (.*)$/ -> /..:$1$2/
; postfix continuará con la siguiente expresión si no hay espacio, así que mantenga los patrones simples poniendo primero la coincidencia compleja.
Si no es así, pero aún está dentro del poder de las expresiones regulares, puede haber una manera deencadenar múltiples búsquedas. Desde el principio no puedo reconstruirlo todo, pero si está disponible en su distribución y funciona, la documentación debería ser útil, comience con el header_checks
manual y el DATABASE_README
archivo.
pipemap:{pcre:/extract/category.pcre,pcre:/map/category/to/filter/command.pcre}
Idea básica: obtenga primero su dirección general (p. ej. MYFILTER: $1
), y solo luego aplique las ediciones necesarias para convertirlo en un comando postfix válido, asegurándose cuidadosamente de que todas las entradas conduzcan a una salida válida ( MYFILTER: (valid1|valid2) -> FILTER host:port
más una línea alternativa MYFILTER:
-> FILTER: default:port
)
De lo contrario, normalmente cuando quieres hacer cosas demasiado poderosas para expresiones regulares y header_checks, escalas a Turing-completitud:
Una búsqueda suficientemente dinámica. por ejemplo, si le gusta SQL, eso debería generarle algo que no sea mucho menos legible/mantenible. Tenga cuidado con los resultados lógicos no deseados de múltiples búsquedas
header_checks = sqlite:/path/to/definition.conf pcre:/remaining/simpler/rules.pcre
Un demonio milter/política. Incluso podrían llamar a archivos binarios externos sin redirigir el mensaje en absoluto. Dependiendo de la interfaz de su idea actual del siguiente FILTRO en línea, esto puede ser más o menos conveniente.
También creo que hay maneras de hacer que Postfix funcione correctamente.transporteun mensaje determinado a través de múltiples instancias de header_checks si es necesario, pero no recomendaría esa ruta, no combina bien con otras decisiones de enrutamiento (más o menos dinámicas).