/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.service.job;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import fr.gael.dhus.DHuS;
import fr.gael.dhus.messaging.mail.MailException;
import fr.gael.dhus.messaging.mail.MailServer;
import fr.gael.dhus.system.config.ConfigurationManager;
/**
* Autowired by {@link AutowiringJobFactory}
*/
@Component
public class SendLogsJob extends AbstractJob
{
private static final Logger LOGGER = LogManager.getLogger(SendLogsJob.class);
@Autowired
private ConfigurationManager configurationManager;
@Autowired
private MailServer mailServer;
@Override
public String getCronExpression ()
{
return configurationManager.getSendLogsCronConfiguration ().getSchedule();
}
@Override
protected void executeInternal (JobExecutionContext arg0)
throws JobExecutionException
{
if (!configurationManager.getSendLogsCronConfiguration ().isActive ())
return;
long start = System.currentTimeMillis ();
LOGGER.info("SCHEDULER : Send Administrative logs.");
if (!DHuS.isStarted ())
{
LOGGER.warn("SCHEDULER : Not run while system not fully initialized.");
return;
}
String[] addresses = configurationManager.getSendLogsCronConfiguration ().
getAddresses ().split (",");
// Case of no addresses available: use system support
if ((addresses == null) ||
(addresses.length==0) ||
"".equals (addresses[0].trim()))
{
String email = configurationManager.getSupportConfiguration ().
getMail ();
if ((email == null) || "".equals (email))
{
throw new MailException ("Support e-mail not configured, " +
"system logs will not be send");
}
addresses = new String[] { email };
}
RollingFileAppender rollingFileAppender = (RollingFileAppender)
((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger ()).
getAppenders ().get ("RollingFile");
if (rollingFileAppender == null)
{
throw new MailException ("No rolling log file defined");
}
String logPath = rollingFileAppender.getFileName ();
if ((logPath == null) || logPath.trim ().equals (""))
{
throw new MailException ("Log file not defined");
}
File logs = new File (logPath);
if(!logs.exists ())
{
throw new MailException ("Log file not present : " + logs.getPath ());
}
Date now = new Date ();
SimpleDateFormat df = new SimpleDateFormat ("yyyy-MM-dd'@'HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("GMT"));
String docFilename = configurationManager.getNameConfiguration ().
getShortName ().toLowerCase ()+"-"+df.format (now);
File zipLogs;
try
{
zipLogs = File.createTempFile (docFilename, ".zip");
}
catch (IOException e)
{
throw new MailException ("Cannot create temporary zip log file.", e);
}
// compress logs file to zip format
FileOutputStream fos;
ZipOutputStream zos = null;
FileInputStream fis = null;
try
{
int length;
byte[] buffer = new byte[1024];
ZipEntry entry = new ZipEntry (docFilename + ".txt");
fos = new FileOutputStream (zipLogs);
zos = new ZipOutputStream (fos);
fis = new FileInputStream (logs);
zos.setLevel (Deflater.BEST_COMPRESSION);
zos.putNextEntry (entry);
while ((length = fis.read (buffer)) > 0)
{
zos.write (buffer, 0, length);
}
}
catch (IOException e)
{
throw new MailException ("An error occurred during compression " +
"logs file, cannot send logs !", e);
}
finally
{
try
{
if (fis != null)
{
fis.close ();
}
if (zos != null)
{
zos.closeEntry ();
zos.close ();
}
}
catch (IOException e)
{
throw new MailException ("An error occurred during compression " +
"logs file, cannot send logs !", e);
}
}
EmailAttachment attachment = new EmailAttachment ();
attachment.setDescription (configurationManager.getNameConfiguration ().
getShortName ()+" Logs " + now.toString ());
attachment.setPath (zipLogs.getPath ());
attachment.setName (zipLogs.getName ());
// Prepare the addresses
List<String>ads = new ArrayList<String> ();
for (String email: addresses)
{
StringTokenizer tk = new StringTokenizer (email, ", ");
while (tk.hasMoreTokens ())
{
String token = tk.nextToken ().trim();
if (!token.isEmpty ())
ads.add (token);
}
}
for (String email: ads)
{
try
{
String server = configurationManager.getServerConfiguration ().
getExternalHostname ();
String url = configurationManager.getServerConfiguration ().
getExternalUrl();
mailServer.send (email, null, null,
"["+configurationManager.getNameConfiguration ().getShortName ().
toLowerCase ()+"@"+ server + "] logs of " + df.format (now),
"Here is attached "+configurationManager.getNameConfiguration ().
getShortName ()+" logs of \""+
url + "\" host.\n\n" +
"Kind Regards.\nThe "+configurationManager.
getNameConfiguration ().getShortName ()+" Team.", attachment);
LOGGER.info("Logs Sent to " + email);
}
catch (EmailException e)
{
throw new MailException ("Cannot send logs to " + email, e);
}
}
if (!zipLogs.delete ())
{
LOGGER.warn("Cannot remove mail attachment: " + zipLogs.getAbsolutePath());
}
LOGGER.info("SCHEDULER : Send Administrative logs done - " +
(System.currentTimeMillis ()-start) + "ms");
}
}