Compare commits
10 Commits
9c05f3ac83
...
58ae26b4f7
Author | SHA1 | Date | |
---|---|---|---|
58ae26b4f7 | |||
e07cdcfeb0 | |||
eb2b1edf29 | |||
8a0c93172c | |||
378c907146 | |||
21b61759d6 | |||
ed5286435a | |||
ebf5b9e304 | |||
fd07d1ce74 | |||
263f69b2b8 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
.vscode/
|
.vscode/
|
||||||
obj/
|
obj/
|
||||||
bin/
|
bin/
|
||||||
|
justdoit.sh
|
||||||
|
75
Program.cs
75
Program.cs
@ -1,22 +1,57 @@
|
|||||||
using System.Diagnostics;
|
public class Program {
|
||||||
|
static void Main(string[] args) {
|
||||||
|
|
||||||
string homePath;
|
string beforeUpdate() {
|
||||||
if(Environment.OSVersion.Platform == PlatformID.Unix) {
|
|
||||||
homePath = Environment.GetEnvironmentVariable("HOME");
|
Update.copyEverthingBeforeUpdateToBackupLocation();
|
||||||
} else {
|
Update.zipAllContentInBackupLocation("pre-backup.zip");
|
||||||
Console.WriteLine("This script doesn't support your operating system.");
|
Update.zipPacmanDatabase();
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
return "pre-backup complete";
|
||||||
|
}
|
||||||
|
|
||||||
|
string postUpdate() {
|
||||||
|
|
||||||
|
Update.copyEverthingAfterUpdateToBackupLocation();
|
||||||
|
Update.zipAllContentInBackupLocation("post-backup.zip");
|
||||||
|
Update.copyEverthingFromBackupLocationToFinalDestination(args[0]);
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
return "post-backup complete";
|
||||||
|
}
|
||||||
|
|
||||||
|
string testPacmanDatabase() {
|
||||||
|
|
||||||
|
Update.zipPacmanDatabase();
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||||
|
return "Test complete";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?redirectedfrom=MSDN&view=net-7.0
|
||||||
|
|
||||||
|
try {
|
||||||
|
switch(args[1]) {
|
||||||
|
case "pre-backup":
|
||||||
|
beforeUpdate();
|
||||||
|
Console.ResetColor();
|
||||||
|
break;
|
||||||
|
case "post-backup":
|
||||||
|
postUpdate();
|
||||||
|
Console.ResetColor();
|
||||||
|
break;
|
||||||
|
case "testPacmanDatabase":
|
||||||
|
testPacmanDatabase();
|
||||||
|
Console.ResetColor();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Wait! How did you do that?");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Process process = new Process();
|
|
||||||
|
|
||||||
ProcessStartInfo processStartInfo = new ProcessStartInfo();
|
|
||||||
//processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
||||||
processStartInfo.FileName = @"yay";
|
|
||||||
//processStartInfo.WorkingDirectory = homePath;
|
|
||||||
//processStartInfo.Arguments = "--color";
|
|
||||||
processStartInfo.RedirectStandardOutput = false;
|
|
||||||
processStartInfo.RedirectStandardError = false;
|
|
||||||
processStartInfo.UseShellExecute = true;
|
|
||||||
|
|
||||||
process.StartInfo = processStartInfo;
|
|
||||||
process.Start();
|
|
17
README.md
17
README.md
@ -1,6 +1,8 @@
|
|||||||
# update-c#
|
# update-c#
|
||||||
|
|
||||||
A rewrite of the legendary update script in C#
|
A rewrite of the legendary update script in C#
|
||||||
|
|
||||||
|
This time with file handling entirely in C# while keeping all scripting parts in bash.
|
||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
- [@ProfessionalUwU](http://192.168.0.69:3000/ProfessionalUwU)
|
- [@ProfessionalUwU](http://192.168.0.69:3000/ProfessionalUwU)
|
||||||
@ -46,11 +48,20 @@ Run executable
|
|||||||
```bash
|
```bash
|
||||||
./update
|
./update
|
||||||
```
|
```
|
||||||
## Roadmap
|
## Roadmap/ToDo
|
||||||
|
|
||||||
- Figure out how to do options/arguments
|
- Figure out how to do options/arguments
|
||||||
- Backup important files
|
- Backup all necessary files
|
||||||
- Figure out how to make a single executable
|
- Hopefully shrink size of the executable
|
||||||
|
- Potentially speed up file handling
|
||||||
|
- Color output according to state (success = green, failure = red, info = yellow)
|
||||||
|
- Option to change backup location (instead of home)
|
||||||
|
- Keep backups for a configurable amount of days
|
||||||
|
|
||||||
|
## Sites I used to help make this project
|
||||||
|
- [dotnetperls](https://dotnetperls.com)
|
||||||
|
- [stackoverflow](https://stackoverflow.com/questions/tagged/c%23)
|
||||||
|
- [c-sharpcorner](https://www.c-sharpcorner.com)
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Contributions are always welcome!
|
Contributions are always welcome!
|
||||||
|
271
Update.cs
Normal file
271
Update.cs
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO.Compression;
|
||||||
|
|
||||||
|
public class Update {
|
||||||
|
public static string getHomePath() {
|
||||||
|
string homePath = string.Empty;
|
||||||
|
|
||||||
|
if (Environment.OSVersion.Platform == PlatformID.Unix) {
|
||||||
|
homePath = Environment.GetEnvironmentVariable("HOME");
|
||||||
|
return homePath;
|
||||||
|
} else {
|
||||||
|
throw new ApplicationException("This script doesn't support your operating system.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static string copyEverthingBeforeUpdateToBackupLocation() {
|
||||||
|
string targetPath = "/tmp/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"};
|
||||||
|
List<string> filesToCopy = new List<string>(systemFilesToCopy);
|
||||||
|
|
||||||
|
string pacmanPackageListBeforeUpdate = targetPath + "pacman-pre.txt";
|
||||||
|
filesToCopy.Add(pacmanPackageListBeforeUpdate);
|
||||||
|
string flatpakListBeforeUpdate = targetPath+ "flatpak-pre.txt";
|
||||||
|
filesToCopy.Add(flatpakListBeforeUpdate);
|
||||||
|
|
||||||
|
if (!Directory.Exists(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 = "/tmp/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 = targetPath + "pacman-after.txt";
|
||||||
|
filesToCopy.Add(pacmanPackageListBeforeUpdate);
|
||||||
|
string flatpakListBeforeUpdate = targetPath + "flatpak-after.txt";
|
||||||
|
filesToCopy.Add(flatpakListBeforeUpdate);
|
||||||
|
|
||||||
|
if (!Directory.Exists(targetPath)) {
|
||||||
|
Directory.CreateDirectory(targetPath);
|
||||||
|
copyEverthingAfterUpdateToBackupLocation();
|
||||||
|
} 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}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method <c>copyEverthingFromBackupLocationToFinalDestination</c> copies everything to second Backup Location which should be a external drive or a network share. Offsite/Second Backup.
|
||||||
|
/// </summary>
|
||||||
|
public static string copyEverthingFromBackupLocationToFinalDestination(string finalBackupLocation) {
|
||||||
|
string targetPath = finalBackupLocation;
|
||||||
|
|
||||||
|
if (!Directory.Exists(targetPath)) {
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
return $"Backup location does not exist! Please specify one in the config.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetPath is not null) {
|
||||||
|
string sourcePath = getHomePath() + "/backup/compressed/";
|
||||||
|
string[] intermediateBackupLocation = Directory.GetFiles(sourcePath);
|
||||||
|
|
||||||
|
if (!Directory.Exists(targetPath)) {
|
||||||
|
throw new DirectoryNotFoundException("Target directory not found");
|
||||||
|
} else {
|
||||||
|
foreach (string file in intermediateBackupLocation) {
|
||||||
|
FileInfo info = new FileInfo(file);
|
||||||
|
string destFile = Path.Combine(targetPath, info.Name);
|
||||||
|
File.Copy(info.FullName, destFile, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
return $"Copied everything successfully to {targetPath}";
|
||||||
|
} else {
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
return "You have not configured a backup location!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool zipAllContentInBackupLocation(string finalZipName) {
|
||||||
|
string targetPath = getHomePath() + "/backup/compressed/";
|
||||||
|
if (!Directory.Exists(targetPath)) {
|
||||||
|
Directory.CreateDirectory(targetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
string sourcePath = "/tmp/backup/uncompressed/";
|
||||||
|
string targetZip = getHomePath() + "/backup/compressed/" + finalZipName;
|
||||||
|
|
||||||
|
if (!Directory.Exists("/tmp/backup/")) {
|
||||||
|
Directory.CreateDirectory("/tmp/backup/");
|
||||||
|
}
|
||||||
|
string newFinalZip = "/tmp/backup/" + finalZipName;
|
||||||
|
File.Delete(newFinalZip); // Delete residual zip's in tmp
|
||||||
|
ZipFile.CreateFromDirectory(sourcePath, newFinalZip);
|
||||||
|
|
||||||
|
if (File.Exists(targetZip)) {
|
||||||
|
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)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool zipPacmanDatabase() {
|
||||||
|
string pacmanDatabaseLocation = "/var/lib/pacman/local/";
|
||||||
|
string oldPacmanDatabaseZip = getHomePath() + "/backup/compressed/pacman-database.zip";
|
||||||
|
string newPacmanDatabaseZip = "/tmp/backup/compressed/pacman-database.zip";
|
||||||
|
|
||||||
|
if (!Directory.Exists("/tmp/backup/compressed/")) {
|
||||||
|
Directory.CreateDirectory("/tmp/backup/compressed/");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(checkForLckFile("/var/lib/pacman/") == false) { // Only creates the zip if the db.lck doesn't exist
|
||||||
|
|
||||||
|
makeDatabaseLock();
|
||||||
|
|
||||||
|
if (File.Exists(newPacmanDatabaseZip)) { // Delete residual pacman database in tmp
|
||||||
|
File.Delete(newPacmanDatabaseZip);
|
||||||
|
deleteDatabaseLock(); // Delete previous created database lock
|
||||||
|
} else {
|
||||||
|
ZipFile.CreateFromDirectory(pacmanDatabaseLocation, newPacmanDatabaseZip); // If no zip exists create one
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(oldPacmanDatabaseZip)) {
|
||||||
|
if (!checkForIdenticalFile(oldPacmanDatabaseZip, newPacmanDatabaseZip)) {
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("Pacman Database is outdated");
|
||||||
|
File.Delete(oldPacmanDatabaseZip);
|
||||||
|
File.Move(newPacmanDatabaseZip, oldPacmanDatabaseZip);
|
||||||
|
} else {
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
Console.WriteLine("Pacman Database is up to date");
|
||||||
|
File.Delete(newPacmanDatabaseZip);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!File.Exists(newPacmanDatabaseZip)) {
|
||||||
|
ZipFile.CreateFromDirectory(pacmanDatabaseLocation, newPacmanDatabaseZip); // Create the zip in tmp
|
||||||
|
}
|
||||||
|
File.Move(newPacmanDatabaseZip, oldPacmanDatabaseZip);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ApplicationException("db.lck exists. Please try again later.");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
//deleteDatabaseLock(); // Bad practice. Only for debug purpose!
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(oldPacmanDatabaseZip)) {
|
||||||
|
deleteDatabaseLock();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool checkForLckFile(string folderToCheck) {
|
||||||
|
if (Directory.GetFiles(folderToCheck, "*.lck").Length == 1) {
|
||||||
|
return true; // lck file exists
|
||||||
|
} else {
|
||||||
|
return false; // lck file doesn't exists
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void makeDatabaseLock() {
|
||||||
|
var psi = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "/bin/bash",
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
Arguments = string.Format("-c \"cd /var/lib/pacman/ && sudo touch db.lck && sudo chmod 000 db.lck\"")
|
||||||
|
};
|
||||||
|
|
||||||
|
using (var p = Process.Start(psi))
|
||||||
|
{
|
||||||
|
if (p != null)
|
||||||
|
{
|
||||||
|
var strOutput = p.StandardOutput.ReadToEnd();
|
||||||
|
p.WaitForExit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void deleteDatabaseLock() {
|
||||||
|
var psi = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "/bin/bash",
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
Arguments = string.Format("-c \"cd /var/lib/pacman/ && sudo rm -f db.lck\"")
|
||||||
|
};
|
||||||
|
|
||||||
|
using (var p = Process.Start(psi))
|
||||||
|
{
|
||||||
|
if (p != null)
|
||||||
|
{
|
||||||
|
var strOutput = p.StandardOutput.ReadToEnd();
|
||||||
|
p.WaitForExit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,5 +10,9 @@
|
|||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.IO.Compression.ZipFile" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user