92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package backup
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/pterodactyl/wings/api"
|
|
)
|
|
|
|
const (
|
|
LocalBackupAdapter = "wings"
|
|
S3BackupAdapter = "s3"
|
|
)
|
|
|
|
type Request struct {
|
|
Adapter string `json:"adapter"`
|
|
Uuid string `json:"uuid"`
|
|
IgnoredFiles []string `json:"ignored_files"`
|
|
PresignedUrl string `json:"presigned_url"`
|
|
}
|
|
|
|
// Generates a new local backup struct.
|
|
func (r *Request) NewLocalBackup() (*LocalBackup, error) {
|
|
if r.Adapter != LocalBackupAdapter {
|
|
return nil, errors.New(fmt.Sprintf("cannot create local backup using [%s] adapter", r.Adapter))
|
|
}
|
|
|
|
return &LocalBackup{
|
|
Uuid: r.Uuid,
|
|
IgnoredFiles: r.IgnoredFiles,
|
|
}, nil
|
|
}
|
|
|
|
// Generates a new S3 backup struct.
|
|
func (r *Request) NewS3Backup() (*S3Backup, error) {
|
|
if r.Adapter != S3BackupAdapter {
|
|
return nil, errors.New(fmt.Sprintf("cannot create s3 backup using [%s] adapter", r.Adapter))
|
|
}
|
|
|
|
if len(r.PresignedUrl) == 0 {
|
|
return nil, errors.New("a valid presigned S3 upload URL must be provided to use the [s3] adapter")
|
|
}
|
|
|
|
return &S3Backup{
|
|
Uuid: r.Uuid,
|
|
IgnoredFiles: r.IgnoredFiles,
|
|
PresignedUrl: r.PresignedUrl,
|
|
}, nil
|
|
}
|
|
|
|
type Backup interface {
|
|
// Returns the UUID of this backup as tracked by the panel instance.
|
|
Identifier() string
|
|
|
|
// Generates a backup in whatever the configured source for the specific
|
|
// implementation is.
|
|
Backup(*IncludedFiles, string) error
|
|
|
|
// Returns the ignored files for this backup instance.
|
|
Ignored() []string
|
|
|
|
// Returns a SHA256 checksum for the generated backup.
|
|
Checksum() ([]byte, error)
|
|
|
|
// Returns the size of the generated backup.
|
|
Size() (int64, error)
|
|
|
|
// Returns the path to the backup on the machine. This is not always the final
|
|
// storage location of the backup, simply the location we're using to store
|
|
// it until it is moved to the final spot.
|
|
Path() string
|
|
|
|
// Returns details about the archive.
|
|
Details() *ArchiveDetails
|
|
|
|
// Removes a backup file.
|
|
Remove() error
|
|
}
|
|
|
|
type ArchiveDetails struct {
|
|
Checksum string `json:"checksum"`
|
|
Size int64 `json:"size"`
|
|
}
|
|
|
|
// Returns a request object.
|
|
func (ad *ArchiveDetails) ToRequest(successful bool) api.BackupRequest {
|
|
return api.BackupRequest{
|
|
Checksum: ad.Checksum,
|
|
Size: ad.Size,
|
|
Successful: successful,
|
|
}
|
|
}
|