1 package org
.argeo
.maintenance
.backup
.vfs
;
3 import java
.util
.ArrayList
;
4 import java
.util
.HashMap
;
8 import org
.apache
.commons
.vfs2
.FileObject
;
9 import org
.apache
.commons
.vfs2
.FileSystemException
;
10 import org
.apache
.commons
.vfs2
.FileSystemManager
;
11 import org
.apache
.commons
.vfs2
.FileSystemOptions
;
12 import org
.apache
.commons
.vfs2
.Selectors
;
13 import org
.apache
.commons
.vfs2
.UserAuthenticator
;
14 import org
.apache
.commons
.vfs2
.impl
.DefaultFileSystemConfigBuilder
;
15 import org
.argeo
.api
.cms
.CmsLog
;
16 import org
.argeo
.util
.LangUtils
;
19 * Combines multiple backups and transfer them to a remote location. Purges
20 * remote and local data based on certain criteria.
22 public class SystemBackup
implements Runnable
{
23 private final static CmsLog log
= CmsLog
.getLog(SystemBackup
.class);
25 private FileSystemManager fileSystemManager
;
26 private UserAuthenticator userAuthenticator
= null;
28 private String backupsBase
;
29 private String systemName
;
31 private List
<AtomicBackup
> atomicBackups
= new ArrayList
<AtomicBackup
>();
32 private BackupPurge backupPurge
= new SimpleBackupPurge();
34 private Map
<String
, UserAuthenticator
> remoteBases
= new HashMap
<String
, UserAuthenticator
>();
38 if (atomicBackups
.size() == 0)
39 throw new MaintenanceException("No atomic backup listed");
40 List
<String
> failures
= new ArrayList
<String
>();
42 SimpleBackupContext backupContext
= new SimpleBackupContext(fileSystemManager
, backupsBase
, systemName
);
44 // purge older backups
45 FileSystemOptions opts
= new FileSystemOptions();
47 DefaultFileSystemConfigBuilder
.getInstance().setUserAuthenticator(opts
, userAuthenticator
);
48 } catch (FileSystemException e
) {
49 throw new MaintenanceException("Cannot create authentication", e
);
54 backupPurge
.purge(fileSystemManager
, backupsBase
, systemName
, backupContext
.getDateFormat(), opts
);
55 } catch (Exception e
) {
56 failures
.add("Purge " + backupsBase
+ " failed: " + e
.getMessage());
57 log
.error("Purge of " + backupsBase
+ " failed", e
);
61 for (AtomicBackup atomickBackup
: atomicBackups
) {
63 String target
= atomickBackup
.backup(fileSystemManager
, backupsBase
, backupContext
, opts
);
64 if (log
.isDebugEnabled())
65 log
.debug("Performed backup " + target
);
66 } catch (Exception e
) {
67 String msg
= "Atomic backup " + atomickBackup
.getName() + " failed: "
68 + LangUtils
.chainCausesMessages(e
);
71 if (log
.isTraceEnabled())
72 log
.trace("Stacktrace of atomic backup " + atomickBackup
.getName() + " failure.", e
);
77 for (String remoteBase
: remoteBases
.keySet()) {
78 FileObject localBaseFo
= null;
79 FileObject remoteBaseFo
= null;
80 UserAuthenticator auth
= remoteBases
.get(remoteBase
);
83 FileSystemOptions remoteOpts
= new FileSystemOptions();
85 DefaultFileSystemConfigBuilder
.getInstance().setUserAuthenticator(remoteOpts
, auth
);
86 backupPurge
.purge(fileSystemManager
, remoteBase
, systemName
, backupContext
.getDateFormat(), remoteOpts
);
87 } catch (Exception e
) {
88 failures
.add("Purge " + remoteBase
+ " failed: " + e
.getMessage());
89 log
.error("Cannot purge " + remoteBase
, e
);
93 localBaseFo
= fileSystemManager
.resolveFile(backupsBase
+ '/' + backupContext
.getRelativeFolder(),
95 remoteBaseFo
= fileSystemManager
.resolveFile(remoteBase
+ '/' + backupContext
.getRelativeFolder(),
97 remoteBaseFo
.copyFrom(localBaseFo
, Selectors
.SELECT_ALL
);
98 if (log
.isDebugEnabled())
99 log
.debug("Copied backup to " + remoteBaseFo
+ " from " + localBaseFo
);
101 } catch (Exception e
) {
102 failures
.add("Dispatch to " + remoteBase
+ " failed: " + e
.getMessage());
103 log
.error("Cannot dispatch backups from " + backupContext
.getRelativeFolder() + " to " + remoteBase
, e
);
105 BackupUtils
.closeFOQuietly(localBaseFo
);
106 BackupUtils
.closeFOQuietly(remoteBaseFo
);
109 int failureCount
= 0;
110 if (failures
.size() > 0) {
111 StringBuffer buf
= new StringBuffer();
112 for (String failure
: failures
) {
113 buf
.append('\n').append(failureCount
).append(" - ").append(failure
);
116 throw new MaintenanceException(failureCount
+ " error(s) when running the backup,"
117 + " check the logs and the backups as soon as possible." + buf
);
121 public void setFileSystemManager(FileSystemManager fileSystemManager
) {
122 this.fileSystemManager
= fileSystemManager
;
125 public void setBackupsBase(String backupsBase
) {
126 this.backupsBase
= backupsBase
;
129 public void setSystemName(String name
) {
130 this.systemName
= name
;
133 public void setAtomicBackups(List
<AtomicBackup
> atomicBackups
) {
134 this.atomicBackups
= atomicBackups
;
137 public void setBackupPurge(BackupPurge backupPurge
) {
138 this.backupPurge
= backupPurge
;
141 public void setUserAuthenticator(UserAuthenticator userAuthenticator
) {
142 this.userAuthenticator
= userAuthenticator
;
145 public void setRemoteBases(Map
<String
, UserAuthenticator
> remoteBases
) {
146 this.remoteBases
= remoteBases
;
149 // public static void main(String args[]) {
152 // StandardFileSystemManager fsm = new StandardFileSystemManager();
155 // SystemBackup systemBackup = new SystemBackup();
156 // systemBackup.setSystemName("mySystem");
158 // .setBackupsBase("/home/mbaudier/dev/src/commons/server/runtime/org.argeo.server.core/target");
159 // systemBackup.setFileSystemManager(fsm);
161 // List<AtomicBackup> atomicBackups = new ArrayList<AtomicBackup>();
163 // MySqlBackup mySqlBackup = new MySqlBackup("root", "", "test");
164 // atomicBackups.add(mySqlBackup);
165 // PostgreSqlBackup postgreSqlBackup = new PostgreSqlBackup(
166 // "argeo", "argeo", "gis_template");
167 // atomicBackups.add(postgreSqlBackup);
168 // SvnBackup svnBackup = new SvnBackup(
169 // "/home/mbaudier/tmp/testsvnrepo");
170 // atomicBackups.add(svnBackup);
172 // systemBackup.setAtomicBackups(atomicBackups);
174 // Map<String, UserAuthenticator> remoteBases = new HashMap<String,
175 // UserAuthenticator>();
176 // StaticUserAuthenticator userAuthenticator = new StaticUserAuthenticator(
177 // null, "demo", "demo");
178 // remoteBases.put("sftp://localhost/home/mbaudier/test",
179 // userAuthenticator);
180 // systemBackup.setRemoteBases(remoteBases);
182 // systemBackup.run();
185 // } catch (FileSystemException e) {
186 // // TODO Auto-generated catch block
187 // e.printStackTrace();
193 // Thread.sleep(120 * 1000);
194 // } catch (InterruptedException e) {
195 // e.printStackTrace();