From: Mathieu Baudier Date: Wed, 3 Oct 2012 16:10:10 +0000 (+0000) Subject: Introduce OS call backup X-Git-Tag: argeo-commons-2.1.30~830 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=fcb34fd19eeadb2ba7becce15faf552e7a4a0b7e;p=lgpl%2Fargeo-commons.git Introduce OS call backup git-svn-id: https://svn.argeo.org/commons/trunk@5585 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/demo/log4j.properties b/demo/log4j.properties index 06e71583d..46e90839b 100644 --- a/demo/log4j.properties +++ b/demo/log4j.properties @@ -6,6 +6,7 @@ log4j.logger.org.argeo.jackrabbit.remote.ExtendedDispatcherServlet=WARN log4j.logger.org.argeo.server.webextender.TomcatDeployer=WARN #log4j.logger.org.springframework.security=DEBUG +log4j.logger.org.apache.commons.exec=DEBUG log4j.logger.org.apache.catalina=INFO log4j.logger.org.apache.coyote=INFO diff --git a/server/runtime/org.argeo.server.core/build.properties b/server/runtime/org.argeo.server.core/build.properties index 23bde2468..ee20c144e 100644 --- a/server/runtime/org.argeo.server.core/build.properties +++ b/server/runtime/org.argeo.server.core/build.properties @@ -1 +1,6 @@ source.. = src/main/java/ +additional.bundles = slf4j.api,\ + slf4j.org.apache.commons.logging,\ + slf4j.log4j,\ + org.apache.log4j + \ No newline at end of file diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java new file mode 100644 index 000000000..84d89d51f --- /dev/null +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java @@ -0,0 +1,98 @@ +package org.argeo.server.backup; + +import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.ExecuteException; +import org.apache.commons.exec.ExecuteStreamHandler; +import org.apache.commons.exec.Executor; +import org.apache.commons.exec.PumpStreamHandler; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.vfs.FileContent; +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.FileSystemManager; +import org.apache.commons.vfs.VFS; +import org.argeo.ArgeoException; + +/** + * Runs a an OS command and save the output as a file. Typically used for MySQL + * dumps + */ +public class OsCallBackup implements Runnable { + + private final static Log log = LogFactory.getLog(OsCallBackup.class); + + private String command; + private Map variables = new HashMap(); + + private String target; + + @Override + public void run() { + try { + Executor executor = new DefaultExecutor(); + + CommandLine commandLine = CommandLine.parse(command, variables); + + // stdout + FileSystemManager fsm = VFS.getManager(); + FileObject targetFo = fsm.resolveFile(target); + FileContent targetContent = targetFo.getContent(); + + // stderr + ByteArrayOutputStream errBos = new ByteArrayOutputStream(); + ExecuteStreamHandler streamHandler = new PumpStreamHandler( + targetContent.getOutputStream(), errBos); + + executor.setStreamHandler(streamHandler); + + try { + if (log.isDebugEnabled()) + log.debug(commandLine.toString()); + + executor.execute(commandLine); + } catch (ExecuteException e) { + byte[] err = errBos.toByteArray(); + String errStr = new String(err); + throw new ArgeoException("Process failed with exit value " + + e.getExitValue() + ": " + errStr); + } + } catch (Exception e) { + throw new ArgeoException("Cannot backup to " + target + + " with command " + command + " " + variables, e); + } + } + + public void setCommand(String command) { + this.command = command; + } + + public void setVariables(Map variables) { + this.variables = variables; + } + + public void setTarget(String target) { + this.target = target; + } + + public static void main(String args[]) { + OsCallBackup osCallBackup = new OsCallBackup(); + osCallBackup.setCommand("/usr/bin/mysqldump" + + " --lock-tables --add-locks --add-drop-table" + + " -u ${dbUser} --password=${dbPassword} --databases ${dbName}"); + Map variables = new HashMap(); + variables.put("dbUser", "root"); + variables.put("dbPassword", ""); + variables.put("dbName", "test"); + osCallBackup.setVariables(variables); + + osCallBackup + .setTarget("/home/mbaudier/dev/src/commons/server/runtime/org.argeo.server.core/target/dump.sql"); + + osCallBackup.run(); + } +}