Read-only is working

This commit is contained in:
Quentin 2021-08-20 08:02:36 +02:00
parent 8f7e8d2c73
commit 55e9aa7018

60
main.go
View file

@ -29,12 +29,20 @@ type garageCtx struct {
StatCache map[string]*GarageStat StatCache map[string]*GarageStat
} }
func EnvOrDefault(key, def string) string {
if val, ok := os.LookupEnv(key); ok {
return val
}
return def
}
func main() { func main() {
pathPrefix := "/webdav" pathPrefix := EnvOrDefault("BAGAGE_WEBDAV_PREFIX", "/webdav")
UserBaseDN := "ou=users,dc=deuxfleurs,dc=fr" LdapServer := EnvOrDefault("BAGAGE_LDAP_ENDPOINT", "127.0.0.1:1389")
UserNameAttr := "cn" UserBaseDN := EnvOrDefault("BAGAGE_LDAP_USER_BASE_DN", "ou=users,dc=deuxfleurs,dc=fr")
Endpoint := "garage.deuxfleurs.fr" UserNameAttr := EnvOrDefault("BAGAGE_LDAP_USERNAME_ATTR", "cn")
UseSSL := true Endpoint := EnvOrDefault("BAGAGE_S3_ENDPOINT", "garage.deuxfleurs.fr")
UseSSL := EnvOrDefault("BAGAGE_S3_SSL", "true") == "true"
srv := &webdav.Handler{ srv := &webdav.Handler{
Prefix: pathPrefix, Prefix: pathPrefix,
@ -54,7 +62,7 @@ func main() {
return return
} }
ldapSock, err := ldap.Dial("tcp", "127.0.0.1:1389") ldapSock, err := ldap.Dial("tcp", LdapServer)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
InternalError(w, r) InternalError(w, r)
@ -177,6 +185,8 @@ func (s *GarageFS) Stat(ctx context.Context, name string) (os.FileInfo, error) {
type GarageFile struct { type GarageFile struct {
ctx context.Context ctx context.Context
mc *minio.Client mc *minio.Client
obj *minio.Object
stat *GarageStat
path string path string
} }
@ -185,15 +195,44 @@ func NewGarageFile(ctx context.Context, path string) (webdav.File, error) {
gf.ctx = ctx gf.ctx = ctx
gf.mc = ctx.Value(garageEntry).(garageCtx).MC gf.mc = ctx.Value(garageEntry).(garageCtx).MC
gf.path = path gf.path = path
stat, err := NewGarageStat(ctx, path)
if err != nil {
return nil, err
}
gf.stat = stat
return gf, nil return gf, nil
} }
func (gf *GarageFile) Close() error { func (gf *GarageFile) Close() error {
return errors.New("not implemented Close") if gf.obj == nil {
return nil
}
err := gf.obj.Close()
gf.obj = nil
return err
}
func (gf *GarageFile) loadObject() error {
if gf.obj == nil {
log.Println("Called GetObject on", gf.path)
obj, err := gf.mc.GetObject(gf.ctx, gf.stat.bucket, gf.stat.obj.Key, minio.GetObjectOptions{})
if err != nil {
return err
}
gf.obj = obj
}
return nil
} }
func (gf *GarageFile) Read(p []byte) (n int, err error) { func (gf *GarageFile) Read(p []byte) (n int, err error) {
return 0, errors.New("not implemented Read") if gf.stat.Mode().IsDir() {
return 0, os.ErrInvalid
}
if err := gf.loadObject(); err != nil {
return 0, err
}
return gf.obj.Read(p)
} }
func (gf *GarageFile) Write(p []byte) (n int, err error) { func (gf *GarageFile) Write(p []byte) (n int, err error) {
@ -201,7 +240,10 @@ func (gf *GarageFile) Write(p []byte) (n int, err error) {
} }
func (gf *GarageFile) Seek(offset int64, whence int) (int64, error) { func (gf *GarageFile) Seek(offset int64, whence int) (int64, error) {
return 0, errors.New("not implemented Seek") if err := gf.loadObject(); err != nil {
return 0, err
}
return gf.obj.Seek(offset, whence)
} }
/* /*