Seperated Zip steps into seperate functions && Added file comparison && Now using /tmp for file operations && Experimental color output && Added extra file and directory logic

Seperated Pacman Database into it's own function so that when the function is called two times it doesn't actually do it.
Added a way to compare two files by reading every byte and then checking if it's the same or not.
For convenience sake the /tmp directory will be used for all temporary file operations like compressing.
Color output is going great. Looks pretty nice.
Before doing anything file related all functions check if the necessary directory exists.
This commit is contained in:
ProfessionalUwU 2023-01-14 04:03:43 +01:00
parent 8a0c93172c
commit eb2b1edf29
3 changed files with 143 additions and 18 deletions

View File

@ -3,12 +3,25 @@
string result = Update.copyEverthingBeforeUpdateToBackupLocation(); string result = Update.copyEverthingBeforeUpdateToBackupLocation();
Console.WriteLine(result); Console.WriteLine(result);
//string result2 = Update.copyEverthingFromBackupLocationToFinalDestination(); bool pacmanDatabaseResult = Update.zipPacmanDatabase();
//Console.WriteLine(result2); Console.WriteLine(pacmanDatabaseResult);
//Console.WriteLine(args.Length); bool result2 = Update.zipAllContentInBackupLocation("pre-backup.zip");
Console.WriteLine(result2);
bool result3 = Update.zipAllContentInBackupLocation(); string result3 = Update.copyEverthingAfterUpdateToBackupLocation();
Console.WriteLine(result3); Console.WriteLine(result3);
bool result4 = Update.zipAllContentInBackupLocation("after-backup.zip");
if (result4) {
Console.WriteLine(result4);
} else {
}
string result5 = Update.copyEverthingFromBackupLocationToFinalDestination(args[0]); // "/artemis/test/"
Console.WriteLine(result5);
//Console.WriteLine(args[0]);
} }
} }

View File

