Newsgroup: it.comp.os.linux.sys
Titolo: Bizzarra configurazione di postfix

Ho creato un mostro!
Io ho:
relay_domains = mysql:/etc/postfix/
mysql-relay_domains.cf
transport_maps = mysql:/etc/postfix/
mysql-union_transport_maps.cf
relay_transport = mysql:/etc/postfix/
mysql-virtual_transport.cf
Stando alla documentazione di postfix, il passaggi per il corretto
delivery sono i seguenti:
* check del dominio in "relay_domains"
* se il dominio è presente, check del transport in "transport_maps"
* se transport_maps non è presente o è vuoto, check del transport da
"relay_transport"
Così facendo, posso specificare i defaults in "relay_transport" e
fare l'ovveride di alcuni recipient direttamente dal transport_maps.
Però mi viene letto solo e soltanto il transport_maps. Se tale
transport non ritorna risultati, la mail è rifiutata.
Perchè non legge anche relay_transport? Stando alla documentazione il
transport_maps serve solo per fare l'override di parametri presenti nel
più generico relay_transport.
Mah.
Ho risolto facendo un mostro: una union in transport maps che pesca
i dati da due tabelle e non utilizzando il relay_transport, ma è
semplicemente una cosa assurda IHMO.

 semplicemente una cosa assurda IHMO.
Se illustrassi COSA vuoi fare, magari ti si potrebbe dire come farlo.
-- 
Flavio Visentin
Scientists have finally discovered what's wrong with the female brain:
On the left side, there is nothing right, and on the right side, there
is nothing left.

 Se illustrassi COSA vuoi fare, magari ti si potrebbe dire come farlo.
Voglio fare una cosa apparentemente molto semplice:
dominio1.com
 => relay su 1.2.3.4
dominio2.com
 => ralay su 2.3.4.5
in...@dominio1.com
 => ralay su 3.4.5.6
Ovvero, di default tutto il dominio viene relayato (brr) su un
server specifico, ma all'occorrenza devo poter ignorare tale relay
e poterne specificare uno determinato per alcuni recipient.
Attualmente ho tamponato con una union, che alla fin fine non è nemmeno
scorretta, dal momento che la mappa transport necessita di un valore, io
genero tale valore prendendolo dal database e la union fa semplicemente
parte di SQL, non è che abbia fatto chissà quale strano meccanismo.
Di certo se fosse possibile fare tutto con postfix, sarebbe meglio.
Ma, adesso mentre scrivo, mi è venuto in mente un secondo problema:
far fare tutto a postfix significa fare 2 query ogni volta, una per
prendere transport, se presente, l'altra per prendere il relay di
default del dominio, nel caso non fosse presente il transport.
Con la union faccio una sola query.

 No, non è vero...
Allora hai ragione tu.
E dato che hai ragione saprai anche perché non funziona e come risolvere.


 E dato che hai ragione saprai anche perché non funziona e come risolvere.
No, non so come risolvere :)
Ma stando a quel documento, li è scritto che è possibile specificare
transport:nexthop non è che l'ho inventato io.
"Specify a string of the form transport:nexthop, where transport is the 
name of a mail delivery transport defined in 
master.cf
."
E' il relay_domains che vuole un valore tipo "OK"

 No, non è vero...
Invece sì.
Un test per chiarire: prova a togliere le definizioni che hai messo tu e 
vedere cosa ti riporta un
postconf | grep ^relay_transport
-- 
http://bofhskull.wordpress.com/

 postconf | grep ^relay_transport
Mi riporta
relay_transport = relay
Però li nella documentazione è scritto di specificare transport:nexthop
Uhm...


Lascia perdere quello che credi di capire dalla documentazione.
Stai confondendo i riferimenti a "transport" inteso come servizio e 
"transport" inteso come lookup della stessa.
Per dirla con la nomenclatura di altri mailserver, stai confondendo il 
router con il routing.
Per quello che vuoi fare (transport per singolo destinatario diversa da 
quella per il dominio) è sufficiente un "man 5 transport" e leggere il 
blocco relativo a "TABLE SEARCH ORDER".
main.cf
:
transport_maps                  = hash:/etc/postfix/transport
/etc/postfix/transport:
dominio1.com
		smtp:[1.2.3.4]
