service.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. switch ServiceConfig.ArgumentFrom {
  50. case FromInstall:
  51. if len(os.Args) > 2 && os.Args[1] == Args1Install {
  52. ServiceConfig.ArgumentFrom = FromConfig
  53. ServiceConfig.ArgumentList = os.Args[2:]
  54. } else {
  55. ServiceConfig.ArgumentFrom = FromNo
  56. ServiceConfig.ArgumentList = nil
  57. }
  58. case FromConfig:
  59. if len(ServiceConfig.ArgumentList) == 0 {
  60. ServiceConfig.ArgumentFrom = FromNo
  61. ServiceConfig.ArgumentList = nil
  62. }
  63. default:
  64. ServiceConfig.ArgumentFrom = FromNo
  65. ServiceConfig.ArgumentList = nil
  66. }
  67. switch ServiceConfig.EnvFrom {
  68. case FromInstall:
  69. if len(ServiceConfig.EnvGetList) == 0 {
  70. ServiceConfig.EnvFrom = FromNo
  71. ServiceConfig.EnvGetList = nil
  72. ServiceConfig.EnvSetList = nil
  73. break
  74. }
  75. ServiceConfig.EnvSetList = make(map[string]string, len(ServiceConfig.EnvGetList))
  76. for _, e := range ServiceConfig.EnvGetList {
  77. ServiceConfig.EnvSetList[e] = os.Getenv(e)
  78. }
  79. case FromConfig:
  80. ServiceConfig.EnvGetList = nil
  81. if len(ServiceConfig.EnvSetList) == 0 {
  82. ServiceConfig.EnvFrom = FromNo
  83. ServiceConfig.EnvSetList = nil
  84. }
  85. default:
  86. ServiceConfig.EnvFrom = FromNo
  87. ServiceConfig.EnvGetList = nil
  88. ServiceConfig.EnvSetList = nil
  89. }
  90. }