Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion router/router_download.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func getDownloadBackup(c *gin.Context) {
}

// Locate the backup on the local disk.
b, st, err := backup.LocateLocal(client, token.BackupUuid)
b, st, err := backup.LocateLocal(client, token.BackupUuid, token.ServerUuid)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{
Expand Down
17 changes: 8 additions & 9 deletions router/router_server_backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ func postServerBackup(c *gin.Context) {
var adapter backup.BackupInterface
switch data.Adapter {
case backup.LocalBackupAdapter:
adapter = backup.NewLocal(client, backupUuid, data.Ignore)
adapter = backup.NewLocal(client, backupUuid, s.ID(), data.Ignore)
case backup.S3BackupAdapter:
adapter = backup.NewS3(client, backupUuid, data.Ignore)
adapter = backup.NewS3(client, backupUuid, s.ID(), data.Ignore)
default:
middleware.CaptureAndAbort(c, errors.New("router/backups: provided adapter is not valid: "+string(data.Adapter)))
return
Expand Down Expand Up @@ -137,11 +137,10 @@ func postServerRestoreBackup(c *gin.Context) {
}
}


// Now that we've cleaned up the data directory if necessary, grab the backup file
// and attempt to restore it into the server directory.
if data.Adapter == backup.LocalBackupAdapter {
b, _, err := backup.LocateLocal(client, backupUuid)
b, _, err := backup.LocateLocal(client, backupUuid, s.ID())
if err != nil {
middleware.CaptureAndAbort(c, err)
return
Expand Down Expand Up @@ -182,15 +181,15 @@ func postServerRestoreBackup(c *gin.Context) {
if stderrors.As(err, &downloadErr) {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": downloadErr.Error()})
return
}
}
middleware.CaptureAndAbort(c, err)
return
}
if res.StatusCode != http.StatusOK {
_ = res.Body.Close()
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "The provided backup link returned an invalid response status: " + res.Status})
return
}
}
// Don't allow content types that we know are going to give us problems.
if !isSupportedBackupRestoreContentType(res.Header.Get("Content-Type")) {
_ = res.Body.Close()
Expand All @@ -202,7 +201,7 @@ func postServerRestoreBackup(c *gin.Context) {

go func(s *server.Server, uuid string, logger *log.Entry) {
logger.Info("starting restoration process for server backup using S3 driver")
if err := s.RestoreBackup(backup.NewS3(client, uuid, ""), res.Body); err != nil {
if err := s.RestoreBackup(backup.NewS3(client, uuid, s.ID(), ""), res.Body); err != nil {
logger.WithField("error", errors.WithStack(err)).Error("failed to restore remote S3 backup to server")
}
s.Events().Publish(server.DaemonMessageEvent, "Completed server restoration from S3 backup.")
Expand All @@ -224,7 +223,7 @@ func deleteServerBackup(c *gin.Context) {
if !ok {
return
}
b, _, err := backup.LocateLocal(middleware.ExtractApiClient(c), backupUuid)
b, _, err := backup.LocateLocal(middleware.ExtractApiClient(c), backupUuid, middleware.ExtractServer(c).ID())
if err != nil {
// Just return from the function at this point if the backup was not located.
if errors.Is(err, os.ErrNotExist) {
Expand Down Expand Up @@ -367,4 +366,4 @@ func isSupportedBackupRestoreContentType(value string) bool {
default:
return false
}
}
}
6 changes: 3 additions & 3 deletions server/backup/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,14 @@ func (b *Backup) Path() string {
if err != nil {
identifier = path.Base(b.Identifier())
}
return path.Join(config.Get().System.BackupDirectory, identifier+".tar.gz")
return path.Join(config.Get().System.BackupDirectory, b.ServerId(), identifier+".tar.gz")
Comment thread
QuintenQVD0 marked this conversation as resolved.
}

// Size returns the size of the generated backup.
func (b *Backup) Size() (int64, error) {
if err := b.validateIdentifier(); err != nil {
return 0, err
}
}
st, err := os.Stat(b.Path())
if err != nil {
return 0, err
Expand All @@ -143,7 +143,7 @@ func (b *Backup) Size() (int64, error) {
func (b *Backup) Checksum() ([]byte, error) {
if err := b.validateIdentifier(); err != nil {
return nil, err
}
}
h := sha1.New()

f, err := os.Open(b.Path())
Expand Down
21 changes: 11 additions & 10 deletions server/backup/backup_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,22 @@ type LocalBackup struct {

var _ BackupInterface = (*LocalBackup)(nil)

func NewLocal(client remote.Client, uuid string, ignore string) *LocalBackup {
func NewLocal(client remote.Client, uuid string, suuid string, ignore string) *LocalBackup {
return &LocalBackup{
Backup{
client: client,
Uuid: uuid,
Ignore: ignore,
adapter: LocalBackupAdapter,
client: client,
Uuid: uuid,
ServerUuid: suuid,
Ignore: ignore,
adapter: LocalBackupAdapter,
},
}
}

// LocateLocal finds the backup for a server and returns the local path. This
// will obviously only work if the backup was created as a local backup.
func LocateLocal(client remote.Client, uuid string) (*LocalBackup, os.FileInfo, error) {
b := NewLocal(client, uuid, "")
func LocateLocal(client remote.Client, uuid string, suuid string) (*LocalBackup, os.FileInfo, error) {
b := NewLocal(client, uuid, suuid, "")
if err := b.validateIdentifier(); err != nil {
return nil, nil, err
}
Expand All @@ -55,7 +56,7 @@ func LocateLocal(client remote.Client, uuid string) (*LocalBackup, os.FileInfo,
func (b *LocalBackup) Remove() error {
if err := b.validateIdentifier(); err != nil {
return err
}
}
err := os.Remove(b.Path())
if err != nil {
return err
Expand Down Expand Up @@ -83,7 +84,7 @@ func (b *LocalBackup) WithLogContext(c map[string]interface{}) {
func (b *LocalBackup) Generate(ctx context.Context, fsys *filesystem.Filesystem, ignore string) (*ArchiveDetails, error) {
if err := b.validateIdentifier(); err != nil {
return nil, err
}
}
a := &filesystem.Archive{
Filesystem: fsys,
Ignore: ignore,
Expand Down Expand Up @@ -113,7 +114,7 @@ func (b *LocalBackup) Generate(ctx context.Context, fsys *filesystem.Filesystem,
func (b *LocalBackup) Restore(ctx context.Context, _ io.Reader, callback RestoreCallback) error {
if err := b.validateIdentifier(); err != nil {
return err
}
}
f, err := os.Open(b.Path())
if err != nil {
return err
Expand Down
15 changes: 8 additions & 7 deletions server/backup/backup_s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,14 @@ type S3Backup struct {

var _ BackupInterface = (*S3Backup)(nil)

func NewS3(client remote.Client, uuid string, ignore string) *S3Backup {
func NewS3(client remote.Client, uuid string, suuid string, ignore string) *S3Backup {
return &S3Backup{
Backup{
client: client,
Uuid: uuid,
Ignore: ignore,
adapter: S3BackupAdapter,
client: client,
Uuid: uuid,
ServerUuid: suuid,
Ignore: ignore,
adapter: S3BackupAdapter,
},
}
}
Expand All @@ -41,7 +42,7 @@ func NewS3(client remote.Client, uuid string, ignore string) *S3Backup {
func (s *S3Backup) Remove() error {
if err := s.validateIdentifier(); err != nil {
return err
}
}
return os.Remove(s.Path())
}

Expand Down Expand Up @@ -69,7 +70,7 @@ func (s *S3Backup) Generate(ctx context.Context, fsys *filesystem.Filesystem, ig
if err != nil {
return nil, err
}
}
}
if err := a.Create(ctx, s.Path()); err != nil {
return nil, err
}
Expand Down
8 changes: 4 additions & 4 deletions server/backup/backup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ import (
func TestBackupGenerateRequiresUuidIdentifier(t *testing.T) {
tests := map[string]func(string) BackupInterface{
"local": func(identifier string) BackupInterface {
return NewLocal(nil, identifier, "")
return NewLocal(nil, identifier, "ce6ee345-6729-4aed-8fed-c866c535a69d", "")
},
"s3": func(identifier string) BackupInterface {
return NewS3(nil, identifier, "")
return NewS3(nil, identifier, "ce6ee345-6729-4aed-8fed-c866c535a69d", "")
},
}

Expand All @@ -43,7 +43,7 @@ func TestBackupPathUsesBackupDirectory(t *testing.T) {
"../target/archive",
"nested/archive",
} {
b := NewLocal(nil, identifier, "")
b := NewLocal(nil, identifier, "ce6ee345-6729-4aed-8fed-c866c535a69d", "")
rel, err := filepath.Rel(backupDir, b.Path())
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -100,4 +100,4 @@ func testBackupGenerateRequiresUuidIdentifier(t *testing.T, createBackup func(st
return
}
t.Fatal("expected backup generation not to overwrite existing archive")
}
}
Loading