From a22a73cc933f0cc96333a24dd224581ea66cd359 Mon Sep 17 00:00:00 2001 From: netbenix Date: Tue, 23 Nov 2021 12:29:45 +0100 Subject: [PATCH 1/7] Implemented newBackupEntry for MariaDB --- SQL/MariaDBConnector.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/SQL/MariaDBConnector.go b/SQL/MariaDBConnector.go index bd4b0c4..bff477f 100644 --- a/SQL/MariaDBConnector.go +++ b/SQL/MariaDBConnector.go @@ -43,6 +43,12 @@ func checkIfBackupTableExist(db *sql.DB, mariadb MariaDBConnector) bool { return true } +func checkIfBackupEntryExist(db *sql.DB, mariadb MariaDBConnector, backupName string) bool { + rows, _ := db.Query("SELECT * FROM `" + mariadb.Database + "`.Backups WHERE BackupName = '" + backupName + "';") + if !rows.Next(){ return false; } + return true +} + func createMariaDBConnection(mariadb MariaDBConnector) *sql.DB{ logger := Logging.DetailedLogger("MariaDB", "createConnection") db, err := sql.Open("mysql", mariadb.DbUser + ":" + mariadb.DbPassword + "@(" + mariadb.Address + ":" +strconv.Itoa(int(mariadb.Port))+ ")/" + mariadb.Database) @@ -89,4 +95,22 @@ func (mariadb MariaDBConnector) newLogEntry(uuid uuid.UUID, logType LogType, bac } } -func (mariadb MariaDBConnector) newBackupEntry(uuid uuid.UUID, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, durationToBackup time.Duration, hadErrors bool){} \ No newline at end of file + + +func (mariadb MariaDBConnector) newBackupEntry(uuid uuid.UUID, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, durationToBackup time.Duration, hadErrors bool){ + logger := Logging.DetailedLogger("MariaDB", "newBackupEntry") + + db := createMariaDBConnection(mariadb) + + if checkIfBackupEntryExist(db, mariadb, backupName){ + _, err := db.Query("UPDATE `" + mariadb.Database + "`.Backups SET LastBackup = ?, `DurationToBackup (s)` = ?, HadErrors = ? WHERE BackuoName = ?;",lastBackup, durationToBackup, hadErrors, backupName) + if err != nil { + logger.Fatal(err) + } + } else { + _, err := db.Query("INSERT INTO `" + mariadb.Database + "`.Backups VALUES (?, ?, ?, ?, ?, ?, ?, ?);", uuid.String(), lastBackup, localBackup, filePath, strconv.FormatInt(int64(storageType), 10), remotePath, durationToBackup, hadErrors) + if err != nil { + logger.Fatal(err) + } + } +} \ No newline at end of file From 3c8e3e8105a8fa49c21ec494d388c7d556a290e3 Mon Sep 17 00:00:00 2001 From: netbenix Date: Sat, 27 Nov 2021 20:54:27 +0100 Subject: [PATCH 2/7] Updated main.go --- main.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 28e50f9..f880d80 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "github.com/google/uuid" "os" "scabiosa/Compressor" @@ -21,10 +22,11 @@ func main(){ destPath := checkTmpPath(config, backupItem.CreateLocalBackup) bakFile := Compressor.CreateBakFile(backupItem.BackupName + getTimeSuffix(), backupItem.FolderPath, destPath) - StorageTypes.UploadFile(storage, destPath + string(os.PathSeparator) + bakFile) + fmt.Printf(bakFile) + StorageTypes.UploadFile(storage, bakFile) if !backupItem.CreateLocalBackup { - _ = os.Remove(destPath + string(os.PathSeparator) + bakFile) + _ = os.Remove(bakFile) SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupItem.BackupName, SQL.SQLStage_DeleteTmp, SQL.REMOTE_NONE, "Deleted tmp file" ,time.Now()) } @@ -32,6 +34,8 @@ func main(){ } +//TODO Implement SQL Backup entries +//TODO SQL Log backupName is still != config.BackupMane func getTimeSuffix() string{ currTime := time.Now() From 870dc6f30a278cbbb9de0bbb0fbe8b5c734384c5 Mon Sep 17 00:00:00 2001 From: netbenix Date: Sat, 27 Nov 2021 20:54:55 +0100 Subject: [PATCH 3/7] Refactoring of Compression Added multithreading --- Compressor/Compression.go | 98 +++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 45 deletions(-) diff --git a/Compressor/Compression.go b/Compressor/Compression.go index fd8f25b..b6cf34d 100644 --- a/Compressor/Compression.go +++ b/Compressor/Compression.go @@ -2,7 +2,6 @@ package Compressor import ( "archive/tar" - "bytes" "compress/flate" "compress/gzip" "fmt" @@ -15,74 +14,83 @@ import ( "time" ) -func CreateBakFile(filename string, folderPath string, destinationPath string) string { +func CreateBakFile(fileName string, folderPath string, destinationPath string) string { logger := Logging.DetailedLogger("Compression", "CreateBakFile") - var buf bytes.Buffer - compress(folderPath, &buf) + pathToFile := destinationPath + string(os.PathSeparator) + fileName + ".bak" - fileName := filename + ".bak" - - fileToWrite, err := os.OpenFile(destinationPath + string(os.PathSeparator) + fileName, os.O_CREATE|os.O_RDWR, os.FileMode(600)) + fileToWrite, err := os.OpenFile(pathToFile, os.O_CREATE|os.O_RDWR, os.FileMode(600)) if err != nil { logger.Fatal(err) } - - if _, err := io.Copy(fileToWrite, &buf); err != nil { - logger.Fatal(err) - } + compress(fileToWrite, folderPath) SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(folderPath), SQL.SQLStage_Compress, SQL.REMOTE_NONE, "File successfully written.", time.Now()) - - - return fileName + fileToWrite.Close() + return pathToFile } +func compressFile(targetFile *os.File, file string, fi os.FileInfo, folderPath string) error { -func compress(folderPath string, buf io.Writer){ + fileWriter, _ := gzip.NewWriterLevel(targetFile, flate.BestCompression) + tw := tar.NewWriter(fileWriter) + + header, err := tar.FileInfoHeader(fi, file) + if err != nil{ + return err + } + + relPath, _ := filepath.Rel(filepath.Dir(folderPath), file) + header.Name = relPath + + if err := tw.WriteHeader(header); err != nil { + return err + } + + if !fi.IsDir(){ + data, err := os.Open(file) + if err != nil { + return err + } + + fmt.Printf("[%s] Compressing: %s (%d bytes)\n", filepath.Base(folderPath) ,relPath, fi.Size()) + if _, err := io.Copy(tw, data); err != nil { + return err + } + } + + if err := tw.Close(); err != nil { + return err + } + + if err := fileWriter.Close(); err != nil { + return err + } + + return nil +} + +func compress(targetFile *os.File, folderPath string) { logger := Logging.DetailedLogger("Gzip", "compress") - zr, _ := gzip.NewWriterLevel(buf, flate.BestCompression) - tw := tar.NewWriter(zr) - fmt.Printf("[%s] Start compression...\n", filepath.Base(folderPath)) SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(folderPath), SQL.SQLStage_Compress, SQL.REMOTE_NONE, "Start compression", time.Now()) filepath.Walk(folderPath, func(file string, fi os.FileInfo, err error) error { - header, err := tar.FileInfoHeader(fi, file) - if err != nil { - logger.Fatal(err) - } - relPath, _ := filepath.Rel(filepath.Dir(folderPath), file) - - header.Name = relPath - if err := tw.WriteHeader(header); err != nil { - logger.Fatal(err) - } - - if !fi.IsDir(){ - data, err := os.Open(file) + //This delay is to ensure the files don't get a sudden "file aleady close" error + time.Sleep(20 * time.Millisecond) + go func() { + err := compressFile(targetFile, file, fi, folderPath) if err != nil { logger.Fatal(err) } + }() - fmt.Printf("[%s] Compressing: %s (%d bytes)\n", filepath.Base(folderPath) ,relPath, fi.Size()) - if _, err := io.Copy(tw, data); err != nil { - logger.Fatal(err) - } - } return nil }) - if err := tw.Close(); err != nil { - logger.Fatal(err) - } - - if err := zr.Close(); err != nil { - logger.Fatal(err) - } - - + //Wait until all file writes all done + time.Sleep(5 * time.Second) fmt.Printf("[%s] Compression Done.\n", filepath.Base(folderPath)) SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(folderPath), SQL.SQLStage_Compress, SQL.REMOTE_NONE, "Compression complete.", time.Now()) } \ No newline at end of file From 675a8dafb39778625f108ef945975e017be75d5c Mon Sep 17 00:00:00 2001 From: netbenix Date: Sun, 28 Nov 2021 12:33:22 +0100 Subject: [PATCH 4/7] Updated SQL --- SQL/MariaDBConnector.go | 9 ++++----- SQL/SQLInterface.go | 6 +++--- StorageTypes/AzureFileStorage.go | 16 ++++++++++------ StorageTypes/StorageInterface.go | 16 ++++++++++++---- main.go | 6 +++--- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/SQL/MariaDBConnector.go b/SQL/MariaDBConnector.go index bff477f..ccd3ad3 100644 --- a/SQL/MariaDBConnector.go +++ b/SQL/MariaDBConnector.go @@ -62,7 +62,7 @@ func (mariadb MariaDBConnector) createDefaultTables(){ logger := Logging.DetailedLogger("MariaDB", "createDefaultTables") eventLogSQL := "create table " + mariadb.Database +".EventLog\n(\n UUID text null,\n LogType enum ('INFO', 'WARNING', 'ERROR', 'FATAL') null,\n BackupName varchar(256) null,\n Stage enum ('COMPRESS', 'UPLOAD', 'DELETE TMP') null,\n RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null,\n Description text null,\n Timestamp datetime null\n);" - backupSQL := "create table " + mariadb.Database +".Backups\n(\n UUID text null,\n BackupName varchar(256) null,\n LastBackup datetime null,\n LocalBackup tinyint(1) null,\n FilePath varchar(256) null,\n RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null,\n RemotePath varchar(256) null,\n `DurationToBackup (s)` double null,\n HadErrors tinyint(1) null\n);\n\n" + backupSQL := "create table " + mariadb.Database +".Backups\n(\n UUID text null,\n BackupName varchar(256) null,\n LastBackup datetime null,\n LocalBackup tinyint(1) null,\n FilePath varchar(256) null,\n RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null,\n RemotePath varchar(256) null\n);\n\n" db := createMariaDBConnection(mariadb) @@ -86,7 +86,6 @@ func (mariadb MariaDBConnector) createDefaultTables(){ func (mariadb MariaDBConnector) newLogEntry(uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time){ logger := Logging.DetailedLogger("MariaDB", "newLogEntry") - db := createMariaDBConnection(mariadb) _, err := db.Query("INSERT INTO `" + mariadb.Database + "`.EventLog VALUES (?, ?, ?, ?, ?, ?, ?);", uuid.String(), strconv.FormatInt(int64(logType), 10), backupName, stage, strconv.FormatInt(int64(storageType), 10), description ,timestamp) @@ -97,18 +96,18 @@ func (mariadb MariaDBConnector) newLogEntry(uuid uuid.UUID, logType LogType, bac } -func (mariadb MariaDBConnector) newBackupEntry(uuid uuid.UUID, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, durationToBackup time.Duration, hadErrors bool){ +func (mariadb MariaDBConnector) newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string){ logger := Logging.DetailedLogger("MariaDB", "newBackupEntry") db := createMariaDBConnection(mariadb) if checkIfBackupEntryExist(db, mariadb, backupName){ - _, err := db.Query("UPDATE `" + mariadb.Database + "`.Backups SET LastBackup = ?, `DurationToBackup (s)` = ?, HadErrors = ? WHERE BackuoName = ?;",lastBackup, durationToBackup, hadErrors, backupName) + _, err := db.Query("UPDATE `" + mariadb.Database + "`.Backups SET LastBackup = ? WHERE BackupName = ?;", lastBackup, backupName) if err != nil { logger.Fatal(err) } } else { - _, err := db.Query("INSERT INTO `" + mariadb.Database + "`.Backups VALUES (?, ?, ?, ?, ?, ?, ?, ?);", uuid.String(), lastBackup, localBackup, filePath, strconv.FormatInt(int64(storageType), 10), remotePath, durationToBackup, hadErrors) + _, err := db.Query("INSERT INTO `" + mariadb.Database + "`.Backups VALUES (?, ?, ?, ?, ?, ?, ?);", uuid.New(), backupName, lastBackup, localBackup, filePath, strconv.FormatInt(int64(storageType), 10), remotePath) if err != nil { logger.Fatal(err) } diff --git a/SQL/SQLInterface.go b/SQL/SQLInterface.go index b597a51..f0cebc4 100644 --- a/SQL/SQLInterface.go +++ b/SQL/SQLInterface.go @@ -9,7 +9,7 @@ import ( type SQLService interface { createDefaultTables() newLogEntry(uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time) - newBackupEntry(uuid uuid.UUID, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, durationToBackup time.Duration, hadErrors bool) + newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string) } func CreateDefaultTables(sqlService SQLService){ @@ -20,8 +20,8 @@ func NewLogEntry(sqlService SQLService, uuid uuid.UUID, logType LogType, backupN sqlService.newLogEntry(uuid, logType, backupName, stage, storageType, description, timestamp) } -func NewBackupEntry(sqlService SQLService, uuid uuid.UUID, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, durationToBackup time.Duration, hadErrors bool){ - sqlService.newBackupEntry(uuid, backupName, lastBackup, localBackup, filePath, storageType, remotePath, durationToBackup, hadErrors) +func NewBackupEntry(sqlService SQLService, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string){ + sqlService.newBackupEntry(backupName, lastBackup, localBackup, filePath, storageType, remotePath) } func GetSQLInstance() SQLService{ diff --git a/StorageTypes/AzureFileStorage.go b/StorageTypes/AzureFileStorage.go index 73837e1..74aad65 100644 --- a/StorageTypes/AzureFileStorage.go +++ b/StorageTypes/AzureFileStorage.go @@ -23,7 +23,7 @@ type AzureFileStorage struct{ } -func (azure AzureFileStorage) upload(fileName string){ +func (azure AzureFileStorage) upload(fileName string, backupName string){ logger := Logging.DetailedLogger("AzureFileStorage", "upload") file, err := os.Open(fileName) @@ -48,8 +48,8 @@ func (azure AzureFileStorage) upload(fileName string){ ctx := context.Background() - fmt.Printf("[%s] Starting upload to Azure File Share...\n", strings.Trim(filepath.Base(fileName), ".bak")) - SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(fileName), SQL.SQLStage_Upload, SQL.REMOTE_AZURE_FILE, "Starting upload.", time.Now()) + fmt.Printf("[%s] Starting upload to Azure File Share...\n", backupName, ".bak") + SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupName, SQL.SQLStage_Upload, SQL.REMOTE_AZURE_FILE, "Starting upload.", time.Now()) err = azfile.UploadFileToAzureFile(ctx, file, fileURL, azfile.UploadToAzureFileOptions{ @@ -58,11 +58,15 @@ func (azure AzureFileStorage) upload(fileName string){ CacheControl: "no-transform", }, Progress: func(bytesTransferred int64){ - fmt.Printf("[%s] Uploaded %d of %d bytes.\n", strings.Trim(filepath.Base(fileName), ".bak") ,bytesTransferred, fileSize.Size()) + fmt.Printf("[%s] Uploaded %d of %d bytes.\n", strings.Trim(backupName, ".bak") ,bytesTransferred, fileSize.Size()) }}) - fmt.Printf("[%s] Upload finished.\n", strings.Trim(filepath.Base(fileName), ".bak")) - SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(fileName), SQL.SQLStage_Upload, SQL.REMOTE_AZURE_FILE, "Finished upload.", time.Now()) + if err != nil{ + logger.Fatal(err) + } + + fmt.Printf("[%s] Upload finished.\n", strings.Trim(backupName, ".bak")) + SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupName, SQL.SQLStage_Upload, SQL.REMOTE_AZURE_FILE, "Finished upload.", time.Now()) } func readConfig() []byte { diff --git a/StorageTypes/StorageInterface.go b/StorageTypes/StorageInterface.go index b85a5dd..43e243f 100644 --- a/StorageTypes/StorageInterface.go +++ b/StorageTypes/StorageInterface.go @@ -1,11 +1,13 @@ package StorageTypes +import "scabiosa/SQL" + type Storage interface { - upload(fileName string) + upload(fileName string, backupName string) } -func UploadFile(storage Storage, fileName string){ - storage.upload(fileName) +func UploadFile(storage Storage, fileName string, backupName string){ + storage.upload(fileName, backupName) } func CheckStorageType(storageType string) Storage{ @@ -13,6 +15,12 @@ func CheckStorageType(storageType string) Storage{ if storageType == "azure-fileshare"{ return GetAzureStorage() } - return nil +} + +func CheckRemoteStorageType(storageType string) SQL.RemoteStorageType { + if storageType == "azure-fileshare"{ + return SQL.REMOTE_AZURE_FILE + } + return 3 } \ No newline at end of file diff --git a/main.go b/main.go index f880d80..5132f23 100644 --- a/main.go +++ b/main.go @@ -21,15 +21,15 @@ func main(){ storage := StorageTypes.CheckStorageType(backupItem.StorageType) destPath := checkTmpPath(config, backupItem.CreateLocalBackup) - bakFile := Compressor.CreateBakFile(backupItem.BackupName + getTimeSuffix(), backupItem.FolderPath, destPath) + bakFile := Compressor.CreateBakFile(backupItem.BackupName + getTimeSuffix(), backupItem.FolderPath, destPath, backupItem.BackupName) fmt.Printf(bakFile) - StorageTypes.UploadFile(storage, bakFile) + StorageTypes.UploadFile(storage, bakFile, backupItem.BackupName) if !backupItem.CreateLocalBackup { _ = os.Remove(bakFile) SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupItem.BackupName, SQL.SQLStage_DeleteTmp, SQL.REMOTE_NONE, "Deleted tmp file" ,time.Now()) } - + SQL.NewBackupEntry(SQL.GetSQLInstance(), backupItem.BackupName, time.Now(), backupItem.CreateLocalBackup, backupItem.FolderPath, StorageTypes.CheckRemoteStorageType(backupItem.StorageType), StorageTypes.GetAzureStorage().TargetDirectory) } } From d51cf6799753a280f75f7784b7160ce6057a7115 Mon Sep 17 00:00:00 2001 From: netbenix Date: Sun, 28 Nov 2021 12:33:47 +0100 Subject: [PATCH 5/7] Reverted multithreaded compression due to not wanting to work Me sad :c --- Compressor/Compression.go | 105 ++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 56 deletions(-) diff --git a/Compressor/Compression.go b/Compressor/Compression.go index b6cf34d..063276c 100644 --- a/Compressor/Compression.go +++ b/Compressor/Compression.go @@ -2,6 +2,7 @@ package Compressor import ( "archive/tar" + "bytes" "compress/flate" "compress/gzip" "fmt" @@ -14,83 +15,75 @@ import ( "time" ) -func CreateBakFile(fileName string, folderPath string, destinationPath string) string { +func CreateBakFile(fileName string, folderPath string, destinationPath string, backupName string) string { logger := Logging.DetailedLogger("Compression", "CreateBakFile") + var buf bytes.Buffer + compress(folderPath, &buf, backupName) + pathToFile := destinationPath + string(os.PathSeparator) + fileName + ".bak" + fileToWrite, err := os.OpenFile(pathToFile, os.O_CREATE|os.O_RDWR, os.FileMode(600)) if err != nil { logger.Fatal(err) } - compress(fileToWrite, folderPath) - SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(folderPath), SQL.SQLStage_Compress, SQL.REMOTE_NONE, "File successfully written.", time.Now()) - fileToWrite.Close() - return pathToFile + if _, err := io.Copy(fileToWrite, &buf); err != nil { + logger.Fatal(err) + } + + SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupName, SQL.SQLStage_Compress, SQL.REMOTE_NONE, "File successfully written.", time.Now()) + + + return fileName } -func compressFile(targetFile *os.File, file string, fi os.FileInfo, folderPath string) error { - fileWriter, _ := gzip.NewWriterLevel(targetFile, flate.BestCompression) - tw := tar.NewWriter(fileWriter) - - header, err := tar.FileInfoHeader(fi, file) - if err != nil{ - return err - } - - relPath, _ := filepath.Rel(filepath.Dir(folderPath), file) - header.Name = relPath - - if err := tw.WriteHeader(header); err != nil { - return err - } - - if !fi.IsDir(){ - data, err := os.Open(file) - if err != nil { - return err - } - - fmt.Printf("[%s] Compressing: %s (%d bytes)\n", filepath.Base(folderPath) ,relPath, fi.Size()) - if _, err := io.Copy(tw, data); err != nil { - return err - } - } - - if err := tw.Close(); err != nil { - return err - } - - if err := fileWriter.Close(); err != nil { - return err - } - - return nil -} - -func compress(targetFile *os.File, folderPath string) { +func compress(folderPath string, buf io.Writer, backupName string){ logger := Logging.DetailedLogger("Gzip", "compress") - fmt.Printf("[%s] Start compression...\n", filepath.Base(folderPath)) - SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(folderPath), SQL.SQLStage_Compress, SQL.REMOTE_NONE, "Start compression", time.Now()) - filepath.Walk(folderPath, func(file string, fi os.FileInfo, err error) error { + zr, _ := gzip.NewWriterLevel(buf, flate.BestCompression) + tw := tar.NewWriter(zr) - //This delay is to ensure the files don't get a sudden "file aleady close" error - time.Sleep(20 * time.Millisecond) - go func() { - err := compressFile(targetFile, file, fi, folderPath) + fmt.Printf("[%s] Start compression...\n", filepath.Base(folderPath)) + SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupName, SQL.SQLStage_Compress, SQL.REMOTE_NONE, "Start compression", time.Now()) + filepath.Walk(folderPath, func(file string, fi os.FileInfo, err error) error { + header, err := tar.FileInfoHeader(fi, file) + if err != nil { + logger.Fatal(err) + } + + relPath, _ := filepath.Rel(filepath.Dir(folderPath), file) + + header.Name = relPath + if err := tw.WriteHeader(header); err != nil { + logger.Fatal(err) + } + + if !fi.IsDir(){ + data, err := os.Open(file) if err != nil { logger.Fatal(err) } - }() + fmt.Printf("[%s] Compressing: %s (%d bytes)\n", filepath.Base(folderPath) ,relPath, fi.Size()) + if _, err := io.Copy(tw, data); err != nil { + logger.Fatal(err) + } + } return nil }) - //Wait until all file writes all done - time.Sleep(5 * time.Second) + if err := tw.Close(); err != nil { + logger.Fatal(err) + } + + if err := zr.Close(); err != nil { + logger.Fatal(err) + } + + fmt.Printf("[%s] Compression Done.\n", filepath.Base(folderPath)) - SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, filepath.Base(folderPath), SQL.SQLStage_Compress, SQL.REMOTE_NONE, "Compression complete.", time.Now()) + SQL.NewLogEntry(SQL.GetSQLInstance(), uuid.New(), SQL.LogInfo, backupName, SQL.SQLStage_Compress, SQL.REMOTE_NONE, "Compression complete.", time.Now()) } \ No newline at end of file From 612d78c4b2130f8f2179b35077c039a27f51f93b Mon Sep 17 00:00:00 2001 From: netbenix Date: Sun, 28 Nov 2021 12:35:20 +0100 Subject: [PATCH 6/7] Removed todos --- main.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/main.go b/main.go index 5132f23..7a49edf 100644 --- a/main.go +++ b/main.go @@ -34,8 +34,6 @@ func main(){ } -//TODO Implement SQL Backup entries -//TODO SQL Log backupName is still != config.BackupMane func getTimeSuffix() string{ currTime := time.Now() From 8ae3eca9f43e1fbb47e4ce96834e2f2587ca62fa Mon Sep 17 00:00:00 2001 From: netbenix Date: Sun, 28 Nov 2021 12:35:47 +0100 Subject: [PATCH 7/7] Updated .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 66aa1d2..f4d99cc 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ scabiosa # GoLand IDE files .idea/ + +#tmp folder +tmp/