subservice.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import (
  3. "net/http"
  4. "os"
  5. "path/filepath"
  6. fs "imuslab.com/arozos/mod/filesystem"
  7. prout "imuslab.com/arozos/mod/prouter"
  8. subservice "imuslab.com/arozos/mod/subservice"
  9. "imuslab.com/arozos/mod/utils"
  10. )
  11. /*
  12. ArOZ Online System - Dynamic Subsystem loading services
  13. */
  14. var (
  15. ssRouter *subservice.SubServiceRouter
  16. reservePaths = []string{
  17. "web",
  18. "system",
  19. "SystemAO",
  20. "img",
  21. "STDIN",
  22. "STDOUT",
  23. "STDERR",
  24. "COM",
  25. "ws",
  26. "cluster",
  27. }
  28. )
  29. func SubserviceInit() {
  30. //If subservice is disabled, do not register endpoints
  31. if *disable_subservices {
  32. return
  33. }
  34. //Create a new subservice handler
  35. ssRouter = subservice.NewSubServiceRouter(
  36. reservePaths,
  37. subserviceBasePort,
  38. userHandler,
  39. moduleHandler,
  40. *listen_port,
  41. )
  42. //Create an admin router for subservice related functions
  43. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  44. ModuleName: "System Setting",
  45. AdminOnly: false,
  46. UserHandler: userHandler,
  47. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  48. utils.SendErrorResponse(w, "Permission Denied")
  49. },
  50. })
  51. //Register url endpoints
  52. adminRouter.HandleFunc("/system/subservice/list", ssRouter.HandleListing)
  53. adminRouter.HandleFunc("/system/subservice/kill", ssRouter.HandleKillSubService)
  54. adminRouter.HandleFunc("/system/subservice/start", ssRouter.HandleStartSubService)
  55. //Make subservice dir
  56. os.MkdirAll("./subservice", 0644)
  57. //Scan and load all subservice modules
  58. subservices, _ := filepath.Glob("./subservice/*")
  59. for _, servicePath := range subservices {
  60. if fs.IsDir(servicePath) && !fs.FileExists(servicePath+"/.disabled") {
  61. //Only enable module with no suspended config file
  62. ssRouter.Launch(servicePath, true)
  63. }
  64. }
  65. }
  66. // Stop all the subprocess correctly
  67. func SubserviceHandleShutdown() {
  68. if ssRouter != nil {
  69. ssRouter.Close()
  70. }
  71. }