From 300ca653cc1b7f3af22edd121d6b7aa441036f96 Mon Sep 17 00:00:00 2001 From: HikariKnight <2557889+HikariKnight@users.noreply.github.com> Date: Mon, 10 Apr 2023 18:33:48 +0200 Subject: [PATCH] implement backup system --- internal/configs/config_dracut.go | 3 +++ internal/configs/config_modprobe.go | 3 +++ internal/configs/configs.go | 39 +++++++++++++++++++++++++++++ internal/ui_main_events.go | 7 +++--- internal/ui_main_view.go | 9 +++++-- pkg/fileio/fileio.go | 33 +++++++++++++++++++++++- 6 files changed, 88 insertions(+), 6 deletions(-) diff --git a/internal/configs/config_dracut.go b/internal/configs/config_dracut.go index 0a87da5..8330031 100644 --- a/internal/configs/config_dracut.go +++ b/internal/configs/config_dracut.go @@ -29,4 +29,7 @@ func Set_Dracut() { // Add to our kernel arguments file that vfio_pci should load early (dracut does this using kernel arguments) fileio.AppendContent(" rd.driver.pre=vfio_pci", config.Path.CMDLINE) + + // Make a backup of dracutConf if there is one there + backupFile(strings.Replace(dracutConf, "config", "", 1)) } diff --git a/internal/configs/config_modprobe.go b/internal/configs/config_modprobe.go index ba8cc3e..227cd61 100644 --- a/internal/configs/config_modprobe.go +++ b/internal/configs/config_modprobe.go @@ -60,4 +60,7 @@ func Set_Modprobe(gpu_IDs []string) { content, conffile, ) + + // Make a backup of dracutConf if there is one there + backupFile(strings.Replace(conffile, "config", "", 1)) } diff --git a/internal/configs/configs.go b/internal/configs/configs.go index 1602ede..dc0096f 100644 --- a/internal/configs/configs.go +++ b/internal/configs/configs.go @@ -95,6 +95,9 @@ func InitConfigs() { confpath, ) + // Make a backup directory + makeBackupDir(syspath) + // Create the directories for our configs err := os.MkdirAll(confpath, os.ModePerm) errorcheck.ErrorCheck(err) @@ -128,6 +131,9 @@ func InitConfigs() { errorcheck.ErrorCheck(err) // Close the file so we can edit it file.Close() + + // Backup the sysfile if we do not have a backup + backupFile(sysfile) } // If we now have a config that exists @@ -179,3 +185,36 @@ func vfio_modules() []string { // Return the modules return modules } + +func backupFile(source string) { + // Make a destination path + dest := fmt.Sprintf("backup%s", source) + + // If the file exists in the config but not on the system it is a file we make + if fileio.FileExist(fmt.Sprintf("config%s", source)) && !fileio.FileExist(source) { + // Create the blank file so that a copy of the backup folder to /etc + file, err := os.Create(dest) + errorcheck.ErrorCheck(err, "Error creating file %s", dest) + file.Close() + } else if !fileio.FileExist(dest) { + // If a backup of the file does not exist + // Write to the logger + logger.Printf("No first time backup of %s detected.\nCreating a backup at %s", source, dest) + + // Copy the file + fileio.FileCopy(source, dest) + } + +} + +func makeBackupDir(dest string) { + // If a backup directory does not exist + if !fileio.FileExist("backup/") { + // Write to the logger + logger.Printf("Backup directory does not exist!\nCreating backup directory for first run backup") + } + + // Make the empty directories + err := os.MkdirAll(fmt.Sprintf("backup/%s", dest), os.ModePerm) + errorcheck.ErrorCheck(err, "Error making backup/ folder") +} diff --git a/internal/ui_main_events.go b/internal/ui_main_events.go index 7de865f..83a3758 100644 --- a/internal/ui_main_events.go +++ b/internal/ui_main_events.go @@ -27,9 +27,6 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if m.focused > 0 && m.focused != DONE { m.focused-- return m, nil - } else if m.focused == DONE { - // Since we have no QuickEmu support, skip the usb controller configuration - m.focused = VIDEO } else { // If we are at the beginning, just exit return m, tea.Quit @@ -39,6 +36,10 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // If we are done then handle keybindings a bit differently // Setup keybindings for authDialog switch msg.String() { + case "ctrl+z": + // Since we have no QuickEmu support, skip the usb controller configuration + m.focused = VIDEO + case "ctrl+c": // Exit when user presses CTRL+C return m, tea.Quit diff --git a/internal/ui_main_view.go b/internal/ui_main_view.go index 7d0651e..d0b448f 100644 --- a/internal/ui_main_view.go +++ b/internal/ui_main_view.go @@ -125,9 +125,14 @@ func (m model) View() string { "* The \"quickemu\" folder contains files that might be\n useable for quickemu in the future\n", "* The files inside the \"etc\" folder must be copied to your system.\n", " NOTE: Verify that these files are correctly formated/edited!\n", + "* Once all files have been copied, you need to update your bootloader and rebuild\n", + " your initramfs using the tools to do so by your system.\n", "\n", - "A script file named \"install.sh\" has been generated,\n", - "run it to copy the files to your system and make a backup of your old files.", + "This program can do this for you, however the program will have to\n", + "type your password to sudo using STDIN, to avoid using STDIN press CTRL+C\n", + "and copy the files, update your bootloader and rebuild your initramfs manually.\n", + "If you want to go back and change something, press CTRL+Z\n", + "\nNOTE: A backup of the original files from the first run can be found in the backup folder", ), ) diff --git a/pkg/fileio/fileio.go b/pkg/fileio/fileio.go index 959394e..38c5a7a 100644 --- a/pkg/fileio/fileio.go +++ b/pkg/fileio/fileio.go @@ -4,13 +4,17 @@ import ( "bufio" "errors" "fmt" + "io" "os" "github.com/HikariKnight/ls-iommu/pkg/errorcheck" ) -// This just implements repetetive tasks I have to do with files +/* + * This just implements repetetive tasks I have to do with files + */ +// Creates a file and appends the content to the file (ending newline must be supplied with content string) func AppendContent(content string, fileName string) { // Open the file f, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm) @@ -22,6 +26,7 @@ func AppendContent(content string, fileName string) { errorcheck.ErrorCheck(err, fmt.Sprintf("Error writing to %s", fileName)) } +// Reads the file and returns a stringlist with each line func ReadLines(fileName string) []string { content, err := os.Open(fileName) errorcheck.ErrorCheck(err, fmt.Sprintf("Error reading file %s", fileName)) @@ -41,6 +46,7 @@ func ReadLines(fileName string) []string { } +// Reads a file and returns all the content as a string func ReadFile(fileName string) string { // Read the whole file content, err := os.ReadFile(fileName) @@ -51,6 +57,7 @@ func ReadFile(fileName string) string { } +// Checks if a file exists and returns a bool func FileExist(fileName string) bool { var exist bool @@ -66,3 +73,27 @@ func FileExist(fileName string) bool { // Return if the file exists return exist } + +// Copies a FILE from source to dest +func FileCopy(sourceFile, destFile string) { + // Get the file info + filestat, err := os.Stat(sourceFile) + errorcheck.ErrorCheck(err, "Error getting fileinfo of: %s", sourceFile) + + // If the file is a regular file + if filestat.Mode().IsRegular() { + // Open the source file for reading + source, err := os.Open(sourceFile) + errorcheck.ErrorCheck(err, "Error opening %s for copying", sourceFile) + defer source.Close() + + // Create the destination file + dest, err := os.Create(destFile) + errorcheck.ErrorCheck(err, "Error creating %s", destFile) + defer dest.Close() + + // Copy the contents of source to dest using io + _, err = io.Copy(dest, source) + errorcheck.ErrorCheck(err, "Failed to copy \"%s\" to \"%s\"", sourceFile, destFile) + } +}