disk.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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 RAIDServiceInit() {
  18. /*
  19. RAID Management
  20. Handle physical disk RAID for more NAS OS like experience
  21. */
  22. if *allow_hardware_management {
  23. rm, err := raid.NewRaidManager(raid.Options{
  24. Logger: systemWideLogger,
  25. })
  26. if err == nil {
  27. raidManager = rm
  28. } else {
  29. //Unable to start RAID manager. Skip it.
  30. systemWideLogger.PrintAndLog("RAID", "Unable to start RAID manager", err)
  31. }
  32. /* Flush mdadm RAID */
  33. if raidManager != nil {
  34. if !*skip_mdadm_reload {
  35. err := raidManager.FlushReload()
  36. if err != nil {
  37. systemWideLogger.PrintAndLog("RAID", "mdadm reload failed: "+err.Error(), err)
  38. }
  39. }
  40. }
  41. }
  42. }
  43. func DiskServiceInit() {
  44. //Register Disk Utilities under System Setting
  45. //Disk info are only viewable by administrator
  46. router := prout.NewModuleRouter(prout.RouterOption{
  47. ModuleName: "System Setting",
  48. AdminOnly: false,
  49. UserHandler: userHandler,
  50. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  51. utils.SendErrorResponse(w, "Permission Denied")
  52. },
  53. })
  54. //Anyone logged in can load router
  55. authRouter := prout.NewModuleRouter(prout.RouterOption{
  56. AdminOnly: false,
  57. UserHandler: userHandler,
  58. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  59. utils.SendErrorResponse(w, "Permission Denied")
  60. },
  61. })
  62. //Disk Space Display endpoint
  63. router.HandleFunc("/system/disk/space/list", diskspace.HandleDiskSpaceList)
  64. //Handle Virtual Disk Properties display endpoints
  65. dc := diskcapacity.NewCapacityResolver(userHandler)
  66. router.HandleFunc("/system/disk/space/resolve", dc.HandleCapacityResolving)
  67. authRouter.HandleFunc("/system/disk/space/tmp", dc.HandleTmpCapacityResolving)
  68. //New Large File Scanner
  69. lfs := sortfile.NewLargeFileScanner(userHandler)
  70. router.HandleFunc("/system/disk/space/largeFiles", lfs.HandleLargeFileList)
  71. //Register settings
  72. registerSetting(settingModule{
  73. Name: "Space Finder",
  74. Desc: "Reclaim Storage Space on Disks",
  75. IconPath: "SystemAO/disk/space/img/small_icon.png",
  76. Group: "Disk",
  77. StartDir: "SystemAO/disk/space/finder.html",
  78. RequireAdmin: false,
  79. })
  80. if *allow_hardware_management {
  81. //Displaying remaining space on disk, only enabled when allow hardware is true
  82. registerSetting(settingModule{
  83. Name: "Disk Space",
  84. Desc: "System Storage Space on Disks",
  85. IconPath: "SystemAO/disk/space/img/small_icon.png",
  86. Group: "Disk",
  87. StartDir: "SystemAO/disk/space/diskspace.html",
  88. RequireAdmin: false,
  89. })
  90. }
  91. //Register Disk SMART services
  92. if sudo_mode {
  93. //Create a new admin router
  94. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  95. ModuleName: "System Setting",
  96. AdminOnly: true,
  97. UserHandler: userHandler,
  98. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  99. utils.SendErrorResponse(w, "Permission Denied")
  100. },
  101. })
  102. /*
  103. SMART Listener
  104. Handle disk SMART and disk information
  105. See disk/SMART for more information
  106. */
  107. if *allow_hardware_management {
  108. smartListener, err := smart.NewSmartListener()
  109. if err != nil {
  110. //Listener creation failed
  111. systemWideLogger.PrintAndLog("Disk", "Failed to create SMART listener: "+err.Error(), err)
  112. } else {
  113. //Listener created. Register endpoints
  114. registerSetting(settingModule{
  115. Name: "Disk SMART",
  116. Desc: "HardDisk Health Checking",
  117. IconPath: "SystemAO/disk/smart/img/small_icon.png",
  118. Group: "Disk",
  119. StartDir: "SystemAO/disk/smart/smart.html",
  120. RequireAdmin: true,
  121. })
  122. authRouter.HandleFunc("/system/disk/smart/getSMART", smartListener.GetSMART)
  123. }
  124. /*
  125. RAID Manager endpoints
  126. */
  127. if raidManager != nil {
  128. //Register endpoints and settings for this host
  129. registerSetting(settingModule{
  130. Name: "RAID",
  131. Desc: "Providing basic mdadm features",
  132. IconPath: "SystemAO/disk/raid/img/small_icon.png",
  133. Group: "Disk",
  134. StartDir: "SystemAO/disk/raid/index.html",
  135. RequireAdmin: true,
  136. })
  137. /* RAID storage pool function */
  138. adminRouter.HandleFunc("/system/disk/raid/list", raidManager.HandleListRaidDevices)
  139. adminRouter.HandleFunc("/system/disk/raid/new", raidManager.HandleCreateRAIDDevice)
  140. adminRouter.HandleFunc("/system/disk/raid/remove", func(w http.ResponseWriter, r *http.Request) {
  141. if !AuthValidateSecureRequest(w, r) {
  142. return
  143. }
  144. raidManager.HandleRemoveRaideDevice(w, r)
  145. })
  146. adminRouter.HandleFunc("/system/disk/raid/assemble", func(w http.ResponseWriter, r *http.Request) {
  147. if !AuthValidateSecureRequest(w, r) {
  148. return
  149. }
  150. raidManager.HandleForceAssembleReload(w, r)
  151. })
  152. adminRouter.HandleFunc("/system/disk/raid/format", raidManager.HandleFormatRaidDevice)
  153. adminRouter.HandleFunc("/system/disk/raid/detail", raidManager.HandleLoadArrayDetail)
  154. adminRouter.HandleFunc("/system/disk/raid/devinfo", raidManager.HandlListChildrenDeviceInfo)
  155. adminRouter.HandleFunc("/system/disk/raid/addMemeber", raidManager.HandleAddDiskToRAIDVol)
  156. adminRouter.HandleFunc("/system/disk/raid/removeMemeber", raidManager.HandleRemoveDiskFromRAIDVol)
  157. /* Device Management functions */
  158. adminRouter.HandleFunc("/system/disk/devices/list", raidManager.HandleListUsableDevices)
  159. adminRouter.HandleFunc("/system/disk/devices/model", raidManager.HandleResolveDiskModelLabel)
  160. /* Advance functions*/
  161. adminRouter.HandleFunc("/system/disk/raid/assemble", raidManager.HandleRaidDevicesAssemble)
  162. adminRouter.HandleFunc("/system/disk/raid/reload", raidManager.HandleMdadmFlushReload)
  163. }
  164. }
  165. /*
  166. Disk Manager Initialization
  167. See disk/diskmg.go for more details
  168. For setting register, see setting.advance.go
  169. */
  170. if *allow_hardware_management {
  171. authRouter.HandleFunc("/system/disk/diskmg/view", diskmg.HandleView)
  172. adminRouter.HandleFunc("/system/disk/diskmg/platform", diskmg.HandlePlatform)
  173. adminRouter.HandleFunc("/system/disk/diskmg/mount", func(w http.ResponseWriter, r *http.Request) {
  174. //Mount option require passing in all filesystem handlers
  175. allFsh := GetAllLoadedFsh()
  176. diskmg.HandleMount(w, r, allFsh)
  177. })
  178. adminRouter.HandleFunc("/system/disk/diskmg/format", func(w http.ResponseWriter, r *http.Request) {
  179. //Check if request are made in POST mode
  180. if r.Method != http.MethodPost {
  181. w.WriteHeader(http.StatusMethodNotAllowed)
  182. w.Write([]byte("405 - Method Not Allowed"))
  183. return
  184. }
  185. //Check if ArozOS is running in sudo mode
  186. if !sudo_mode {
  187. w.WriteHeader(http.StatusUnauthorized)
  188. w.Write([]byte("401 - Unauthorized (Is ArozOS running in sudo mode?)"))
  189. return
  190. }
  191. //Format option require passing in all filesystem handlers
  192. allFsh := GetAllLoadedFsh()
  193. diskmg.HandleFormat(w, r, allFsh)
  194. })
  195. adminRouter.HandleFunc("/system/disk/diskmg/mpt", diskmg.HandleListMountPoints)
  196. }
  197. }
  198. }