implement backup system

This commit is contained in:
HikariKnight 2023-04-10 18:33:48 +02:00
parent 7eb7e2fa1c
commit 300ca653cc
6 changed files with 88 additions and 6 deletions

View file

@ -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))
}

View file

@ -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))
}

View file

@ -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")
}

View file

@ -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

View file

@ -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",
),
)

View file

@ -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)
}
}