From ad098f9a4a481f9fe3c44100cf37ba32f5f369a6 Mon Sep 17 00:00:00 2001 From: kubi Date: Fri, 10 May 2024 22:52:37 -0700 Subject: [PATCH] Delete backups on server delete (#13) Deletes all backups unless the wings config System.Backups.RemoveBackupsOnServerDelete is set to false. --- config/config.go | 3 +++ go.sum | 5 ++++- router/router.go | 3 +++ router/router_server.go | 19 +++++++++++++++++++ server/server.go | 10 ++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/config/config.go b/config/config.go index 614bca38..16364be3 100644 --- a/config/config.go +++ b/config/config.go @@ -254,6 +254,9 @@ type Backups struct { // // Defaults to "best_speed" (level 1) CompressionLevel string `default:"best_speed" yaml:"compression_level"` + + // RemoveBackupsOnServerDelete deletes backups associated with a server when the server is deleted + RemoveBackupsOnServerDelete bool `default:"true" yaml:"remove_backups_on_server_delete"` } type Transfers struct { diff --git a/go.sum b/go.sum index 811c6518..841c573f 100644 --- a/go.sum +++ b/go.sum @@ -518,6 +518,9 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -674,4 +677,4 @@ nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYm rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= \ No newline at end of file +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/router/router.go b/router/router.go index b988d109..97fd37a5 100644 --- a/router/router.go +++ b/router/router.go @@ -87,6 +87,9 @@ func Configure(m *wserver.Manager, client remote.Client) *gin.Engine { server.POST("/transfer", postServerTransfer) server.DELETE("/transfer", deleteServerTransfer) + // Deletes all backups for a server + server.DELETE("deleteAllBackups", deleteAllServerBackups) + files := server.Group("/files") { files.GET("/contents", getServerFileContents) diff --git a/router/router_server.go b/router/router_server.go index 6f1efcb0..da194225 100644 --- a/router/router_server.go +++ b/router/router_server.go @@ -2,6 +2,7 @@ package router import ( "context" + "github.com/pelican-dev/wings/config" "net/http" "os" "strconv" @@ -213,6 +214,14 @@ func deleteServer(c *gin.Context) { dl.Cancel() } + // Remove all server backups unless config setting is specified + if config.Get().System.Backups.RemoveBackupsOnServerDelete == true { + if err := s.RemoveAllServerBackups(); err != nil { + middleware.CaptureAndAbort(c, err) + return + } + } + // Destroy the environment; in Docker this will handle a running container and // forcibly terminate it before removing the container, so we do not need to handle // that here. @@ -261,3 +270,13 @@ func postServerDenyWSTokens(c *gin.Context) { c.Status(http.StatusNoContent) } + +func deleteAllServerBackups(c *gin.Context) { + s := ExtractServer(c) + + if err := s.RemoveAllServerBackups(); err != nil { + middleware.CaptureAndAbort(c, err) + } else { + c.Status(http.StatusNoContent) + } +} diff --git a/server/server.go b/server/server.go index a2400808..42bf8fe2 100644 --- a/server/server.go +++ b/server/server.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "os" + "path" "strconv" "strings" "sync" @@ -391,3 +392,12 @@ func (s *Server) ToAPIResponse() APIResponse { Configuration: *s.Config(), } } + +func (s *Server) RemoveAllServerBackups() error { + sp := path.Join(config.Get().System.BackupDirectory, s.ID()) + // This should never be possible, but we'll check it anyway. + if sp == config.Get().System.BackupDirectory { + return errors.New("invalid server, cannot delete backup dir") + } + return os.RemoveAll(sp) +}