| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package config
- import (
- "encoding/json"
- "os"
- "path/filepath"
- "sync"
- )
- // Config 全局配置结构
- type Config struct {
- mu sync.RWMutex
- FTP FTPConfig `json:"ftp"`
- Web WebConfig `json:"web"`
- Admin AdminConfig `json:"admin"`
- Database DBConfig `json:"database"`
- }
- type FTPConfig struct {
- Host string `json:"host"`
- Port int `json:"port"`
- PassivePortMin int `json:"passive_port_min"`
- PassivePortMax int `json:"passive_port_max"`
- RootDir string `json:"root_dir"`
- EnableAnonymous bool `json:"enable_anonymous"`
- MaxConnections int `json:"max_connections"`
- IdleTimeout int `json:"idle_timeout"` // 秒
- }
- type WebConfig struct {
- Host string `json:"host"`
- Port int `json:"port"`
- }
- type AdminConfig struct {
- Username string `json:"username"`
- Password string `json:"password"`
- }
- type DBConfig struct {
- Path string `json:"path"`
- }
- // DefaultConfig 返回默认配置
- func DefaultConfig() *Config {
- return &Config{
- FTP: FTPConfig{
- Host: "0.0.0.0",
- Port: 2121,
- PassivePortMin: 50000,
- PassivePortMax: 50100,
- RootDir: "./ftp_root",
- EnableAnonymous: false,
- MaxConnections: 50,
- IdleTimeout: 300,
- },
- Web: WebConfig{
- Host: "0.0.0.0",
- Port: 8080,
- },
- Admin: AdminConfig{
- Username: "admin",
- Password: "admin123",
- },
- Database: DBConfig{
- Path: "./data/ftp.db",
- },
- }
- }
- // Load 从文件加载配置
- func Load(path string) (*Config, error) {
- data, err := os.ReadFile(path)
- if err != nil {
- if os.IsNotExist(err) {
- cfg := DefaultConfig()
- if err := cfg.Save(path); err != nil {
- return nil, err
- }
- return cfg, nil
- }
- return nil, err
- }
- var cfg Config
- if err := json.Unmarshal(data, &cfg); err != nil {
- return nil, err
- }
- return &cfg, nil
- }
- // Save 保存配置到文件
- func (c *Config) Save(path string) error {
- c.mu.RLock()
- defer c.mu.RUnlock()
- dir := filepath.Dir(path)
- if err := os.MkdirAll(dir, 0755); err != nil {
- return err
- }
- data, err := json.MarshalIndent(c, "", " ")
- if err != nil {
- return err
- }
- return os.WriteFile(path, data, 0644)
- }
- // Get 安全获取配置副本
- func (c *Config) Get() Config {
- c.mu.RLock()
- defer c.mu.RUnlock()
- return *c
- }
- // Update 安全更新配置
- func (c *Config) Update(fn func(cfg *Config)) {
- c.mu.Lock()
- defer c.mu.Unlock()
- fn(c)
- }
|