Make a backup of the config directory on startup

On each start the config is backed up in a separate directory. 5 backups are kept, older backups get deleted.
This commit is contained in:
0xb00bface 2022-11-12 18:10:12 +01:00
parent 287d0804c8
commit 0e4957e4c7
2 changed files with 36 additions and 16 deletions

View File

@ -5,6 +5,15 @@
object from the persisted groups.json file. Now the model state is updated
before performing the check.
* Fixed: File handles not released for failed segments
* Changed config backup mechanism: Instead of creating a backup of the config
in case of an error, ctbrec now creates a backup of the config on each start.
Up to 5 backups are kept, older backups will be deleted automatically
The backup will be created right next to the current config dir. E.g.:
```
ctbrec
|- 4.7.13
|- 4.7.13_backup_2022-11-12_18-03-35_712
```
4.7.13
========================

View File

@ -17,8 +17,6 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
@ -61,6 +59,8 @@ public class Config {
configDir = new File(OS.getConfigDir(), Version.getVersion().toString());
}
backupConfig(configDir);
if (System.getProperty("ctbrec.config") != null) {
filename = System.getProperty("ctbrec.config");
} else {
@ -68,6 +68,30 @@ public class Config {
}
}
private void backupConfig(File currentConfigDir) throws IOException {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(RECORDING_DATE_FORMAT);
File src = currentConfigDir;
File target = new File(src.getParentFile(), src.getName() + "_backup_" + dateTimeFormatter.format(LocalDateTime.now()));
LOG.info("Creating a backup of the config in {}", target);
FileUtils.copyDirectory(src, target, pathname -> !(pathname.toString().contains("minimal-browser") && pathname.toString().contains("Cache")), true);
deleteOldBackups(currentConfigDir);
}
private void deleteOldBackups(File currentConfigDir) {
File parent = currentConfigDir.getParentFile();
File[] backupDirectories = parent.listFiles(file -> file.isDirectory() && file.getName().matches(".*?_backup_\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}_\\d{3}"));
Arrays.sort(backupDirectories, Comparator.comparing(File::getName));
for (int i = 0; i < backupDirectories.length - 5; i++) {
File dirToDelete = backupDirectories[i];
try {
LOG.info("Delete old config backup {}", dirToDelete);
IoUtils.deleteDirectory(dirToDelete);
} catch (IOException e) {
LOG.error("Couldn't delete old config backup {}. You might have to delete it manually.", dirToDelete, e);
}
}
}
private void copyConfigIfNewVersion() throws IOException {
File configDirectory;
if (System.getProperty(SYSPROP_CONFIG_DIR) != null) {
@ -146,7 +170,6 @@ public class Config {
for (Site site : sites) {
site.setEnabled(!settings.disabledSites.contains(site.getName()));
}
makeBackup(configFile);
throw e;
}
} else {
@ -238,23 +261,11 @@ public class Config {
if (settings.modelsIgnored != null && !settings.modelsIgnored.isEmpty()) {
settings.ignoredModels = settings.modelsIgnored.stream()
.map(Model::getUrl)
.collect(Collectors.toList());
.collect(Collectors.toList()); // NOSONAR modifiable list desired here
settings.modelsIgnored = null;
}
}
private void makeBackup(File source) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String timestamp = sdf.format(new Date());
String backup = source.getName() + '.' + timestamp;
File target = new File(source.getParentFile(), backup);
Files.copy(source.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
LOG.error("Couldn't create backup of settings file", e);
}
}
public static synchronized void init(List<Site> sites) throws IOException {
if (instance == null) {
instance = new Config(sites);