From 6696d5e2d21eb342b4bb096e059f0c77940fedc9 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 31 Oct 2012 06:00:02 +0000 Subject: [PATCH] Introduce PostgreSQL and Subversion backups git-svn-id: https://svn.argeo.org/commons/trunk@5678 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/server/backup/MySqlBackup.java | 7 +- .../org/argeo/server/backup/OsCallBackup.java | 12 +++- .../argeo/server/backup/PostgreSqlBackup.java | 70 +++++++++++++++++++ .../server/backup/SimpleBackupPurge.java | 5 +- .../org/argeo/server/backup/SvnBackup.java | 55 +++++++++++++++ .../org/argeo/server/backup/SystemBackup.java | 6 ++ 6 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/PostgreSqlBackup.java create mode 100644 server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SvnBackup.java diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/MySqlBackup.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/MySqlBackup.java index e4ec54e34..3fbbc691f 100644 --- a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/MySqlBackup.java +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/MySqlBackup.java @@ -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(); } 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 989c29a68..a7b6f1c2c 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 @@ -28,6 +28,8 @@ public class OsCallBackup extends AbstractAtomicBackup { private Map variables = new HashMap(); private Executor executor = new DefaultExecutor(); + private Map environment = new HashMap(); + 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 getEnvironment() { + return environment; + } + protected Map 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 index 000000000..5eb4f61a2 --- /dev/null +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/PostgreSqlBackup.java @@ -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; + } + +} diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SimpleBackupPurge.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SimpleBackupPurge.java index 3c45c36a0..de80a6737 100644 --- a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SimpleBackupPurge.java +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SimpleBackupPurge.java @@ -32,7 +32,10 @@ public class SimpleBackupPurge implements BackupPurge { SortedMap toDelete = new TreeMap(); 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 index 000000000..f1e45c305 --- /dev/null +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SvnBackup.java @@ -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; + } + +} diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SystemBackup.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SystemBackup.java index a8149ee54..bd4e5210b 100644 --- a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SystemBackup.java +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/SystemBackup.java @@ -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); -- 2.30.2