/* * The MIT License * * Copyright (c) 2009-2010, Vincent Sellier * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.jvnet.hudson.plugins.backup.utils; import hudson.model.Hudson; import hudson.util.HudsonIsLoading; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletContext; import org.apache.commons.io.FileUtils; import org.jvnet.hudson.plugins.backup.BackupConfig; import org.jvnet.hudson.plugins.backup.utils.compress.UnArchiver; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; /** * This is the restore task, run in background and log to a file * * @author vsellier */ public class RestoreTask extends BackupPluginTask { private final static Logger LOGGER = Logger.getLogger(RestoreTask.class .getName()); /** * This context will be passed to the StaplerRequest mock * at the end of the restore. It is used be {@link Hudson} to put * the {@link HudsonIsLoading} object. */ private ServletContext servletContext; public RestoreTask(BackupConfig configuration, String hudsonWorkDir, String backupFileName, String logFilePath, ServletContext servletContext) { super(configuration, hudsonWorkDir, backupFileName, logFilePath); this.servletContext = servletContext; } public void run() { assert (logFilePath != null); assert (backupFileName != null); startDate = new Date(); try { logger = new BackupLogger(logFilePath, configuration.isVerbose()); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Unable to open log file for writing : {0}", logFilePath); return; } logger.info("Restore started at " + getTimestamp(startDate)); File directory = new File(hudsonWorkDir); String tempDirectoryPath = hudsonWorkDir + "_restore"; logger.info("Working into " + tempDirectoryPath + " directory"); File temporary_directory = new File(tempDirectoryPath); if (temporary_directory.exists()) { logger.info("A old restore working dir exists, cleaning ..."); try { FileUtils.deleteDirectory(temporary_directory); } catch (IOException e) { logger.error("Unable to delete " + tempDirectoryPath); e.printStackTrace(logger.getWriter()); finished = true; return; } } temporary_directory.mkdir(); File archive = new File(backupFileName); logger.info("Uncompressing archive file..."); UnArchiver unAchiver = configuration.getArchiveType().getUnArchiver(); try { unAchiver.unArchive(archive, tempDirectoryPath); } catch (Exception e) { e.printStackTrace(logger.getWriter()); logger.error("Error uncompressiong archive : " + e.getMessage()); finished = true; return; } // Not using tools like FileUtils.deleteDirectory // because it is failing with non existing symbolic links logger.info("Removing old configuration files..."); delete(directory); logger.info("Making temporary directory the hudson home..."); temporary_directory.renameTo(directory); logger.info("*****************************************"); logger.info("Reloading hudson configuration from disk."); logger.info("*****************************************"); StaplerRequest request = FakeObject.getStaplerRequestFake(servletContext); StaplerResponse response = FakeObject.getStaplerResponseFake(); try { Hudson.getInstance().doReload(request, response); } catch (IOException e) { logger.error("Error reloading config files from disk."); logger.error("Call this method manually"); e.printStackTrace(logger.getWriter()); } endDate = new Date(); logger.info("Backup end at " + getTimestamp(endDate)); BigDecimal delay = new BigDecimal(endDate.getTime() - startDate.getTime()); delay = delay.setScale(2, BigDecimal.ROUND_HALF_UP); delay = delay.divide(new BigDecimal("1000")); logger.info("[" + delay.toPlainString() + "s]"); finished = true; logger.close(); } private void delete(File file) { if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { delete(files[i]); } } if (configuration.isVerbose()) { logger.debug("Deleting " + file.getAbsolutePath()); } file.delete(); } }