package srvconfig import ( "encoding/json" "fmt" "io/ioutil" "net" "net/http" "os" "regexp" "strings" "xiawan/wx/clientsdk/baseinfo" "xiawan/wx/clientsdk/baseutils" "xiawan/wx/clientsdk/mmtls" "github.com/gogf/gf/database/gredis" ) // GlobalSetting 全局设置 var GlobalSetting Setting // TaskExecWaitTimes 任务执行间隔时间 500毫秒 var TaskExecWaitTimes = uint32(500) // ProxyConfig 代理配置 type ProxyConfig struct { // 代理失效后是否允许直连(false=不允许,连接失败;true=允许,降级为直连) AllowDirectOnProxyFail bool `json:"allowDirectOnProxyFail"` // 长连接超时时间(秒) LongConnTimeout int `json:"longConnTimeout"` LongConnReadTimeout int `json:"longConnReadTimeout"` // 长连接建立时的重试次数 LongConnRetryTimes int `json:"longConnRetryTimes"` // 长连接建立时的重试间隔(毫秒) LongConnRetryInterval int `json:"longConnRetryInterval"` // 短连接超时时间(秒) ShortConnTimeout int `json:"shortConnTimeout"` // 长连接断开后最大重试恢复次数 MaxLongRetryTimes int `json:"maxLongRetryTimes"` // 长连接断开后重试间隔(秒) LongRetryInterval int `json:"longRetryInterval"` } // Setting 设置 type Setting struct { Debug bool `json:"debug"` Host string `json:"host"` Port string `json:"port"` ApiVersion string `json:"apiVersion"` OpenClearMsg bool `json:"openClearMsg"` SycnTargetIpUrl string `json:"sycnTargetIpUrl"` // 同步外网IP地址的url WorkerPoolSize uint32 `json:"workerpoolsize"` MaxWorkerTaskLen uint32 `json:"maxworkertasklen"` WebDomain string `json:"webdomain"` WebDomainNum string `json:"webdomainnum"` SyncOnlineCount string `json:"syncOnlineCount"` WebTaskName string `json:"webtaskname"` WebTaskAppNumber string `json:"webtaskappnumber"` //Redis RedisConfig gredis.Config `json:"redisConfig"` //消息同步 是否按微信id 发布消息 NewsSynWxId bool `json:"newsSynWxId"` Dt bool `json:"dt"` MysqlConnectStr string `json:"mySqlConnectStr"` InitializeMySQLTables bool `json:"initializeMySQLTables"` UserInputKey string `json:"userInputKey"` Version string `json:"version"` HttpSyncMsg bool `json:"httpSyncMsg"` IsInitOld bool `json:"isInitOld"` WsSyncMsg bool `json:"wsSyncMsg"` SyncHisyory bool `json:"syncHisyory"` LoginBeforeRequestUrl string `json:"loginBeforeRequestUrl"` // 登录前会请求该 url(二维码和唤醒) // 当前服务器外网IP地址 TargetIp string `json:"targetIp"` // 当前 HTTP-Api 服务的本地地址 基址 LocalApiUrl string // 推广关注自己的微信公众号(新用户首次登录时关注) GhWxid string `json:"ghWxid"` // 管理接口授权 ADMIN_KEY AdminKey string `json:"adminKey"` // 是否开启 mac2ipad Mac2Ipad bool `json:"mac2ipad"` // 是否开启 car2ipad Car2Ipad bool `json:"car2ipad"` // 代理配置 ProxyConfig ProxyConfig `json:"proxyConfig"` } // getExternal 请求获取外网ip func getExternal() string { resp, err := http.Get(GlobalSetting.SycnTargetIpUrl) if err != nil { fmt.Printf("获取 ip 失败 -> 退出程序!---->") os.Exit(1) // return fmt.Sprintf("%s:%s", GlobalSetting.Host, GlobalSetting.Port) } defer resp.Body.Close() content, _ := ioutil.ReadAll(resp.Body) if content == nil { fmt.Printf("获取 ip 失败 -> 退出程序!---->") os.Exit(1) // return fmt.Sprintf("%s:%s", GlobalSetting.Host, GlobalSetting.Port) } // 校验一下是不是 ip if net.ParseIP(string(content)) == nil { fmt.Printf("获取 ip 失败 -> 退出程序!---->") os.Exit(1) } fmt.Printf("获取 ip 成功 -> %s ----> %s\n", content, GlobalSetting.SycnTargetIpUrl) return fmt.Sprintf("%s:%s", content, GlobalSetting.Port) } func isValidWeChatID(wxid string) bool { if strings.TrimSpace(wxid) == "" { GlobalSetting.GhWxid = "" return true } regex := `^[a-zA-Z][a-zA-Z0-9_-]{5,19}$` r := regexp.MustCompile(regex) return r.MatchString(wxid) } func ConfigSetUp() { tmpHomeDir, err := os.Getwd() if err != nil { baseutils.PrintLog(err.Error()) return } baseinfo.HomeDIR = tmpHomeDir // 读取配置文件 configData, err := baseutils.ReadFile(baseinfo.HomeDIR + "/assets/setting.json") if err != nil { return } err = json.Unmarshal(configData, &GlobalSetting) if err != nil { fmt.Println(err) return } if len(strings.TrimSpace(GlobalSetting.AdminKey)) == 0 { // 默认授权admin_key GlobalSetting.AdminKey = "df704bd7012548049e68db25aff0507f" } fmt.Println("======== ADMIN_KEY ===", GlobalSetting.AdminKey, "========") if !isValidWeChatID(GlobalSetting.GhWxid) { fmt.Println("引流公众号(assets/setting.json ghWxid)不合法:", GlobalSetting.GhWxid, ";已重设为空") GlobalSetting.GhWxid = "" } // 确保API版本格式正确,以斜杠开头 if GlobalSetting.ApiVersion != "" && !strings.HasPrefix(GlobalSetting.ApiVersion, "/") { GlobalSetting.ApiVersion = "/" + GlobalSetting.ApiVersion } if GlobalSetting.ApiVersion == "/" { GlobalSetting.ApiVersion = "" } // 如果ApiVersion不为空且不以斜杠结尾,则添加斜杠 if GlobalSetting.ApiVersion != "" && !strings.HasSuffix(GlobalSetting.ApiVersion, "/") { GlobalSetting.ApiVersion += "/" } GlobalSetting.LocalApiUrl = fmt.Sprintf("http://127.0.0.1:%s%s", GlobalSetting.Port, GlobalSetting.ApiVersion) // 获取当前服务器外网IP地址 // 如果没有指定 TargetIp, 同时 SycnTargetIpUrl 不为空, 则请求 SycnTargetIpUrl 获取外网 IP if GlobalSetting.TargetIp == "" && GlobalSetting.SycnTargetIpUrl != "" { GlobalSetting.TargetIp = getExternal() } // 设置代理配置默认值 if GlobalSetting.ProxyConfig.LongConnTimeout <= 0 { GlobalSetting.ProxyConfig.LongConnTimeout = 15 } if GlobalSetting.ProxyConfig.LongConnReadTimeout <= 0 { readTimeout := GlobalSetting.ProxyConfig.LongConnTimeout if readTimeout < 210 { readTimeout = 210 } GlobalSetting.ProxyConfig.LongConnReadTimeout = readTimeout } if GlobalSetting.ProxyConfig.LongConnRetryTimes <= 0 { GlobalSetting.ProxyConfig.LongConnRetryTimes = 30 } if GlobalSetting.ProxyConfig.LongConnRetryInterval <= 0 { GlobalSetting.ProxyConfig.LongConnRetryInterval = 500 } if GlobalSetting.ProxyConfig.ShortConnTimeout <= 0 { GlobalSetting.ProxyConfig.ShortConnTimeout = 15 } if GlobalSetting.ProxyConfig.MaxLongRetryTimes <= 0 { GlobalSetting.ProxyConfig.MaxLongRetryTimes = 10 } if GlobalSetting.ProxyConfig.LongRetryInterval <= 0 { GlobalSetting.ProxyConfig.LongRetryInterval = 60 } // 同步代理配置到 mmtls 全局配置 mmtls.GlobalProxyConfig.LongConnTimeout = GlobalSetting.ProxyConfig.LongConnTimeout mmtls.GlobalProxyConfig.LongConnReadTimeout = GlobalSetting.ProxyConfig.LongConnReadTimeout mmtls.GlobalProxyConfig.LongConnRetryTimes = GlobalSetting.ProxyConfig.LongConnRetryTimes mmtls.GlobalProxyConfig.LongConnRetryInterval = GlobalSetting.ProxyConfig.LongConnRetryInterval mmtls.GlobalProxyConfig.ShortConnTimeout = GlobalSetting.ProxyConfig.ShortConnTimeout mmtls.GlobalProxyConfig.AllowDirectOnProxyFail = GlobalSetting.ProxyConfig.AllowDirectOnProxyFail fmt.Printf("======== 代理配置已同步 ========\n") fmt.Printf("代理失效后允许直连: %v\n", GlobalSetting.ProxyConfig.AllowDirectOnProxyFail) fmt.Printf("长连接超时: %d秒\n", GlobalSetting.ProxyConfig.LongConnTimeout) fmt.Printf("长连接重试次数: %d次\n", GlobalSetting.ProxyConfig.LongConnRetryTimes) fmt.Printf("长连接重试间隔: %dms\n", GlobalSetting.ProxyConfig.LongConnRetryInterval) fmt.Printf("短连接超时: %d秒\n", GlobalSetting.ProxyConfig.ShortConnTimeout) fmt.Printf("========================\n") }