disk.go 7.9 KB

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