HSAdmin Backend Domains, E-Mail, Datenbanken
Peter Hormanns
2011-07-20 b690312f6c2bb59a0f8a3462d387f681c3266a48
clean code, templates dynamic and static web
1 files copied
1 files renamed
2 files modified
325 ■■■■■ changed files
hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java 279 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl 8 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/dom/httpd-vhost-static.jtpl 36 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/Pac.java 2 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java
@@ -19,15 +19,12 @@
import de.hsadmin.core.qserv.WaitingTasksProcessor;
import de.hsadmin.mods.email.EMailAddress;
import de.hsadmin.mods.email.EMailAddressProcessorFactory;
import de.hsadmin.mods.pac.INetAddress;
import de.hsadmin.mods.pac.Pac;
import de.hsadmin.mods.user.UnixUser;
public class DomainProcessorFactory implements EntityProcessorFactory {
    /**
     * @return a Processor which creates a domain
     * @throws ProcessorException
     */
    public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em, T entity) throws ProcessorException {
        String hiveName = entity.getHiveName();
        Domain dom = (Domain) entity;
@@ -35,7 +32,6 @@
        Pac pac = domUser.getPac();
        String pacName = pac.getName();
        String domName = dom.getName();
        String zonefileTargetPath = "/etc/bind/pri." + domName;
        Map<String, String> templateVars = new HashMap<String, String>();
        templateVars.put("SIO", Long.toString(System.currentTimeMillis()/1000L));
        templateVars.put("PAC", pacName);
@@ -43,7 +39,59 @@
        templateVars.put("DOM_HOSTNAME", domName);
        templateVars.put("DOM_USERNAME", domUser.getName());
        templateVars.put("PAC_HOSTNAME", pacName + ".hostsharing.net");
        templateVars.put("DOM_IPNUMBER", pac.getCurINetAddr().getInetAddr());
        templateVars.put("DOM_IPNUMBER", getCurrentIPAddress(pac));
        templateVars.put("DOM_IPNUMBEREX", getOldIPAddress(pac));
        WaitingTasksProcessor mainProcessor = new WaitingTasksProcessor(createHiveDNSSetupProcessor(domName, templateVars));
        mainProcessor.appendProcessor(hiveName, createHiveEMailSetupProcessor(em, domName), "Setup EMail");
        String hiveInetAddr = pac.getHive().getInetAddr().getInetAddr();
        for (String queueName : new String[] { "dns1", "dns2", "dns3" }) {
            mainProcessor.appendProcessor(queueName, createDNSServerSetupProcessor(domName, hiveInetAddr), queueName + ".hostsharing.net");
        }
        for (String queueName : new String[] { "mail1", "mail2", "mail3" }) {
            mainProcessor.appendProcessor(queueName, createMailinSetupProcessor(domName, pac), queueName + ".hostsharing.net");
        }
        mainProcessor.appendProcessor("backupmx", createBackupMXSetupProcessor(domName), "backupmx.hostsharing.net");
        templateVars = new HashMap<String, String>();
        templateVars.put("PAC", pacName);
        templateVars.put("HIVE", pac.getHiveName());
        templateVars.put("DOM_HOSTNAME", domName);
        templateVars.put("DOM_USERNAME", domUser.getName());
        templateVars.put("PAC_HOSTNAME", pacName + ".hostsharing.net");
        templateVars.put("DOM_IPNUMBER", getCurrentIPAddress(pac));
        templateVars.put("DOM_IPNUMBEREX", getOldIPAddress(pac));
        templateVars.put("DOMAIN", domName);
        templateVars.put("USER_NAME", domUser.getComment());
        mainProcessor.appendProcessor(hiveName, createApacheVHostSetupProcessor(dom, templateVars), "Setup Apache VHost");
        return mainProcessor;
    }
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) throws ProcessorException {
        throw new ProcessorException("domain.update not implemented");
    }
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) {
        Domain dom = (Domain) entity;
        String domName = dom.getName();
        WaitingTasksProcessor mainProcessor = new WaitingTasksProcessor(
                new CompoundProcessor(
                    createHiveEMailRemoveProcessor(domName),
                    createHiveDNSRemoveProcessor(domName)
                )
            );
        for (String queueName : new String[] { "dns1", "dns2", "dns3" }) {
            mainProcessor.appendProcessor(queueName, createDNSServerRemoveProcessor(domName), queueName + ".hostsharing.net");
        }
        for (String queueName : new String[] { "mail1", "mail2", "mail3" }) {
            mainProcessor.appendProcessor(queueName, createMailinDeleteProcessor(domName), queueName + ".hostsharing.net");
        }
        mainProcessor.appendProcessor(dom.getHiveName(), createApacheVHostDeleteProcessor(dom), "remove apache vhost");
        mainProcessor.appendProcessor("backupmx", createBackupMXDeleteProcessor(domName), "backupmx.hostsharing.net");
        return mainProcessor;
    }
    private Processor createHiveDNSSetupProcessor(String domName, Map<String, String> templateVars)
            throws ProcessorException {
        String zonefileTargetPath = "/etc/bind/pri." + domName;
        Processor zonefileTemplateProcessor = 
            new TemplateProcessor("/de/hsadmin/mods/dom/zonefile.jtpl", templateVars, zonefileTargetPath, false);
        Processor zonefileACLProcessor = 
@@ -52,54 +100,98 @@
            new ShellProcessor("echo 'zone \"" + domName + "\" { type master; file \"pri." + domName + "\"; };' >>/etc/bind/named.pri-zones" +
                " && sort /etc/bind/named.pri-zones | uniq >/etc/bind/named.pri-zones.tmp" +
                " && mv /etc/bind/named.pri-zones.tmp /etc/bind/named.pri-zones");
        String hiveInetAddr = pac.getHive().getInetAddr().getInetAddr();
        Processor dnsReloadProcessor = new ShellProcessor("invoke-rc.d bind9 reload");
        EMailAddressProcessorFactory eMailAddressProcessorFactory = new EMailAddressProcessorFactory();
        Processor dnsSetupProcessor = 
            new CompoundProcessor(zonefileTemplateProcessor, zonefileACLProcessor, prizonesFileProcessor, dnsReloadProcessor);
        WaitingTasksProcessor mainProcessor = new WaitingTasksProcessor(dnsSetupProcessor);
        return dnsSetupProcessor;
    }
    private ShellProcessor createHiveDNSRemoveProcessor(String domName) {
        return new ShellProcessor("grep -v '\"pri." + domName + "\"' /etc/bind/named.pri-zones > /etc/bind/named.pri-zones.tmp" +
            " && mv /etc/bind/named.pri-zones.tmp /etc/bind/named.pri-zones" +
            " && rm /etc/bind/pri." + domName +
            " && invoke-rc.d bind9 reload");
    }
    private CompoundProcessor createHiveEMailSetupProcessor(EntityManager em, String domName) {
        EMailAddressProcessorFactory eMailAddressProcessorFactory = new EMailAddressProcessorFactory();
        CompoundProcessor emailAdrProcessor = new CompoundProcessor();
        Query query = em.createQuery("SELECT adr FROM " + EMailAddress.class.getAnnotation(javax.persistence.Entity.class).name()
            + " adr WHERE adr.domain.name='" + domName + "'");
        Query query = em.createQuery(
            "SELECT adr FROM " +
                EMailAddress.class.getAnnotation(javax.persistence.Entity.class).name() + " adr " +
                "WHERE adr.domain.name='" + domName + "'");
        List<?> resultList = query.getResultList();
        for (Object obj : resultList) {
            EMailAddress eMailAddress = (EMailAddress) obj;
            emailAdrProcessor.appendProcessor(eMailAddressProcessorFactory.createCreateProcessor(em, eMailAddress));
        }
        mainProcessor.appendProcessor(hiveName, emailAdrProcessor, "Setup EMail");
        Processor seczonesFileProcessor = null;
        String[] dnsServerQueues = { "dns1", "dns2", "dns3" };
        for (String queueName : dnsServerQueues) {
            seczonesFileProcessor =
                new ShellProcessor("echo 'zone \"" + domName + "\" { type slave; file \"sec." + domName + "\"; masters { " + hiveInetAddr + "; }; };' >>/etc/bind/named-hsh.conf" +
                    " && sort /etc/bind/named-hsh.conf | uniq >/etc/bind/named-hsh.conf.tmp" +
                    " && mv /etc/bind/named-hsh.conf.tmp /etc/bind/named-hsh.conf" +
                    " && invoke-rc.d bind9 reload");
            mainProcessor.appendProcessor(queueName, seczonesFileProcessor, queueName + ".hostsharing.net");
        }
        Processor relayDomainsProcessor = null;
        String[] mailServerQueues = { "mail1", "mail2", "mail3" };
        for (String queueName : mailServerQueues) {
            relayDomainsProcessor = new CompoundProcessor(
                new ShellProcessor("postmap -r -i /etc/postfix-mailin/relaydomains",
                            domName + " anything\n" +
                            "." + domName + " anything\n"),
                new ShellProcessor("postmap -r -i /etc/postfix-mailin/transport",
                            domName + " smtp:[" + pac.getName() + ".hostsharing.net]\n" +
                            "." + domName + " smtp:[" + pac.getName() + ".hostsharing.net]\n")
            );
            mainProcessor.appendProcessor(queueName, relayDomainsProcessor, queueName + ".hostsharing.net");
        }
        Processor backupMXSMTPTransportsProcessor =
            new ShellProcessor("echo " + domName + " >> /etc/postfix/relaydomains" +
        return emailAdrProcessor;
    }
    private ShellProcessor createHiveEMailRemoveProcessor(String domName) {
        return new ShellProcessor(
            "for KEY in $(postmap -s /etc/postfix/virtual|grep '@" + domName + "\\s'|cut -f1); " +
                "do postmap -d $KEY /etc/postfix/virtual; done");
    }
    private Processor createDNSServerSetupProcessor(String domName,
            String hiveInetAddr) {
        Processor seczonesFileProcessor;
        seczonesFileProcessor =
            new ShellProcessor("echo 'zone \"" + domName + "\" { type slave; file \"sec." + domName + "\"; masters { " + hiveInetAddr + "; }; };' >>/etc/bind/named-hsh.conf" +
                " && sort /etc/bind/named-hsh.conf | uniq >/etc/bind/named-hsh.conf.tmp" +
                " && mv /etc/bind/named-hsh.conf.tmp /etc/bind/named-hsh.conf" +
                " && invoke-rc.d bind9 reload");
        return seczonesFileProcessor;
    }
    private Processor createDNSServerRemoveProcessor(String domName) {
        return new ShellProcessor("grep -v '\"sec." + domName + "\"' /etc/bind/named-hsh.conf >/etc/bind/named-hsh.conf.tmp" +
                " && mv /etc/bind/named-hsh.conf.tmp /etc/bind/named-hsh.conf" +
                " && rm /var/cache/bind/sec." + domName +
                " && invoke-rc.d bind9 reload");
    }
    private Processor createMailinSetupProcessor(String domName, Pac pac) {
        return new CompoundProcessor(
            new ShellProcessor("postmap -r -i /etc/postfix-mailin/relaydomains",
                        domName + " anything\n" +
                        "." + domName + " anything\n"),
            new ShellProcessor("postmap -r -i /etc/postfix-mailin/transport",
                        domName + " smtp:[" + pac.getName() + ".hostsharing.net]\n" +
                        "." + domName + " smtp:[" + pac.getName() + ".hostsharing.net]\n")
        );
    }
    private Processor createMailinDeleteProcessor(String domName) {
        Processor mailQueueProcessor = new ShellProcessor("postmap -d '" + domName + "' /etc/postfix-mailin/relaydomains && " +
                "postmap -d '" + domName + "' /etc/postfix-mailin/transport && " +
                "postmap -d '." + domName + "' /etc/postfix-mailin/relaydomains && " +
                "postmap -d '." + domName + "' /etc/postfix-mailin/transport");
        return mailQueueProcessor;
    }
    private Processor createBackupMXSetupProcessor(String domName) {
        return new ShellProcessor("echo " + domName + " >> /etc/postfix/relaydomains" +
                    " && invoke-rc.d postfix reload");
        mainProcessor.appendProcessor("backupmx", backupMXSMTPTransportsProcessor, "backupmx.hostsharing.net");
    }
    private Processor createBackupMXDeleteProcessor(String domName) {
        Processor backupMXSMTPRelayDelProcessor =
            new ShellProcessor("grep -v '^" + domName + "$' /etc/postfix/relaydomains > /etc/postfix/relaydomains.tmp" +
                " && mv /etc/postfix/relaydomains.tmp /etc/postfix/relaydomains" +
                " && invoke-rc.d postfix reload");
        return backupMXSMTPRelayDelProcessor;
    }
    private CompoundProcessor createDomainDirectoriesProcessor(Domain dom, Map<String, String> templateVars) throws ProcessorException {
        UnixUser domUser = dom.getUser();
        String domName = dom.getName();
        String pacName = domUser.getPac().getName();
        String domsDir = domUser.getHomedir() + "/doms";
        String userName = domUser.getName();
        String domainDir = domsDir + "/" + dom.getName();
        String[] subDirs = new String[] { "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "cgi", "fastcgi", "cgi-ssl", "fastcgi-ssl", "etc", "var" };
        String userName = domUser.getName();
        Processor mkDomainDirProzessor = 
            new ShellProcessor(
                    "mkdir --mode=1550 --parents " + domsDir + " && " +
@@ -114,18 +206,6 @@
                    "chown " + userName + ":" + pacName +  " " + domainDir + "/" + subDir
                ));
        }
        templateVars = new HashMap<String, String>();
        templateVars.put("PAC", pacName);
        templateVars.put("HIVE", pac.getHiveName());
        templateVars.put("DOM_HOSTNAME", domName);
        templateVars.put("DOM_USERNAME", domUser.getName());
        templateVars.put("PAC_HOSTNAME", pacName + ".hostsharing.net");
        templateVars.put("DOM_IPNUMBER", pac.getCurINetAddr().getInetAddr());
        templateVars.put("DOMAIN", domName);
        templateVars.put("USER_NAME", domUser.getComment());
        domDirsProcessor.appendProcessor(
                new CreateFileProcessor("/de/hsadmin/mods/dom/httpd.conf.jtpl", templateVars, "/etc/apache2/sites-generated/" + domName, "root", "root", "644")
            );
        templateVars.put("PROTOCOL", "http");
        domDirsProcessor.appendProcessor(
                new CreateFileProcessor("/de/hsadmin/mods/dom/htaccess.jtpl", templateVars, domainDir + "/htdocs/.htaccess", userName, pacName, "644")
@@ -157,70 +237,55 @@
                        "chown --no-dereference " + userName + ":httpd /home/doms/" + domName 
                         + " && " + "chown " + userName + ":httpd /home/doms/" + domName + "/")
            );
        mainProcessor.appendProcessor(hiveName, domDirsProcessor, "Setup doms/" + domName + "-Directory");
        Processor domSetupProcessor =
            new ShellProcessor("ln -s /etc/apache2/sites-generated/" + domName + " /etc/apache2/sites-enabled/010-" + domName + " && invoke-rc.d apache2 reload >/dev/null 2>&1");
        mainProcessor.appendProcessor(hiveName, domSetupProcessor, "Setup Apache VHost");
        return mainProcessor;
        return domDirsProcessor;
    }
    /**
     * @return a Processor which updates a domain
     */
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) {
        return null;
    }
    /**
     * @return a Processor which deletes a domain
     */
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) {
        Domain dom = (Domain) entity;
    private Processor createApacheVHostSetupProcessor(Domain dom, Map<String, String> templateVars)
                throws ProcessorException {
        String domName = dom.getName();
        ShellProcessor emailAddressRemoveProcessor = new ShellProcessor("for KEY in $(postmap -s /etc/postfix/virtual|grep '@" + domName + "\\s'|cut -f1); do postmap -d $KEY /etc/postfix/virtual; done");
        ShellProcessor dnsRemoveRemoveProcessor =
            new ShellProcessor("grep -v '\"pri." + domName + "\"' /etc/bind/named.pri-zones > /etc/bind/named.pri-zones.tmp" +
                " && mv /etc/bind/named.pri-zones.tmp /etc/bind/named.pri-zones" +
                " && rm /etc/bind/pri." + domName +
                " && invoke-rc.d bind9 reload");
        WaitingTasksProcessor mainProcessor = new WaitingTasksProcessor(new CompoundProcessor(emailAddressRemoveProcessor, dnsRemoveRemoveProcessor));
        Processor domSetupProcessor = new CompoundProcessor(
            createDomainDirectoriesProcessor(dom, templateVars),
            new CreateFileProcessor(selectVHostTemplate(dom), templateVars, "/etc/apache2/sites-generated/" + domName, "root", "root", "644"),
            new ShellProcessor("ln -sf /etc/apache2/sites-generated/" + domName + " /etc/apache2/sites-enabled/010-" + domName + " && invoke-rc.d apache2 reload >/dev/null 2>&1")
        );
        return domSetupProcessor;
    }
        Processor seczonesFileProcessor = null;
        String[] dnsQueues = { "dns1", "dns2", "dns3" };
        for (String queueName : dnsQueues) {
            seczonesFileProcessor =
                new ShellProcessor("grep -v '\"sec." + domName + "\"' /etc/bind/named-hsh.conf >/etc/bind/named-hsh.conf.tmp" +
                        " && mv /etc/bind/named-hsh.conf.tmp /etc/bind/named-hsh.conf" +
                        " && rm /var/cache/bind/sec." + domName +
                        " && invoke-rc.d bind9 reload");
            mainProcessor.appendProcessor(queueName, seczonesFileProcessor, queueName + ".hostsharing.net");
        }
        Processor mailQueueProcessor = null;
        String[] mailServerQueues = { "mail1", "mail2", "mail3" };
        for (String queueName : mailServerQueues) {
            mailQueueProcessor = new ShellProcessor("postmap -d '" + domName + "' /etc/postfix-mailin/relaydomains && " +
                    "postmap -d '" + domName + "' /etc/postfix-mailin/transport && " +
                    "postmap -d '." + domName + "' /etc/postfix-mailin/relaydomains && " +
                    "postmap -d '." + domName + "' /etc/postfix-mailin/transport");
            mainProcessor.appendProcessor(queueName, mailQueueProcessor, queueName + ".hostsharing.net");
        }
    private Processor createApacheVHostDeleteProcessor(Domain dom) {
        String domName = dom.getName();
        Processor vhostDelProcessor = 
            new ShellProcessor("rm /home/doms/" + domName +
                " && rm -rf " + dom.getUser().getHomedir() + "/doms/" + domName +
                " && rm /etc/apache2/sites-generated/" + domName +
                " && rm /etc/apache2/sites-*/`ls -1 /etc/apache2/sites-enabled/ | egrep \"^[01]+-" + domName + "$\"`" +
                " && invoke-rc.d apache2 reload >/dev/null 2>&1");
        mainProcessor.appendProcessor(dom.getHiveName(), vhostDelProcessor, "remove apache vhost");
        Processor backupMXSMTPRelayDelProcessor =
            new ShellProcessor("grep -v '^" + domName + "$' /etc/postfix/relaydomains > /etc/postfix/relaydomains.tmp" +
                " && mv /etc/postfix/relaydomains.tmp /etc/postfix/relaydomains" +
                " && invoke-rc.d postfix reload");
        mainProcessor.appendProcessor("backupmx", backupMXSMTPRelayDelProcessor, "backupmx.hostsharing.net");
        return mainProcessor;
        return vhostDelProcessor;
    }
    private String selectVHostTemplate(Domain dom) {
        String domName = dom.getName();
        UnixUser user = dom.getUser();
        Pac pac = user.getPac();
        if (domName.equals(pac.getName() + ".hostsharing.net")) {
            return "/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl";
        }
        if (pac.getBasepac().getName().startsWith("DW")) {
            return "/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl";
        }
        return "/de/hsadmin/mods/dom/httpd-vhost-static.jtpl";
    }
    private String getCurrentIPAddress(Pac pac) {
        return pac.getCurINetAddr().getInetAddr();
    }
    private String getOldIPAddress(Pac pac) {
        INetAddress oldINetAddr = pac.getOldINetAddr();
        if (oldINetAddr != null) {
            return oldINetAddr.getInetAddr();
        } else {
            return getCurrentIPAddress(pac);
        }
    }
}
hsarback/src/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl
File was renamed from hsarback/src/de/hsadmin/mods/dom/httpd.conf.jtpl
@@ -1,7 +1,7 @@
NameVirtualHost {DOM_IPNUMBER}:80
NameVirtualHost {DOM_IPNUMBER}:80
NameVirtualHost {DOM_IPNUMBEREX}:80
<VirtualHost {DOM_IPNUMBER}:80 {DOM_IPNUMBER}:80>
<VirtualHost {DOM_IPNUMBER}:80 {DOM_IPNUMBEREX}:80>
    ServerName {DOM_HOSTNAME}
    ServerAlias *.{DOM_HOSTNAME}
