diff --git a/router/downloader/downloader.go b/router/downloader/downloader.go index 067542f..447463f 100644 --- a/router/downloader/downloader.go +++ b/router/downloader/downloader.go @@ -60,7 +60,6 @@ func (dl *Download) Execute() error { dl.cancelFunc = &cancel defer dl.Cancel() - fnameparts := strings.Split(dl.req.URL.Path, "/") req, _ := http.NewRequestWithContext(ctx, http.MethodGet, dl.req.URL.String(), nil) res, err := client.Do(req) if err != nil { @@ -70,6 +69,8 @@ func (dl *Download) Execute() error { if res.StatusCode >= 300 || res.StatusCode < 200 { return errors.New("downloader: got bad response status from endpoint: " + res.Status) } + + fnameparts := strings.Split(dl.req.URL.Path, "/") p := filepath.Join(dl.req.Directory, fnameparts[len(fnameparts)-1]) dl.server.Log().WithField("path", p).Debug("writing remote file to disk") if err := dl.server.Filesystem().Writefile(p, res.Body); err != nil { diff --git a/router/router_server_files.go b/router/router_server_files.go index ba67378..b3b05d6 100644 --- a/router/router_server_files.go +++ b/router/router_server_files.go @@ -256,6 +256,11 @@ func postServerPullRemoteFile(c *gin.Context) { return } + if err := s.Filesystem().HasSpaceErr(true); err != nil { + WithError(c, err) + return + } + dl := downloader.New(s, downloader.DownloadRequest{ URL: u, Directory: data.Directory, diff --git a/server/filesystem/disk_space.go b/server/filesystem/disk_space.go index ccef0ac..cab4482 100644 --- a/server/filesystem/disk_space.go +++ b/server/filesystem/disk_space.go @@ -48,6 +48,15 @@ func (fs *Filesystem) SetDiskLimit(i int64) { fs.mu.Unlock() } +// The same concept as HasSpaceAvailable however this will return an error if there is +// no space, rather than a boolean value. +func (fs *Filesystem) HasSpaceErr(allowStaleValue bool) error { + if !fs.HasSpaceAvailable(allowStaleValue) { + return &Error{code: ErrCodeDiskSpace} + } + return nil +} + // Determines if the directory a file is trying to be added to has enough space available // for the file to be written to. // diff --git a/server/filesystem/errors.go b/server/filesystem/errors.go index b6bbb37..52a2c20 100644 --- a/server/filesystem/errors.go +++ b/server/filesystem/errors.go @@ -67,10 +67,6 @@ func IsErrorCode(err error, code ErrorCode) bool { return false } -func NewDiskSpaceError() *Error { - return &Error{code: ErrCodeDiskSpace} -} - // Returns a new BadPathResolution error. func NewBadPathResolution(path string, resolved string) *Error { return &Error{code: ErrCodePathResolution, path: path, resolved: resolved} diff --git a/server/power.go b/server/power.go index 396595c..3a52df9 100644 --- a/server/power.go +++ b/server/power.go @@ -5,7 +5,6 @@ import ( "emperror.dev/errors" "github.com/pterodactyl/wings/config" "github.com/pterodactyl/wings/environment" - "github.com/pterodactyl/wings/server/filesystem" "golang.org/x/sync/semaphore" "os" "time" @@ -168,8 +167,8 @@ func (s *Server) onBeforeStart() error { s.Filesystem().HasSpaceAvailable(true) } else { s.PublishConsoleOutputFromDaemon("Checking server disk space usage, this could take a few seconds...") - if !s.Filesystem().HasSpaceAvailable(false) { - return filesystem.NewDiskSpaceError() + if err := s.Filesystem().HasSpaceErr(false); err != nil { + return err } }