HSAdmin Backend Domains, E-Mail, Datenbanken
Peter Hormanns
2011-07-01 ea8c5d59246644bb306d56a9140101e428473715
Paket-Anlegen begonnen
5 files added
1 files deleted
2 files modified
313 ■■■■ changed files
hsarback/lib/commons-net2-2.0.jar patch | view | raw | blame | history
hsarback/lib/jpwgen-1.2.0.jar patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java 28 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/MailerShell.java 41 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java 76 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java 1 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java 94 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl 73 ●●●●● patch | view | raw | blame | history
hsarback/lib/commons-net2-2.0.jar
Binary files differ
hsarback/lib/jpwgen-1.2.0.jar
Binary files differ
hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java
@@ -1,15 +1,11 @@
package de.hsadmin.core.qserv;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import de.hsadmin.core.model.HSAdminException;
import de.hsadmin.core.util.Config;
public class MailerProcessor extends AbstractProcessor {
    private static final long serialVersionUID = -8900943664576420041L;
    private static final long serialVersionUID = 1L;
    private String aTo;
    private String aSubject;
@@ -22,20 +18,14 @@
    }
    public Object process() throws ProcessorException {
        Properties aProps = new Properties();
        aProps.setProperty("mail.smtp.host", "localhost");
        Session aSess = Session.getInstance(aProps);
        MimeMessage aMsg = new MimeMessage(aSess);
        try {
            aMsg.setFrom(new InternetAddress("robot@hostsharing.net"));
            aMsg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(aTo));
            aMsg.setSubject(aSubject);
            aMsg.setText(aBody);
            MailerShell.send(aMsg);
            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 (MessagingException aExc) {
            throw new ProcessorException(aExc);
        } catch (HSAdminException e) {
            throw new ProcessorException(e);
        }
    }
}
hsarback/src/de/hsadmin/core/qserv/MailerShell.java
File was deleted
hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java
New file
@@ -0,0 +1,76 @@
package de.hsadmin.core.qserv;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import org.apache.commons.net.smtp.SMTPClient;
import org.apache.commons.net.smtp.SMTPReply;
import org.apache.commons.net.smtp.SimpleSMTPHeader;
import de.hsadmin.core.model.HSAdminException;
import de.hsadmin.core.util.Config;
public class SmtpHelper {
    public static void send(String fromAddress, String toAddress, String subject, String text)
            throws HSAdminException {
        send(fromAddress, toAddress, null, subject, text);
    }
    public static void send(String fromAddress, String toAddress, String ccAddress, String subject, String text)
            throws HSAdminException {
        try {
            SMTPClient client = new SMTPClient();
            String canonicalHostName = InetAddress.getLocalHost().getHostName();
            String smtpHost = Config.getInstance().getProperty("smtp.host");
            if ("unittest".equals(smtpHost)) { // Nur fuer Unit-Tests
                if (subject.toLowerCase().contains("error")) {
                    throw new HSAdminException("Konnte Mail nicht senden");
                }
                System.out.println("------------------------");
                System.out.println("From: " + fromAddress);
                System.out.println("To: " + toAddress);
                System.out.println("Subject: " + subject);
                System.out.println("\n" + text);
                return;
            }
            client.connect(smtpHost, 25);
            int reply = client.getReplyCode();
            if (!SMTPReply.isPositiveCompletion(reply)) {
                throw new HSAdminException("Konnte Mail Server nicht erreichen");
            }
            client.login(canonicalHostName);
            client.setSender(fromAddress.trim());
            client.addRecipient(toAddress.trim());
            if (ccAddress != null && ccAddress.trim().length() > 3) {
                client.addRecipient(ccAddress.trim());
            }
            Writer sendMessageData = client.sendMessageData();
            if (sendMessageData == null) {
                throw new HSAdminException("Konnte Mail nicht senden (SMTP-Relay-Problem)");
            }
            PrintWriter wr = new PrintWriter(sendMessageData);
            SimpleSMTPHeader header = new SimpleSMTPHeader(fromAddress, toAddress,
                    subject);
            wr.write(header.toString());
            wr.write(text);
            wr.close();
            if (!client.completePendingCommand()) {
                throw new HSAdminException("Konnte Mail nicht senden");
            }
            client.logout();
            client.disconnect();
        } catch (UnknownHostException e) {
            throw new HSAdminException(e);
        } catch (SocketException e) {
            throw new HSAdminException(e);
        } catch (IOException e) {
            throw new HSAdminException(e);
        }
    }
}
hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
@@ -96,6 +96,7 @@
        Long maxUid = (Long) em.createQuery("SELECT MAX(u.userId) FROM UnixUsers u").getSingleResult();
        if (maxUid >= nUID) nUID = maxUid + 1;
        admin.setUserId(nUID);
        users.add(admin);
        return super.add(newEntity);
    }
hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java
New file
@@ -0,0 +1,94 @@
package de.hsadmin.mods.pac;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.Set;
import javax.persistence.EntityManager;
import net.sf.jtpl.Template;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.CompoundProcessor;
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.WaitingTasksProcessor;
import de.hsadmin.mods.user.UnixUser;
import de.rrze.jpwgen.flags.PwGeneratorFlagBuilder;
import de.rrze.jpwgen.impl.PwGenerator;
public class PacProcessorFactory implements EntityProcessorFactory {
    private static PwGeneratorFlagBuilder flagBuilder = new PwGeneratorFlagBuilder();
    private static Random random = new Random();
    static {
        flagBuilder.setIncludeCapitals();
        flagBuilder.setIncludeNumerals();
//        flagBuilder.setIncludeReducedSymbols();
        flagBuilder.setFilterAmbiguous();
    }
    @Override
    public <T extends AbstractEntity> Processor createCreateProcessor(
            EntityManager em, T entity) throws ProcessorException {
        Pac pac = (Pac) entity;
        String inetAddr = pac.getCurINetAddr().getInetAddr();
        String pacName = pac.getName();
        String customerEMail = pac.getCustomer().getContractualContact().getEmail();
        UnixUser unixUser = null;
        Set<UnixUser> unixUserSet = pac.getUnixUser();
        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");
        String password = PwGenerator.generatePassword(7, flagBuilder.build(), 100, random);
        Processor newUsersProc = new ShellProcessor(
                "newusers", pacName + ":" + password  + ":"
                        + unixUser.getUserId() + ":" + unixUser.getPac().getName()
                        + ":" + unixUser.getComment() + ":" + unixUser.getHomedir()
                        + ":" + unixUser.getShell() + "\n");
        try {
            InputStream stream = TemplateProcessor.class.getClassLoader().getResourceAsStream("/de/hsadmin/mods/pac/email_new_pac_account.jtpl");
            Template template = new Template(new InputStreamReader(stream));
            template.assign("PAC", pacName);
            template.assign("PASSWORD", password);
            template.assign("CUST_EMAIL", customerEMail);
            template.parse("main");
            Processor emailPasswordProc = new WaitingTasksProcessor(
                    new MailerProcessor(
                            customerEMail,
                            "Zugangsdaten des neue Hostsharing Pakets " + pacName,
                            template.out())
                );
            return new CompoundProcessor(hostsAppender, interfacesAppender, sudoersAppender, newUsersProc, emailPasswordProc);
        } catch (IllegalArgumentException e) {
            throw new ProcessorException(e);
        } catch (IOException e) {
            throw new ProcessorException(e);
        }
    }
    @Override
    public <T extends AbstractEntity> Processor createUpdateProcessor(
            EntityManager em, T newEntity) throws ProcessorException {
        throw new ProcessorException("pac.update not implemented");
    }
    @Override
    public <T extends AbstractEntity> Processor createDeleteProcessor(
            EntityManager em, T entity) throws ProcessorException {
        throw new ProcessorException("pac.delete not implemented");
    }
}
hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl
New file
@@ -0,0 +1,73 @@
<!-- BEGIN: main -->Das neue Hostsharing Paket {PAC} ist eingerichtet. Zugangsdaten:
        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!
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
an externe E-Mail-Adressen weitergeleitet werden. Initial ist
eine Weiterleitung an {CUST_EMAIL} eingetragen.
Wir empfehlen, Domains nicht unter dem Paketadmin {PAC} sondern z.B.
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
Login per SSH mit dem Kommandozeilen-Programm hsadmin eingerichtet
werden (in Kürze auch per Web-Client). Dokumentation finden Sie unter:
        <http://www.hostsharing.net/dokumentation.html>
Der Webspace des Paketes ist theoretisch ab sofort unter
<http://{PAC}.hostsharing.net/> erreichbar, allerdings kann es durch
DNS-Caches Verzögerungen 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.
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.
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.
Bei evtl. auftretenden Problemen mit dem Server bitte zunächst auf
unserer Status-Website <http://status.hostsharing.net/> 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.
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.
Auch ist diese Rufnummer keine Support-Rufnummer, telefonische
Support-Anfragen können grundsätzlich 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
Viel Erfolg mit dem neuen Paket bei Hostsharing!
        die Hostsharing Hostmaster
P.S. Diese E-Mail wurde automatisch erstellt und ist daher allgemein
formuliert.
--
Hostsharing Service | http://www.hostsharing.net
Telefon: +49 40 209331311 | Fax: +49 40 209331312
Hostsharing eG | Glockengießerwall 17 | D-20095 Hamburg
Registergericht Hamburg, GnR 1007 | USt.-ID-Nr.: DE218602793
vertretungsberechtigter Vorstand: Michael Hierweck, Uwe Müller
<!-- END: main -->