config.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. }
  19. // ConfigCache ConfigCache
  20. type cacheType struct {
  21. ConfigSingle *Config
  22. Err error
  23. Lock sync.Mutex
  24. }
  25. var cache = &cacheType{}
  26. // GetConfigCache 获得配置
  27. func GetConfigCache() (conf Config, err error) {
  28. cache.Lock.Lock()
  29. defer cache.Lock.Unlock()
  30. if cache.ConfigSingle != nil {
  31. return *cache.ConfigSingle, cache.Err
  32. }
  33. // init config
  34. cache.ConfigSingle = &Config{}
  35. configFilePath := getConfigFilePath()
  36. _, err = os.Stat(configFilePath)
  37. if err != nil {
  38. log.Println("没有找到配置文件!请在网页中输入")
  39. cache.Err = err
  40. return *cache.ConfigSingle, err
  41. }
  42. byt, err := ioutil.ReadFile(configFilePath)
  43. if err != nil {
  44. log.Println("config.yaml读取失败")
  45. cache.Err = err
  46. return *cache.ConfigSingle, err
  47. }
  48. err = yaml.Unmarshal(byt, cache.ConfigSingle)
  49. if err != nil {
  50. log.Println("反序列化配置文件失败", err)
  51. cache.Err = err
  52. return *cache.ConfigSingle, err
  53. }
  54. // remove err
  55. cache.Err = nil
  56. return *cache.ConfigSingle, err
  57. }
  58. // SaveConfig 保存配置
  59. func (conf *Config) SaveConfig() (err error) {
  60. cache.Lock.Lock()
  61. defer cache.Lock.Unlock()
  62. byt, err := yaml.Marshal(conf)
  63. if err != nil {
  64. log.Println(err)
  65. return err
  66. }
  67. err = ioutil.WriteFile(getConfigFilePath(), byt, 0600)
  68. if err != nil {
  69. log.Println(err)
  70. return
  71. }
  72. // 清空配置缓存
  73. cache.ConfigSingle = nil
  74. return
  75. }
  76. // GetConfigFilePath 获得配置文件路径, 保存到备份目录下
  77. func getConfigFilePath() string {
  78. _, err := os.Stat(parentSavePath)
  79. if err != nil {
  80. os.Mkdir(parentSavePath, 0750)
  81. }
  82. return parentSavePath + string(os.PathSeparator) + ".backup_x_config.yaml"
  83. }