main.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package main
  2. import (
  3. "embed"
  4. "flag"
  5. "fmt"
  6. "io/fs"
  7. "net/http"
  8. "os"
  9. "imuslab.com/bokofs/bokofsd/mod/bokofs"
  10. "imuslab.com/bokofs/bokofsd/mod/bokofs/bokoworker"
  11. "imuslab.com/bokofs/bokofsd/mod/netstat"
  12. )
  13. //go:embed web/*
  14. var embeddedFiles embed.FS
  15. func main() {
  16. flag.Parse()
  17. /* File system handler */
  18. var fileSystem http.FileSystem
  19. if *devMode {
  20. fmt.Println("Development mode enabled. Serving files from ./web directory.")
  21. fileSystem = http.Dir("./web")
  22. } else {
  23. fmt.Println("Production mode enabled. Serving files from embedded filesystem.")
  24. subFS, err := fs.Sub(embeddedFiles, "web")
  25. if err != nil {
  26. fmt.Fprintf(os.Stderr, "Error accessing embedded subdirectory: %v\n", err)
  27. os.Exit(1)
  28. }
  29. fileSystem = http.FS(subFS)
  30. }
  31. configFolderPath := "./config"
  32. if *config != "" {
  33. configFolderPath = *config
  34. }
  35. if _, err := os.Stat(configFolderPath); os.IsNotExist(err) {
  36. fmt.Printf("Config folder does not exist. Creating folder at %s\n", configFolderPath)
  37. if err := os.Mkdir(configFolderPath, os.ModePerm); err != nil {
  38. fmt.Fprintf(os.Stderr, "Error creating config folder: %v\n", err)
  39. os.Exit(1)
  40. }
  41. }
  42. /* Network statistics */
  43. nsb, err := netstat.NewNetStatBuffer(300)
  44. if err != nil {
  45. fmt.Fprintf(os.Stderr, "Error creating network statistics buffer: %v\n", err)
  46. os.Exit(1)
  47. }
  48. defer netstatBuffer.Close()
  49. netstatBuffer = nsb
  50. /* Package Check */
  51. if !checkRuntimeEnvironment() {
  52. fmt.Println("Runtime environment check failed. Please install the missing packages.")
  53. os.Exit(1)
  54. }
  55. //DEBUG
  56. wds, err := bokofs.NewWebdavInterfaceServer("/disk/", "/thumb/")
  57. if err != nil {
  58. panic(err)
  59. }
  60. test, err := bokoworker.NewFSWorker(&bokoworker.Options{
  61. NodeName: "test",
  62. ServePath: "./test",
  63. ThumbnailStore: "./tmp/test/",
  64. })
  65. if err != nil {
  66. panic(err)
  67. }
  68. wds.AddWorker(test)
  69. test2, err := bokoworker.NewFSWorker(&bokoworker.Options{
  70. NodeName: "test2",
  71. ServePath: "./mod",
  72. ThumbnailStore: "./tmp/mod/",
  73. })
  74. if err != nil {
  75. panic(err)
  76. }
  77. wds.AddWorker(test2)
  78. //END DEBUG
  79. http.Handle("/", http.FileServer(fileSystem))
  80. /* WebDAV Handlers */
  81. http.Handle("/disk/", wds.FsHandler()) //Note the trailing slash
  82. http.Handle("/thumb/", wds.ThumbHandler()) //Note the trailing slash
  83. /* REST API Handlers */
  84. http.Handle("/meta", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  85. // TODO: Implement handler logic for /meta
  86. fmt.Fprintln(w, "Meta handler not implemented yet")
  87. }))
  88. http.Handle("/api/", HandlerAPIcalls())
  89. addr := fmt.Sprintf(":%d", *httpPort)
  90. fmt.Printf("Starting static web server on %s\n", addr)
  91. if err := http.ListenAndServe(addr, nil); err != nil {
  92. fmt.Fprintf(os.Stderr, "Error starting server: %v\n", err)
  93. os.Exit(1)
  94. }
  95. }