/* * Copyright (c) 2002-2009, The DSpace Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of the DSpace Foundation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.dspace.checker; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import java.util.GregorianCalendar; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.log4j.Logger; import org.dspace.core.ConfigurationManager; /** * <p> * The email reporter creates and sends emails to an administrator. This only * reports information for todays date. It is expected this will be used just * after the checksum checker has been run. * </p> * * @author Jim Downing * @author Grace Carpenter * @author Nathan Sarr * * */ public class DailyReportEmailer { /** log4j logger. */ private static Logger log = Logger.getLogger(DailyReportEmailer.class); /** * Default constructor. */ public DailyReportEmailer() { } /** * Send the report through email. * * @param attachment * the file containing the report * @param numberOfBitstreams * the number of bitstreams reported * * @throws IOException * if IO exception occurs * @throws javax.mail.MessagingException * if message cannot be sent. */ public void sendReport(File attachment, int numberOfBitstreams) throws IOException, javax.mail.MessagingException { // Get the mail configuration properties String server = ConfigurationManager.getProperty("mail.server"); // Set up properties for mail session Properties props = System.getProperties(); props.put("mail.smtp.host", server); // Get session Session session = Session.getDefaultInstance(props, null); MimeMessage msg = new MimeMessage(session); Multipart multipart = new MimeMultipart(); // create the first part of the email BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart .setText("This is the checksum checker report see attachment for details \n" + numberOfBitstreams + " Bitstreams found with POSSIBLE issues"); multipart.addBodyPart(messageBodyPart); // add the file messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachment); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName("checksum_checker_report.txt"); multipart.addBodyPart(messageBodyPart); msg.setContent(multipart); msg.setFrom(new InternetAddress(ConfigurationManager .getProperty("mail.from.address"))); msg.addRecipient(Message.RecipientType.TO, new InternetAddress( ConfigurationManager.getProperty("mail.admin"))); msg.setSentDate(new Date()); msg.setSubject("Checksum checker Report - " + numberOfBitstreams + " Bitstreams found with POSSIBLE issues"); Transport.send(msg); } /** * Allows users to have email sent to them. The default is to send all * reports in one email * * @param args * <dl> * <dt>-h</dt> * <dd>help</dd> * <dt>-d</dt> * <dd>Select deleted bitstreams</dd> * <dt>-m</dt> * <dd>Bitstreams missing from assetstore</dd> * <dt>-c</dt> * <dd>Bitstreams whoses checksums were changed</dd> * <dt>-n</dt> * <dd>Bitstreams whoses checksums were changed</dd> * <dt>-a</dt> * <dd>Send all reports in one email</dd> * </dl> * */ public static void main(String[] args) { // set up command line parser CommandLineParser parser = new PosixParser(); CommandLine line = null; // create an options object and populate it Options options = new Options(); options.addOption("h", "help", false, "Help"); options .addOption("d", "Deleted", false, "Send E-mail report for all bitstreams set as deleted for today"); options .addOption("m", "Missing", false, "Send E-mail report for all bitstreams not found in assetstore for today"); options .addOption( "c", "Changed", false, "Send E-mail report for all bitstreams where checksum has been changed for today"); options.addOption("a", "All", false, "Send all E-mail reports"); options.addOption("u", "Unchecked", false, "Send the Unchecked bitstream report"); options .addOption("n", "Not Processed", false, "Send E-mail report for all bitstreams set to longer be processed for today"); try { line = parser.parse(options, args); } catch (ParseException e) { log.fatal(e); System.exit(1); } // user asks for help if (line.hasOption('h')) { HelpFormatter myhelp = new HelpFormatter(); myhelp.printHelp("Checksum Reporter\n", options); System.out .println("\nSend Deleted bitstream email report: DailyReportEmailer -d"); System.out .println("\nSend Missing bitstreams email report: DailyReportEmailer -m"); System.out .println("\nSend Checksum Changed email report: DailyReportEmailer -c"); System.out .println("\nSend bitstream not to be processed email report: DailyReportEmailer -n"); System.out .println("\nSend Un-checked bitstream report: DailyReportEmailer -u"); System.out.println("\nSend All email reports: DailyReportEmailer"); System.exit(0); } // create a new simple reporter SimpleReporter reporter = new SimpleReporterImpl(); DailyReportEmailer emailer = new DailyReportEmailer(); // get dates for yesterday and tomorrow GregorianCalendar calendar = new GregorianCalendar(); calendar.add(GregorianCalendar.DAY_OF_YEAR, -1); Date yesterday = calendar.getTime(); calendar.add(GregorianCalendar.DAY_OF_YEAR, 2); Date tomorrow = calendar.getTime(); File report = null; FileWriter writer = null; try { // the number of bitstreams in report int numBitstreams = 0; // create a temporary file in the log directory String dirLocation = ConfigurationManager.getProperty("log.dir"); File directory = new File(dirLocation); if (directory.exists() && directory.isDirectory()) { report = File.createTempFile("checker_report", ".txt", directory); } else { throw new IllegalStateException("directory :" + dirLocation + " does not exist"); } writer = new FileWriter(report); if ((line.hasOption("a")) || (line.getOptions().length == 0)) { writer .write("\n--------------------------------- Begin Reporting ------------------------\n\n"); numBitstreams += reporter.getDeletedBitstreamReport(yesterday, tomorrow, writer); writer .write("\n--------------------------------- Report Spacer ---------------------------\n\n"); numBitstreams += reporter.getChangedChecksumReport(yesterday, tomorrow, writer); writer .write("\n--------------------------------- Report Spacer ---------------------------\n\n"); numBitstreams += reporter.getBitstreamNotFoundReport(yesterday, tomorrow, writer); writer .write("\n--------------------------------- Report Spacer ---------------------------\n\n"); numBitstreams += reporter.getNotToBeProcessedReport(yesterday, tomorrow, writer); writer .write("\n--------------------------------- Report Spacer ---------------------------\n\n"); numBitstreams += reporter.getUncheckedBitstreamsReport(writer); writer .write("\n--------------------------------- End Report ---------------------------\n\n"); writer.flush(); writer.close(); emailer.sendReport(report, numBitstreams); } else { if (line.hasOption("d")) { writer .write("\n--------------------------------- Begin Reporting ------------------------\n\n"); numBitstreams += reporter.getDeletedBitstreamReport( yesterday, tomorrow, writer); writer.flush(); writer.close(); emailer.sendReport(report, numBitstreams); } if (line.hasOption("m")) { writer .write("\n--------------------------------- Begin Reporting ------------------------\n\n"); numBitstreams += reporter.getBitstreamNotFoundReport( yesterday, tomorrow, writer); writer.flush(); writer.close(); emailer.sendReport(report, numBitstreams); } if (line.hasOption("c")) { writer .write("\n--------------------------------- Begin Reporting ------------------------\n\n"); numBitstreams += reporter.getChangedChecksumReport( yesterday, tomorrow, writer); writer.flush(); writer.close(); emailer.sendReport(report, numBitstreams); } if (line.hasOption("n")) { writer .write("\n--------------------------------- Begin Reporting ------------------------\n\n"); numBitstreams += reporter.getNotToBeProcessedReport( yesterday, tomorrow, writer); writer.flush(); writer.close(); emailer.sendReport(report, numBitstreams); } if (line.hasOption("u")) { writer .write("\n--------------------------------- Begin Reporting ------------------------\n\n"); numBitstreams += reporter .getUncheckedBitstreamsReport(writer); writer.flush(); writer.close(); emailer.sendReport(report, numBitstreams); } } } catch (Exception e) { log.fatal(e); } finally { if (writer != null) { try { writer.close(); } catch (Exception e) { log.fatal("Could not close writer", e); } } if (report != null) { if (report.exists()) { report.delete(); } } } } }