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=eeca1ccc7d60abf78be7aaab3d0a161a0dd45e42;hb=9eb1585fe9b213d55398aedfdd48c998c30b46dc;hp=84d89d51f95743fb4dc3485651458900c30dae6f;hpb=2c6cfdbdc82a3ca09d7c8407386665f744002738;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 index 84d89d51f..eeca1ccc7 100644 --- 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 @@ -10,60 +10,64 @@ 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.io.IOUtils; 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 + * Runs an OS command and save its standard output as a file. Typically used for + * MySQL or OpenLDAP dumps. */ -public class OsCallBackup implements Runnable { - +public class OsCallBackup extends AbstractAtomicBackup { private final static Log log = LogFactory.getLog(OsCallBackup.class); private String command; private Map variables = new HashMap(); + private Executor executor = new DefaultExecutor(); - private String target; + public OsCallBackup() { + } - @Override - public void run() { - try { - Executor executor = new DefaultExecutor(); + public OsCallBackup(String name) { + super(name); + } - CommandLine commandLine = CommandLine.parse(command, variables); + public OsCallBackup(String name, String command) { + super(name); + this.command = command; + } + + @Override + public void writeBackup(FileObject targetFo) { + CommandLine commandLine = CommandLine.parse(command, variables); + ByteArrayOutputStream errBos = new ByteArrayOutputStream(); + if (log.isTraceEnabled()) + log.trace(commandLine.toString()); + try { // 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); - } + executor.execute(commandLine); + } catch (ExecuteException e) { + byte[] err = errBos.toByteArray(); + String errStr = new String(err); + throw new ArgeoException("Process " + commandLine + + " failed with exit value " + e.getExitValue() + ": " + + errStr, e); } catch (Exception e) { - throw new ArgeoException("Cannot backup to " + target - + " with command " + command + " " + variables, e); + byte[] err = errBos.toByteArray(); + String errStr = new String(err); + throw new ArgeoException("Process " + commandLine + " failed: " + + errStr, e); + } finally { + IOUtils.closeQuietly(errBos); } } @@ -71,28 +75,20 @@ public class OsCallBackup implements Runnable { this.command = command; } - public void setVariables(Map variables) { - this.variables = variables; + protected String getCommand() { + return command; } - public void setTarget(String target) { - this.target = target; + protected Map getVariables() { + return variables; } - 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"); + public void setVariables(Map variables) { + this.variables = variables; + } - osCallBackup.run(); + public void setExecutor(Executor executor) { + this.executor = executor; } + }