@@ -49,9 +49,9 @@
</VirtualHost>
NameVirtualHost {DOM_IPNUMBER}:443
NameVirtualHost {DOM_IPNUMBER}:443
NameVirtualHost {DOM_IPNUMBEREX}:443
<VirtualHost {DOM_IPNUMBER}:443 {DOM_IPNUMBER}:443>
<VirtualHost {DOM_IPNUMBER}:443 {DOM_IPNUMBEREX}:443>
    ServerName {DOM_HOSTNAME}
    ServerAlias *.{DOM_HOSTNAME}
hsarback/src/de/hsadmin/mods/dom/httpd-vhost-static.jtpl
copy from hsarback/src/de/hsadmin/mods/dom/httpd.conf.jtpl copy to hsarback/src/de/hsadmin/mods/dom/httpd-vhost-static.jtpl
File was copied from hsarback/src/de/hsadmin/mods/dom/httpd.conf.jtpl
@@ -1,7 +1,7 @@
NameVirtualHost {DOM_IPNUMBER}:80
NameVirtualHost {DOM_IPNUMBER}:80
NameVirtualHost {DOM_IPNUMBEREX}:80
<VirtualHost {DOM_IPNUMBER}:80 {DOM_IPNUMBER}:80>
<VirtualHost {DOM_IPNUMBER}:80 {DOM_IPNUMBEREX}:80>
    ServerName {DOM_HOSTNAME}
    ServerAlias *.{DOM_HOSTNAME}
