Paket-Anlegen begonnen

This commit is contained in:
Peter Hormanns 2011-07-01 15:26:29 +00:00
parent a71fd7fe67
commit ea8c5d5924
8 changed files with 253 additions and 60 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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 class MailerProcessor extends AbstractProcessor {
}
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);
}
}
}

View File

@ -1,41 +0,0 @@
package de.hsadmin.core.qserv;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
public class MailerShell {
private static boolean bExecute = true; // really execute or just store
// command and stdin?
private static MimeMessage aMessage; // stored message
/**
* Set mode of real mailer or just storing the messages for testing
* purposes.
*
* @param bExec
* specifies whether messages are really send (true) or just
* stored (false)
*/
public static void setExecute(boolean bExec) {
bExecute = bExec;
}
/**
* Returns and clears the last command which should have been executed.
*
* @return Last command, plus "<<EOF\n" + stdin + "EOF" if stdin was given.
*/
public static MimeMessage popLastMessage() {
MimeMessage aLastMessage = aMessage;
aMessage = null;
return aLastMessage;
}
public static void send(MimeMessage aMsg) throws MessagingException {
if (bExecute)
javax.mail.Transport.send(aMsg);
aMessage = aMsg;
}
}

View 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);
}
}
}

View File

@ -96,6 +96,7 @@ public class PacModuleImpl extends AbstractModuleImpl {
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);
}

View 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");
}
}

View 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 -->