config.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package entity
  2. import (
  3. "io/ioutil"
  4. "log"
  5. "os"
  6. "sync"
  7. "gopkg.in/yaml.v2"
  8. )
  9. // parentSavePath Parent Save Path
  10. const parentSavePath = "backup-x-files"
  11. // Config yml格式的配置文件
  12. // go的实体需大写对应config.yml的key, key全部小写
  13. type Config struct {
  14. User
  15. BackupConfig []BackupConfig
  16. Webhook
  17. S3Config
  18. EncryptKey string // 加密的key
  19. }
  20. // ConfigCache ConfigCache
  21. type cacheType struct {
  22. ConfigSingle *Config
  23. Err error
  24. Lock sync.Mutex
  25. }
  26. var cache = &cacheType{}
  27. // GetConfigCache 获得配置
  28. func GetConfigCache() (conf Config, err error) {
  29. cache.Lock.Lock()
  30. defer cache.Lock.Unlock()
  31. if cache.ConfigSingle != nil {
  32. return *cache.ConfigSingle, cache.Err
  33. }
  34. // init config
  35. cache.ConfigSingle = &Config{}
  36. configFilePath := getConfigFilePath()
  37. _, err = os.Stat(configFilePath)
  38. if err != nil {
  39. log.Println("没有找到配置文件!请在网页中输入")
  40. cache.Err = err
  41. return *cache.ConfigSingle, err
  42. }
  43. byt, err := ioutil.ReadFile(configFilePath)
  44. if err != nil {
  45. log.Println("config.yaml读取失败")
  46. cache.Err = err
  47. return *cache.ConfigSingle, err
  48. }
  49. err = yaml.Unmarshal(byt, cache.ConfigSingle)
  50. if err != nil {
  51. log.Println("反序列化配置文件失败", err)
  52. cache.Err = err
  53. return *cache.ConfigSingle, err
  54. }
  55. // remove err
  56. cache.Err = nil
  57. return *cache.ConfigSingle, err
  58. }
  59. // SaveConfig 保存配置
  60. func (conf *Config) SaveConfig() (err error) {
  61. cache.Lock.Lock()
  62. defer cache.Lock.Unlock()
  63. byt, err := yaml.Marshal(conf)
  64. if err != nil {
  65. log.Println(err)
  66. return err
  67. }
  68. err = ioutil.WriteFile(getConfigFilePath(), byt, 0600)
  69. if err != nil {
  70. log.Println(err)
  71. return
  72. }
  73. // 清空配置缓存
  74. cache.ConfigSingle = nil
  75. return
  76. }
  77. // GetConfigFilePath 获得配置文件路径, 保存到备份目录下
  78. func getConfigFilePath() string {
  79. _, err := os.Stat(parentSavePath)
  80. if err != nil {
  81. os.Mkdir(parentSavePath, 0750)
  82. }
  83. return parentSavePath + string(os.PathSeparator) + ".backup_x_config.yaml"
  84. }