package services import ( "fmt" "log" "os" "path/filepath" "xg_dba/api" "xg_dba/internal/global" "github.com/spf13/viper" ) // 设置连接信息 func SetConnectInfo_service(connectInfos []api.ConnectInfoRequest, saveFilePath string) error { // 创建目录(如果不存在) dirPath := filepath.Dir(saveFilePath) if err := os.MkdirAll(dirPath, os.ModePerm); err != nil { log.Println("创建目录失败", err) return err } // 创建空的配置文件(如果文件不存在) if _, err := os.Stat(saveFilePath); os.IsNotExist(err) { file, err := os.Create(saveFilePath) if err != nil { log.Println("创建文件失败", err) return err } defer file.Close() } // 设置 Viper 配置文件路径 viper.SetConfigFile(saveFilePath) viper.SetConfigType("toml") // 读取配置文件(忽略不存在的文件错误) if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); !ok { log.Println("读取配置文件失败", err) return err } } // 遍历每个连接信息 for idx, connectInfo := range connectInfos { // 连接测试 // sshClient, err := remote.NewSSHClient(connectInfo.Id, connectInfo.Ssh.Username, connectInfo.Ssh.Password, connectInfo.Ssh.Host, connectInfo.Ssh.Port) // if err != nil { // log.Println("连接失败", err) // return err // } // defer sshClient.Close() // 定义组和默认值 group := map[string]interface{}{ "db_database": connectInfo.Db.Database, "db_password": connectInfo.Db.Password, "db_port": connectInfo.Db.Port, "db_user": connectInfo.Db.User, "ssh_ip": connectInfo.Ssh.Host, "ssh_password": connectInfo.Ssh.Password, "ssh_port": connectInfo.Ssh.Port, "ssh_username": connectInfo.Ssh.Username, } // 将组写入 Viper 配置,使用 server_db.idx 的方式 for key, value := range group { viper.Set(fmt.Sprintf("server_db.%d.%s", idx+1, key), value) } } // 保存到文件 if err := viper.WriteConfigAs(saveFilePath); err != nil { log.Println("写入配置文件失败", err) return err } //更新缓存 if err := global.Cache.RefreshCache(); err != nil { log.Println("写入缓存失败", err) return err } fmt.Println("缓存刷新: ", global.Cache.Cache) return nil }