config.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package config
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "sync"
  7. )
  8. // Config 全局配置结构
  9. type Config struct {
  10. mu sync.RWMutex
  11. FTP FTPConfig `json:"ftp"`
  12. Web WebConfig `json:"web"`
  13. Admin AdminConfig `json:"admin"`
  14. Database DBConfig `json:"database"`
  15. }
  16. type FTPConfig struct {
  17. Host string `json:"host"`
  18. Port int `json:"port"`
  19. PassivePortMin int `json:"passive_port_min"`
  20. PassivePortMax int `json:"passive_port_max"`
  21. RootDir string `json:"root_dir"`
  22. EnableAnonymous bool `json:"enable_anonymous"`
  23. MaxConnections int `json:"max_connections"`
  24. IdleTimeout int `json:"idle_timeout"` // 秒
  25. }
  26. type WebConfig struct {
  27. Host string `json:"host"`
  28. Port int `json:"port"`
  29. }
  30. type AdminConfig struct {
  31. Username string `json:"username"`
  32. Password string `json:"password"`
  33. }
  34. type DBConfig struct {
  35. Path string `json:"path"`
  36. }
  37. // DefaultConfig 返回默认配置
  38. func DefaultConfig() *Config {
  39. return &Config{
  40. FTP: FTPConfig{
  41. Host: "0.0.0.0",
  42. Port: 2121,
  43. PassivePortMin: 50000,
  44. PassivePortMax: 50100,
  45. RootDir: "./ftp_root",
  46. EnableAnonymous: false,
  47. MaxConnections: 50,
  48. IdleTimeout: 300,
  49. },
  50. Web: WebConfig{
  51. Host: "0.0.0.0",
  52. Port: 8080,
  53. },
  54. Admin: AdminConfig{
  55. Username: "admin",
  56. Password: "admin123",
  57. },
  58. Database: DBConfig{
  59. Path: "./data/ftp.db",
  60. },
  61. }
  62. }
  63. // Load 从文件加载配置
  64. func Load(path string) (*Config, error) {
  65. data, err := os.ReadFile(path)
  66. if err != nil {
  67. if os.IsNotExist(err) {
  68. cfg := DefaultConfig()
  69. if err := cfg.Save(path); err != nil {
  70. return nil, err
  71. }
  72. return cfg, nil
  73. }
  74. return nil, err
  75. }
  76. var cfg Config
  77. if err := json.Unmarshal(data, &cfg); err != nil {
  78. return nil, err
  79. }
  80. return &cfg, nil
  81. }
  82. // Save 保存配置到文件
  83. func (c *Config) Save(path string) error {
  84. c.mu.RLock()
  85. defer c.mu.RUnlock()
  86. dir := filepath.Dir(path)
  87. if err := os.MkdirAll(dir, 0755); err != nil {
  88. return err
  89. }
  90. data, err := json.MarshalIndent(c, "", " ")
  91. if err != nil {
  92. return err
  93. }
  94. return os.WriteFile(path, data, 0644)
  95. }
  96. // Get 安全获取配置副本
  97. func (c *Config) Get() Config {
  98. c.mu.RLock()
  99. defer c.mu.RUnlock()
  100. return *c
  101. }
  102. // Update 安全更新配置
  103. func (c *Config) Update(fn func(cfg *Config)) {
  104. c.mu.Lock()
  105. defer c.mu.Unlock()
  106. fn(c)
  107. }