service.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright 2025 BackendServerTemplate Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package resource
  5. import (
  6. _ "embed"
  7. "gopkg.in/yaml.v3"
  8. "os"
  9. "regexp"
  10. )
  11. const (
  12. FromNo = "no"
  13. FromInstall = "install"
  14. FromConfig = "config"
  15. )
  16. const (
  17. Args1Install = "install"
  18. Args1Uninstall1 = "remove"
  19. Args1Uninstall2 = "uninstall"
  20. Args1Start = "start"
  21. Args1Stop = "stop"
  22. Args1Restart = "restart"
  23. )
  24. type ServiceConfigType struct {
  25. Name string `yaml:"name"`
  26. DisplayName string `yaml:"display-name"`
  27. Describe string `yaml:"describe"`
  28. ArgumentFrom string `yaml:"argument-from"`
  29. ArgumentList []string `yaml:"argument-list"`
  30. EnvFrom string `yaml:"env-from"`
  31. EnvGetList []string `yaml:"env-get-list"`
  32. EnvSetList map[string]string `yaml:"env-set-list"`
  33. }
  34. //go:embed SERVICE.yaml
  35. var serviceConfig []byte
  36. var ServiceConfig ServiceConfigType
  37. var nameRegex = regexp.MustCompilePOSIX(`^[a-zA-Z0-9]+$`)
  38. func initServiceConfig() {
  39. err := yaml.Unmarshal(serviceConfig, &ServiceConfig)
  40. if err != nil {
  41. panic(err)
  42. }
  43. if ServiceConfig.Name == "" || !nameRegex.MatchString(ServiceConfig.Name) {
  44. panic("service name is invalid")
  45. }
  46. if ServiceConfig.DisplayName == "" {
  47. ServiceConfig.DisplayName = ServiceConfig.Name
  48. }
  49. ServiceConfig.Describe = utilsClenFileData(ServiceConfig.Describe)
  50. switch ServiceConfig.ArgumentFrom {
  51. case FromInstall:
  52. if len(os.Args) > 2 && os.Args[1] == Args1Install {
  53. ServiceConfig.ArgumentFrom = FromConfig
  54. ServiceConfig.ArgumentList = os.Args[2:]
  55. } else {
  56. ServiceConfig.ArgumentFrom = FromNo
  57. ServiceConfig.ArgumentList = nil
  58. }
  59. case FromConfig:
  60. if len(ServiceConfig.ArgumentList) == 0 {
  61. ServiceConfig.ArgumentFrom = FromNo
  62. ServiceConfig.ArgumentList = nil
  63. }
  64. default:
  65. ServiceConfig.ArgumentFrom = FromNo
  66. ServiceConfig.ArgumentList = nil
  67. }
  68. switch ServiceConfig.EnvFrom {
  69. case FromInstall:
  70. if len(ServiceConfig.EnvGetList) == 0 {
  71. ServiceConfig.EnvFrom = FromNo
  72. ServiceConfig.EnvGetList = nil
  73. ServiceConfig.EnvSetList = nil
  74. break
  75. }
  76. ServiceConfig.EnvSetList = make(map[string]string, len(ServiceConfig.EnvGetList))
  77. for _, e := range ServiceConfig.EnvGetList {
  78. ServiceConfig.EnvSetList[e] = os.Getenv(e)
  79. }
  80. case FromConfig:
  81. ServiceConfig.EnvGetList = nil
  82. if len(ServiceConfig.EnvSetList) == 0 {
  83. ServiceConfig.EnvFrom = FromNo
  84. ServiceConfig.EnvSetList = nil
  85. }
  86. default:
  87. ServiceConfig.EnvFrom = FromNo
  88. ServiceConfig.EnvGetList = nil
  89. ServiceConfig.EnvSetList = nil
  90. }
  91. }