subservice.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. "app",
  28. }
  29. )
  30. func SubserviceInit() {
  31. //If subservice is disabled, do not register endpoints
  32. if *disable_subservices {
  33. return
  34. }
  35. //Create a new subservice handler
  36. ssRouter = subservice.NewSubServiceRouter(
  37. reservePaths,
  38. subserviceBasePort,
  39. userHandler,
  40. moduleHandler,
  41. *listen_port,
  42. )
  43. //Create an admin router for subservice related functions
  44. adminRouter := 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. //Register url endpoints
  53. adminRouter.HandleFunc("/system/subservice/list", ssRouter.HandleListing)
  54. adminRouter.HandleFunc("/system/subservice/kill", ssRouter.HandleKillSubService)
  55. adminRouter.HandleFunc("/system/subservice/start", ssRouter.HandleStartSubService)
  56. //Make subservice dir
  57. os.MkdirAll("./subservice", 0644)
  58. //Scan and load all subservice modules
  59. subservices, _ := filepath.Glob("./subservice/*")
  60. for _, servicePath := range subservices {
  61. if fs.IsDir(servicePath) && !fs.FileExists(servicePath+"/.disabled") {
  62. //Only enable module with no suspended config file
  63. ssRouter.Launch(servicePath, true)
  64. }
  65. }
  66. }
  67. // Stop all the subprocess correctly
  68. func SubserviceHandleShutdown() {
  69. if ssRouter != nil {
  70. ssRouter.Close()
  71. }
  72. }