1 package org
.argeo
.maintenance
.backup
.vfs
;
3 import java
.util
.ArrayList
;
4 import java
.util
.HashMap
;
8 import org
.apache
.commons
.logging
.Log
;
9 import org
.apache
.commons
.logging
.LogFactory
;
10 import org
.apache
.commons
.vfs2
.FileObject
;
11 import org
.apache
.commons
.vfs2
.FileSystemException
;
12 import org
.apache
.commons
.vfs2
.FileSystemManager
;
13 import org
.apache
.commons
.vfs2
.FileSystemOptions
;
14 import org
.apache
.commons
.vfs2
.Selectors
;
15 import org
.apache
.commons
.vfs2
.UserAuthenticator
;
16 import org
.apache
.commons
.vfs2
.impl
.DefaultFileSystemConfigBuilder
;
17 import org
.argeo
.maintenance
.MaintenanceException
;
18 import org
.argeo
.util
.LangUtils
;
21 * Combines multiple backups and transfer them to a remote location. Purges
22 * remote and local data based on certain criteria.
24 public class SystemBackup
implements Runnable
{
25 private final static Log log
= LogFactory
.getLog(SystemBackup
.class);
27 private FileSystemManager fileSystemManager
;
28 private UserAuthenticator userAuthenticator
= null;
30 private String backupsBase
;
31 private String systemName
;
33 private List
<AtomicBackup
> atomicBackups
= new ArrayList
<AtomicBackup
>();
34 private BackupPurge backupPurge
= new SimpleBackupPurge();
36 private Map
<String
, UserAuthenticator
> remoteBases
= new HashMap
<String
, UserAuthenticator
>();
40 if (atomicBackups
.size() == 0)
41 throw new MaintenanceException("No atomic backup listed");
42 List
<String
> failures
= new ArrayList
<String
>();
44 SimpleBackupContext backupContext
= new SimpleBackupContext(fileSystemManager
, backupsBase
, systemName
);
46 // purge older backups
47 FileSystemOptions opts
= new FileSystemOptions();
49 DefaultFileSystemConfigBuilder
.getInstance().setUserAuthenticator(opts
, userAuthenticator
);
50 } catch (FileSystemException e
) {
51 throw new MaintenanceException("Cannot create authentication", e
);
56 backupPurge
.purge(fileSystemManager
, backupsBase
, systemName
, backupContext
.getDateFormat(), opts
);
57 } catch (Exception e
) {
58 failures
.add("Purge " + backupsBase
+ " failed: " + e
.getMessage());
59 log
.error("Purge of " + backupsBase
+ " failed", e
);
63 for (AtomicBackup atomickBackup
: atomicBackups
) {
65 String target
= atomickBackup
.backup(fileSystemManager
, backupsBase
, backupContext
, opts
);
66 if (log
.isDebugEnabled())
67 log
.debug("Performed backup " + target
);
68 } catch (Exception e
) {
69 String msg
= "Atomic backup " + atomickBackup
.getName() + " failed: "
70 + LangUtils
.chainCausesMessages(e
);
73 if (log
.isTraceEnabled())
74 log
.trace("Stacktrace of atomic backup " + atomickBackup
.getName() + " failure.", e
);
79 for (String remoteBase
: remoteBases
.keySet()) {
80 FileObject localBaseFo
= null;
81 FileObject remoteBaseFo
= null;
82 UserAuthenticator auth
= remoteBases
.get(remoteBase
);
85 FileSystemOptions remoteOpts
= new FileSystemOptions();
87 DefaultFileSystemConfigBuilder
.getInstance().setUserAuthenticator(remoteOpts
, auth
);
88 backupPurge
.purge(fileSystemManager
, remoteBase
, systemName
, backupContext
.getDateFormat(), remoteOpts
);
89 } catch (Exception e
) {
90 failures
.add("Purge " + remoteBase
+ " failed: " + e
.getMessage());
91 log
.error("Cannot purge " + remoteBase
, e
);
95 localBaseFo
= fileSystemManager
.resolveFile(backupsBase
+ '/' + backupContext
.getRelativeFolder(),
97 remoteBaseFo
= fileSystemManager
.resolveFile(remoteBase
+ '/' + backupContext
.getRelativeFolder(),
99 remoteBaseFo
.copyFrom(localBaseFo
, Selectors
.SELECT_ALL
);
100 if (log
.isDebugEnabled())
101 log
.debug("Copied backup to " + remoteBaseFo
+ " from " + localBaseFo
);
103 } catch (Exception e
) {
104 failures
.add("Dispatch to " + remoteBase
+ " failed: " + e
.getMessage());
105 log
.error("Cannot dispatch backups from " + backupContext
.getRelativeFolder() + " to " + remoteBase
, e
);
107 BackupUtils
.closeFOQuietly(localBaseFo
);
108 BackupUtils
.closeFOQuietly(remoteBaseFo
);
111 int failureCount
= 0;
112 if (failures
.size() > 0) {
113 StringBuffer buf
= new StringBuffer();
114 for (String failure
: failures
) {
115 buf
.append('\n').append(failureCount
).append(" - ").append(failure
);
118 throw new MaintenanceException(failureCount
+ " error(s) when running the backup,"
119 + " check the logs and the backups as soon as possible." + buf
);
123 public void setFileSystemManager(FileSystemManager fileSystemManager
) {
124 this.fileSystemManager
= fileSystemManager
;
127 public void setBackupsBase(String backupsBase
) {
128 this.backupsBase
= backupsBase
;
131 public void setSystemName(String name
) {
132 this.systemName
= name
;
135 public void setAtomicBackups(List
<AtomicBackup
> atomicBackups
) {
136 this.atomicBackups
= atomicBackups
;
139 public void setBackupPurge(BackupPurge backupPurge
) {
140 this.backupPurge
= backupPurge
;
143 public void setUserAuthenticator(UserAuthenticator userAuthenticator
) {
144 this.userAuthenticator
= userAuthenticator
;
147 public void setRemoteBases(Map
<String
, UserAuthenticator
> remoteBases
) {
148 this.remoteBases
= remoteBases
;
151 // public static void main(String args[]) {
154 // StandardFileSystemManager fsm = new StandardFileSystemManager();
157 // SystemBackup systemBackup = new SystemBackup();
158 // systemBackup.setSystemName("mySystem");
160 // .setBackupsBase("/home/mbaudier/dev/src/commons/server/runtime/org.argeo.server.core/target");
161 // systemBackup.setFileSystemManager(fsm);
163 // List<AtomicBackup> atomicBackups = new ArrayList<AtomicBackup>();
165 // MySqlBackup mySqlBackup = new MySqlBackup("root", "", "test");
166 // atomicBackups.add(mySqlBackup);
167 // PostgreSqlBackup postgreSqlBackup = new PostgreSqlBackup(
168 // "argeo", "argeo", "gis_template");
169 // atomicBackups.add(postgreSqlBackup);
170 // SvnBackup svnBackup = new SvnBackup(
171 // "/home/mbaudier/tmp/testsvnrepo");
172 // atomicBackups.add(svnBackup);
174 // systemBackup.setAtomicBackups(atomicBackups);
176 // Map<String, UserAuthenticator> remoteBases = new HashMap<String,
177 // UserAuthenticator>();
178 // StaticUserAuthenticator userAuthenticator = new StaticUserAuthenticator(
179 // null, "demo", "demo");
180 // remoteBases.put("sftp://localhost/home/mbaudier/test",
181 // userAuthenticator);
182 // systemBackup.setRemoteBases(remoteBases);
184 // systemBackup.run();
187 // } catch (FileSystemException e) {
188 // // TODO Auto-generated catch block
189 // e.printStackTrace();
195 // Thread.sleep(120 * 1000);
196 // } catch (InterruptedException e) {
197 // e.printStackTrace();