bokofs.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package bokofs
  2. import (
  3. "errors"
  4. "log"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "sync"
  9. "golang.org/x/net/webdav"
  10. "imuslab.com/bokofs/bokofsd/mod/bokofs/bokoworker"
  11. )
  12. /*
  13. WebDAV module
  14. This module handle the interfacing to the underlying file system
  15. through the middle ware
  16. */
  17. type Server struct {
  18. LoadedWorkers sync.Map //Storing uuid to bokoworker pointer (*bokoworker.Worker)
  19. FsRouter FlowRouter //The file system router
  20. ThumbRouter FlowRouter //The thumbnail router
  21. fsprefix string
  22. thumbprefix string
  23. }
  24. /* NewWebdavInterfaceServer creates a new WebDAV server instance */
  25. func NewWebdavInterfaceServer(fsPrefix string, thumbPrefix string) (*Server, error) {
  26. //Make sure the prefix has a prefix and a trailing slash
  27. if fsPrefix == "" || thumbPrefix == "" {
  28. return nil, os.ErrInvalid
  29. }
  30. if !strings.HasPrefix(fsPrefix, "/") {
  31. fsPrefix = "/" + fsPrefix
  32. }
  33. if !strings.HasSuffix(fsPrefix, "/") {
  34. fsPrefix = fsPrefix + "/"
  35. }
  36. if !strings.HasPrefix(thumbPrefix, "/") {
  37. thumbPrefix = "/" + thumbPrefix
  38. }
  39. if !strings.HasSuffix(thumbPrefix, "/") {
  40. thumbPrefix = thumbPrefix + "/"
  41. }
  42. thisServer := Server{
  43. LoadedWorkers: sync.Map{},
  44. fsprefix: fsPrefix,
  45. thumbprefix: thumbPrefix,
  46. }
  47. //Initiate the root router file system
  48. fsRouter, err := NewRootRouter(&thisServer, fsPrefix, RouterType_FS)
  49. if err != nil {
  50. return nil, err
  51. }
  52. thisServer.FsRouter = fsRouter
  53. thumbRouter, err := NewRootRouter(&thisServer, thumbPrefix, RouterType_Thumb)
  54. if err != nil {
  55. return nil, err
  56. }
  57. thisServer.ThumbRouter = thumbRouter
  58. return &thisServer, nil
  59. }
  60. func (s *Server) AddWorker(worker *bokoworker.Worker) error {
  61. if worker.Filesystem == nil || worker.Thumbnails == nil {
  62. return errors.New("missing resources router")
  63. }
  64. //Check if the worker root path is already loaded
  65. if _, ok := s.LoadedWorkers.Load(worker.NodeName); ok {
  66. return os.ErrExist
  67. }
  68. s.LoadedWorkers.Store(worker.NodeName, worker)
  69. return nil
  70. }
  71. func (s *Server) RemoveWorker(workerRootPath string) {
  72. s.LoadedWorkers.Delete(workerRootPath)
  73. }
  74. func (s *Server) FsHandler() http.Handler {
  75. srv := &webdav.Handler{
  76. FileSystem: s.FsRouter,
  77. LockSystem: webdav.NewMemLS(),
  78. Logger: func(r *http.Request, err error) {
  79. if err != nil {
  80. log.Printf("WEBDAV [%s]: %s, ERROR: %s\n", r.Method, r.URL, err)
  81. } else {
  82. log.Printf("WEBDAV [%s]: %s \n", r.Method, r.URL)
  83. }
  84. },
  85. }
  86. return srv
  87. }
  88. func (s *Server) ThumbHandler() http.Handler {
  89. srv := &webdav.Handler{
  90. FileSystem: s.ThumbRouter,
  91. LockSystem: webdav.NewMemLS(),
  92. Logger: func(r *http.Request, err error) {
  93. if err != nil {
  94. log.Printf("THUMB [%s]: %s, ERROR: %s\n", r.Method, r.URL, err)
  95. } else {
  96. log.Printf("THUMB [%s]: %s \n", r.Method, r.URL)
  97. }
  98. },
  99. }
  100. return srv
  101. }