1 package org
.argeo
.maintenance
.backup
.vfs
;
3 import java
.io
.ByteArrayOutputStream
;
4 import java
.util
.HashMap
;
7 import org
.apache
.commons
.exec
.CommandLine
;
8 import org
.apache
.commons
.exec
.DefaultExecutor
;
9 import org
.apache
.commons
.exec
.ExecuteException
;
10 import org
.apache
.commons
.exec
.ExecuteStreamHandler
;
11 import org
.apache
.commons
.exec
.Executor
;
12 import org
.apache
.commons
.exec
.PumpStreamHandler
;
13 import org
.apache
.commons
.io
.IOUtils
;
14 import org
.apache
.commons
.logging
.Log
;
15 import org
.apache
.commons
.logging
.LogFactory
;
16 import org
.apache
.commons
.vfs2
.FileContent
;
17 import org
.apache
.commons
.vfs2
.FileObject
;
20 * Runs an OS command and save its standard output as a file. Typically used for
21 * MySQL or OpenLDAP dumps.
23 public class OsCallBackup
extends AbstractAtomicBackup
{
24 private final static Log log
= LogFactory
.getLog(OsCallBackup
.class);
26 private String command
;
27 private Map
<String
, String
> variables
= new HashMap
<String
, String
>();
28 private Executor executor
= new DefaultExecutor();
30 private Map
<String
, String
> environment
= new HashMap
<String
, String
>();
32 /** Name of the sudo user, root if "", not sudo if null */
33 private String sudo
= null;
35 public OsCallBackup() {
38 public OsCallBackup(String name
) {
42 public OsCallBackup(String name
, String command
) {
44 this.command
= command
;
48 public void writeBackup(FileObject targetFo
) {
49 String commandToUse
= command
;
54 commandToUse
= "sudo " + commandToUse
;
56 commandToUse
= "sudo -u " + sudo
+ " " + commandToUse
;
59 CommandLine commandLine
= CommandLine
.parse(commandToUse
, variables
);
60 ByteArrayOutputStream errBos
= new ByteArrayOutputStream();
61 if (log
.isTraceEnabled())
62 log
.trace(commandLine
.toString());
66 FileContent targetContent
= targetFo
.getContent();
68 ExecuteStreamHandler streamHandler
= new PumpStreamHandler(targetContent
.getOutputStream(), errBos
);
69 executor
.setStreamHandler(streamHandler
);
70 executor
.execute(commandLine
, environment
);
71 } catch (ExecuteException e
) {
72 byte[] err
= errBos
.toByteArray();
73 String errStr
= new String(err
);
74 throw new MaintenanceException("Process " + commandLine
+ " failed (" + e
.getExitValue() + "): " + errStr
, e
);
75 } catch (Exception e
) {
76 byte[] err
= errBos
.toByteArray();
77 String errStr
= new String(err
);
78 throw new MaintenanceException("Process " + commandLine
+ " failed: " + errStr
, e
);
80 IOUtils
.closeQuietly(errBos
);
84 public void setCommand(String command
) {
85 this.command
= command
;
88 protected String
getCommand() {
93 * A reference to the environment variables that will be passed to the
94 * process. Empty by default.
96 protected Map
<String
, String
> getEnvironment() {
100 protected Map
<String
, String
> getVariables() {
104 public void setVariables(Map
<String
, String
> variables
) {
105 this.variables
= variables
;
108 public void setExecutor(Executor executor
) {
109 this.executor
= executor
;
112 public void setSudo(String sudo
) {