Files
wechat_ipad_pro/srv/srvconfig/globalconfig.go

217 lines
7.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")
}