Files
pg-bkup/pkg/restore.go

138 lines
4.0 KiB
Go
Raw Normal View History

2024-09-10 22:59:28 +02:00
// Package pkg /
/*****
@author Jonas Kaninda
@license MIT License <https://opensource.org/licenses/MIT>
@Copyright © 2024 Jonas Kaninda
**/
package pkg
import (
"fmt"
"github.com/jkaninda/pg-bkup/utils"
"github.com/spf13/cobra"
"os"
"os/exec"
"path/filepath"
)
func StartRestore(cmd *cobra.Command) {
2024-09-10 22:59:28 +02:00
utils.Welcome()
//Set env
utils.SetEnv("STORAGE_PATH", storagePath)
//Get flag value and set env
2024-07-31 22:32:07 +02:00
s3Path := utils.GetEnv(cmd, "path", "AWS_S3_PATH")
remotePath := utils.GetEnv(cmd, "path", "SSH_REMOTE_PATH")
storage = utils.GetEnv(cmd, "storage", "STORAGE")
file = utils.GetEnv(cmd, "file", "FILE_NAME")
executionMode, _ = cmd.Flags().GetString("mode")
bucket := utils.GetEnvVariable("AWS_S3_BUCKET_NAME", "BUCKET_NAME")
dbConf = getDbConfig(cmd)
2024-07-29 07:33:26 +02:00
switch storage {
case "s3":
restoreFromS3(dbConf, file, bucket, s3Path)
2024-07-29 07:33:26 +02:00
case "local":
utils.Info("Restore database from local")
copyToTmp(storagePath, file)
RestoreDatabase(dbConf, file)
2024-07-29 07:33:26 +02:00
case "ssh":
restoreFromRemote(dbConf, file, remotePath)
2024-07-29 07:33:26 +02:00
case "ftp":
2024-08-04 01:20:30 +02:00
utils.Fatal("Restore from FTP is not yet supported")
2024-07-29 07:33:26 +02:00
default:
utils.Info("Restore database from local")
copyToTmp(storagePath, file)
RestoreDatabase(dbConf, file)
2024-07-29 07:33:26 +02:00
}
}
func restoreFromS3(db *dbConfig, file, bucket, s3Path string) {
2024-07-31 22:32:07 +02:00
utils.Info("Restore database from s3")
err := utils.DownloadFile(tmpPath, file, bucket, s3Path)
if err != nil {
2024-08-04 01:20:30 +02:00
utils.Fatal("Error download file from s3 %s %v ", file, err)
2024-07-31 22:32:07 +02:00
}
RestoreDatabase(db, file)
2024-07-31 22:32:07 +02:00
}
func restoreFromRemote(db *dbConfig, file, remotePath string) {
2024-07-31 22:32:07 +02:00
utils.Info("Restore database from remote server")
err := CopyFromRemote(file, remotePath)
if err != nil {
2024-08-04 01:20:30 +02:00
utils.Fatal("Error download file from remote server: %s %v", filepath.Join(remotePath, file), err)
2024-07-31 22:32:07 +02:00
}
RestoreDatabase(db, file)
2024-07-31 22:32:07 +02:00
}
2024-01-19 06:49:29 +01:00
// RestoreDatabase restore database
func RestoreDatabase(db *dbConfig, file string) {
gpgPassphrase := os.Getenv("GPG_PASSPHRASE")
if file == "" {
utils.Fatal("Error, file required")
}
extension := filepath.Ext(fmt.Sprintf("%s/%s", tmpPath, file))
if extension == ".gpg" {
if gpgPassphrase == "" {
utils.Fatal("Error: GPG passphrase is required, your file seems to be a GPG file.\nYou need to provide GPG keys. GPG_PASSPHRASE environment variable is required.")
} else {
//Decrypt file
err := Decrypt(filepath.Join(tmpPath, file), gpgPassphrase)
if err != nil {
2024-08-04 01:20:30 +02:00
utils.Fatal("Error decrypting file %s %v", file, err)
}
//Update file name
file = RemoveLastExtension(file)
}
}
2024-08-04 01:20:30 +02:00
err := utils.CheckEnvVars(dbHVars)
if err != nil {
utils.Error("Please make sure all required environment variables for database are set")
utils.Fatal("Error checking environment variables: %s", err)
}
2024-08-04 01:20:30 +02:00
if utils.FileExists(fmt.Sprintf("%s/%s", tmpPath, file)) {
err := os.Setenv("PGPASSWORD", db.dbPassword)
2024-08-04 01:20:30 +02:00
if err != nil {
return
}
testDatabaseConnection(db)
utils.Info("Restoring database...")
2024-08-04 01:20:30 +02:00
extension := filepath.Ext(fmt.Sprintf("%s/%s", tmpPath, file))
// Restore from compressed file / .sql.gz
if extension == ".gz" {
str := "zcat " + fmt.Sprintf("%s/%s", tmpPath, file) + " | psql -h " + db.dbHost + " -p " + db.dbPort + " -U " + db.dbUserName + " -v -d " + db.dbName
2024-08-04 01:20:30 +02:00
_, err := exec.Command("bash", "-c", str).Output()
if err != nil {
2024-08-04 01:20:30 +02:00
utils.Fatal("Error, in restoring the database %v", err)
}
utils.Info("Restoring database... done")
2024-08-04 01:20:30 +02:00
utils.Done("Database has been restored")
//Delete temp
deleteTemp()
2024-08-04 01:20:30 +02:00
} else if extension == ".sql" {
//Restore from sql file
str := "cat " + fmt.Sprintf("%s/%s", tmpPath, file) + " | psql -h " + db.dbHost + " -p " + db.dbPort + " -U " + db.dbUserName + " -v -d " + db.dbName
2024-08-04 01:20:30 +02:00
_, err := exec.Command("bash", "-c", str).Output()
if err != nil {
utils.Fatal("Error in restoring the database %v", err)
}
utils.Info("Restoring database... done")
2024-08-04 01:20:30 +02:00
utils.Done("Database has been restored")
//Delete temp
deleteTemp()
} else {
2024-08-04 01:20:30 +02:00
utils.Fatal("Unknown file extension: %s", extension)
}
2024-08-04 01:20:30 +02:00
} else {
utils.Fatal("File not found in %s", fmt.Sprintf("%s/%s", tmpPath, file))
}
}