dominio2.com
		smtp:[2.3.4.5]
in...@dominio1.com
 	smtp:[3.4.5.6]
-- 
http://bofhskull.wordpress.com/

 
in...@dominio1.com
     smtp:[3.4.5.6]
Ok, ed è come faccio io adesso.
transport_maps = mysql:/etc/postfix/
mysql-union_transport_maps.cf
con una query che mi fa la UNION (ho i dati suddivi per dominio su una
tabella diversa da quelli per recipient).
La UNION prima va a prendere un eventuale transport per recipient,
se tale recipient non è presente, passa al transport per dominio.
Mi spara fuori solo un risultato, il primo che trova, quindi
o il recipient o il dominio.
Allora la mia soluzione non è bizzarra, è normale...

 Allora la mia soluzione non è bizzarra, è normale...
L'unica cosa "bizzarra" è il fatto che la UNION non serve un accidenti: 
non sta scritto da nessuna parte che $transport_maps debba elencare una 
mappa sola. Non per nulla ha un nome plurale...
-- 
http://bofhskull.wordpress.com/

 mappa sola. Non per nulla ha un nome plurale...
Uhm, lui di default quindi da priorità al recipient e poi al dominio?
ovvero se io ho nel file
dominio.it
 => 2.3.4.5
nome....@dominio.it
 => 1.2.3.4
Lui darà priorità comunque a 
nome....@dominio.it
 ?
Dal mio punto di vista cambia poco, o faccio la union o faccio
una join per cui non vedo tutta sta differenza prestazionale.
(sempre nel mio caso specifico)

 (sempre nel mio caso specifico)
Non conosco il tuo DB, ma non capisco perchè dovrebbe esserci una join.
Due query semplici, in due file-mappa separati, sono IMHO tanto più 
leggere di una qualsiasi JOIN o UNION...
Poi, come te pare...
-- 
http://bofhskull.wordpress.com/

 leggere di una qualsiasi JOIN o UNION...
Perchè quando è stato fatto il DB (6-7 mesi fa) non avevo previsto
la possibilità di fare il redirect di un singolo account verso una
determinata macchina, ma avevo previsto solo il relay dell'intero
dominio. (ed è giusto così per le nostre necessità).
Ma ora devo fare degli interventi di manutenzione e, per forza di cose,
devo obbligatoriamente fare il relay per recipient anzichè per dominio.
(in altre parole, un dominio con 100 caselle o lo migro di server tutto
in una volta [improponibile] e quindi aggiorno l'intero relay oppure
faccio la migrazione mail per mail ed aggiungo un relay temporaneo per
i singoli recipient)
Comunque sia, non mi preoccupano più di tanto le performance, una union
dovrebbe avere performance molto simili a due query distinte (si tratta
in effetti di due query con i dati visualizzati insieme) ed è solo una
cosa temporanea, in futuro potrei fare il dump delle mappe da mysql ad
un file hash, tanto tale tabella sarà praticamente statica...

 dominio. (ed è giusto così per le nostre necessità).
Quello che intende skull è banalmente questo:
transport_maps = mysql:/etc/postfix/
mysql-user_maps.cf
                 mysql:/etc/postfix/
mysql-domain_maps.cf
Se matcha la prima fa una query, altrimenti ne fai due. In ogni caso
dovrebbe essere più pulito e performante di una union o una join.


 dovrebbe essere più pulito e performante di una union o una join.
Ecco, non avevo pensato minimamente a fare due mappe in tal modo.
Buona idea.
Per la velocità, non saprei, adesso faccio una verifica ad eseguire
le due query singole (come farebbe postfix) oppure direttamente
nella union.
Intanto grazie.

 dovrebbe essere più pulito e performante di una union o una join.
Sembra proprio che due query siano più performanti.
La union impiega 20ms, le due query impiegano 1ms l'una...