diff --git a/.classpath b/.classpath index 24785a7..2b1a2cd 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,27 @@ - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project index a4d20f0..a95b20c 100644 --- a/.project +++ b/.project @@ -15,8 +15,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature org.maven.ide.eclipse.maven2Nature diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 80b8578..f9fe345 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,3 +1,4 @@ -#Thu Mar 17 11:56:15 CET 2011 eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 3d385dc..107056a 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,3 @@ -#Sat Feb 19 22:13:15 CET 2011 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/pom.xml b/pom.xml index 0314205..251778b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,82 +1,85 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - SyncTool - synctool - 1.2.1 - jar + SyncTool + synctool + 1.3 + jar - SyncTool - Directory Synchronization Tool - http://www.tilman.de/programme/synctool + SyncTool + Directory Synchronization Tool + http://www.tilman.de/programme/synctool - - UTF-8 - + + UTF-8 + - - - junit - junit - 3.8.1 - test - - - com.martiansoftware - jsap - 2.1 - jar - compile - - - log4j - log4j - 1.2.14 - jar - compile - - - com.h2database - h2 - 1.3.150 - jar - compile - - - commons-codec - commons-codec - 1.4 - jar - compile - - - commons-io - commons-io - 2.0.1 - jar - compile - - - jivesoftware - smack - 3.1.0 - jar - compile - - - jivesoftware - smackx - 3.1.0 - jar - compile - - - org.hsqldb - hsqldb - 2.0.0 - jar - compile - - + + + junit + junit + 3.8.1 + test + + + com.martiansoftware + jsap + 2.1 + jar + compile + + + log4j + log4j + 1.2.17 + + + com.h2database + h2 + 1.3.150 + jar + compile + + + commons-codec + commons-codec + 1.4 + jar + compile + + + commons-io + commons-io + 2.0.1 + jar + compile + + + jivesoftware + smack + 3.1.0 + jar + compile + + + jivesoftware + smackx + 3.1.0 + jar + compile + + + org.hsqldb + hsqldb + 2.0.0 + jar + compile + + + javax.mail + mail + 1.4.5 + + diff --git a/src/main/java/de/tilman/log4j/EmailCollector.java b/src/main/java/de/tilman/log4j/EmailCollector.java new file mode 100644 index 0000000..ea4107c --- /dev/null +++ b/src/main/java/de/tilman/log4j/EmailCollector.java @@ -0,0 +1,98 @@ +package de.tilman.log4j; + +import java.util.LinkedList; +import java.util.Properties; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.LoggingEvent; + +public class EmailCollector extends AppenderSkeleton { + + private final static Logger log = Logger.getLogger(EmailCollector.class); + + /** + * Maximum number of lines to collect + */ + private int bufferSize; + + private LinkedList lineBuffer; + + private String smtpUser; + private String smtpPassword; + private String emailRecipient; + private String emailSubject; + + public EmailCollector(int bufferSize, String smtpUser, String smtpPassword, String emailRecipient, String emailSubject) { + this.bufferSize = bufferSize; + lineBuffer = new LinkedList(); + this.smtpUser= smtpUser; + this.smtpPassword = smtpPassword; + this.emailRecipient = emailRecipient; + this.emailSubject = emailSubject; + } + + /** + * Close the EmailCollector and send collected messages. + * + * @see org.apache.log4j.Appender#close() + */ + @Override + public void close() { + log.info("Sending e-mail report to " + emailRecipient); + + String host = "smtp.gmail.com"; + Properties props = System.getProperties(); + props.put("mail.smtp.starttls.enable", "true"); + props.put("mail.smtp.host", host); + props.put("mail.smtp.user", smtpUser); + props.put("mail.smtp.password", smtpPassword); + props.put("mail.smtp.port", "587"); + props.put("mail.smtp.auth", "true"); + + Session session = Session.getDefaultInstance(props, null); + MimeMessage message = new MimeMessage(session); + try { + message.setFrom(new InternetAddress(smtpUser)); + message.addRecipient(Message.RecipientType.TO, new InternetAddress(emailRecipient)); + message.setSubject(emailSubject); + + StringBuffer sb = new StringBuffer(); + while (lineBuffer.size() > 0) { + sb.append(lineBuffer.poll()); + sb.append("\n"); + } + + message.setText(sb.toString()); + Transport transport = session.getTransport("smtp"); + transport.connect(host, smtpUser, smtpPassword); + transport.sendMessage(message, message.getAllRecipients()); + transport.close(); + } catch (MessagingException e) { + log.error("Error sending e-mail", e); + } + + this.closed = true; + } + + @Override + public boolean requiresLayout() { + return false; + } + + @Override + protected void append(LoggingEvent event) { + if (lineBuffer.size() >= bufferSize) { + lineBuffer.removeFirst(); + } + lineBuffer.add(event.toString()); + } + +} diff --git a/src/main/java/de/tilman/log4j/JabberAppender.java b/src/main/java/de/tilman/log4j/JabberAppender.java index 30063cb..e8c8fa5 100644 --- a/src/main/java/de/tilman/log4j/JabberAppender.java +++ b/src/main/java/de/tilman/log4j/JabberAppender.java @@ -34,7 +34,7 @@ import org.jivesoftware.smack.packet.Message; /** * A simple log4j appender that connects the logger to an XMPP recipient. * - * @author Tilman Walther + * @author Tilman Liero */ public class JabberAppender extends AppenderSkeleton { diff --git a/src/main/java/de/tilman/synctool/SyncTool.java b/src/main/java/de/tilman/synctool/SyncTool.java index 475e359..499c0fe 100644 --- a/src/main/java/de/tilman/synctool/SyncTool.java +++ b/src/main/java/de/tilman/synctool/SyncTool.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 Tilman Walther + * Copyright 2011, 2012 Tilman Liero * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,7 @@ import org.apache.log4j.BasicConfigurator; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.FileAppender; import org.apache.log4j.Level; +import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.RollingFileAppender; @@ -50,13 +51,14 @@ import com.martiansoftware.jsap.JSAPResult; import com.martiansoftware.jsap.Switch; import com.martiansoftware.jsap.UnflaggedOption; +import de.tilman.log4j.EmailCollector; import de.tilman.log4j.JabberAppender; /** * SyncTool synchronized two directories recursively. * - * @author Tilman Walther + * @author Tilman Liero */ public class SyncTool { @@ -449,10 +451,13 @@ public class SyncTool { } + /** + * @param args + */ public static void main(String[] args) { BasicConfigurator.configure(new ConsoleAppender(new PatternLayout("%d{ISO8601} - %m%n"))); - log.info("Starting SyncTool version 1.2.1"); + log.info("Starting SyncTool version 1.3"); JSAP jsap = new JSAP(); @@ -477,6 +482,21 @@ public class SyncTool { logfileOption.setHelp("the path for a logfile to write"); jsap.registerParameter(logfileOption); + FlaggedOption smtpUser = new FlaggedOption("SMTP user").setStringParser(JSAP.STRING_PARSER).setLongFlag( + "smtpuser").setShortFlag('t'); + smtpUser.setHelp("the SMTP user for e-mail reporting"); + jsap.registerParameter(smtpUser); + + FlaggedOption smtpPassword = new FlaggedOption("SMTP password").setStringParser(JSAP.STRING_PARSER).setLongFlag( + "smtppassword").setShortFlag('w'); + smtpPassword.setHelp("the SMTP password used for sending the e-mail report"); + jsap.registerParameter(smtpPassword); + + FlaggedOption emailAddress = new FlaggedOption("e-mail address").setStringParser(JSAP.STRING_PARSER).setLongFlag( + "email").setShortFlag('e'); + emailAddress.setHelp("send logging output as jabber message to the given address"); + jsap.registerParameter(emailAddress); + FlaggedOption jabberAddress = new FlaggedOption("jabber address").setStringParser(JSAP.STRING_PARSER).setLongFlag( "jabber").setShortFlag('j'); jabberAddress.setHelp("send logging output as jabber message to the given address"); @@ -519,7 +539,7 @@ public class SyncTool { FlaggedOption checkFileExists = new FlaggedOption("checkfile").setStringParser(JSAP.STRING_PARSER).setLongFlag( "check-file-exists"); - checkFileExists.setHelp("perfom synchronization only if the given file exists"); + checkFileExists.setHelp("perform synchronization only if the given file exists"); jsap.registerParameter(checkFileExists); Switch debugSwitch = new Switch("debug").setLongFlag("debug"); @@ -570,6 +590,11 @@ public class SyncTool { } } + if (config.getString("SMTP user") != null) { + BasicConfigurator.configure(new EmailCollector(200, config.getString("smtpuser"), config.getString("smtppassword"), config.getString("email"), "SyncTool Report")); + log.info("Prepared e-mail report for " + config.getString("e-mail address")); + } + if (config.getString("jabber address") != null) { try { BasicConfigurator.configure(new JabberAppender(config.getString("jabber address"), config.getString("jabber server"), config.getString("jabber user"), config.getString("jabber password"))); @@ -589,5 +614,8 @@ public class SyncTool { SyncTool syncTool = new SyncTool(config); syncTool.sync(config.getString("source path"), config.getString("destination path")); + + // shutting down the logger will trigger the generation of the e-mail report + LogManager.shutdown(); } }