@ -52,11 +52,11 @@ Run executable
- Figure out how to do options/arguments - Figure out how to do options/arguments
- Backup all necessary files - Backup all necessary files
- Shrink size of the executable - Hopefully shrink size of the executable
- Potentially speed up file handling - Potentially speed up file handling
- Color output according to state (success = green, failure = red, info = yellow) - Color output according to state (success = green, failure = red, info = yellow)
- Backup pacman database - Option to change backup location (instead of home)
- Compress all files to single archive - Keep backups for a configurable amount of days
## Sites I used to help make this project ## Sites I used to help make this project
- [dotnetperls](https://dotnetperls.com) - [dotnetperls](https://dotnetperls.com)

134
Update.cs
View File

@ -13,6 +13,11 @@ public class Update {
} }
public static string copyEverthingBeforeUpdateToBackupLocation() { public static string copyEverthingBeforeUpdateToBackupLocation() {
string targetPath = getHomePath() + "/backup/uncompressed/"; string targetPath = getHomePath() + "/backup/uncompressed/";
if (File.Exists(targetPath + "/pacman-after.txt") && File.Exists(targetPath + "/flatpak-after.txt")) {
File.Delete(targetPath + "/pacman-after.txt");
File.Delete(targetPath + "/flatpak-after.txt");
}
string[] systemFilesToCopy = {"/etc/fstab", "/etc/makepkg.conf"}; string[] systemFilesToCopy = {"/etc/fstab", "/etc/makepkg.conf"};
List<string> filesToCopy = new List<string>(systemFilesToCopy); List<string> filesToCopy = new List<string>(systemFilesToCopy);
@ -24,6 +29,40 @@ public class Update {
if (!Directory.Exists(targetPath)) { if (!Directory.Exists(targetPath)) {
Directory.CreateDirectory(targetPath); Directory.CreateDirectory(targetPath);
copyEverthingBeforeUpdateToBackupLocation();
} else {
foreach (string file in filesToCopy) {
FileInfo info = new FileInfo(file);
string destFile = Path.Combine(targetPath, info.Name);
File.Copy(info.FullName, destFile, true);
}
}
string copiedFiles = string.Join(", ", filesToCopy);
Console.ForegroundColor = ConsoleColor.Green;
return $"Copied {copiedFiles} to {targetPath}";
}
public static string copyEverthingAfterUpdateToBackupLocation() {
string targetPath = getHomePath() + "/backup/uncompressed/"; // Use /tmp to zip and then move into /backup/compressed/
if (File.Exists(targetPath + "/pacman-pre.txt") && File.Exists(targetPath + "/flatpak-pre.txt")) {
File.Delete(targetPath + "/pacman-pre.txt");
File.Delete(targetPath + "/flatpak-pre.txt");
File.Delete(targetPath + "/fstab");
File.Delete(targetPath + "/makepkg.conf");
}
List<string> filesToCopy = new List<string>();
string pacmanPackageListBeforeUpdate = getHomePath() + "/pacman-after.txt";
filesToCopy.Add(pacmanPackageListBeforeUpdate);
string flatpakListBeforeUpdate = getHomePath() + "/flatpak-after.txt";
filesToCopy.Add(flatpakListBeforeUpdate);
if (!Directory.Exists(targetPath)) {
Directory.CreateDirectory(targetPath);
copyEverthingAfterUpdateToBackupLocation();
} else { } else {
foreach (string file in filesToCopy) { foreach (string file in filesToCopy) {
FileInfo info = new FileInfo(file); FileInfo info = new FileInfo(file);
@ -41,8 +80,8 @@ public class Update {
/// <summary> /// <summary>
/// Method <c>copyEverthingFromBackupLocationToFinalDestination</c> copies everything to second Backup Location which should be a external drive or a network share. Offsite/Second Backup. /// Method <c>copyEverthingFromBackupLocationToFinalDestination</c> copies everything to second Backup Location which should be a external drive or a network share. Offsite/Second Backup.
/// </summary> /// </summary>
public static string copyEverthingFromBackupLocationToFinalDestination() { public static string copyEverthingFromBackupLocationToFinalDestination(string finalBackupLocation) {
string targetPath = "/artemis/test/"; string targetPath = finalBackupLocation;
if (!Directory.Exists(targetPath)) { if (!Directory.Exists(targetPath)) {
Console.ForegroundColor = ConsoleColor.Red; Console.ForegroundColor = ConsoleColor.Red;
@ -50,7 +89,7 @@ public class Update {
} }
if (targetPath is not null) { if (targetPath is not null) {
string sourcePath = getHomePath() + "/backup/"; string sourcePath = getHomePath() + "/backup/compressed/";
string[] intermediateBackupLocation = Directory.GetFiles(sourcePath); string[] intermediateBackupLocation = Directory.GetFiles(sourcePath);
if (!Directory.Exists(targetPath)) { if (!Directory.Exists(targetPath)) {
@ -70,23 +109,96 @@ public class Update {
} }
} }
public static bool zipAllContentInBackupLocation() { public static bool zipAllContentInBackupLocation(string finalZipName) {
string targetPath = getHomePath() + "/backup/compressed/"; string targetPath = getHomePath() + "/backup/compressed/";
Directory.CreateDirectory(targetPath); Directory.CreateDirectory(targetPath);
string sourcePath = getHomePath() + "/backup/uncompressed/"; string sourcePath = getHomePath() + "/backup/uncompressed/"; // Moved to /tmp
string targetZip = getHomePath() + "/backup/compressed/backup.zip"; string targetZip = getHomePath() + "/backup/compressed/" + finalZipName;
ZipFile.CreateFromDirectory(sourcePath, targetZip);
string pacmanDatabaseLocation = "/var/lib/pacman/local/"; if (!Directory.Exists("/tmp/backup/")) {
string pacmanDatabaseZip = getHomePath() + "/backup/compressed/pacman_database.zip"; Directory.CreateDirectory("/tmp/backup/");
ZipFile.CreateFromDirectory(pacmanDatabaseLocation, pacmanDatabaseZip); }
string newFinalZip = "/tmp/backup/" + finalZipName;
File.Delete(newFinalZip); // Delete residual zip's in tmp
ZipFile.CreateFromDirectory(sourcePath, newFinalZip);
if (File.Exists(targetZip)) {
// ToDo verify if current zip matched old zip. If yes don't create the zip and leave the old one. If it doesn't match delete the old one.
if (!checkForIdenticalFile(targetZip, newFinalZip)) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"{finalZipName} is outdated");
File.Delete(targetZip);
if (File.Exists(newFinalZip)) {
File.Delete(newFinalZip);
zipAllContentInBackupLocation(finalZipName);
} else {
File.Move(newFinalZip, targetZip);
}
} else {
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{finalZipName} is up to date");
}
} else {
ZipFile.CreateFromDirectory(sourcePath, targetZip);
}
if (File.Exists(targetZip) && File.Exists(pacmanDatabaseZip)) { if (File.Exists(targetZip)) {
return true; return true;
} else { } else {
return false; return false;
} }
}
public static bool zipPacmanDatabase() {
string pacmanDatabaseLocation = "/var/lib/pacman/local/";
string pacmanDatabaseZip = getHomePath() + "/backup/compressed/pacman_database.zip";
if (!Directory.Exists("/tmp/backup/")) {
Directory.CreateDirectory("/tmp/backup/");
}
string newPacmanDatabaseZip = "/tmp/backup/pacman_database.zip";
File.Delete(newPacmanDatabaseZip); // Delete residual Pacman Database in tmp
ZipFile.CreateFromDirectory(pacmanDatabaseLocation, newPacmanDatabaseZip);
if (File.Exists(pacmanDatabaseZip)) {
if (!checkForIdenticalFile(pacmanDatabaseZip, newPacmanDatabaseZip)) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Pacman Database is outdated");
File.Delete(pacmanDatabaseZip);
if (File.Exists(newPacmanDatabaseZip)) {
File.Delete(newPacmanDatabaseZip);
zipPacmanDatabase();
} else {
File.Move(newPacmanDatabaseZip, pacmanDatabaseZip);
}
} else {
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Pacman Database is up to date");
}
} else {
ZipFile.CreateFromDirectory(pacmanDatabaseLocation, pacmanDatabaseZip);
}
if (File.Exists(pacmanDatabaseZip)) {
return true;
} else {
return false;
}
}
public static bool checkForIdenticalFile(string existingFilePath, string newFilePath) {
byte[] existingFile = File.ReadAllBytes(existingFilePath);
byte[] newFile = File.ReadAllBytes(newFilePath);
if (existingFile.Length == newFile.Length) {
for (int i=0; i < existingFile.Length; i++) {
if (existingFile[i] != newFile[i]) {
return false;
}
}
return true;
}
return false;
} }
} }