HSAdmin Backend Domains, E-Mail, Datenbanken
Michael Hierweck
2017-09-12 f3a2ac9123229cec800ffca85e2d4351c142dc00
Simplify mail setup: dom module controls transports and relaydomains (and relayrecipients in case of backupmxforexternalmx), email module controls virtual and relayrecipients.
2 files modified
91 ■■■■■ changed files
hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java 9 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/email/EMailAddressProcessorFactory.java 82 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java
@@ -160,7 +160,15 @@
                            dom.getName() + " smtp:" + inetAddr + ":225\n" +
                            "." + dom.getName() + " smtp:" + inetAddr + ":225\n")
                    );
            cp.appendProcessor(
                    new ShellProcessor("postmap -r -i /etc/postfix-mailin/relayrecipients",
                            "@" + dom.getName() + " anything\n")
                    );
        } else {
            cp.appendProcessor(
                    new ShellProcessor(
                            "postmap -d '@" + dom.getName() + "' /etc/postfix-mailin/relayrecipients")
                    );
            cp.appendProcessor(
                    new ShellProcessor(
                            "postmap -d '" + dom.getName() + "' /etc/postfix-mailin/transport && " +
@@ -197,6 +205,7 @@
        Processor mailQueueProcessor = new CompoundProcessor(
                createPostgreyConfiguration(em),                
                new ShellProcessor(
                        "postmap -d '@" + dom.getName() + "' /etc/postfix-mailin/relayrecpients && " +
                        "postmap -d '" + dom.getName() + "' /etc/postfix-mailin/relaydomains && " +
                        "postmap -d '" + dom.getName() + "' /etc/postfix-mailin/transport && " +
                        "postmap -d '." + dom.getName() + "' /etc/postfix-mailin/relaydomains && " +
hsarback/src/de/hsadmin/mods/email/EMailAddressProcessorFactory.java
@@ -15,69 +15,61 @@
import de.hsadmin.mods.pac.Pac;
public class EMailAddressProcessorFactory implements EntityProcessorFactory {
    public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em, T entity) {
        // TODO: combine both keys in a single call (optimization)
        EMailAddress email = (EMailAddress) entity;
        Pac pac = email.getDomain().getUser().getPac();
        CompoundProcessor cp = new CompoundProcessor();
        cp.appendProcessor(new ShellProcessor( "postmap -r -i /etc/postfix-mailin/virtual",
                email.getFullDomain() + " -" ) );
        Config config = Config.getInstance();
        cp.appendProcessor(new ShellProcessor( "postmap -r -i /etc/postfix-mailin/virtual",
                email.getEMailAddress() + " " + email.getTarget() ) );
        cp.appendProcessor(
                new ShellProcessor("postmap -r -i /etc/postfix-mailin/virtual", email.getFullDomain() + " -"));
        cp.appendProcessor(new ShellProcessor("postmap -r -i /etc/postfix-mailin/virtual",
                email.getEMailAddress() + " " + email.getTarget()));
        WaitingTasksProcessor waitingTasksProcessor = new WaitingTasksProcessor(cp);
        Config config = Config.getInstance();
        for (String queueName : config.getProperty("queues.mail").split(",")) {
            waitingTasksProcessor.appendProcessor(queueName, new ShellProcessor( "postmap -r -i /etc/postfix-mailin/relayrecipients",
                    email.getEMailAddress() + " anything" ), "Add to relayrecipients" );
        }
        if (emailAddressCount(em, email) <= 1) {
            String domName = email.getDomain().getName();
            for (String queueName : config.getProperty("queues.mail").split(",")) {
                waitingTasksProcessor.appendProcessor(queueName, createMailinSetupProcessor(domName, pac), queueName + ".hostsharing.net");
            }
            waitingTasksProcessor.appendProcessor(queueName,
                    new ShellProcessor("postmap -r -i /etc/postfix-mailin/relayrecipients",
                            email.getEMailAddress() + " anything"),
                    "Add to relayrecipients");
        }
        return waitingTasksProcessor;
    }
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) {
        // TODO: if update is specified by primary-key or DB query instead of OID,
        //     a  postmap -d might be neccessary
        // TODO: if update is specified by primary-key or DB query instead of
        // OID, a postmap -d might be neccessary
        return createCreateProcessor(em, entity);
    }
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) {
        CompoundProcessor cp = new CompoundProcessor();
        EMailAddress email = (EMailAddress) entity;
        cp.appendProcessor(
                new ShellProcessor( "postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/virtual" ) );
        if (emailAddressCount(em, email) == 0) {
            // last email address removed
            String fullDomain = email.getFullDomain();
            cp.appendProcessor(new ShellProcessor("postmap -d '" + fullDomain + "' /etc/postfix-mailin/virtual"));
        }
        cp.appendProcessor(
                new ShellProcessor("postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/virtual"));
        Config config = Config.getInstance();
        WaitingTasksProcessor waitingTasksProcessor = new WaitingTasksProcessor(cp);
        for (String queueName : config.getProperty("queues.mail").split(",")) {
            waitingTasksProcessor.appendProcessor(queueName,
                new ShellProcessor( "postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/relayrecipients" ),
                    "Remove from relayrecipients" );
        }
        if (emailAddressCount(em, email) == 0) {
            // remove the domain from virtual.db
            String fullDomain = email.getFullDomain();
            cp.appendProcessor(
                    new ShellProcessor( "postmap -d '" + fullDomain + "' /etc/postfix-mailin/virtual" ) );
            for (String queueName : config.getProperty("queues.mail").split(",")) {
                waitingTasksProcessor.appendProcessor(queueName, createMailinDeleteProcessor(fullDomain), queueName + ".hostsharing.net");
            }
            waitingTasksProcessor.appendProcessor(queueName,
                    new ShellProcessor(
                            "postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/relayrecipients"),
                    "Remove from relayrecipients");
        }
        return waitingTasksProcessor;
        return waitingTasksProcessor;
    }
    private int emailAddressCount(EntityManager em, EMailAddress email) {
        Query query;
        if ( email.getSubdomain() != null ) {
        if (email.getSubdomain() != null) {
            query = em.createQuery("SELECT e FROM EMailAddresses e WHERE e.subdomain=:subdomain AND e.domain=:domain");
            query.setParameter("subdomain", email.getSubdomain());
        }
        else {
            query = em.createQuery("SELECT e FROM EMailAddresses e WHERE ( e.subdomain IS NULL OR e.subdomain = '' ) AND e.domain=:domain");
        } else {
            query = em.createQuery(
                    "SELECT e FROM EMailAddresses e WHERE ( e.subdomain IS NULL OR e.subdomain = '' ) AND e.domain=:domain");
        }
        query.setParameter("domain", email.getDomain());
        List<?> result = query.getResultList();
@@ -85,20 +77,6 @@
            return 0;
        }
        return result.size();
    }
    private Processor createMailinSetupProcessor(String domName, Pac pac) {
        String inetAddr = pac.getCurINetAddr().getInetAddr();
        return
            new ShellProcessor("postmap -r -i /etc/postfix-mailin/transport",
                        domName + " smtp:" + inetAddr + ":225\n" +
                        "." + domName + " smtp:" + inetAddr + ":225\n");
    }
    private Processor createMailinDeleteProcessor(String domName) {
        return new ShellProcessor(
                "postmap -d '" + domName + "' /etc/postfix-mailin/transport && " +
                "postmap -d '." + domName + "' /etc/postfix-mailin/transport");
    }
}