disk.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package main
  2. /*
  3. ArOZ Online Disk Service Endpoint Handler
  4. This is a module to provide access to the disk services
  5. */
  6. import (
  7. "net/http"
  8. "imuslab.com/arozos/mod/disk/diskcapacity"
  9. "imuslab.com/arozos/mod/disk/diskmg"
  10. diskspace "imuslab.com/arozos/mod/disk/diskspace"
  11. "imuslab.com/arozos/mod/disk/raid"
  12. smart "imuslab.com/arozos/mod/disk/smart"
  13. sortfile "imuslab.com/arozos/mod/disk/sortfile"
  14. prout "imuslab.com/arozos/mod/prouter"
  15. "imuslab.com/arozos/mod/utils"
  16. )
  17. func DiskServiceInit() {
  18. //Register Disk Utilities under System Setting
  19. //Disk info are only viewable by administrator
  20. router := prout.NewModuleRouter(prout.RouterOption{
  21. ModuleName: "System Setting",
  22. AdminOnly: false,
  23. UserHandler: userHandler,
  24. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  25. utils.SendErrorResponse(w, "Permission Denied")
  26. },
  27. })
  28. //Anyone logged in can load router
  29. authRouter := prout.NewModuleRouter(prout.RouterOption{
  30. AdminOnly: false,
  31. UserHandler: userHandler,
  32. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  33. utils.SendErrorResponse(w, "Permission Denied")
  34. },
  35. })
  36. //Disk Space Display endpoint
  37. router.HandleFunc("/system/disk/space/list", diskspace.HandleDiskSpaceList)
  38. //Handle Virtual Disk Properties display endpoints
  39. dc := diskcapacity.NewCapacityResolver(userHandler)
  40. router.HandleFunc("/system/disk/space/resolve", dc.HandleCapacityResolving)
  41. authRouter.HandleFunc("/system/disk/space/tmp", dc.HandleTmpCapacityResolving)
  42. //New Large File Scanner
  43. lfs := sortfile.NewLargeFileScanner(userHandler)
  44. router.HandleFunc("/system/disk/space/largeFiles", lfs.HandleLargeFileList)
  45. //Register settings
  46. registerSetting(settingModule{
  47. Name: "Space Finder",
  48. Desc: "Reclaim Storage Space on Disks",
  49. IconPath: "SystemAO/disk/space/img/small_icon.png",
  50. Group: "Disk",
  51. StartDir: "SystemAO/disk/space/finder.html",
  52. RequireAdmin: false,
  53. })
  54. if *allow_hardware_management {
  55. //Displaying remaining space on disk, only enabled when allow hardware is true
  56. registerSetting(settingModule{
  57. Name: "Disk Space",
  58. Desc: "System Storage Space on Disks",
  59. IconPath: "SystemAO/disk/space/img/small_icon.png",
  60. Group: "Disk",
  61. StartDir: "SystemAO/disk/space/diskspace.html",
  62. RequireAdmin: false,
  63. })
  64. }
  65. //Register Disk SMART services
  66. if sudo_mode {
  67. //Create a new admin router
  68. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  69. ModuleName: "System Setting",
  70. AdminOnly: true,
  71. UserHandler: userHandler,
  72. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  73. utils.SendErrorResponse(w, "Permission Denied")
  74. },
  75. })
  76. /*
  77. SMART Listener
  78. Handle disk SMART and disk information
  79. See disk/SMART for more information
  80. */
  81. if *allow_hardware_management {
  82. smartListener, err := smart.NewSmartListener()
  83. if err != nil {
  84. //Listener creation failed
  85. systemWideLogger.PrintAndLog("Disk", "Failed to create SMART listener: "+err.Error(), err)
  86. } else {
  87. //Listener created. Register endpoints
  88. registerSetting(settingModule{
  89. Name: "Disk SMART",
  90. Desc: "HardDisk Health Checking",
  91. IconPath: "SystemAO/disk/smart/img/small_icon.png",
  92. Group: "Disk",
  93. StartDir: "SystemAO/disk/smart/smart.html",
  94. RequireAdmin: true,
  95. })
  96. authRouter.HandleFunc("/system/disk/smart/getSMART", smartListener.GetSMART)
  97. }
  98. }
  99. /*
  100. RAID Management
  101. Handle physical disk RAID for more NAS OS like experience
  102. */
  103. if *allow_hardware_management {
  104. //Register endpoints and settings for this host
  105. registerSetting(settingModule{
  106. Name: "RAID",
  107. Desc: "Providing basic mdadm features",
  108. IconPath: "SystemAO/disk/raid/img/small_icon.png",
  109. Group: "Disk",
  110. StartDir: "SystemAO/disk/raid/index.html",
  111. RequireAdmin: true,
  112. })
  113. rm, err := raid.NewRaidManager(raid.Options{})
  114. if err == nil {
  115. raidManager = rm
  116. } else {
  117. //Unable to start RAID manager. Skip it.
  118. systemWideLogger.PrintAndLog("RAID", "Unable to start RAID manager", err)
  119. }
  120. if raidManager != nil {
  121. authRouter.HandleFunc("/system/disk/raid/list", raidManager.HandleListRaidDevices)
  122. authRouter.HandleFunc("/system/disk/raid/remove", raidManager.HandleRemoveRaideDevice)
  123. authRouter.HandleFunc("/system/disk/raid/assemble", raidManager.HandleRaidDevicesAssemble)
  124. authRouter.HandleFunc("/system/disk/raid/new", raidManager.HandleCreateRAIDDevice)
  125. }
  126. }
  127. /*
  128. Disk Manager Initialization
  129. See disk/diskmg.go for more details
  130. For setting register, see setting.advance.go
  131. */
  132. if *allow_hardware_management {
  133. authRouter.HandleFunc("/system/disk/diskmg/view", diskmg.HandleView)
  134. adminRouter.HandleFunc("/system/disk/diskmg/platform", diskmg.HandlePlatform)
  135. adminRouter.HandleFunc("/system/disk/diskmg/mount", func(w http.ResponseWriter, r *http.Request) {
  136. //Mount option require passing in all filesystem handlers
  137. allFsh := GetAllLoadedFsh()
  138. diskmg.HandleMount(w, r, allFsh)
  139. })
  140. adminRouter.HandleFunc("/system/disk/diskmg/format", func(w http.ResponseWriter, r *http.Request) {
  141. //Check if request are made in POST mode
  142. if r.Method != http.MethodPost {
  143. w.WriteHeader(http.StatusMethodNotAllowed)
  144. w.Write([]byte("405 - Method Not Allowed"))
  145. return
  146. }
  147. //Check if ArozOS is running in sudo mode
  148. if !sudo_mode {
  149. w.WriteHeader(http.StatusUnauthorized)
  150. w.Write([]byte("401 - Unauthorized (Is ArozOS running in sudo mode?)"))
  151. return
  152. }
  153. //Format option require passing in all filesystem handlers
  154. allFsh := GetAllLoadedFsh()
  155. diskmg.HandleFormat(w, r, allFsh)
  156. })
  157. adminRouter.HandleFunc("/system/disk/diskmg/mpt", diskmg.HandleListMountPoints)
  158. }
  159. }
  160. }