From 28bc9b54e11578bc2284f4e2f263a9ccfa974f11 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 31 Aug 2015 23:16:07 +0200 Subject: [server] Added mail text for all current events --- .../openslx/bwlp/sat/database/mappers/DbImage.java | 39 ++++++------ .../bwlp/sat/database/mappers/DbMailQueue.java | 2 +- .../sat/database/models/LocalImageVersion.java | 5 +- .../main/java/org/openslx/bwlp/sat/mail/Mail.java | 8 +++ .../org/openslx/bwlp/sat/mail/MailGenerator.java | 74 ++++++++++++++-------- .../java/org/openslx/bwlp/sat/mail/MailQueue.java | 2 +- .../java/org/openslx/bwlp/sat/mail/SmtpMailer.java | 15 ----- .../bwlp/sat/maintenance/SendExpireWarning.java | 9 +-- 8 files changed, 88 insertions(+), 66 deletions(-) (limited to 'dozentenmodulserver') diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java index 95d6380c..c8e5fd2a 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java @@ -111,19 +111,26 @@ public class DbImage { } } + private final static String localImageBaseSql = "SELECT" + + " imageversionid, imagebaseid, filepath, filesize, uploaderid, createtime, expiretime, isvalid" + + " FROM imageversion"; + + private static LocalImageVersion toLocalImageVersion(ResultSet rs) throws SQLException { + return new LocalImageVersion(rs.getString("imageversionid"), rs.getString("imagebaseid"), + rs.getString("filepath"), rs.getLong("filesize"), rs.getString("uploaderid"), + rs.getLong("createtime"), rs.getLong("expiretime"), rs.getBoolean("isvalid")); + } + public static LocalImageVersion getLocalImageData(String imageVersionId) throws TNotFoundException, SQLException { try (MysqlConnection connection = Database.getConnection()) { - MysqlStatement stmt = connection.prepareStatement("SELECT" - + " imageversionid, imagebaseid, filepath, filesize, createtime, expiretime, isvalid" - + " FROM imageversion WHERE imageversionid = :imageversionid"); + MysqlStatement stmt = connection.prepareStatement(localImageBaseSql + + " WHERE imageversionid = :imageversionid"); stmt.setString("imageversionid", imageVersionId); ResultSet rs = stmt.executeQuery(); if (!rs.next()) throw new TNotFoundException(); - return new LocalImageVersion(rs.getString("imageversionid"), rs.getString("imagebaseid"), - rs.getString("filepath"), rs.getLong("filesize"), rs.getLong("createtime"), - rs.getLong("expiretime"), rs.getBoolean("isvalid")); + return toLocalImageVersion(rs); } catch (SQLException e) { LOGGER.error("Query failed in DbImage.getLocalImageData()", e); throw e; @@ -132,16 +139,13 @@ public class DbImage { protected static List getLocalImageVersions(MysqlConnection connection, String imageBaseId) throws SQLException { - MysqlStatement stmt = connection.prepareStatement("SELECT" - + " imageversionid, imagebaseid, filepath, filesize, createtime, expiretime, isvalid" - + " FROM imageversion WHERE imagebaseid = :imagebaseid"); + MysqlStatement stmt = connection.prepareStatement(localImageBaseSql + + " WHERE imagebaseid = :imagebaseid"); stmt.setString("imagebaseid", imageBaseId); ResultSet rs = stmt.executeQuery(); List list = new ArrayList<>(); while (rs.next()) { - list.add(new LocalImageVersion(rs.getString("imageversionid"), rs.getString("imagebaseid"), - rs.getString("filepath"), rs.getLong("filesize"), rs.getLong("createtime"), - rs.getLong("expiretime"), rs.getBoolean("isvalid"))); + list.add(toLocalImageVersion(rs)); } return list; } @@ -149,16 +153,13 @@ public class DbImage { public static List getExpiringLocalImageVersions(int maxRemainingDays) throws SQLException { try (MysqlConnection connection = Database.getConnection()) { - MysqlStatement stmt = connection.prepareStatement("SELECT" - + " imageversionid, imagebaseid, filepath, filesize, createtime, expiretime, isvalid" - + " FROM imageversion WHERE expiretime < :deadline"); + MysqlStatement stmt = connection.prepareStatement(localImageBaseSql + + " WHERE expiretime < :deadline"); stmt.setLong("deadline", Util.unixTime() + (maxRemainingDays * 86400)); ResultSet rs = stmt.executeQuery(); List list = new ArrayList<>(); while (rs.next()) { - list.add(new LocalImageVersion(rs.getString("imageversionid"), rs.getString("imagebaseid"), - rs.getString("filepath"), rs.getLong("filesize"), rs.getLong("createtime"), - rs.getLong("expiretime"), rs.getBoolean("isvalid"))); + list.add(toLocalImageVersion(rs)); } return list; } catch (SQLException e) { @@ -543,7 +544,7 @@ public class DbImage { baseStmt.setString("imagebaseid", imageBaseId); baseStmt.executeUpdate(); LocalImageVersion liv = new LocalImageVersion(imageVersionId, imageBaseId, filePath, fileSize, - nowSecs, expireTime, true); + owner.userId, nowSecs, expireTime, true); DbLecture.autoUpdateUsedImage(connection, imageBaseId, liv); setLatestVersion(connection, imageBaseId, liv); connection.commit(); diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbMailQueue.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbMailQueue.java index 67d3591a..f05b70f0 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbMailQueue.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbMailQueue.java @@ -45,7 +45,7 @@ public class DbMailQueue { } MysqlStatement stmt = connection.prepareStatement("SELECT" + " mailid, userid, message FROM mailqueue" - + " WHERE failcount < 2 ORDER BY dateline DESC LIMIT " + batchSize); + + " WHERE failcount < 2 ORDER BY dateline ASC LIMIT " + batchSize); ResultSet rs = stmt.executeQuery(); List list = new ArrayList<>(); while (rs.next()) { diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/models/LocalImageVersion.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/models/LocalImageVersion.java index fea36200..c1952434 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/models/LocalImageVersion.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/models/LocalImageVersion.java @@ -12,16 +12,19 @@ public class LocalImageVersion { public final boolean isValid; + public final String uploaderId; + public final long createTime; public final long expireTime; public LocalImageVersion(String imageVersionId, String imageBaseId, String filePath, long fileSize, - long createTime, long expireTime, boolean isValid) { + String uploaderId, long createTime, long expireTime, boolean isValid) { this.imageVersionId = imageVersionId; this.imageBaseId = imageBaseId; this.filePath = filePath; this.fileSize = fileSize; + this.uploaderId = uploaderId; this.createTime = createTime; this.expireTime = expireTime; this.isValid = isValid; diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/Mail.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/Mail.java index a795a52e..60b1cc52 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/Mail.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/Mail.java @@ -1,5 +1,9 @@ package org.openslx.bwlp.sat.mail; +import java.util.UUID; + +import org.openslx.bwlp.thrift.iface.UserInfo; + public class Mail { public final String id; @@ -12,4 +16,8 @@ public class Mail { this.message = message; } + public Mail(UserInfo recipient, String message) { + this(UUID.randomUUID().toString(), recipient.userId, message); + } + } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java index 3a976b3d..47006742 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java @@ -28,6 +28,9 @@ import org.openslx.bwlp.thrift.iface.UserInfo; public class MailGenerator { + // TODO Hard-Coded template mess. Strings and messages changed a lot while testing :( + // This is best we could do for Sept. release + private static final Logger LOGGER = Logger.getLogger(MailGenerator.class); /** @@ -41,22 +44,36 @@ public class MailGenerator { if (!hasMailConfig()) return; for (LectureSummary lecture : lectures) { - LOGGER.debug("Auto-Update mail for " + lecture.lectureId + " " + lecture.lectureName); List relevantUsers = getUserToMail(lecture); + String message = "Zur Veranstaltung '" + lecture.lectureName + + "' gehörige VM wurde aktualisiert."; for (UserInfo user : relevantUsers) { - LOGGER.debug("Sending auto-update info to " + Formatter.userFullName(user)); + if (newVersion.uploaderId.equals(user.userId)) // Don't notice about changes by user + continue; + MailQueue.queue(new Mail(user, message)); } } } + /** + * Called when a lecture is downgraded, or a lecture is updated and it + * doesn't have auto-updates enabled. + * + * @param lectures list of affected lectures + * @param newVersion the new version being switched to + */ public static void lectureForcedUpdate(List lectures, LocalImageVersion newVersion) { if (!hasMailConfig()) return; for (LectureSummary lecture : lectures) { - LOGGER.debug("Forced-Update mail for " + lecture.lectureId + " " + lecture.lectureName); List relevantUsers = getUserToMail(lecture); + String message = "Die VM-Version der Veranstaltung '" + lecture.lectureName + + "' wurde gelöscht oder ist beschädigt,\n" + + " daher verweist sie jetzt auf die VM-Version vom " + + Formatter.date(newVersion.createTime) + ".\n" + + " Bitte überprüfen Sie ggf. die Verlinkte VM bzgl. Ihrer Kursinhalte."; for (UserInfo user : relevantUsers) { - LOGGER.debug("Sending forced-update info to " + Formatter.userFullName(user)); + MailQueue.queue(new Mail(user, message)); } } } @@ -65,10 +82,13 @@ public class MailGenerator { if (!hasMailConfig()) return; for (LectureSummary lecture : lectures) { - LOGGER.debug("Deactivated mail for " + lecture.lectureId + " " + lecture.lectureName); List relevantUsers = getUserToMail(lecture); + String message = "Die Veranstaltung '" + lecture.lectureName + "' musste deaktiviert werden," + + "\n da die verknüpfte VM gelöscht oder beschädigt wurde. Bitte prüfen" + + "\n Sie die Veranstaltung und ändern Sie ggf. die Verlinkung," + + "\n damit die Veranstaltung nicht gelöscht wird."; for (UserInfo user : relevantUsers) { - LOGGER.debug("Sending deactivated info to " + Formatter.userFullName(user)); + MailQueue.queue(new Mail(user, message)); } } } @@ -84,8 +104,6 @@ public class MailGenerator { LOGGER.warn("Version Deleted for image=" + imageBaseId + " failed", e); return; } - LOGGER.debug("Sending info mail about deleted image version " - + (oldLocal == null ? "-" : oldLocal.imageVersionId) + " (" + image.imageName + ")"); ImageVersionDetails oldVersion = null; ImageVersionDetails newVersion = null; for (ImageVersionDetails version : image.versions) { @@ -96,9 +114,9 @@ public class MailGenerator { newVersion = version; } } - String message; + String message = "VM '" + image.imageName + "':"; if (newVersion == null) { - message = "Last version deleted; WARNING: No more valid image versions"; + message += "\n Die letzte verbliebene Version der VM wurde gelöscht; VM deaktiviert."; } else { String uploaderName; try { @@ -106,25 +124,21 @@ public class MailGenerator { uploaderName = uploader.ui.firstName + " " + uploader.ui.lastName + " <" + uploader.ui.eMail + ">"; } catch (TNotFoundException | SQLException e) { - uploaderName = "an unknown person"; - ; + uploaderName = "(unbekannt)"; } - if (oldVersion == null) { - message = "Old version deleted;"; - } else { - message = "Old version (created " + Formatter.date(oldVersion.createTime) + ") deleted;"; + message += "\n Neueste Version ist jetzt vom " + Formatter.date(oldVersion.createTime) + + " (erstellt von " + uploaderName + ")"; + if (oldVersion != null) { + message += "\n Zuvor neueste Verson war vom " + Formatter.date(oldVersion.createTime); } - message += " new version now in use was uploaded on " + Formatter.date(newVersion.createTime) - + " by " + uploaderName; } - LOGGER.debug("Mail: " + message); List relevantUsers = getUserToMail(image); for (UserInfo user : relevantUsers) { - LOGGER.debug("Sending mail to " + Formatter.userFullName(user)); + MailQueue.queue(new Mail(user, message)); } } - public static void sendDeletionReminder(LocalImageVersion version, int days) { + public static void sendDeletionReminder(LocalImageVersion version, int days, boolean mailForced) { if (!hasMailConfig()) return; ImageDetailsRead image; @@ -134,10 +148,20 @@ public class MailGenerator { LOGGER.warn("Could not get image details for image version " + version.imageVersionId); return; } + String message; + if (image.latestVersionId == null || image.latestVersionId.equals(version.imageVersionId)) { + message = "Die aktuellste Version der VM '" + image.imageName + "' läuft\n" + " in " + days + + " Tag(en) ab. Bitte aktualisieren Sie die VM."; + } else if (mailForced) { + message = "Eine alte Version der VM '" + image.imageName + "' läuft in " + days + + " Tag(en) ab.\n" + + " Eine aktuellere Version ist vorhanden, diese Nachricht ist rein informell."; + } else { + return; + } List relevantUsers = getUserToMail(image); for (UserInfo user : relevantUsers) { - LOGGER.debug("[img:" + image.imageName + "] Sending warning mail to " - + Formatter.userFullName(user) + " (" + days + " days)"); + MailQueue.queue(new Mail(user, message)); } } @@ -145,9 +169,9 @@ public class MailGenerator { if (!hasMailConfig()) return; List relevantUsers = getUserToMail(lecture); + String message = "Die Veranstaltung '" + lecture.lectureName + "' läuft in " + days + " Tag(en) ab."; for (UserInfo user : relevantUsers) { - LOGGER.debug("[lecture:" + lecture.lectureName + "] Sending warning mail to " - + Formatter.userFullName(user) + " (" + days + " days)"); + MailQueue.queue(new Mail(user, message)); } } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailQueue.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailQueue.java index ae1932e1..0ba396d2 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailQueue.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailQueue.java @@ -199,7 +199,7 @@ public class MailQueue { fullMessage += "\n\nBei weiteren Fragen wenden Sie sich bitte an den Support unter\n" + conf.replyTo; } - fullMessage += "\n\n-----------------------------\n" + "Generiert von " + conf.serverName; + fullMessage += "\n\n--\n" + "Generiert auf " + conf.serverName; return smtpc.send(user.eMail, "[bwLehrstuhl] Hinweise zu Ihren VMs/Veranstaltungen", fullMessage); } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/SmtpMailer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/SmtpMailer.java index 4f1b415e..8d90f860 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/SmtpMailer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/SmtpMailer.java @@ -12,8 +12,6 @@ import java.security.spec.InvalidKeySpecException; import javax.security.auth.login.LoginException; import org.apache.commons.net.PrintCommandListener; -import org.apache.commons.net.ProtocolCommandEvent; -import org.apache.commons.net.ProtocolCommandListener; import org.apache.commons.net.smtp.AuthenticatingSMTPClient; import org.apache.commons.net.smtp.AuthenticatingSMTPClient.AUTH_METHOD; import org.apache.commons.net.smtp.SMTPReply; @@ -52,19 +50,6 @@ public class SmtpMailer { } boolean cleanup = true; try { - new ProtocolCommandListener() { - - @Override - public void protocolReplyReceived(ProtocolCommandEvent event) { - event.getMessage(); - } - - @Override - public void protocolCommandSent(ProtocolCommandEvent event) { - // TODO Auto-generated method stub - - } - }; client.addProtocolCommandListener(new PrintCommandListener(System.out)); client.setConnectTimeout(5000); IOException conEx = null; diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java index 187b7628..53f5941e 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java @@ -98,11 +98,12 @@ public class SendExpireWarning implements Runnable { for (LocalImageVersion version : versions) { final int days = (int) ((version.expireTime - now) / 86400); LOGGER.debug(version.imageVersionId + " expires in " + days); - if ((version.isValid && (days == 14 || days == 7 || days == 1)) - || (!version.isValid && days == 3)) { - MailGenerator.sendDeletionReminder(version, days); + boolean mailNormal = (version.isValid && (days == 14 || days == 7 || days == 1)) + || (!version.isValid && days == 3); + boolean mailForced = version.isValid && days == 1; + if (mailNormal || mailForced) { + MailGenerator.sendDeletionReminder(version, days, mailForced); } } } - } -- cgit v1.2.3-55-g7522