Introduce PostgreSQL and Subversion backups
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 31 Oct 2012 06:00:02 +0000 (06:00 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 31 Oct 2012 06:00:02 +0000 (06:00 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@5678 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/MySqlBackup.java
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/PostgreSqlBackup.java [new file with mode: 0644]
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SimpleBackupPurge.java
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SvnBackup.java [new file with mode: 0644]
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SystemBackup.java

index e4ec54e346461661dfccddc44c1b7c82541e4316..3fbbc691ff984e414665cefc3c85be9308e1296d 100644 (file)
@@ -2,7 +2,7 @@ package org.argeo.server.backup;
 
 import org.apache.commons.vfs.FileObject;
 
-/** Backups a MySQL database using mysqldump */
+/** Backups a MySQL database using mysqldump. */
 public class MySqlBackup extends OsCallBackup {
        private String mysqldumpLocation = "/usr/bin/mysqldump";
 
@@ -11,20 +11,19 @@ public class MySqlBackup extends OsCallBackup {
        private String dbName;
 
        public MySqlBackup() {
-               super();
        }
 
        public MySqlBackup(String dbUser, String dbPassword, String dbName) {
-               super(dbName + ".sql");
                this.dbUser = dbUser;
                this.dbPassword = dbPassword;
                this.dbName = dbName;
+               init();
        }
 
        @Override
        public void init() {
                if (getName() == null)
-                       setName(dbName + ".sql");
+                       setName(dbName + ".mysql");
                super.init();
        }
 
index 989c29a6872ddebda58f78fd307ff0459aac89a2..a7b6f1c2c405ff7a827044c4fc2aeb5a530b48ad 100644 (file)
@@ -28,6 +28,8 @@ public class OsCallBackup extends AbstractAtomicBackup {
        private Map<String, String> variables = new HashMap<String, String>();
        private Executor executor = new DefaultExecutor();
 
+       private Map<String, String> environment = new HashMap<String, String>();
+
        public OsCallBackup() {
        }
 
@@ -54,7 +56,7 @@ public class OsCallBackup extends AbstractAtomicBackup {
                        ExecuteStreamHandler streamHandler = new PumpStreamHandler(
                                        targetContent.getOutputStream(), errBos);
                        executor.setStreamHandler(streamHandler);
-                       executor.execute(commandLine);
+                       executor.execute(commandLine, environment);
                } catch (ExecuteException e) {
                        byte[] err = errBos.toByteArray();
                        String errStr = new String(err);
@@ -78,6 +80,14 @@ public class OsCallBackup extends AbstractAtomicBackup {
                return command;
        }
 
+       /**
+        * A reference to the environment variables that will be passed to the
+        * process. Empty by default.
+        */
+       protected Map<String, String> getEnvironment() {
+               return environment;
+       }
+
        protected Map<String, String> getVariables() {
                return variables;
        }
diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/PostgreSqlBackup.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/PostgreSqlBackup.java
new file mode 100644 (file)
index 0000000..5eb4f61
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.server.backup;
+
+import org.apache.commons.vfs.FileObject;
+
+/** Backups a PostgreSQL database using pg_dump. */
+public class PostgreSqlBackup extends OsCallBackup {
+       /**
+        * PostgreSQL password environment variable (see
+        * http://stackoverflow.com/questions
+        * /2893954/how-to-pass-in-password-to-pg-dump)
+        */
+       protected final static String PGPASSWORD = "PGPASSWORD";
+
+       private String pgDumpLocation = "/usr/bin/pg_dump";
+
+       private String dbUser;
+       private String dbPassword;
+       private String dbName;
+
+       public PostgreSqlBackup() {
+               super();
+       }
+
+       public PostgreSqlBackup(String dbUser, String dbPassword, String dbName) {
+               this.dbUser = dbUser;
+               this.dbPassword = dbPassword;
+               this.dbName = dbName;
+               init();
+       }
+
+       @Override
+       public void init() {
+               // disable compression since pg_dump is used with -Fc option
+               setCompression(null);
+
+               if (getName() == null)
+                       setName(dbName + ".pgdump");
+               super.init();
+       }
+
+       @Override
+       public void writeBackup(FileObject targetFo) {
+               if (getCommand() == null) {
+                       getEnvironment().put(PGPASSWORD, dbPassword);
+                       setCommand(pgDumpLocation + " -Fc" + " -U ${dbUser} ${dbName}");
+               }
+               getVariables().put("dbUser", dbUser);
+               getVariables().put("dbPassword", dbPassword);
+               getVariables().put("dbName", dbName);
+
+               super.writeBackup(targetFo);
+       }
+
+       public void setDbUser(String dbUser) {
+               this.dbUser = dbUser;
+       }
+
+       public void setDbPassword(String dbPassword) {
+               this.dbPassword = dbPassword;
+       }
+
+       public void setDbName(String dbName) {
+               this.dbName = dbName;
+       }
+
+       public void setPgDumpLocation(String mysqldumpLocation) {
+               this.pgDumpLocation = mysqldumpLocation;
+       }
+
+}
index 3c45c36a040f93bbe1bab3b4c9fae27f0d6ef8db..de80a6737ee1a7ccfa941671f4476a21777729e4 100644 (file)
@@ -32,7 +32,10 @@ public class SimpleBackupPurge implements BackupPurge {
                        SortedMap<DateTime, FileObject> toDelete = new TreeMap<DateTime, FileObject>();
                        int backupCount = 0;
 
-                       // scan backups an list those which should be deleted
+                       // make sure base dir exists
+                       baseFo.createFolder();
+
+                       // scan backups and list those which should be deleted
                        for (FileObject backupFo : baseFo.getChildren()) {
                                String backupName = backupFo.getName().getBaseName();
                                Date backupDate = dateFormat.parse(backupName);
diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SvnBackup.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SvnBackup.java
new file mode 100644 (file)
index 0000000..f1e45c3
--- /dev/null
@@ -0,0 +1,55 @@
+package org.argeo.server.backup;
+
+import java.io.File;
+
+import org.apache.commons.vfs.FileObject;
+
+/** Backups a Subversion repository using svnadmin. */
+public class SvnBackup extends OsCallBackup {
+       private String svnadminLocation = "/usr/bin/svnadmin";
+
+       private String repoLocation;
+       private String repoName;
+
+       public SvnBackup() {
+       }
+
+       public SvnBackup(String repoLocation) {
+               this.repoLocation = repoLocation;
+               init();
+       }
+
+       @Override
+       public void init() {
+               // use directory as repo name
+               if (repoName == null)
+                       repoName = new File(repoLocation).getName();
+
+               if (getName() == null)
+                       setName(repoName + ".svndump");
+               super.init();
+       }
+
+       @Override
+       public void writeBackup(FileObject targetFo) {
+               if (getCommand() == null) {
+                       setCommand(svnadminLocation + " dump " + " ${repoLocation}");
+               }
+               getVariables().put("repoLocation", repoLocation);
+
+               super.writeBackup(targetFo);
+       }
+
+       public void setRepoLocation(String repoLocation) {
+               this.repoLocation = repoLocation;
+       }
+
+       public void setRepoName(String repoName) {
+               this.repoName = repoName;
+       }
+
+       public void setSvnadminLocation(String mysqldumpLocation) {
+               this.svnadminLocation = mysqldumpLocation;
+       }
+
+}
index a8149ee54d18fd5ba1837969d7d57c95d7ab101d..bd4e5210b34983315f243ff2dfcf9d094f43fd18 100644 (file)
@@ -182,6 +182,12 @@ public class SystemBackup implements Runnable {
 
                                MySqlBackup mySqlBackup = new MySqlBackup("root", "", "test");
                                atomicBackups.add(mySqlBackup);
+                               PostgreSqlBackup postgreSqlBackup = new PostgreSqlBackup(
+                                               "argeo", "argeo", "gis_template");
+                               atomicBackups.add(postgreSqlBackup);
+                               SvnBackup svnBackup = new SvnBackup(
+                                               "/home/mbaudier/tmp/testsvnrepo");
+                               atomicBackups.add(svnBackup);
 
                                systemBackup.setAtomicBackups(atomicBackups);