diff --git a/.gitignore b/.gitignore index e39c86a..15dbd0e 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,4 @@ test_*/ !.gitkeep debug data/.states.json +.DS_Store diff --git a/router/router_server_backup.go b/router/router_server_backup.go index b81074c..a405042 100644 --- a/router/router_server_backup.go +++ b/router/router_server_backup.go @@ -1,6 +1,8 @@ package router import ( + "errors" + "fmt" "github.com/gin-gonic/gin" "github.com/pterodactyl/wings/server" "github.com/pterodactyl/wings/server/backup" @@ -12,14 +14,27 @@ import ( func postServerBackup(c *gin.Context) { s := GetServer(c.Param("server")) - data := &backup.LocalBackup{} + data := &backup.Request{} c.BindJSON(&data) - go func(b *backup.LocalBackup, serv *server.Server) { - if err := serv.BackupLocal(b); err != nil { - zap.S().Errorw("failed to generate backup for server", zap.Error(err)) + switch data.Adapter { + case backup.LocalBackupAdapter: + adapter, err := data.NewLocalBackup() + if err != nil { + TrackedServerError(err, s).AbortWithServerError(c) + return } - }(data, s) + + go func(b *backup.LocalBackup, serv *server.Server) { + if err := serv.BackupLocal(b); err != nil { + zap.S().Errorw("failed to generate backup for server", zap.Error(err)) + } + }(adapter, s) + case backup.S3BackupAdapter: + TrackedServerError(errors.New(fmt.Sprintf("unsupported backup adapter [%s] provided", data.Adapter)), s).AbortWithServerError(c) + default: + TrackedServerError(errors.New(fmt.Sprintf("unknown backup adapter [%s] provided", data.Adapter)), s).AbortWithServerError(c) + } c.Status(http.StatusAccepted) } @@ -40,4 +55,4 @@ func deleteServerBackup(c *gin.Context) { } c.Status(http.StatusNoContent) -} \ No newline at end of file +} diff --git a/server/backup/backup.go b/server/backup/backup.go index 70eda89..5e25f3c 100644 --- a/server/backup/backup.go +++ b/server/backup/backup.go @@ -1,9 +1,35 @@ package backup import ( + "errors" + "fmt" "github.com/pterodactyl/wings/api" ) +const ( + LocalBackupAdapter = "local" + 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 +} + type Backup interface { // Returns the UUID of this backup as tracked by the panel instance. Identifier() string @@ -39,4 +65,4 @@ func (ad *ArchiveDetails) ToRequest(successful bool) api.BackupRequest { Size: ad.Size, Successful: successful, } -} \ No newline at end of file +}