@@ -10,9 +10,6 @@
    SuexecUserGroup {DOM_USERNAME} {PAC}
    DocumentRoot /home/doms/{DOM_HOSTNAME}/htdocs
    Alias /cgi-bin/ /home/doms/{DOM_HOSTNAME}/cgi/
    Alias /fastcgi-bin/ /home/doms/{DOM_HOSTNAME}/fastcgi/
    <Directory />
        Options -ExecCGI +IncludesNOEXEC +Indexes +MultiViews +SymLinksIfOwnerMatch
@@ -23,13 +20,11 @@
    </Directory>
    <Location /cgi-bin/>
        SetHandler cgi-script
        Options +ExecCGI -Indexes -MultiViews
        Redirect 501
    </Location>
    <Location /fastcgi-bin/>
        SetHandler fcgid-script
        Options +ExecCGI -Indexes -MultiViews
        Redirect 501
    </Location>
    RewriteEngine On
@@ -37,21 +32,16 @@
    #RewriteLog /home/doms/{DOM_HOSTNAME}/var/rewrite.log
    #RewriteLogLevel 9
    RewriteCond %{REQUEST_URI} !^/cgi-bin/
    RewriteCond %{REQUEST_URI} !^/fastcgi-bin/
    RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:80)?$ [novary]
    RewriteCond /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1} -d
    RewriteRule ^(.*) /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1}$1 [last]
    AddType application/x-httpd-php .php .php5 .php4 .php3
    Action application/x-httpd-php /fastcgi-bin/phpstub
