forked from j62/ctbrec
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:
parent
287d0804c8
commit
0e4957e4c7
|
@ -5,6 +5,15 @@
|
||||||
object from the persisted groups.json file. Now the model state is updated
|
object from the persisted groups.json file. Now the model state is updated
|
||||||
before performing the check.
|
before performing the check.
|
||||||
* Fixed: File handles not released for failed segments
|
* 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
|
4.7.13
|
||||||
========================
|
========================
|
||||||
|
|
|
@ -17,8 +17,6 @@ import org.slf4j.LoggerFactory;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.StandardCopyOption;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
|
@ -61,6 +59,8 @@ public class Config {
|
||||||
configDir = new File(OS.getConfigDir(), Version.getVersion().toString());
|
configDir = new File(OS.getConfigDir(), Version.getVersion().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
backupConfig(configDir);
|
||||||
|
|
||||||
if (System.getProperty("ctbrec.config") != null) {
|
if (System.getProperty("ctbrec.config") != null) {
|
||||||
filename = System.getProperty("ctbrec.config");
|
filename = System.getProperty("ctbrec.config");
|
||||||
} else {
|
} 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 {
|
private void copyConfigIfNewVersion() throws IOException {
|
||||||
File configDirectory;
|
File configDirectory;
|
||||||
if (System.getProperty(SYSPROP_CONFIG_DIR) != null) {
|
if (System.getProperty(SYSPROP_CONFIG_DIR) != null) {
|
||||||
|
@ -146,7 +170,6 @@ public class Config {
|
||||||
for (Site site : sites) {
|
for (Site site : sites) {
|
||||||
site.setEnabled(!settings.disabledSites.contains(site.getName()));
|
site.setEnabled(!settings.disabledSites.contains(site.getName()));
|
||||||
}
|
}
|
||||||
makeBackup(configFile);
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -238,23 +261,11 @@ public class Config {
|
||||||
if (settings.modelsIgnored != null && !settings.modelsIgnored.isEmpty()) {
|
if (settings.modelsIgnored != null && !settings.modelsIgnored.isEmpty()) {
|
||||||
settings.ignoredModels = settings.modelsIgnored.stream()
|
settings.ignoredModels = settings.modelsIgnored.stream()
|
||||||
.map(Model::getUrl)
|
.map(Model::getUrl)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList()); // NOSONAR modifiable list desired here
|
||||||
settings.modelsIgnored = null;
|
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 {
|
public static synchronized void init(List<Site> sites) throws IOException {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
instance = new Config(sites);
|
instance = new Config(sites);
|
||||||
|
|
Loading…
Reference in New Issue