X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fbackup%2FOsCallBackup.java;fp=server%2Fruntime%2Forg.argeo.server.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fbackup%2FOsCallBackup.java;h=84d89d51f95743fb4dc3485651458900c30dae6f;hb=fcb34fd19eeadb2ba7becce15faf552e7a4a0b7e;hp=0000000000000000000000000000000000000000;hpb=08ad729f003968658575f6cc110a32492aa6ccc1;p=lgpl%2Fargeo-commons.git 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(); + } +}