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
;
18 import org
.argeo
.maintenance
.MaintenanceException
;
21 * Runs an OS command and save its standard output as a file. Typically used for
22 * MySQL or OpenLDAP dumps.
24 public class OsCallBackup
extends AbstractAtomicBackup
{
25 private final static Log log
= LogFactory
.getLog(OsCallBackup
.class);
27 private String command
;
28 private Map
<String
, String
> variables
= new HashMap
<String
, String
>();
29 private Executor executor
= new DefaultExecutor();
31 private Map
<String
, String
> environment
= new HashMap
<String
, String
>();
33 /** Name of the sudo user, root if "", not sudo if null */
34 private String sudo
= null;
36 public OsCallBackup() {
39 public OsCallBackup(String name
) {
43 public OsCallBackup(String name
, String command
) {
45 this.command
= command
;
49 public void writeBackup(FileObject targetFo
) {
50 String commandToUse
= command
;
55 commandToUse
= "sudo " + commandToUse
;
57 commandToUse
= "sudo -u " + sudo
+ " " + commandToUse
;
60 CommandLine commandLine
= CommandLine
.parse(commandToUse
, variables
);
61 ByteArrayOutputStream errBos
= new ByteArrayOutputStream();
62 if (log
.isTraceEnabled())
63 log
.trace(commandLine
.toString());
67 FileContent targetContent
= targetFo
.getContent();
69 ExecuteStreamHandler streamHandler
= new PumpStreamHandler(targetContent
.getOutputStream(), errBos
);
70 executor
.setStreamHandler(streamHandler
);
71 executor
.execute(commandLine
, environment
);
72 } catch (ExecuteException e
) {
73 byte[] err
= errBos
.toByteArray();
74 String errStr
= new String(err
);
75 throw new MaintenanceException("Process " + commandLine
+ " failed (" + e
.getExitValue() + "): " + errStr
, e
);
76 } catch (Exception e
) {
77 byte[] err
= errBos
.toByteArray();
78 String errStr
= new String(err
);
79 throw new MaintenanceException("Process " + commandLine
+ " failed: " + errStr
, e
);
81 IOUtils
.closeQuietly(errBos
);
85 public void setCommand(String command
) {
86 this.command
= command
;
89 protected String
getCommand() {
94 * A reference to the environment variables that will be passed to the
95 * process. Empty by default.
97 protected Map
<String
, String
> getEnvironment() {
101 protected Map
<String
, String
> getVariables() {
105 public void setVariables(Map
<String
, String
> variables
) {
106 this.variables
= variables
;
109 public void setExecutor(Executor executor
) {
110 this.executor
= executor
;
113 public void setSudo(String sudo
) {