</VirtualHost>
NameVirtualHost {DOM_IPNUMBER}:443
NameVirtualHost {DOM_IPNUMBER}:443
NameVirtualHost {DOM_IPNUMBEREX}:443
<VirtualHost {DOM_IPNUMBER}:443 {DOM_IPNUMBER}:443>
<VirtualHost {DOM_IPNUMBER}:443 {DOM_IPNUMBEREX}:443>
    ServerName {DOM_HOSTNAME}
    ServerAlias *.{DOM_HOSTNAME}
@@ -65,9 +55,6 @@
    DocumentRoot /home/doms/{DOM_HOSTNAME}/htdocs-ssl
    Alias /cgi-bin/ /home/doms/{DOM_HOSTNAME}/cgi-ssl/
    Alias /fastcgi-bin/ /home/doms/{DOM_HOSTNAME}/fastcgi-ssl/
    <Directory />
        SSLRequireSSL On
        Options -ExecCGI +IncludesNOEXEC +Indexes +MultiViews +SymLinksIfOwnerMatch
@@ -78,13 +65,11 @@
    </Directory>
    <Location /cgi-bin/>
        SetHandler cgi-script
        Options +ExecCGI -Indexes -MultiViews
        Redirect 501
    </Location>
    <Location /fastcgi-bin/>
        SetHandler fcgid-script
        Options +ExecCGI -Indexes -MultiViews
        Redirect 501
    </Location>
    
    RewriteEngine On
@@ -92,14 +77,9 @@
    #RewriteLog /home/doms/{DOM_HOSTNAME}/var/rewrite.log
    #RewriteLogLevel 9
    RewriteCond %{REQUEST_URI} !^/cgi-bin/
    RewriteCond %{REQUEST_URI} !^/fastcgi-bin/
    RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:443)?$ [novary]
    RewriteCond /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1} -d
    RewriteRule ^(.*) /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1}$1 [last]
    AddType application/x-httpd-php .php .php5 .php4 .php3
    Action application/x-httpd-php /fastcgi-bin/phpstub
</VirtualHost>
    
hsarback/src/de/hsadmin/mods/pac/Pac.java
@@ -106,8 +106,6 @@
                    comp.getBaseComponent(), this, comp.getDefaultQuantity(),
                    today, null);
            pacComponents.add(pacComp);
            System.err.println("TRACE [Pac]: added pacComp " + pacComp + " to "
                    + getName());
        }
    }