| | |
| | | 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; |
| | |
| | | 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); |
| | |
| | | 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 = |
| | |
| | | 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 + " && " + |
| | |
| | | "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") |
| | |
| | | "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); |
| | | } |
| | | } |
| | | |
| | | } |