diff --git a/hsarback/build.xml b/hsarback/build.xml index 9386a6a..c2af7eb 100644 --- a/hsarback/build.xml +++ b/hsarback/build.xml @@ -40,6 +40,19 @@ + + + + + + + + + + + + + diff --git a/hsarback/src/de/hsadmin/core/qserv/QueueServer.java b/hsarback/src/de/hsadmin/core/qserv/QueueServer.java index c709096..2785523 100644 --- a/hsarback/src/de/hsadmin/core/qserv/QueueServer.java +++ b/hsarback/src/de/hsadmin/core/qserv/QueueServer.java @@ -144,29 +144,27 @@ public class QueueServer extends QueueCommons implements // execute processor within the message task.getProcessor().process(); System.out.println("done"); - - // mark done - sendStatus(task); - } catch (Exception receiveException) { - System.err.println("exception " + receiveException); // TODO: - // logging - receiveException.printStackTrace(System.err); - if (receiveException.getCause() != null) { - System.err.println("caused by exception " - + receiveException.getCause()); // TODO: logging - receiveException.getCause().printStackTrace(System.err); - } else - System.err.println("no further cause available"); - task.setException(receiveException); - sendStatus(task); - } catch (Throwable t) { - System.err.println("severe exception " + t); // TODO: logging + } catch (Throwable throwable) { + logException(throwable); + task.setException(throwable); } finally { + sendStatus(task); setNMessagesProcessed(getNMessagesProcessed() + 1); notifyAll(); } } + private void logException(Throwable t) { + System.err.println("exception " + t); // TODO: logging + t.printStackTrace(System.err); + if (t.getCause() != null) { + System.err.println("caused by exception " + + t.getCause()); // TODO: logging + t.getCause().printStackTrace(System.err); + } else + System.err.println("no further cause available"); + } + @Override public void onException(JMSException e) { System.out.println("Exception: " + e.getMessage()); diff --git a/hsarback/src/de/hsadmin/core/qserv/QueueTask.java b/hsarback/src/de/hsadmin/core/qserv/QueueTask.java index ff46f96..5b0c1aa 100644 --- a/hsarback/src/de/hsadmin/core/qserv/QueueTask.java +++ b/hsarback/src/de/hsadmin/core/qserv/QueueTask.java @@ -181,15 +181,14 @@ public class QueueTask extends AbstractEntity implements Serializable { public String getException() { return exception; - }; + } public void setException(String exception) { this.exception = exception; } - public void setException(Exception exception) { - this.exception = exception.toString(); - // TODO: stack+cause + public void setException(Throwable exception) { + this.exception = exception.getMessage(); } @Override diff --git a/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java b/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java index 08b312b..8a7f2eb 100644 --- a/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java +++ b/hsarback/src/de/hsadmin/core/qserv/TemplateProcessor.java @@ -6,13 +6,14 @@ 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 = 4520635523274792876L; + private static final long serialVersionUID = 2L; private String content = null; private String targetPath = null; @@ -34,6 +35,29 @@ public class TemplateProcessor extends AbstractProcessor { } } + 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 { diff --git a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java index ca4018e..efdc995 100644 --- a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java +++ b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java @@ -3,6 +3,10 @@ package de.hsadmin.mods.pac; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Random; import java.util.Set; @@ -46,16 +50,33 @@ public class PacProcessorFactory implements EntityProcessorFactory { if (unixUserSet.size() == 1) { unixUser = unixUserSet.iterator().next(); } - Processor hostsAppender = new ShellProcessor("echo '" + inetAddr + " " + pacName +".hostsharing.net " + pacName + "\n' >>/etc/hosts"); - Processor interfacesAppender = new ShellProcessor("echo 'auto eth0:" + pacName + "\n" + - "iface eth0:" + pacName + " inet static\n" + - "\taddress " + inetAddr + "\n" + - "\tnetmask 255.255.255.0\n\n' >>/etc/network/interfaces"); - Processor sudoersAppender = new ShellProcessor("echo '" + pacName + " ALL = (%" + pacName + ") NOPASSWD: ALL\n' >> /etc/sudoers"); + Hive hive = pac.getHive(); + Map hiveValues = new HashMap(); + hiveValues.put("HIVE", hive.getName()); + String hiveIP = hive.getInetAddr().getInetAddr(); + hiveValues.put("HIVE_IP", hiveIP); + hiveValues.put("HIVE_GATEWAY", hiveIP.substring(0, hiveIP.lastIndexOf('.')) + ".1"); + 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()); + pacValuesList.add(pacValues); + } + + // nicht ausprobiert! + + Processor hostsAppender = new TemplateProcessor("/de/hsadmin/mods/pac/hosts.jtpl", hiveValues, pacValuesList.iterator(), "/etc/hosts", true); + Processor interfacesAppender = new TemplateProcessor("/de/hsadmin/mods/pac/interfaces.jtpl", hiveValues, pacValuesList.iterator(), "/etc/network/interfaces", true); + Processor sudoersAppender = new TemplateProcessor("/de/hsadmin/mods/pac/sudoers.jtpl", hiveValues, pacValuesList.iterator(), "/etc/sudoers", true); + + // nicht ausprobiert! + String password = PwGenerator.generatePassword(7, flagBuilder.build(), 100, random); Processor newUsersProc = new ShellProcessor( "newusers", pacName + ":" + password + ":" - + unixUser.getUserId() + ":" + unixUser.getPac().getName() + + unixUser.getUserId() + ":" + unixUser.getUserId() + ":" + unixUser.getComment() + ":" + unixUser.getHomedir() + ":" + unixUser.getShell() + "\n"); try { @@ -71,7 +92,10 @@ public class PacProcessorFactory implements EntityProcessorFactory { "Zugangsdaten des neue Hostsharing Pakets " + pacName, template.out()) ); - return new CompoundProcessor(hostsAppender, interfacesAppender, sudoersAppender, newUsersProc, emailPasswordProc); + Processor priProcessor = new CompoundProcessor(hostsAppender, interfacesAppender, sudoersAppender, newUsersProc); + WaitingTasksProcessor secProcessor = new WaitingTasksProcessor(priProcessor); + secProcessor.appendProcessor(pac.getHiveName(), emailPasswordProc, "send email to customer"); + return secProcessor; } catch (IllegalArgumentException e) { throw new ProcessorException(e); } catch (IOException e) { diff --git a/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl b/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl index aca9c11..6c9a273 100644 --- a/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl +++ b/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl @@ -1,17 +1,17 @@ -Das neue Hostsharing Paket {PAC} ist eingerichtet. Zugangsdaten: +Das neue Hostsharing Paket {PAC} ist eingerichtet. +Die Zugangsdaten sind: Hostname (HTTP, FTP, SSH, POP3, IMAP): {PAC}.hostsharing.net Benutzernamen (Paket-Admin-Account): {PAC} Passwort: {PASSWORD} -Wir bitten zu berücksichtigen, dass man mit diesem Passwort sehr viel -Macht über das Paket hat, so ist damit z.B. die Bestellung von Domains -möglich. Bitte daher die u.g. Sicherheitshinweise beachten und den -Paketadmin-Account {PAC} nicht mit unsicheren (unverschlüsselten) -Protokollen wie POP3 oder FTP ohne TLS verwenden! +Wir bitten zu beruecksichtigen, dass man mit diesem Passwort sehr viel +Macht ueber das Paket hat. Bitte daher die u.g. Sicherheitshinweise +beachten und den Paketadmin-Account {PAC} nicht mit unsicheren +(unverschluesselten) Protokollen wie POP3 oder FTP ohne TLS verwenden! -E-Mail-Benachrichtigungen für den Paket-Admin gehen direkt an den -o.g. Account. Über den E-Mail-Alias {PAC} können diese E-Mails +E-Mail-Benachrichtigungen fuer den Paket-Admin gehen direkt an den +o.g. Account. Ueber den E-Mail-Alias {PAC} koennen diese E-Mails an externe E-Mail-Adressen weitergeleitet werden. Initial ist eine Weiterleitung an {CUST_EMAIL} eingetragen. @@ -20,42 +20,43 @@ unter einem User "{PAC}-doms" anzulegen, um die Paket- und Domain- Verwaltung zu trennen. Dies gilt insbesondere, wenn die Domain-Inhalte per FTP gepflegt werden sollen. -Weitere Accounts (neben dem Paketadmin-Account {PAC}) können nach einem +Weitere Accounts (neben dem Paketadmin-Account {PAC}) koennen nach einem Login per SSH mit dem Kommandozeilen-Programm hsadmin eingerichtet -werden (in Kürze auch per Web-Client). Dokumentation finden Sie unter: +oder mit dem Web-Client unter http://admin.hostsharing.net +Dokumentation finden Sie unter: Der Webspace des Paketes ist theoretisch ab sofort unter erreichbar, allerdings kann es durch -DNS-Caches Verzögerungen geben. Das DocumentRoot ist ~{PAC}/web, wobei +DNS-Caches Verzoegerungen geben. Das DocumentRoot ist ~{PAC}/web, wobei ~{PAC}/cgi als /cgi-bin in den Webspace eingeblendet wird. In SW Paketen -darf dieses CGI auch nur für administrative Zwecke verwendet werden. +darf dieses CGI nur fuer administrative Zwecke verwendet werden. Die vorgenannte Paket-Subdomain ist jedoch eher zum Testen und Ausprobieren gedacht und hat mit dem folgenden Domain-Webspace nichts zu tun, der wird unter ~{PAC}/doms/ angelegt, sobald eine Domain aufgeschaltet wird. Dort gibt -es dann für jede Domain ein separates Verzeichnis. +es dann fuer jede Domain ein separates Verzeichnis. Das Verfahren zum Bestellen von Domains ist auf unserer Website unter http://www.hostsharing.net/dokumentation/einstieg-bei-hostsharing/domain-bestellen.html -beschrieben. Ein Web-Interface hierfür ist in Entwicklung. +beschrieben. -Bei evtl. auftretenden Problemen mit dem Server bitte zunächst auf +Bei evtl. auftretenden Problemen mit dem Server bitte zunaechst auf unserer Status-Website nachsehen, insbesondere auch auf der dortigen Seite "Aktionen", ob die Hostmaster -bereits aktiv sind. Falls nicht, können die Hostmaster bei dringenden -Problemen über die Rufnummer +49 40 209331331 erreicht werden. +bereits aktiv sind. Falls nicht, koennen die Hostmaster bei dringenden +Problemen ueber die Rufnummer +49 40 209331331 erreicht werden. Bitte ggf. lange klingeln lassen, aber nicht mehr anrufen, wenn die Hostmaster laut Status-Seite "Aktionen" bereits dabei sind, -das Problem zu beheben, da dies die Arbeiten dann nur verzögern würde. +das Problem zu beheben, da dies die Arbeiten dann nur verzoegern wuerde. Auch ist diese Rufnummer keine Support-Rufnummer, telefonische -Support-Anfragen können grundsätzlich nicht beantwortet werden. +Support-Anfragen koennen grundsaetzlich nicht beantwortet werden. Weitere Fragen beantworten wir gerne per E-Mail, am liebsten auf der -passenden öffentlichen Mailingliste (in den meisten Fällen wohl -support@). Einen Übeblick über unsere Mailinglisten bietet die Website: -http://www.hostsharing.net/forum/mailinglisten.html +passenden oeffentlichen Mailingliste (in den meisten Faellen wohl +support@). Einen Ueberblick ueber unsere Mailinglisten bietet die Website: +https://www.hostsharing.net/gemeinschaft Viel Erfolg mit dem neuen Paket bei Hostsharing! @@ -67,7 +68,7 @@ formuliert. -- Hostsharing Service | http://www.hostsharing.net Telefon: +49 40 209331311 | Fax: +49 40 209331312 -Hostsharing eG | Glockengießerwall 17 | D-20095 Hamburg +Hostsharing eG | Glockengiesserwall 17 | D-20095 Hamburg Registergericht Hamburg, GnR 1007 | USt.-ID-Nr.: DE218602793 -vertretungsberechtigter Vorstand: Michael Hierweck, Uwe Müller +vertretungsberechtigter Vorstand: Michael Hierweck, Uwe Mueller \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/mods/pac/hosts.jtpl b/hsarback/src/de/hsadmin/mods/pac/hosts.jtpl new file mode 100644 index 0000000..3e296da --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/pac/hosts.jtpl @@ -0,0 +1,14 @@ +127.0.0.1 localhost + +::1 ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +ff02::3 ip6-allhosts + +{HIVE_IP} {HIVE}.hostsharing.net {HIVE} localhive + +{PAC_IP} {PAC}.hostsharing.net {PAC} + + diff --git a/hsarback/src/de/hsadmin/mods/pac/interfaces.jtpl b/hsarback/src/de/hsadmin/mods/pac/interfaces.jtpl new file mode 100644 index 0000000..80aafea --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/pac/interfaces.jtpl @@ -0,0 +1,17 @@ +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/sudoers.jtpl b/hsarback/src/de/hsadmin/mods/pac/sudoers.jtpl new file mode 100644 index 0000000..89bf1a2 --- /dev/null +++ b/hsarback/src/de/hsadmin/mods/pac/sudoers.jtpl @@ -0,0 +1,25 @@ +### Do not edit this file manually +### Generated by HSAdmin Queue Server + +# Host alias specification + +# User alias specification + +# Cmnd alias specification + +# Override built in defaults + +Defaults ignore_dot # "." bzw. "" im PATH ignorieren +Defaults always_set_home # HOME entsprechend des Zielusers aendern +Defaults env_reset # Environmentvariablen filtern +Defaults listpw=all # siehe sudoers(5) + +# User privilege specification +root ALL=(ALL) ALL +%adm ALL=NOPASSWD: ALL + +################################################################################ + +{PAC} ALL = (%{PAC}) NOPASSWD: ALL + +