diff --git a/hsarback/.classpath b/hsarback/.classpath index 0fc2432..d7f8e02 100644 --- a/hsarback/.classpath +++ b/hsarback/.classpath @@ -28,5 +28,6 @@ + diff --git a/hsarback/build.xml b/hsarback/build.xml index a27c939..75170f3 100644 --- a/hsarback/build.xml +++ b/hsarback/build.xml @@ -47,7 +47,7 @@ - + @@ -77,7 +77,7 @@ - + diff --git a/hsarback/lib/velocity-1.7.jar b/hsarback/lib/velocity-1.7.jar new file mode 100644 index 0000000..e147f92 Binary files /dev/null and b/hsarback/lib/velocity-1.7.jar differ diff --git a/hsarback/src/de/hsadmin/core/qserv/CreateFileProcessor.java b/hsarback/src/de/hsadmin/core/qserv/CreateFileProcessor.java index fda5ab8..b398fbc 100644 --- a/hsarback/src/de/hsadmin/core/qserv/CreateFileProcessor.java +++ b/hsarback/src/de/hsadmin/core/qserv/CreateFileProcessor.java @@ -1,26 +1,28 @@ package de.hsadmin.core.qserv; -import java.util.Iterator; import java.util.Map; +import de.hsadmin.mods.dom.Domain; +import de.hsadmin.mods.pac.Hive; + public class CreateFileProcessor extends AbstractProcessor { private static final long serialVersionUID = -2947609532975712444L; private Processor compoundProcessor; - public CreateFileProcessor(String templateName, Map templateValues, String targetPath, String owner, String group, String modeMask, boolean overwriteTarget) throws ProcessorException { - TemplateProcessor templateProcessor = new TemplateProcessor(templateName, templateValues, targetPath, overwriteTarget); + public CreateFileProcessor(String templateName, Map templateValues, Domain dom, String targetPath, String owner, String group, String modeMask, boolean overwriteTarget) throws ProcessorException { + VelocityProcessor templateProcessor = new VelocityProcessor(templateName, templateValues, dom, targetPath, overwriteTarget); compoundProcessor = createCompound(targetPath, owner, group, modeMask, templateProcessor); } - public CreateFileProcessor(String templateName, Map templateValues, Iterator> iterateValues, String targetPath, String owner, String group, String modeMask, boolean overwriteTarget) throws ProcessorException { - TemplateProcessor templateProcessor = new TemplateProcessor(templateName, templateValues, iterateValues, targetPath, overwriteTarget); + public CreateFileProcessor(String templateName, Hive hive, String targetPath, String owner, String group, String modeMask, boolean overwriteTarget) throws ProcessorException { + VelocityProcessor templateProcessor = new VelocityProcessor(templateName, hive, targetPath, overwriteTarget); compoundProcessor = createCompound(targetPath, owner, group, modeMask, templateProcessor); } private Processor createCompound(String targetPath, String owner, String group, - String modeMask, TemplateProcessor templateProcessor) { + String modeMask, Processor templateProcessor) { ShellProcessor shellProcessor = new ShellProcessor( "chown " + owner + ":" + group + " " + targetPath + " && " + diff --git a/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java b/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java deleted file mode 100644 index f7dfc7f..0000000 --- a/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java +++ /dev/null @@ -1,56 +0,0 @@ -package de.hsadmin.core.qserv; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Map; - -import net.sf.jtpl.Template; - -import de.hsadmin.core.model.HSAdminException; -import de.hsadmin.core.util.Config; - -public class MailerProcessor extends AbstractProcessor { - - private static final long serialVersionUID = 1L; - - private String aTo; - private String aSubject; - private String aBody; - - public MailerProcessor(String aTo, String aSubject, String aBody) { - this.aTo = aTo; - this.aSubject = aSubject; - this.aBody = aBody; - } - - public MailerProcessor(String aTo, String aSubject, String templateName, Map templateValues) throws ProcessorException { - this.aTo = aTo; - this.aSubject = aSubject; - try { - InputStream stream = MailerProcessor.class.getClassLoader().getResourceAsStream(templateName); - Template template = new Template(new InputStreamReader(stream)); - for (String key : templateValues.keySet()) { - template.assign(key, templateValues.get(key)); - } - template.parse("main"); - this.aBody = template.out(); - } catch (IllegalArgumentException e) { - throw new ProcessorException(e); - } catch (IOException e) { - throw new ProcessorException(e); - } - } - - public Object process() throws ProcessorException { - try { - Config config = Config.getInstance(); - String aFrom = config.getProperty("hsadmin.smtp.from", "unconfigured_from@example.com"); - String aCC = config.getProperty("hsadmin.smtp.cc", "unconfigured_cc@example.com"); - SmtpHelper.send(aFrom, aTo, aCC, aSubject, aBody); - return null; - } catch (HSAdminException e) { - throw new ProcessorException(e); - } - } -} diff --git a/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java b/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java deleted file mode 100644 index 8a7f2eb..0000000 --- a/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java +++ /dev/null @@ -1,81 +0,0 @@ -package de.hsadmin.core.qserv; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Iterator; -import java.util.Map; - -import net.sf.jtpl.Template; - -public class TemplateProcessor extends AbstractProcessor { - - private static final long serialVersionUID = 2L; - - private String content = null; - private String targetPath = null; - private boolean overwriteTarget = false; - - public TemplateProcessor(String templateName, Map templateValues, String targetPath, boolean overwriteTarget) throws ProcessorException { - this.targetPath = targetPath; - this.overwriteTarget = overwriteTarget; - try { - InputStream stream = TemplateProcessor.class.getClassLoader().getResourceAsStream(templateName); - Template template = new Template(new InputStreamReader(stream)); - for (String key : templateValues.keySet()) { - template.assign(key, templateValues.get(key)); - } - template.parse("main"); - content = template.out(); - } catch (IOException e) { - throw new ProcessorException(e); - } - } - - public TemplateProcessor(String templateName, Map mainValues, Iterator> iterateValues, String targetPath, boolean overwriteTarget) throws ProcessorException { - this.targetPath = targetPath; - this.overwriteTarget = overwriteTarget; - try { - InputStream stream = TemplateProcessor.class.getClassLoader().getResourceAsStream(templateName); - Template template = new Template(new InputStreamReader(stream)); - for (String key : mainValues.keySet()) { - template.assign(key, mainValues.get(key)); - } - while (iterateValues.hasNext()) { - Map iterationValues = iterateValues.next(); - for (String key : iterationValues.keySet()) { - template.assign(key, iterationValues.get(key)); - } - template.parse("main.iterate"); - } - template.parse("main"); - content = template.out(); - } catch (IOException e) { - throw new ProcessorException(e); - } - } - - @Override - public Object process() throws ProcessorException { - try { - File file = new File(targetPath); - if (file.exists() && !overwriteTarget) { - return null; - } - if (!file.exists() || file.canWrite()) { - BufferedWriter writer = new BufferedWriter(new FileWriter(file)); - writer.append(content); - writer.close(); - } else { - throw new ProcessorException("could not write file " + targetPath); - } - return null; - } catch (IOException e) { - throw new ProcessorException(e); - } - } - -} diff --git a/hsarback/src/de/hsadmin/core/qserv/VelocityProcessor.java b/hsarback/src/de/hsadmin/core/qserv/VelocityProcessor.java new file mode 100644 index 0000000..7a2ab9b --- /dev/null +++ b/hsarback/src/de/hsadmin/core/qserv/VelocityProcessor.java @@ -0,0 +1,144 @@ +package de.hsadmin.core.qserv; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.lang.CharEncoding; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import de.hsadmin.mods.dom.Domain; +import de.hsadmin.mods.pac.BasePac; +import de.hsadmin.mods.pac.Hive; +import de.hsadmin.mods.pac.INetAddress; +import de.hsadmin.mods.pac.Pac; + +public class VelocityProcessor extends AbstractProcessor { + + private static final long serialVersionUID = 1L; + + static { + Properties props = new Properties(); + props.getProperty("resource.loader", "file"); + props.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(props); + } + + private String content; + private String targetPath; + private boolean overwriteTarget; + + public VelocityProcessor(String templateName, Hive hive, String targetPath, boolean overwriteTarget) { + this.targetPath = targetPath; + this.overwriteTarget = overwriteTarget; + VelocityContext context = new VelocityContext(); + context.put("hive", hive); + mergeTemplate(templateName, context); + } + + public VelocityProcessor(String templateName, Pac pac, String targetPath, boolean overwriteTarget) { + this.targetPath = targetPath; + this.overwriteTarget = overwriteTarget; + VelocityContext context = new VelocityContext(); + context.put("pac", pac); + context.put("hive", pac.getHive()); + mergeTemplate(templateName, context); + } + + public VelocityProcessor(String templateName, Domain dom, String targetPath, boolean overwriteTarget) { + this.targetPath = targetPath; + this.overwriteTarget = overwriteTarget; + VelocityContext context = new VelocityContext(); + context.put("dom", dom); + Pac pac = dom.getUser().getPac(); + context.put("pac", pac); + context.put("hive", pac.getHive()); + mergeTemplate(templateName, context); + } + + public VelocityProcessor(String templateName, Map templateVars, Domain dom, String targetPath, boolean overwriteTarget) { + this.targetPath = targetPath; + this.overwriteTarget = overwriteTarget; + VelocityContext context = new VelocityContext(); + context.put("dom", dom); + Pac pac = dom.getUser().getPac(); + context.put("pac", pac); + context.put("hive", pac.getHive()); + for (String key : templateVars.keySet()) { + context.put(key, templateVars.get(key)); + } + mergeTemplate(templateName, context); + } + + public VelocityProcessor(String templateName, HashMap templateVars, + String targetPath, boolean overwriteTarget) { + this.targetPath = targetPath; + this.overwriteTarget = overwriteTarget; + VelocityContext context = new VelocityContext(); + for (String key : templateVars.keySet()) { + context.put(key, templateVars.get(key)); + } + mergeTemplate(templateName, context); + } + + private void mergeTemplate(String templateName, VelocityContext context) { + StringWriter writer = new StringWriter(); + Velocity.mergeTemplate(templateName, CharEncoding.UTF_8, context, writer); + this.content = writer.toString(); + } + + @Override + public Object process() throws ProcessorException { + try { + File file = new File(targetPath); + if (file.exists() && !overwriteTarget) { + return "did not overwrite existing file " + targetPath; + } + if (!file.exists() || file.canWrite()) { + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.append(content); + writer.close(); + } else { + throw new ProcessorException("could not write file " + targetPath); + } + return "wrote file " + targetPath; + } catch (IOException e) { + throw new ProcessorException(e); + } + } + + public static void main(String[] args) { + Hive h = new Hive("h01", new INetAddress("192.168.1.100")); + HashSet pacsSet = new HashSet(); + h.setPacs(pacsSet); + Pac p1 = new Pac("pac01", null, new BasePac(), h); + pacsSet.add(p1); + Pac p2 = new Pac("pac02", null, new BasePac(), h); + pacsSet.add(p2); + p1.setCurINetAddr(new INetAddress("192.168.2.11")); + p2.setCurINetAddr(new INetAddress("192.168.2.12")); + VelocityProcessor procHosts = new VelocityProcessor("/de/hsadmin/mods/pac/hosts.vm", h, "/tmp/etc-hosts", true); + VelocityProcessor procVirtual = new VelocityProcessor("/de/hsadmin/mods/pac/httpd-virtual.vm", h, "/tmp/httpd-virtual.conf", true); + VelocityProcessor procInterfaces = new VelocityProcessor("/de/hsadmin/mods/pac/interfaces.vm", h, "/tmp/net-interfaces", true); + VelocityProcessor procProFtpd = new VelocityProcessor("/de/hsadmin/mods/pac/proftpd-conf.vm", h, "/tmp/proftpd.conf", true); + VelocityProcessor procSudoers = new VelocityProcessor("/de/hsadmin/mods/pac/sudoers.vm", h, "/tmp/sudoers", true); + try { + System.out.println(procHosts.process()); + System.out.println(procVirtual.process()); + System.out.println(procInterfaces.process()); + System.out.println(procProFtpd.process()); + System.out.println(procSudoers.process()); + } catch (ProcessorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java b/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java index f4b05b1..81ebbaa 100644 --- a/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java +++ b/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java @@ -16,12 +16,11 @@ import de.hsadmin.core.qserv.EntityProcessorFactory; import de.hsadmin.core.qserv.Processor; import de.hsadmin.core.qserv.ProcessorException; import de.hsadmin.core.qserv.ShellProcessor; -import de.hsadmin.core.qserv.TemplateProcessor; +import de.hsadmin.core.qserv.VelocityProcessor; import de.hsadmin.core.qserv.WaitingTasksProcessor; import de.hsadmin.core.util.Config; 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; @@ -40,39 +39,17 @@ public class DomainProcessorFactory implements EntityProcessorFactory { Domain dom = (Domain) entity; UnixUser domUser = dom.getUser(); Pac pac = domUser.getPac(); - String pacName = pac.getName(); - String domName = dom.getName(); - Map templateVars = new HashMap(); - templateVars.put("SIO", Long.toString(System.currentTimeMillis()/1000L)); - 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)); - WaitingTasksProcessor mainProcessor = new WaitingTasksProcessor(createHiveDNSSetupProcessor(domName, templateVars)); - mainProcessor.appendProcessor(hiveName, createHiveEMailSetupProcessor(em, domName), "Setup EMail"); - String hiveInetAddr = pac.getHive().getInetAddr().getInetAddr(); + WaitingTasksProcessor mainProcessor = new WaitingTasksProcessor(createHiveDNSSetupProcessor(dom)); + mainProcessor.appendProcessor(hiveName, createHiveEMailSetupProcessor(em, dom), "Setup EMail"); Config config = Config.getInstance(); for (String queueName : config.getProperty("queues.dns").split(",")) { - mainProcessor.appendProcessor(queueName, createDNSServerSetupProcessor(domName, hiveInetAddr), queueName + ".hostsharing.net"); + mainProcessor.appendProcessor(queueName, createDNSServerSetupProcessor(dom.getName(), pac.getHive().getInetAddr().getInetAddr()), queueName + ".hostsharing.net"); } for (String queueName : config.getProperty("queues.mail").split(",")) { mainProcessor.appendProcessor(queueName, createMailinSetupProcessor(em, dom, pac), queueName + ".hostsharing.net"); } - templateVars = new HashMap(); - 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, createDomainDirectoriesProcessor(dom, templateVars), "Setup Domain Directories"); - mainProcessor.appendProcessor(hiveName, createApacheVHostSetupProcessor(em, dom, templateVars), "Setup Apache VHost"); + mainProcessor.appendProcessor(hiveName, createDomainDirectoriesProcessor(dom), "Setup Domain Directories"); + mainProcessor.appendProcessor(hiveName, createApacheVHostSetupProcessor(em, dom), "Setup Apache VHost"); return mainProcessor; } @@ -80,19 +57,7 @@ public class DomainProcessorFactory implements EntityProcessorFactory { Domain dom = (Domain) entity; UnixUser domUser = dom.getUser(); Pac pac = domUser.getPac(); - String pacName = pac.getName(); - String domName = dom.getName(); - Map templateVars = new HashMap(); - 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()); - WaitingTasksProcessor processor = new WaitingTasksProcessor(createApacheVHostSetupProcessor(em, dom, templateVars)); + WaitingTasksProcessor processor = new WaitingTasksProcessor(createApacheVHostSetupProcessor(em, dom)); Config config = Config.getInstance(); for (String queueName : config.getProperty("queues.mail").split(",")) { processor.appendProcessor(queueName, createMailinSetupProcessor(em, dom, pac), queueName + ".hostsharing.net"); @@ -117,11 +82,13 @@ public class DomainProcessorFactory implements EntityProcessorFactory { return mainProcessor; } - private Processor createHiveDNSSetupProcessor(String domName, Map templateVars) - throws ProcessorException { + private Processor createHiveDNSSetupProcessor(Domain dom) throws ProcessorException { + Map templateVars = new HashMap(); + templateVars.put("sio", Long.toString(System.currentTimeMillis()/1000L)); + String domName = dom.getName(); String zonefileTargetPath = "/etc/bind/pri." + domName; Processor zonefileTemplateProcessor = - new TemplateProcessor("/de/hsadmin/mods/dom/zonefile.jtpl", templateVars, zonefileTargetPath, false); + new VelocityProcessor("/de/hsadmin/mods/dom/zonefile.vm", templateVars, dom, zonefileTargetPath, false); Processor zonefileACLProcessor = new ShellProcessor("chown root:bind " + zonefileTargetPath + " && chmod 644 " + zonefileTargetPath); // TODO Use templates and regenerate the file. @@ -142,13 +109,13 @@ public class DomainProcessorFactory implements EntityProcessorFactory { " && invoke-rc.d bind9 reload"); } - private CompoundProcessor createHiveEMailSetupProcessor(EntityManager em, String domName) { + private CompoundProcessor createHiveEMailSetupProcessor(EntityManager em, Domain dom) { 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 + "'"); + "WHERE adr.domain.name='" + dom.getName() + "'"); List resultList = query.getResultList(); for (Object obj : resultList) { EMailAddress eMailAddress = (EMailAddress) obj; @@ -202,7 +169,7 @@ public class DomainProcessorFactory implements EntityProcessorFactory { } private Processor createPostgreyConfiguration(EntityManager em) throws ProcessorException { - ArrayList> domsMaps = new ArrayList>(); + List whitelistDoms = new ArrayList(); Query query = em.createQuery("SELECT DISTINCT dom FROM Domains dom WHERE NOT EXISTS " + "( SELECT postgreyDom FROM Domains postgreyDom " + " WHERE postgreyDom.domainoptions.name = :option" + @@ -211,15 +178,14 @@ public class DomainProcessorFactory implements EntityProcessorFactory { List result = query.getResultList(); for (Object dom : result) { if (dom instanceof Domain) { - HashMap hashMap = new HashMap(); - hashMap.put("DOM", ((Domain) dom).getName()); - domsMaps.add(hashMap); + whitelistDoms.add((Domain) dom); } } + HashMap templateVars = new HashMap(); + templateVars.put("whitelist", whitelistDoms); return new CompoundProcessor( - new TemplateProcessor("/de/hsadmin/mods/dom/postgrey-whitelist-recipients.jtpl", - new HashMap(), - domsMaps.iterator(), "/etc/postgrey/whitelist_recipients.tmp", true), + new VelocityProcessor("/de/hsadmin/mods/dom/postgrey-whitelist-recipients.vm", + templateVars, "/etc/postgrey/whitelist_recipients.tmp", true), new ShellProcessor(" ( diff -q /etc/postgrey/whitelist_recipients.tmp /etc/postgrey/whitelist_recipients && rm /etc/postgrey/whitelist_recipients.tmp ) " + "|| ( mv /etc/postgrey/whitelist_recipients.tmp /etc/postgrey/whitelist_recipients && invoke-rc.d postgrey reload )") ); @@ -236,7 +202,8 @@ public class DomainProcessorFactory implements EntityProcessorFactory { return mailQueueProcessor; } - private CompoundProcessor createDomainDirectoriesProcessor(Domain dom, Map templateVars) throws ProcessorException { + private CompoundProcessor createDomainDirectoriesProcessor(Domain dom) throws ProcessorException { + Map templateVars = new HashMap(); UnixUser domUser = dom.getUser(); String domName = dom.getName(); Pac pac = domUser.getPac(); @@ -269,26 +236,26 @@ public class DomainProcessorFactory implements EntityProcessorFactory { "chown " + userName + ":" + pacName + " " + domainDir + "/" + subDir )); } - templateVars.put("PROTOCOL", "http"); + templateVars.put("protocol", "http"); domDirsProcessor.appendProcessor( - new CreateFileProcessor("/de/hsadmin/mods/dom/htaccess.jtpl", templateVars, domainDir + "/htdocs/.htaccess", userName, pacName, "644", false) + new CreateFileProcessor("/de/hsadmin/mods/dom/htaccess.vm", templateVars, dom, domainDir + "/htdocs/.htaccess", userName, pacName, "644", false) ); - templateVars.put("PROTOCOL", "https"); + templateVars.put("protocol", "https"); domDirsProcessor.appendProcessor( - new CreateFileProcessor("/de/hsadmin/mods/dom/htaccess.jtpl", templateVars, domainDir + "/htdocs-ssl/.htaccess", userName, pacName, "644", false) + new CreateFileProcessor("/de/hsadmin/mods/dom/htaccess.vm", templateVars, dom, domainDir + "/htdocs-ssl/.htaccess", userName, pacName, "644", false) ); domDirsProcessor.appendProcessor( - new CreateFileProcessor("/de/hsadmin/mods/dom/index.html.jtpl", templateVars, domainDir + "/subs/www/index.html", userName, pacName, "644", false) + new CreateFileProcessor("/de/hsadmin/mods/dom/index.html.vm", templateVars, dom, domainDir + "/subs/www/index.html", userName, pacName, "644", false) ); domDirsProcessor.appendProcessor( - new CreateFileProcessor("/de/hsadmin/mods/dom/index.html.jtpl", templateVars, domainDir + "/subs-ssl/www/index.html", userName, pacName, "644", false) + new CreateFileProcessor("/de/hsadmin/mods/dom/index.html.vm", templateVars, dom, domainDir + "/subs-ssl/www/index.html", userName, pacName, "644", false) ); if (dynamicWeb) { domDirsProcessor.appendProcessor( - new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.jtpl", templateVars, domainDir + "/cgi/test.cgi", userName, pacName, "755", false) + new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.vm", templateVars, dom, domainDir + "/cgi/test.cgi", userName, pacName, "755", false) ); domDirsProcessor.appendProcessor( - new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.jtpl", templateVars, domainDir + "/cgi-ssl/test.cgi", userName, pacName, "755", false) + new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.vm", templateVars, dom, domainDir + "/cgi-ssl/test.cgi", userName, pacName, "755", false) ); domDirsProcessor.appendProcessor( new CopyFileProcessor("/usr/local/src/phpstub/phpstub", domainDir + "/fastcgi/phpstub", userName, pacName, "755") @@ -305,57 +272,20 @@ public class DomainProcessorFactory implements EntityProcessorFactory { return domDirsProcessor; } - private Processor createApacheVHostSetupProcessor(EntityManager em, Domain dom, Map templateVars) - throws ProcessorException { + private Processor createApacheVHostSetupProcessor(EntityManager em, Domain dom) throws ProcessorException { + Map templateVars = new HashMap(); String domName = dom.getName(); int level = domName.split("\\.").length; String linkPrefix = Integer.toString(100 - level); String pac = dom.getUser().getPac().getName(); Query query = em.createQuery("SELECT d FROM Domains d WHERE d.domainoptions.name = :option AND d.name = :domname"); query.setParameter("domname", dom.getName()); - // TODO: This code should be cleaned up after switching to the velocity template engine. - query.setParameter("option", "indexes"); - if (query.getResultList().isEmpty()) { - templateVars.put("INDEXES", "-Indexes"); - } else { - templateVars.put("INDEXES", "+Indexes"); - } - // TODO: This code should be cleaned up after switching to the velocity template engine. - query.setParameter("option", "includes"); - if (query.getResultList().isEmpty()) { - templateVars.put("INCLUDES", "-Includes"); - } else { - templateVars.put("INCLUDES", "+IncludesNoExec"); - } - // TODO: This code should be cleaned up after switching to the velocity template engine. - query.setParameter("option", "multiviews"); - if (query.getResultList().isEmpty()) { - templateVars.put("MULTIVIEWS", "-MultiViews"); - } else { - templateVars.put("MULTIVIEWS", "+MultiViews"); - } - // TODO: This code should be cleaned up after switching to the velocity template engine. - query.setParameter("option", "htdocsfallback"); - if (query.getResultList().isEmpty()) { - templateVars.put("NOHTDOCSFALLBACKHTTP", - " RewriteCond %{REQUEST_URI} !^/cgi-bin/\n" + - " RewriteCond %{REQUEST_URI} !^/fastcgi-bin/\n" + - " RewriteCond %{HTTP_HOST} ^(.+)\\.{DOM_HOSTNAME}\\.?(:80)?$ [novary]\n" + - " RewriteCond /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1} !-d\n" + - " RewriteRule ^(.*) - [redirect=404,last]\n"); - templateVars.put("NOHTDOCSFALLBACKHTTPS", - " RewriteCond %{REQUEST_URI} !^/cgi-bin/\n" + - " RewriteCond %{REQUEST_URI} !^/fastcgi-bin/\n" + - " RewriteCond %{HTTP_HOST} ^(.+)\\.{DOM_HOSTNAME}\\.?(:443)?$ [novary]\n" + - " RewriteCond /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1} !-d\n" + - " RewriteRule ^(.*) - [redirect=404,last]\n"); - } else { - templateVars.put("NOHTDOCSFALLBACKHTTP", "\n"); - templateVars.put("NOHTDOCSFALLBACKHTTPS", "\n"); - } - + ifOption(templateVars, query, "indexes", "+Indexes", "-Indexes"); + ifOption(templateVars, query, "includes", "+IncludesNoExec", "-Includes"); + ifOption(templateVars, query, "multiviews", "+MultiViews", "-MultiViews"); + ifOption(templateVars, query, "htdocsfallback", Boolean.TRUE, Boolean.FALSE); Processor domSetupProcessor = new CompoundProcessor( - new CreateFileProcessor(selectVHostTemplate(dom), templateVars, "/etc/apache2/sites-available/" + domName + ".tmp", "root", "root", "644", true), + new CreateFileProcessor("/de/hsadmin/mods/dom/httpd-vhost.vm", templateVars, dom, "/etc/apache2/sites-available/" + domName + ".tmp", "root", "root", "644", true), new ShellProcessor("ls /etc/apache2/pems/" + pac + ".pem >/dev/null 2>&1" + " && sed -i '/SSLCertificate.*default/d' " + "/etc/apache2/sites-available/" + domName + ".tmp" + " && (ls /etc/apache2/pems/" + pac + ".chain.pem >/dev/null 2>&1 || sed -i '/SSLCertificateChain.*" + pac + "/d' " + "/etc/apache2/sites-available/" + domName + ".tmp )" + @@ -370,6 +300,15 @@ public class DomainProcessorFactory implements EntityProcessorFactory { return domSetupProcessor; } + private void ifOption(Map templateVars, Query query, String option, Object optIsTrue, Object optIsFalse) { + query.setParameter("option", option); + if (query.getResultList().isEmpty()) { + templateVars.put(option, optIsFalse); + } else { + templateVars.put(option, optIsTrue); + } + } + private Processor createApacheVHostDeleteProcessor(Domain dom) { String domName = dom.getName(); int level = domName.split("\\.").length; @@ -383,30 +322,4 @@ public class DomainProcessorFactory implements EntityProcessorFactory { 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.isDynamicWeb() || dom.isPacDomain()) { - 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); - } - } - } diff --git a/hsarback/src/de/hsadmin/mods/dom/htaccess.jtpl b/hsarback/src/de/hsadmin/mods/dom/htaccess.jtpl deleted file mode 100644 index 3df1d9f..0000000 --- a/hsarback/src/de/hsadmin/mods/dom/htaccess.jtpl +++ /dev/null @@ -1,2 +0,0 @@ -Redirect permanent / {PROTOCOL}://www.{DOMAIN}/ - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/dom/htaccess.vm b/hsarback/src/de/hsadmin/mods/dom/htaccess.vm new file mode 100644 index 0000000..c0c8540 --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/dom/htaccess.vm @@ -0,0 +1 @@ +Redirect permanent / ${protocol}://www.{domain.name}/ diff --git a/hsarback/src/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl b/hsarback/src/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl deleted file mode 100644 index b419eb2..0000000 --- a/hsarback/src/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl +++ /dev/null @@ -1,106 +0,0 @@ -# -# This file is managed by HSAdmin. -# Do not edit manually. Changes will be overwritten. -# - - - - ServerName {DOM_HOSTNAME} - ServerAlias *.{DOM_HOSTNAME} - ServerAdmin webmaster@{DOM_HOSTNAME} - - 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/ - - - Options -ExecCGI {INCLUDES} {INDEXES} {MULTIVIEWS} +SymLinksIfOwnerMatch - - - - AllowOverride AuthConfig FileInfo Indexes Limit - - - - SetHandler cgi-script - Options +ExecCGI {INCLUDES} -Indexes -MultiViews +SymLinksIfOwnerMatch - - - - SetHandler fcgid-script - Options +ExecCGI {INCLUDES} -Indexes -MultiViews +SymLinksIfOwnerMatch - - - RewriteEngine On - RewriteOptions Inherit - - RewriteCond %{REQUEST_URI} !^/cgi-bin/ - RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ - RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:[0-9]+)?$ [novary] - RewriteCond /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1} -d - RewriteRule ^(.*) /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1}$1 [last] - -{NOHTDOCSFALLBACKHTTP} - - AddType application/x-httpd-php .php .php5 .php4 .php3 - Action application/x-httpd-php /fastcgi-bin/phpstub - - - - - - ServerName {DOM_HOSTNAME} - ServerAlias *.{DOM_HOSTNAME} - ServerAdmin {DOM_USERNAME}@{HIVE}.hostsharing.net - - SuexecUserGroup {DOM_USERNAME} {PAC} - - SSLEngine On - SSLCertificateFile /etc/apache2/pems/default.pem - SSLCertificateChainFile /etc/apache2/pems/default.chain.pem - SSLCertificateFile /etc/apache2/pems/{PAC}.pem - SSLCertificateChainFile /etc/apache2/pems/{PAC}.chain.pem - - 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/ - - - SSLRequireSSL On - Options -ExecCGI {INCLUDES} {INDEXES} {MULTIVIEWS} +SymLinksIfOwnerMatch - - - - AllowOverride AuthConfig FileInfo Indexes Limit - - - - SetHandler cgi-script - Options +ExecCGI {INCLUDES} -Indexes -MultiViews +SymLinksIfOwnerMatch - - - - SetHandler fcgid-script - Options +ExecCGI {INCLUDES} -Indexes -MultiViews +SymLinksIfOwnerMatch - - - RewriteEngine On - RewriteOptions Inherit - - RewriteCond %{REQUEST_URI} !^/cgi-bin/ - RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ - RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:[0-9]+)?$ [novary] - RewriteCond /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1} -d - RewriteRule ^(.*) /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1}$1 [last] - -{NOHTDOCSFALLBACKHTTPS} - - AddType application/x-httpd-php .php .php5 .php4 .php3 - Action application/x-httpd-php /fastcgi-bin/phpstub - - - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/dom/httpd-vhost-static.jtpl b/hsarback/src/de/hsadmin/mods/dom/httpd-vhost-static.jtpl deleted file mode 100644 index aa43cdb..0000000 --- a/hsarback/src/de/hsadmin/mods/dom/httpd-vhost-static.jtpl +++ /dev/null @@ -1,90 +0,0 @@ -# -# This file is managed by HSAdmin. -# Do not edit manually. Changes will be overwritten. -# - - - - ServerName {DOM_HOSTNAME} - ServerAlias *.{DOM_HOSTNAME} - ServerAdmin webmaster@{DOM_HOSTNAME} - - SuexecUserGroup {DOM_USERNAME} {PAC} - - DocumentRoot /home/doms/{DOM_HOSTNAME}/htdocs - - - Options -ExecCGI {INCLUDES} {INDEXES} {MULTIVIEWS} +SymLinksIfOwnerMatch - - - - AllowOverride AuthConfig FileInfo Indexes Limit - - - - Redirect 501 / - - - - Redirect 501 / - - - RewriteEngine On - RewriteOptions Inherit - - RewriteCond %{REQUEST_URI} !^/cgi-bin/ - RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ - RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:[0-9]+)?$ [novary] - RewriteCond /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1} -d - RewriteRule ^(.*) /home/doms/{DOM_HOSTNAME}/subs/${tolower:%1}$1 [last] - -{NOHTDOCSFALLBACKHTTP} - - - - - - ServerName {DOM_HOSTNAME} - ServerAlias *.{DOM_HOSTNAME} - ServerAdmin {DOM_USERNAME}@{HIVE}.hostsharing.net - - SuexecUserGroup {DOM_USERNAME} {PAC} - - SSLEngine On - SSLCertificateFile /etc/apache2/pems/default.pem - SSLCertificateChainFile /etc/apache2/pems/default.chain.pem - SSLCertificateFile /etc/apache2/pems/{PAC}.pem - SSLCertificateChainFile /etc/apache2/pems/{PAC}.chain.pem - - DocumentRoot /home/doms/{DOM_HOSTNAME}/htdocs-ssl - - - SSLRequireSSL On - Options -ExecCGI {INCLUDES} {INDEXES} {MULTIVIEWS} +SymLinksIfOwnerMatch - - - - AllowOverride AuthConfig FileInfo Indexes Limit - - - - Redirect 501 / - - - - Redirect 501 / - - - RewriteEngine On - RewriteOptions Inherit - - RewriteCond %{REQUEST_URI} !^/cgi-bin/ - RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ - RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:[0-9]+)?$ [novary] - RewriteCond /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1} -d - RewriteRule ^(.*) /home/doms/{DOM_HOSTNAME}/subs-ssl/${tolower:%1}$1 [last] - -{NOHTDOCSFALLBACKHTTPS} - - - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/dom/httpd-vhost.vm b/hsarback/src/de/hsadmin/mods/dom/httpd-vhost.vm new file mode 100644 index 0000000..04aed0c --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/dom/httpd-vhost.vm @@ -0,0 +1,145 @@ +# +# This file is managed by HSAdmin. +# Do not edit manually. Changes will be overwritten. +# + + + + ServerName ${dom.name} + ServerAlias *.${dom.name} + ServerAdmin webmaster@${dom.name} + + SuexecUserGroup ${dom.user.name} ${pac.name} + + DocumentRoot /home/doms/${dom.name}/htdocs + +#if( ${pac.dynamicWeb} || ${dom.pacDomain} ) + Alias /cgi-bin/ /home/doms/${dom.name}/cgi/ + Alias /fastcgi-bin/ /home/doms/${dom.name}/fastcgi/ +#end + + + Options -ExecCGI ${includes} ${indexes} ${multiviews} +SymLinksIfOwnerMatch + + + + AllowOverride AuthConfig FileInfo Indexes Limit + + +#if( ${pac.dynamicWeb} || ${dom.pacDomain} ) + + SetHandler cgi-script + Options +ExecCGI ${includes} -Indexes -MultiViews +SymLinksIfOwnerMatch + + + + SetHandler fcgid-script + Options +ExecCGI ${includes} -Indexes -MultiViews +SymLinksIfOwnerMatch + +#else + + Redirect 501 / + + + + Redirect 501 / + +#end + + RewriteEngine On + RewriteOptions Inherit + + RewriteCond %{REQUEST_URI} !^/cgi-bin/ + RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ + RewriteCond %{HTTP_HOST} ^(.+)\.${dom.name}\.?(:[0-9]+)?\$ [novary] + RewriteCond /home/doms/${dom.name}/subs/\$\{tolower:%1\} -d + RewriteRule ^(.*) /home/doms/${dom.name}/subs/\$\{tolower:%1\}\$1 [last] + +#if( !${htdocsfallback} ) + RewriteCond %{REQUEST_URI} !^/cgi-bin/ + RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ + RewriteCond %{HTTP_HOST} ^(.+)\.{DOM_HOSTNAME}\.?(:80)?\$ [novary] + RewriteCond /home/doms/${dom.name}/subs/\$\{tolower:%1\} !-d + RewriteRule ^(.*) - [redirect=404,last] +#end + +#if( ${pac.dynamicWeb} || ${dom.pacDomain} ) + AddType application/x-httpd-php .php .php5 .php4 .php3 + Action application/x-httpd-php /fastcgi-bin/phpstub +#end + + + + + + ServerName ${dom.name} + ServerAlias *.${dom.name} + ServerAdmin ${dom.user.name}@${dom.name} + + SuexecUserGroup ${dom.user.name} ${pac.name} + + SSLEngine On + SSLCertificateFile /etc/apache2/pems/default.pem + SSLCertificateChainFile /etc/apache2/pems/default.chain.pem + SSLCertificateFile /etc/apache2/pems/${pac.name}.pem + SSLCertificateChainFile /etc/apache2/pems/${pac.name}.chain.pem + + DocumentRoot /home/doms/${dom.name}/htdocs-ssl + +#if( ${pac.dynamicWeb} || ${dom.pacDomain} ) + Alias /cgi-bin/ /home/doms/${dom.name}/cgi-ssl/ + Alias /fastcgi-bin/ /home/doms/${dom.name}/fastcgi-ssl/ +#end + + + SSLRequireSSL On + Options -ExecCGI ${includes} ${indexes} ${multiviews} +SymLinksIfOwnerMatch + + + + AllowOverride AuthConfig FileInfo Indexes Limit + + +#if( ${pac.dynamicWeb} || ${dom.pacDomain} ) + + SetHandler cgi-script + Options +ExecCGI ${includes} -Indexes -MultiViews +SymLinksIfOwnerMatch + + + + SetHandler fcgid-script + Options +ExecCGI ${includes} -Indexes -MultiViews +SymLinksIfOwnerMatch + +#else + + Redirect 501 / + + + + Redirect 501 / + +#end + + RewriteEngine On + RewriteOptions Inherit + + RewriteCond %{REQUEST_URI} !^/cgi-bin/ + RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ + RewriteCond %{HTTP_HOST} ^(.+)\.${dom.name}\.?(:[0-9]+)?\$ [novary] + RewriteCond /home/doms/${dom.name}/subs-ssl/\$\{tolower:%1\} -d + RewriteRule ^(.*) /home/doms/${dom.name}/subs-ssl/\$\{tolower:%1\}\$1 [last] + +#if( !${htdocsfallback} ) + RewriteCond %{REQUEST_URI} !^/cgi-bin/ + RewriteCond %{REQUEST_URI} !^/fastcgi-bin/ + RewriteCond %{HTTP_HOST} ^(.+)\.${dom.name}\.?(:443)?\$ [novary] + RewriteCond /home/doms/${dom.name}/subs-ssl/\$\{tolower:%1\} !-d + RewriteRule ^(.*) - [redirect=404,last] +#end + +#if( ${pac.dynamicWeb} || ${dom.pacDomain} ) + AddType application/x-httpd-php .php .php5 .php4 .php3 + Action application/x-httpd-php /fastcgi-bin/phpstub +#end + + diff --git a/hsarback/src/de/hsadmin/mods/dom/index.html.jtpl b/hsarback/src/de/hsadmin/mods/dom/index.html.vm similarity index 51% rename from hsarback/src/de/hsadmin/mods/dom/index.html.jtpl rename to hsarback/src/de/hsadmin/mods/dom/index.html.vm index 08d1a9d..b693445 100644 --- a/hsarback/src/de/hsadmin/mods/dom/index.html.jtpl +++ b/hsarback/src/de/hsadmin/mods/dom/index.html.vm @@ -1,22 +1,21 @@ - + -Willkommen bei {DOMAIN} +Willkommen bei ${dom.name} -

Willkommen bei {DOMAIN}

+

Willkommen bei ${dom.name}

Diese neue Website wurde gerade bei der Hostsharing eG -für {USER_NAME} eingerichtet.

+für ${dom.user.comment} eingerichtet.

Der Inhaber der Domain ist bereits per Email unter -webmaster(at){DOMAIN} +webmaster(at)${dom.name} zu erreichen.

- \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/dom/postgrey-whitelist-recipients.jtpl b/hsarback/src/de/hsadmin/mods/dom/postgrey-whitelist-recipients.vm similarity index 63% rename from hsarback/src/de/hsadmin/mods/dom/postgrey-whitelist-recipients.jtpl rename to hsarback/src/de/hsadmin/mods/dom/postgrey-whitelist-recipients.vm index d948b97..7d27cc5 100644 --- a/hsarback/src/de/hsadmin/mods/dom/postgrey-whitelist-recipients.jtpl +++ b/hsarback/src/de/hsadmin/mods/dom/postgrey-whitelist-recipients.vm @@ -1,4 +1,4 @@ -# +# # This file is managed by HSAdmin. # Do not edit manually. Changes will be overwritten. # @@ -8,6 +8,6 @@ postmaster@ #################################################### -{DOM} - - +#foreach( $whitelistdom in ${whitelist} ) +${whitelistdom.name} +#end diff --git a/hsarback/src/de/hsadmin/mods/dom/test.cgi.jtpl b/hsarback/src/de/hsadmin/mods/dom/test.cgi.vm similarity index 52% rename from hsarback/src/de/hsadmin/mods/dom/test.cgi.jtpl rename to hsarback/src/de/hsadmin/mods/dom/test.cgi.vm index cd3dc1b..0f98441 100644 --- a/hsarback/src/de/hsadmin/mods/dom/test.cgi.jtpl +++ b/hsarback/src/de/hsadmin/mods/dom/test.cgi.vm @@ -1,5 +1,4 @@ -#!/bin/sh +#!/bin/sh echo Content-type: text/plain echo echo Hello, world - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/dom/zonefile.jtpl b/hsarback/src/de/hsadmin/mods/dom/zonefile.jtpl deleted file mode 100644 index b4560a7..0000000 --- a/hsarback/src/de/hsadmin/mods/dom/zonefile.jtpl +++ /dev/null @@ -1,25 +0,0 @@ -$TTL 6H -{DOM_HOSTNAME}. IN SOA dns.hostsharing.net. hostmaster.hostsharing.net. ( - {SIO} ; serial secs since Jan 1 1970 - 6H ; refresh (>=10000) - 1H ; retry (>=1800) - 1W ; expire - 1H ; minimum -) - -{DOM_HOSTNAME}. IN NS dns1.hostsharing.net. -{DOM_HOSTNAME}. IN NS dns2.hostsharing.net. -{DOM_HOSTNAME}. IN NS dns3.hostsharing.net. - -{DOM_HOSTNAME}. IN MX 30 mailin1.hostsharing.net. -{DOM_HOSTNAME}. IN MX 30 mailin2.hostsharing.net. -{DOM_HOSTNAME}. IN MX 30 mailin3.hostsharing.net. - -{DOM_HOSTNAME}. IN A {DOM_IPNUMBER} - -*.{DOM_HOSTNAME}. IN MX 30 mailin1.hostsharing.net. -*.{DOM_HOSTNAME}. IN MX 30 mailin2.hostsharing.net. -*.{DOM_HOSTNAME}. IN MX 30 mailin3.hostsharing.net. - -*.{DOM_HOSTNAME}. IN A {DOM_IPNUMBER} - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/dom/zonefile.vm b/hsarback/src/de/hsadmin/mods/dom/zonefile.vm new file mode 100644 index 0000000..b25b612 --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/dom/zonefile.vm @@ -0,0 +1,24 @@ +$TTL 6H +${dom.name}. IN SOA dns.hostsharing.net. hostmaster.hostsharing.net. ( + ${sio} ; serial secs since Jan 1 1970 + 6H ; refresh (>=10000) + 1H ; retry (>=1800) + 1W ; expire + 1H ; minimum +) + +${dom.name}. IN NS dns1.hostsharing.net. +${dom.name}. IN NS dns2.hostsharing.net. +${dom.name}. IN NS dns3.hostsharing.net. + +${dom.name}. IN MX 30 mailin1.hostsharing.net. +${dom.name}. IN MX 30 mailin2.hostsharing.net. +${dom.name}. IN MX 30 mailin3.hostsharing.net. + +${dom.name}. IN A ${pac.curINetAddr.inetAddr} + +*.${dom.name}. IN MX 30 mailin1.hostsharing.net. +*.${dom.name}. IN MX 30 mailin2.hostsharing.net. +*.${dom.name}. IN MX 30 mailin3.hostsharing.net. + +*.${dom.name}. IN A ${pac.curINetAddr.inetAddr} diff --git a/hsarback/src/de/hsadmin/mods/pac/BasePac.java b/hsarback/src/de/hsadmin/mods/pac/BasePac.java index 2698b4b..7f43695 100644 --- a/hsarback/src/de/hsadmin/mods/pac/BasePac.java +++ b/hsarback/src/de/hsadmin/mods/pac/BasePac.java @@ -26,6 +26,7 @@ public class BasePac implements Serializable { private static final long serialVersionUID = 1491121619195513435L; public BasePac() { + components = new HashSet(); } public BasePac(String name, String desc, int sortPos) { diff --git a/hsarback/src/de/hsadmin/mods/pac/Hive.java b/hsarback/src/de/hsadmin/mods/pac/Hive.java index 6183d9f..caa681e 100644 --- a/hsarback/src/de/hsadmin/mods/pac/Hive.java +++ b/hsarback/src/de/hsadmin/mods/pac/Hive.java @@ -21,6 +21,7 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import de.hsadmin.core.model.AbstractEntity; +import de.hsadmin.core.util.Config; import de.hsadmin.mods.user.UnixUser; @Entity(name = "Hives") @@ -130,4 +131,9 @@ public class Hive extends AbstractEntity implements Serializable { public UnixUser owningUser(EntityManager em) { return null; // TODO: kinda somebody like root needed } + + public String getDefaultGateway() { + String hiveIP = getInetAddr().getInetAddr(); + return Config.getInstance().getProperty("hsadmin.default_gateway", hiveIP.substring(0, hiveIP.lastIndexOf('.')) + ".1"); + } } diff --git a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java index b0013fb..4bdaca8 100644 --- a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java +++ b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java @@ -1,27 +1,22 @@ package de.hsadmin.mods.pac; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.Set; import javax.persistence.EntityManager; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.qserv.CompoundProcessor; +import de.hsadmin.core.qserv.CreateFileProcessor; import de.hsadmin.core.qserv.EntityProcessorFactory; -//import de.hsadmin.core.qserv.MailerProcessor; import de.hsadmin.core.qserv.Processor; import de.hsadmin.core.qserv.ProcessorException; import de.hsadmin.core.qserv.ShellProcessor; -import de.hsadmin.core.qserv.TemplateProcessor; -import de.hsadmin.core.qserv.CreateFileProcessor; +import de.hsadmin.core.qserv.VelocityProcessor; import de.hsadmin.core.qserv.WaitingTasksProcessor; -import de.hsadmin.core.util.Config; import de.hsadmin.core.util.PasswordTool; import de.hsadmin.mods.user.UnixUser; + public class PacProcessorFactory implements EntityProcessorFactory { @Override @@ -32,19 +27,17 @@ public class PacProcessorFactory implements EntityProcessorFactory { Hive hive = pac.getHive(); UnixUser unixUser = getPacAdminUser(pac); String password = PasswordTool.generatePassword(); - Map hiveValues = fillHiveValues(hive); - List> pacValuesList = fillPacValuesList(hive, null); Processor priProcessor = new CompoundProcessor( createAddUserProc(pacName, unixUser, password), createSetQuotaProc(pac), - createEtcHostsProc(hiveValues, pacValuesList), - createNetworkInterfacesProc(hiveValues, pacValuesList), + createEtcHostsProc(hive), + createNetworkInterfacesProc(hive), createIPTablesProc(), - createSudouersProc(hiveValues, pacValuesList), - createProftpdConfProc(hiveValues, pacValuesList), + createSudouersProc(hive), + createProftpdConfProc(hive), createMakePacDirectoryStructure(unixUser), createIfUp(pacName), - createHttpdVirtualProc(pacName, pacValuesList), + createHttpdVirtualProc(hive), createAccountingRulesProc()); WaitingTasksProcessor secProcessor = new WaitingTasksProcessor(priProcessor); return secProcessor; @@ -54,11 +47,9 @@ public class PacProcessorFactory implements EntityProcessorFactory { return new ShellProcessor("mk-iptables-rules Accounting"); } - private Processor createHttpdVirtualProc( - String pacName, List> pacValuesList) throws ProcessorException { + private Processor createHttpdVirtualProc(Hive hive) throws ProcessorException { Processor domSetupProcessor = new CompoundProcessor( - new CreateFileProcessor("/de/hsadmin/mods/pac/httpd-virtual.jtpl", - new HashMap(), pacValuesList.iterator(), + new CreateFileProcessor("/de/hsadmin/mods/pac/httpd-virtual.vm", hive, "/etc/apache2/virtual.conf.tmp", "root", "root", "644", true), new ShellProcessor("for PEM in $( cat /etc/apache2/virtual.conf.tmp | grep SSLCertificateFile | cut -c24- ); do " + "ls $PEM >/dev/null 2>&1 || ( " + @@ -90,46 +81,36 @@ public class PacProcessorFactory implements EntityProcessorFactory { public Processor createDeleteProcessor(EntityManager em, T entity) throws ProcessorException { Pac pac = (Pac) entity; Hive hive = pac.getHive(); - Map hiveValues = fillHiveValues(hive); - List> pacValuesList = fillPacValuesList(hive, pac); WaitingTasksProcessor waitingProcessor = new WaitingTasksProcessor(new CompoundProcessor( createIfDown(pac.getName()), - createEtcHostsProc(hiveValues, pacValuesList), - createNetworkInterfacesProc(hiveValues, pacValuesList), - createSudouersProc(hiveValues, pacValuesList), - createProftpdConfProc(hiveValues, pacValuesList), - createHttpdVirtualProc(pac.getName(), pacValuesList), + createEtcHostsProc(hive), + createNetworkInterfacesProc(hive), + createSudouersProc(hive), + createProftpdConfProc(hive), + createHttpdVirtualProc(hive), createAccountingRulesProc())); waitingProcessor.appendProcessor(pac.getHiveName(), createDelUserProc(pac.getName()), "remove packet"); return waitingProcessor; } - private Processor createEtcHostsProc( - Map hiveValues, - List> pacValuesList) throws ProcessorException { - return new TemplateProcessor("/de/hsadmin/mods/pac/hosts.jtpl", hiveValues, pacValuesList.iterator(), "/etc/hosts", true); + private Processor createEtcHostsProc(Hive hive) throws ProcessorException { + return new VelocityProcessor("/de/hsadmin/mods/pac/hosts.vm", hive, "/etc/hosts", true); } - private Processor createNetworkInterfacesProc( - Map hiveValues, - List> pacValuesList) throws ProcessorException { - return new TemplateProcessor("/de/hsadmin/mods/pac/interfaces.jtpl", hiveValues, pacValuesList.iterator(), "/etc/network/interfaces", true); + private Processor createNetworkInterfacesProc(Hive hive) throws ProcessorException { + return new VelocityProcessor("/de/hsadmin/mods/pac/interfaces.vm", hive, "/etc/network/interfaces", true); } private Processor createIPTablesProc() { return new ShellProcessor("mk-iptables-rules Accounting"); } - private Processor createSudouersProc( - Map hiveValues, - List> pacValuesList) throws ProcessorException { - return new TemplateProcessor("/de/hsadmin/mods/pac/sudoers.jtpl", hiveValues, pacValuesList.iterator(), "/etc/sudoers", true); + private Processor createSudouersProc(Hive hive) throws ProcessorException { + return new VelocityProcessor("/de/hsadmin/mods/pac/sudoers.vm", hive, "/etc/sudoers", true); } - private Processor createProftpdConfProc( - Map hiveValues, - List> pacValuesList) throws ProcessorException { - return new TemplateProcessor("/de/hsadmin/mods/pac/proftpd-conf.jtpl", hiveValues, pacValuesList.iterator(), "/etc/proftpd/proftpd.conf", true); + private Processor createProftpdConfProc(Hive hive) throws ProcessorException { + return new VelocityProcessor("/de/hsadmin/mods/pac/proftpd-conf.vm", hive, "/etc/proftpd/proftpd.conf", true); } private Processor createAddUserProc(String pacName, UnixUser unixUser, String password) { @@ -203,31 +184,4 @@ public class PacProcessorFactory implements EntityProcessorFactory { return unixUser; } - private Map fillHiveValues(Hive hive) { - Map hiveValues = new HashMap(); - hiveValues.put("HIVE", hive.getName()); - String hiveIP = hive.getInetAddr().getInetAddr(); - hiveValues.put("HIVE_IP", hiveIP); - String defaultGateway = - Config.getInstance().getProperty("hsadmin.default_gateway", hiveIP.substring(0, hiveIP.lastIndexOf('.')) + ".1"); - defaultGateway = - Config.getInstance().getProperty("hsadmin." + hive.getName() + ".default_gateway", defaultGateway); - hiveValues.put("HIVE_GATEWAY", defaultGateway); - return hiveValues; - } - - private List> fillPacValuesList(Hive hive, Pac pacToSkip) { - List> pacValuesList = new ArrayList>(); - Set pacsSet = hive.getPacs(); - for (Pac p : pacsSet) { - HashMap pacValues = new HashMap(); - pacValues.put("PAC", p.getName()); - pacValues.put("PAC_IP", p.getCurINetAddr().getInetAddr()); - if (pacToSkip == null || !pacToSkip.getName().equals(p.getName())) { - pacValuesList.add(pacValues); - } - } - return pacValuesList; - } - } diff --git a/hsarback/src/de/hsadmin/mods/pac/hosts.jtpl b/hsarback/src/de/hsadmin/mods/pac/hosts.vm similarity index 62% rename from hsarback/src/de/hsadmin/mods/pac/hosts.jtpl rename to hsarback/src/de/hsadmin/mods/pac/hosts.vm index 40f7ee2..8163254 100644 --- a/hsarback/src/de/hsadmin/mods/pac/hosts.jtpl +++ b/hsarback/src/de/hsadmin/mods/pac/hosts.vm @@ -1,4 +1,4 @@ -# +# # This file is managed by HSAdmin. # Do not edit manually. Changes will be overwritten. # @@ -12,8 +12,8 @@ ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts -{HIVE_IP} {HIVE}.hostsharing.net {HIVE} localhive +${hive.inetAddr.inetAddr} ${hive.name}.hostsharing.net ${hive.name} localhive -{PAC_IP} {PAC}.hostsharing.net {PAC} - - +#foreach( $pac in ${hive.pacs} ) +${pac.curINetAddr.inetAddr} ${pac.name}.hostsharing.net ${pac.name} +#end diff --git a/hsarback/src/de/hsadmin/mods/pac/httpd-virtual.jtpl b/hsarback/src/de/hsadmin/mods/pac/httpd-virtual.jtpl deleted file mode 100644 index 751bc2b..0000000 --- a/hsarback/src/de/hsadmin/mods/pac/httpd-virtual.jtpl +++ /dev/null @@ -1,12 +0,0 @@ -# -# This file is managed by HSAdmin. -# Do not edit manually. Changes will be overwritten. -# - - - -NameVirtualHost {PAC_IP}:80 -NameVirtualHost {PAC_IP}:443 - - - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/pac/httpd-virtual.vm b/hsarback/src/de/hsadmin/mods/pac/httpd-virtual.vm new file mode 100644 index 0000000..c59691d --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/pac/httpd-virtual.vm @@ -0,0 +1,11 @@ +# +# This file is managed by HSAdmin. +# Do not edit manually. Changes will be overwritten. +# + +#foreach( $pac in ${hive.pacs} ) + +# ${pac.name} +NameVirtualHost ${pac.curINetAddr.inetAddr}:80 +NameVirtualHost ${pac.curINetAddr.inetAddr}:443 +#end diff --git a/hsarback/src/de/hsadmin/mods/pac/interfaces.jtpl b/hsarback/src/de/hsadmin/mods/pac/interfaces.jtpl deleted file mode 100644 index 8a3810c..0000000 --- a/hsarback/src/de/hsadmin/mods/pac/interfaces.jtpl +++ /dev/null @@ -1,22 +0,0 @@ -# -# This file is managed by HSAdmin. -# Do not edit manually. Changes will be overwritten. -# - -auto lo -iface lo inet loopback - -auto eth0 -iface eth0 inet static - address {HIVE_IP} - netmask 255.255.255.0 - gateway {HIVE_GATEWAY} - -auto eth0:{PAC} -iface eth0:{PAC} inet static - address {PAC_IP} - netmask 255.255.255.0 - - - - \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/pac/interfaces.vm b/hsarback/src/de/hsadmin/mods/pac/interfaces.vm new file mode 100644 index 0000000..4c995cf --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/pac/interfaces.vm @@ -0,0 +1,22 @@ +# +# This file is managed by HSAdmin. +# Do not edit manually. Changes will be overwritten. +# + +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet static + address ${hive.inetAddr.inetAddr} + netmask 255.255.255.0 + gateway ${hive.defaultGateway} + +#foreach( $pac in ${hive.pacs} ) +iface eth0:${pac.name} inet static + address ${pac.curINetAddr.inetAddr} + netmask 255.255.255.0 + +#end + + \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/pac/proftpd-conf.jtpl b/hsarback/src/de/hsadmin/mods/pac/proftpd-conf.vm similarity index 82% rename from hsarback/src/de/hsadmin/mods/pac/proftpd-conf.jtpl rename to hsarback/src/de/hsadmin/mods/pac/proftpd-conf.vm index b52113e..8aa5136 100644 --- a/hsarback/src/de/hsadmin/mods/pac/proftpd-conf.jtpl +++ b/hsarback/src/de/hsadmin/mods/pac/proftpd-conf.vm @@ -1,4 +1,4 @@ -# +# # This file is managed by HSAdmin. # Do not edit manually. Changes will be overwritten. # @@ -58,11 +58,10 @@ PassivePorts 60000 65534 AllowOverwrite on - -#################################################### +#foreach( $pac in ${hive.pacs} ) - - DefaultRoot ~ {PAC} + + DefaultRoot ~ ${pac.name} ServerName "Hostsharing eG" AllowOverwrite on AllowForeignAddress on @@ -70,14 +69,14 @@ PassivePorts 60000 65534 Order allow,deny - AllowGroup {PAC} + AllowGroup ${pac.name} DenyAll - - User {PAC} - Group {PAC} - UserAlias anonymous {PAC} - UserAlias ftp {PAC} + + User ${pac.name} + Group ${pac.name} + UserAlias anonymous ${pac.name} + UserAlias ftp ${pac.name} DirFakeUser on ftp DirFakeGroup on ftp DirFakeMode 000 @@ -87,6 +86,5 @@ PassivePorts 60000 65534 - - +#end \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/pac/sudoers.jtpl b/hsarback/src/de/hsadmin/mods/pac/sudoers.vm similarity index 82% rename from hsarback/src/de/hsadmin/mods/pac/sudoers.jtpl rename to hsarback/src/de/hsadmin/mods/pac/sudoers.vm index 86600f0..6223029 100644 --- a/hsarback/src/de/hsadmin/mods/pac/sudoers.jtpl +++ b/hsarback/src/de/hsadmin/mods/pac/sudoers.vm @@ -1,4 +1,4 @@ -# +# # This file is managed by HSAdmin. # Do not edit manually. Changes will be overwritten. # @@ -22,6 +22,6 @@ root ALL=(ALL) ALL #################################################### -{PAC} ALL = (%{PAC}) NOPASSWD: ALL - - +#foreach( $pac in ${hive.pacs} ) +${pac.name} ALL = (%${pac.name}) NOPASSWD: ALL +#end diff --git a/hsarback/src/net/sf/jtpl/Jtpl.java b/hsarback/src/net/sf/jtpl/Jtpl.java deleted file mode 100644 index f9b0057..0000000 --- a/hsarback/src/net/sf/jtpl/Jtpl.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - Copyright 2009 jtpl.sourceforge.net - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -package net.sf.jtpl; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Jtpl: a very simple template engine for Java
- * Contact: emmanuel.alliel@gmail.com
- * Web: http://jtpl.sourceforge.net
- * - * @version $LastChangedRevision: 51 $ - * @author Emmanuel ALLIEL - * @author Staffan Olsson - * - *

- * Template syntax:
- *    Variables:
- *       {VARIABLE_NAME}
- *    Blocks:
- *       <!-- BEGIN: BlockName -->
- *           <!-- BEGIN: SubBlockName -->
- *           <!-- END: SubBlockName -->
- *       <!-- END: BlockName -->
- *

- * License: Apache 2.0
-*/ - -public class Jtpl implements Serializable -{ - private static final long serialVersionUID = -7175035307912229580L; - - private HashMap blocks = new HashMap(); - private HashMap parsedBlocks = new HashMap(); - private HashMap subBlocks = new HashMap(); - private HashMap vars = new HashMap(); - // flag for backwards compatibility, will probably be reomved in future releases - private boolean failSilently = false; - private boolean implicitMain = false; - - /** - * Constructs a Jtpl object and reads the template from a file. - * For backwards compatibility this constructor enables 'failSilently'. - * @param fileName the file name of the template, exemple: "java/folder/index.tpl" - * @throws IOException when an i/o error occurs while reading the template. - */ - public Jtpl(String fileName) throws IOException - { - this(new File(fileName)); - // this is the old constructor so it enables the old (pre-1.3) behavior on errors - this.failSilently = true; - } - - /** - * Constructs a Jtpl object and reads the template from a file. - * @param file readable file containing template source - * @throws IOException when an i/o error occurs while reading the template. - */ - public Jtpl(File file) throws IOException - { - FileReader fr = new FileReader(file); - String fileText = readFile(fr); - makeTree(fileText); - } - - /** - * Constructs a Jtpl object and reads the template from arbitrary input source. - * @param template the template source - * @throws IOException when an i/o error occurs while reading the template. - */ - public Jtpl(Reader template) throws IOException - { - String fileText = readFile(template); - makeTree(fileText); - } - - /** - * Assign a template variable. - * For variables that are used in blocks, the variable value - * must be set before parse is called. - * @param varName the name of the variable to be set. - * @param varData the new value of the variable. - */ - public void assign(String varName, String varData) - { - vars.put(varName, varData); - } - - /** - * Generates the HTML page and return it into a String. - */ - public String out() - { - if (this.implicitMain) { - this.parse("main"); - } - Object main = parsedBlocks.get("main"); - if (main == null) { - throw new IllegalStateException("'main' block not parsed"); - } - return(main.toString()); - } - - /** - * Parse a template block. - * If the block contains variables, these variables must be set - * before the block is added. - * If the block contains subblocks, the subblocks - * must be parsed before this block. - * @param blockName the name of the block to be parsed. - * @throws IllegalArgumentException if the block name is not found (and failSiletly==false) - */ - public void parse(String blockName) throws IllegalArgumentException - { - String copy = ""; - if (implicitMain && !"main".equals(blockName) && !blockName.startsWith("main.")) { - blockName = "main." + blockName; - } - try { - copy = blocks.get(blockName).toString(); - } catch (NullPointerException e) { - if (!this.failSilently) throw new IllegalArgumentException( - "Block '" + blockName + "' not found." + - " Matches " + locateBlock(blockName)); - } - Pattern pattern = Pattern.compile("\\{([\\w\\.]+)\\}"); - Matcher matcher = pattern.matcher(copy); - pattern = Pattern.compile("_BLOCK_\\.(.+)"); - for (Matcher matcher2; matcher.find();) - { - String match = matcher.group(1); - matcher2 = pattern.matcher(match); - if (matcher2.find()) - { - if (parsedBlocks.containsKey(matcher2.group(1))) - { - copy = copy.replaceFirst("\\{"+match+"\\}", escape( - parsedBlocks.get(matcher2.group(1)).toString())); - } - else - { - copy = copy.replaceFirst("\\{"+match+"\\}", ""); - } - } - else - { - if (vars.containsKey(match)) - { - copy = copy.replaceFirst("\\{"+match+"\\}", escape( - vars.get(match).toString())); - } - else - { - // Leave unchanged because it might be wanted in output. - // Can always be removed by assigning empty value. - //copy = copy.replaceFirst("\\{"+match+"\\}", ""); - } - } - } - if (parsedBlocks.containsKey(blockName)) - { - parsedBlocks.put(blockName, parsedBlocks.get(blockName) + copy); - } - else - { - parsedBlocks.put(blockName, copy); - } - if (subBlocks.containsKey(blockName)) - { - parsedBlocks.put(subBlocks.get(blockName), ""); - } - } - - /** - * Template parsing uses regex replace to insert result text, - * which means that special characters in replacement string must be escaped. - * @param replacement The text that should appear in output. - * @return Text escaped so that it works as String.replaceFirst replacement. - */ - protected String escape(String replacement) { - return replacement.replace("\\", "\\\\").replace("$", "\\$"); - } - - /** - * Lists the blocks that end with the given blockName. - * @param blockName The name as used in parse - * @return Blocks where blockName is the child - * (the Set's toString lists the full names) - */ - protected Set locateBlock(final String blockName) { - Set matches = new java.util.HashSet(); - for (Iterator it = blocks.keySet().iterator(); it.hasNext(); ) { - Object b = it.next(); - if (b.toString().endsWith('.' + blockName)) matches.add(b); - } - return matches; - } - - private String readFile(Reader fr) throws IOException - { - StringBuffer content = new StringBuffer(); - for (int c; (c = fr.read()) != -1; content.append((char)c)); - fr.close(); - return content.toString(); - } - - private void makeTree(String fileText) - { - // BEGIN: implicit main - if (!Pattern.compile(".*.*", Pattern.DOTALL) - .matcher(fileText).matches()) { - this.implicitMain = true; // affects parse(block) and out() - fileText = "" + fileText + ""; - } - // END: implicit main - Pattern pattern = Pattern.compile("(.*?)(?=(?:)|(?:\\s*$))", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - Matcher matcher = pattern.matcher(fileText); - ArrayList blockNames = new ArrayList(); - String parentName = ""; - int lastlength = 0; // used in newline trimming to see if one block immediately follows the previous - while (matcher.find()) - { - // BEGIN: newline trimming - String after = matcher.group(3); // contents after tag - if (lastlength == 0 || fileText.charAt(matcher.start() - 1) == '\n') { - after = after.replaceFirst("^\\r?\\n", ""); - } - lastlength = after.length(); - // END: newline trimming - if (matcher.group(1).toUpperCase().equals("BEGIN")) - { - parentName = implode(blockNames); - blockNames.add(matcher.group(2)); - String currentBlockName = implode(blockNames); - if (blocks.containsKey(currentBlockName)) - { - blocks.put(currentBlockName, blocks.get(currentBlockName) + after); - } - else - { - blocks.put(currentBlockName, after); - } - if (blocks.containsKey(parentName)) - { - blocks.put(parentName, blocks.get(parentName) + "{_BLOCK_." + currentBlockName + "}"); - } - else - { - blocks.put(parentName, "{_BLOCK_." + currentBlockName + "}"); - } - subBlocks.put(parentName, currentBlockName); - subBlocks.put(currentBlockName, ""); - } - else if (matcher.group(1).toUpperCase().equals("END")) - { - blockNames.remove(blockNames.size()-1); - parentName = implode(blockNames); - if (blocks.containsKey(parentName)) - { - blocks.put(parentName, blocks.get(parentName) + after); - } - else - { - blocks.put(parentName, after); - } - } - } - } - - private String implode(ArrayList al) - { - String ret = ""; - for (int i = 0; al.size() > i; i++) - { - if (i != 0) - { - ret += "."; - } - ret += al.get(i); - } - return (ret); - } - -} diff --git a/hsarback/src/net/sf/jtpl/Template.java b/hsarback/src/net/sf/jtpl/Template.java deleted file mode 100644 index 2c23fa7..0000000 --- a/hsarback/src/net/sf/jtpl/Template.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - Copyright 2009 jtpl.sourceforge.net - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -package net.sf.jtpl; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.io.Serializable; -import java.io.StringReader; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.sf.jtpl.Jtpl; - -/** - * The forward compatible template engine interface, - * replacing {@link Jtpl}. - */ -public class Template implements Serializable { - - private static final long serialVersionUID = 3916690583929137140L; - - private Jtpl t; - - public Template(Reader template) throws IOException { - t = new Jtpl(template); - } - - public Template(String templateSource) { - try { - t = new Jtpl(new StringReader(templateSource)); - } catch (IOException e) { - throw new RuntimeException(e); // should be impossible with StringReader - } - } - - public Template(File templateFile) throws FileNotFoundException { - FileReader r = new FileReader(templateFile); - try { - t = new Jtpl(templateFile); - } catch (IOException e) { - try { - r.close(); - } catch (Exception nothingToDoAboutIt) {} - } - } - - // proxying methods from Jtpl1 - - public Template assign(String varName, String varData) { - t.assign(varName, varData); - return this; - } - - public Template parse(String blockName) throws IllegalArgumentException { - t.parse(blockName); - return this; - } - - public String out() { - return t.out(); - } - - // bean properties support - - public Template parse(String blockName, Object bean) { - assignAll(bean); - return parse(blockName); - } - - public String out(Object bean) { - assignAll(bean); - return out(); - } - - protected void assignAll(Object bean) { - Map p = getBeanProperties(bean); - Iterator i = p.keySet().iterator(); - while (i.hasNext()) { - String key = (String) i.next(); - assign(key.toUpperCase(), "" + p.get(key)); - } - } - - /** - * @param bean The instance that has properties named according to JavaBean standard. - * @return Map that should be considered immutable - */ - protected Map getBeanProperties(Object bean) { - HashMap values = new HashMap(); - if (bean == null) return values; - Method[] m = bean.getClass().getMethods(); - - Pattern p = Pattern.compile("get([A-Z]\\w+)"); - - for (int i = 0; i < m.length; i++) { - if (m[i].getName().equals("getClass")) continue; - if (m[i].getParameterTypes().length > 0) continue; - Matcher r = p.matcher(m[i].getName()); - if (r.matches()) { - try { - values.put(r.group(1).toLowerCase(), m[i].invoke(bean, new Object[0])); - } catch (IllegalArgumentException e) { - throw e; - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } - } - } - return values; - } - -} -