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