config.go 2.0 KB

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