123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package bokofs
- import (
- "errors"
- "log"
- "net/http"
- "os"
- "strings"
- "sync"
- "golang.org/x/net/webdav"
- "imuslab.com/bokofs/bokofsd/mod/bokofs/bokoworker"
- )
- /*
- WebDAV module
- This module handle the interfacing to the underlying file system
- through the middle ware
- */
- type Server struct {
- LoadedWorkers sync.Map //Storing uuid to bokoworker pointer (*bokoworker.Worker)
- FsRouter FlowRouter //The file system router
- ThumbRouter FlowRouter //The thumbnail router
- fsprefix string
- thumbprefix string
- }
- /* NewWebdavInterfaceServer creates a new WebDAV server instance */
- func NewWebdavInterfaceServer(fsPrefix string, thumbPrefix string) (*Server, error) {
- //Make sure the prefix has a prefix and a trailing slash
- if fsPrefix == "" || thumbPrefix == "" {
- return nil, os.ErrInvalid
- }
- if !strings.HasPrefix(fsPrefix, "/") {
- fsPrefix = "/" + fsPrefix
- }
- if !strings.HasSuffix(fsPrefix, "/") {
- fsPrefix = fsPrefix + "/"
- }
- if !strings.HasPrefix(thumbPrefix, "/") {
- thumbPrefix = "/" + thumbPrefix
- }
- if !strings.HasSuffix(thumbPrefix, "/") {
- thumbPrefix = thumbPrefix + "/"
- }
- thisServer := Server{
- LoadedWorkers: sync.Map{},
- fsprefix: fsPrefix,
- thumbprefix: thumbPrefix,
- }
- //Initiate the root router file system
- fsRouter, err := NewRootRouter(&thisServer, fsPrefix, RouterType_FS)
- if err != nil {
- return nil, err
- }
- thisServer.FsRouter = fsRouter
- thumbRouter, err := NewRootRouter(&thisServer, thumbPrefix, RouterType_Thumb)
- if err != nil {
- return nil, err
- }
- thisServer.ThumbRouter = thumbRouter
- return &thisServer, nil
- }
- func (s *Server) AddWorker(worker *bokoworker.Worker) error {
- if worker.Filesystem == nil || worker.Thumbnails == nil {
- return errors.New("missing resources router")
- }
- //Check if the worker root path is already loaded
- if _, ok := s.LoadedWorkers.Load(worker.NodeName); ok {
- return os.ErrExist
- }
- s.LoadedWorkers.Store(worker.NodeName, worker)
- return nil
- }
- func (s *Server) RemoveWorker(workerRootPath string) {
- s.LoadedWorkers.Delete(workerRootPath)
- }
- func (s *Server) FsHandler() http.Handler {
- srv := &webdav.Handler{
- FileSystem: s.FsRouter,
- LockSystem: webdav.NewMemLS(),
- Logger: func(r *http.Request, err error) {
- if err != nil {
- log.Printf("WEBDAV [%s]: %s, ERROR: %s\n", r.Method, r.URL, err)
- } else {
- log.Printf("WEBDAV [%s]: %s \n", r.Method, r.URL)
- }
- },
- }
- return srv
- }
- func (s *Server) ThumbHandler() http.Handler {
- srv := &webdav.Handler{
- FileSystem: s.ThumbRouter,
- LockSystem: webdav.NewMemLS(),
- Logger: func(r *http.Request, err error) {
- if err != nil {
- log.Printf("THUMB [%s]: %s, ERROR: %s\n", r.Method, r.URL, err)
- } else {
- log.Printf("THUMB [%s]: %s \n", r.Method, r.URL)
- }
- },
- }
- return srv
- }
|