nfsserv.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package nfsserv
  2. import (
  3. "fmt"
  4. "net"
  5. "strconv"
  6. "github.com/smallfz/libnfs-go/backend"
  7. "github.com/smallfz/libnfs-go/memfs"
  8. server "github.com/smallfz/libnfs-go/server"
  9. "imuslab.com/arozos/mod/fileservers"
  10. "imuslab.com/arozos/mod/info/logger"
  11. "imuslab.com/arozos/mod/permission"
  12. "imuslab.com/arozos/mod/user"
  13. )
  14. type Option struct {
  15. UserManager *user.UserHandler
  16. ListeningPort int
  17. AllowAccessGroup []*permission.PermissionGroup
  18. Logger *logger.Logger
  19. }
  20. type Manager struct {
  21. server *server.Server //NFS server
  22. tcpListener net.Listener //Underlaying TCP connection lisener
  23. isRunning bool
  24. Option *Option
  25. }
  26. // Create a new NFS Server
  27. func NewNfsServer(option Option) *Manager {
  28. if option.Logger == nil {
  29. //Create a new one
  30. option.Logger, _ = logger.NewTmpLogger()
  31. }
  32. return &Manager{
  33. server: nil,
  34. isRunning: false,
  35. Option: &option,
  36. }
  37. }
  38. // Interfaces required for registering File Server in ArozOS
  39. func (s *Manager) IsRunning() bool {
  40. return s.isRunning
  41. }
  42. func (s *Manager) GetEndpoints(userinfo *user.User) []*fileservers.Endpoint {
  43. eps := []*fileservers.Endpoint{}
  44. eps = append(eps, &fileservers.Endpoint{
  45. ProtocolName: "\\\\",
  46. Port: s.Option.ListeningPort,
  47. Subpath: "",
  48. })
  49. return eps
  50. }
  51. func (s *Manager) ServerToggle(enabled bool) error {
  52. if s.isRunning {
  53. return s.Stop()
  54. } else {
  55. return s.Start()
  56. }
  57. }
  58. // Wrapper for logger PrintAndLog
  59. func (s *Manager) Log(message string, err error) {
  60. s.Option.Logger.PrintAndLog("NFS", message, err)
  61. }
  62. // TODO: Link this to arozfs
  63. func (s *Manager) Start() error {
  64. mfs := memfs.NewMemFS()
  65. backend := backend.New(mfs)
  66. svr, err := server.NewServerTCP(":"+strconv.Itoa(s.Option.ListeningPort), backend)
  67. if err != nil {
  68. s.Log("failed to start NFS Server", err)
  69. return err
  70. }
  71. s.Log("Server started listening on "+":"+strconv.Itoa(s.Option.ListeningPort), nil)
  72. s.server = svr
  73. s.isRunning = true
  74. go func() {
  75. if err := svr.Serve(); err != nil {
  76. fmt.Printf("svr.Serve: %v\n", err)
  77. }
  78. }()
  79. return nil
  80. }
  81. func (s *Manager) Stop() error {
  82. return nil
  83. }