From ab634fb3b97bbfa51c5b95bfc9320692b7bb9af5 Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Sat, 7 Jun 2025 22:43:57 +0530 Subject: [PATCH] [server] Streamline storage backend access, fix init error --- server/internal/command/config.defaults.yml | 4 +-- server/internal/core/resource_create.go | 3 ++- server/internal/core/version.go | 4 +-- server/internal/storage/storage.go | 27 ++++++++++++++++----- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/server/internal/command/config.defaults.yml b/server/internal/command/config.defaults.yml index 7c3eee3a..79a9096b 100644 --- a/server/internal/command/config.defaults.yml +++ b/server/internal/command/config.defaults.yml @@ -7,8 +7,8 @@ db: nomigrate: false # Do not auto-migrate schema (dev) trace: false # Trace queries (dev) -fs: - storage: storage +storage: + location: storage user: password: diff --git a/server/internal/core/resource_create.go b/server/internal/core/resource_create.go index 494dc1ac..773a4b20 100644 --- a/server/internal/core/resource_create.go +++ b/server/internal/core/resource_create.go @@ -10,6 +10,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" + "github.com/shroff/phylum/server/internal/storage" ) type ResourceBindConflictResolution int32 @@ -276,7 +277,7 @@ func (f filesystem) createResourceVersion(id, versionID uuid.UUID, size int64, m "size": size, "mime_type": mimeType, "sha256": sha256, - "storage": "_", + "storage": storage.DefaultBackendName, } _, err := f.db.Exec(q, args) return err diff --git a/server/internal/core/version.go b/server/internal/core/version.go index 8f0ece33..d23ec0d9 100644 --- a/server/internal/core/version.go +++ b/server/internal/core/version.go @@ -28,8 +28,8 @@ func (v Version) OpenRead(start, length int) (io.ReadCloser, error) { if v.Storage == "" { return nil, errors.New("unknown storage backend") } - if b := storage.GetBackend(v.Storage); b == nil { - return nil, errors.New("storage backend not found: " + v.Storage) + if b, err := storage.GetBackend(v.Storage); err != nil { + return nil, errors.New("failed to read " + v.ID.String() + ": " + err.Error()) } else { return b.OpenRead(v.ID.String(), start, length) } diff --git a/server/internal/storage/storage.go b/server/internal/storage/storage.go index 0fbfebf9..8642103d 100644 --- a/server/internal/storage/storage.go +++ b/server/internal/storage/storage.go @@ -3,6 +3,7 @@ package storage import ( "encoding/json" "errors" + "fmt" "os" "path" @@ -12,6 +13,9 @@ import ( ) var Cfg Config + +const DefaultBackendName = "_" + var defaultBackend LocalBackend var backends map[string]Backend @@ -22,8 +26,15 @@ type BackendConfig struct { } func Initialize(db db.Handler) error { - if err := os.Chmod(Cfg.Location, 0700); err != nil { - return errors.New("failed to set permissions: " + err.Error()) + if err := os.MkdirAll(Cfg.Location, 0700); err != nil { + return errors.New("failed to create storage location(" + Cfg.Location + "): " + err.Error()) + } else { + if stat, err := os.Stat(Cfg.Location); err != nil { + return errors.New("failed to stat storage location(" + Cfg.Location + "): " + err.Error()) + } else if stat.Mode()&0xfff != 0700 { + return errors.New("storage location does not have correct permissions (0700): " + fmt.Sprintf("%o", stat.Mode()&0xfff)) + } + } if restoredBackends, err := restoreBackends(db); err != nil { return errors.New("failed to restore backends: " + err.Error()) @@ -42,11 +53,15 @@ func DefaultBackend() LocalBackend { return defaultBackend } -func GetBackend(name string) Backend { - if name == "_" { - return defaultBackend +func GetBackend(name string) (Backend, error) { + if name == DefaultBackendName { + return defaultBackend, nil + } + if b, ok := backends[name]; !ok { + return nil, errors.New("no storage backend named \"" + name + "\"") + } else { + return b, nil } - return backends[name] } func ListBackends() map[string]Backend {