Compare commits
No commits in common. "301817c35381153de2dd7501f2defae9dc453bf3" and "a9a9ecc3bde4d20e89e9b80aa56e8dc69c4e1099" have entirely different histories.
301817c353
...
a9a9ecc3bd
42
main.go
42
main.go
|
|
@ -20,12 +20,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// 输入参数
|
|
||||||
if len(os.Args) > 1 {
|
|
||||||
initConfig(os.Args[1]) //第一个参数是配置文件路径
|
|
||||||
} else {
|
|
||||||
initConfig("") //没有输入参数,则使用默认配置文件路径
|
|
||||||
}
|
|
||||||
gin.SetMode(gin.ReleaseMode)
|
gin.SetMode(gin.ReleaseMode)
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
err := dao.Init()
|
err := dao.Init()
|
||||||
|
|
@ -60,42 +54,14 @@ func main() {
|
||||||
ReadConfigToSetSystem()
|
ReadConfigToSetSystem()
|
||||||
r.Run(":" + proto.Config.SERVER_PORT) // listen and serve on 0.0.0.0:8083
|
r.Run(":" + proto.Config.SERVER_PORT) // listen and serve on 0.0.0.0:8083
|
||||||
}
|
}
|
||||||
|
func init() {
|
||||||
// 不使用
|
|
||||||
//
|
|
||||||
// func init() {
|
|
||||||
// // 创建cid的目录
|
|
||||||
// os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm)
|
|
||||||
// os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm)
|
|
||||||
// os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm)
|
|
||||||
// //读取配置文件
|
|
||||||
// //文件地址/home/videoplayer/vp.conf
|
|
||||||
// configPath := "/home/videoplayer/vp.conf"
|
|
||||||
// //读取配置文件
|
|
||||||
// err := proto.ReadConfig(configPath)
|
|
||||||
// if err != nil {
|
|
||||||
// panic("failed to read config file:" + err.Error())
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
func initConfig(configPath string) {
|
|
||||||
//if proto.Config.TOKEN_SECRET != "" {
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
// 创建cid的目录
|
// 创建cid的目录
|
||||||
os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm)
|
os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm)
|
||||||
os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm)
|
os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm)
|
||||||
os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm)
|
os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm)
|
||||||
//系统是linux、macos还是windows
|
//读取配置文件
|
||||||
if configPath == "" {
|
//文件地址/home/videoplayer/vp.conf
|
||||||
if os.Getenv("OS") == "Windows_NT" {
|
configPath := "/home/videoplayer/vp.conf"
|
||||||
configPath = "C:/Users/Administrator/vp.conf"
|
|
||||||
} else if os.Getenv("OS") == "linux" {
|
|
||||||
//文件地址/home/saw-ai/saw-ai.conf
|
|
||||||
configPath = "/etc/vp.conf"
|
|
||||||
} else {
|
|
||||||
configPath = "/etc/vp.conf"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//读取配置文件
|
//读取配置文件
|
||||||
err := proto.ReadConfig(configPath)
|
err := proto.ReadConfig(configPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"log"
|
"log"
|
||||||
mrand "math/rand"
|
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
@ -21,7 +20,6 @@ var ConfigRWLock = &sync.RWMutex{}
|
||||||
var SigningKeyRWLock = &sync.RWMutex{}
|
var SigningKeyRWLock = &sync.RWMutex{}
|
||||||
|
|
||||||
var SyncSecretReqLog int64
|
var SyncSecretReqLog int64
|
||||||
var CurrentConfigPath string
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MYSQL_USER = "video_t2"
|
MYSQL_USER = "video_t2"
|
||||||
|
|
@ -94,16 +92,25 @@ type ConfigStruct struct {
|
||||||
USER_SYNC_TIME int `json:"user_sync_time"` // 用户数据同步时间,单位秒
|
USER_SYNC_TIME int `json:"user_sync_time"` // 用户数据同步时间,单位秒
|
||||||
SERVER_NAME string `json:"server_name"` // 服务器名称,用于区分不同服务器
|
SERVER_NAME string `json:"server_name"` // 服务器名称,用于区分不同服务器
|
||||||
MONITOR_SERVER_TOKEN string `json:"monitor_server_token"` // 监控服务器token,用于状态监控及邮件通知
|
MONITOR_SERVER_TOKEN string `json:"monitor_server_token"` // 监控服务器token,用于状态监控及邮件通知
|
||||||
APP_ID string `json:"app_id"` // 应用ID,用于标识不同应用
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func WriteConfigToFile() {
|
func WriteConfigToFile() {
|
||||||
|
//系统是linux、macos还是windows
|
||||||
|
var configPath string
|
||||||
|
if os.Getenv("OS") == "Windows_NT" {
|
||||||
|
configPath = "D:/Code/videoplayer/vp.conf"
|
||||||
|
} else if os.Getenv("OS") == "linux" {
|
||||||
|
//文件地址/home/saw-ai/saw-ai.conf
|
||||||
|
configPath = "/home/videoplayer/vp.conf"
|
||||||
|
} else {
|
||||||
|
configPath = "/home/videoplayer/vp.conf"
|
||||||
|
}
|
||||||
configData, err := json.MarshalIndent(Config, "", " ")
|
configData, err := json.MarshalIndent(Config, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("WriteConfigToFile json marshal error:", err)
|
log.Println("WriteConfigToFile json marshal error:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = os.WriteFile(CurrentConfigPath, configData, 0644)
|
err = os.WriteFile(configPath, configData, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("WriteConfigToFile write file error:", err)
|
log.Println("WriteConfigToFile write file error:", err)
|
||||||
return
|
return
|
||||||
|
|
@ -114,7 +121,6 @@ func WriteConfigToFile() {
|
||||||
// 读取配置文件
|
// 读取配置文件
|
||||||
func ReadConfig(path string) error {
|
func ReadConfig(path string) error {
|
||||||
//查看配置文件是否存在,不存在则创建
|
//查看配置文件是否存在,不存在则创建
|
||||||
CurrentConfigPath = path
|
|
||||||
_, err := os.Stat(path)
|
_, err := os.Stat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Config file not found!")
|
fmt.Println("Config file not found!")
|
||||||
|
|
@ -152,22 +158,8 @@ func ReadConfig(path string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SigningKey = []byte(Config.TOKEN_SECRET)
|
SigningKey = []byte(Config.TOKEN_SECRET)
|
||||||
if Config.APP_ID == "" {
|
|
||||||
Config.APP_ID = GetRandomString(8)
|
|
||||||
log.Println("ReadConfig generated APP_ID:", Config.APP_ID)
|
|
||||||
go WriteConfigToFile()
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
func GetRandomString(l int) string {
|
|
||||||
str := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
||||||
bytes := []byte(str)
|
|
||||||
var result []byte
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
result = append(result, bytes[mrand.Intn(len(bytes))])
|
|
||||||
}
|
|
||||||
return string(result)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 默认配置
|
// 默认配置
|
||||||
func DefaultConfig() {
|
func DefaultConfig() {
|
||||||
|
|
|
||||||
|
|
@ -191,10 +191,6 @@ func DelMonitorDeviceListWithStatus(userId int, deviceReq []proto.GetMonitorDevi
|
||||||
// 更新token密钥
|
// 更新token密钥
|
||||||
func SyncTokenSecretFromUserCenter() {
|
func SyncTokenSecretFromUserCenter() {
|
||||||
secretSettings, err := GetTokenSecretFromUserCenter()
|
secretSettings, err := GetTokenSecretFromUserCenter()
|
||||||
if err != nil {
|
|
||||||
log.Println("SyncTokenSecretFromUserCenter error:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
//写入redis
|
//写入redis
|
||||||
secretSettingsBytes, err2 := json.Marshal(secretSettings)
|
secretSettingsBytes, err2 := json.Marshal(secretSettings)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
|
|
@ -206,8 +202,12 @@ func SyncTokenSecretFromUserCenter() {
|
||||||
}
|
}
|
||||||
worker.SetRedis("secret_sync_settings", string(secretSettingsBytes)) //将密钥信息存入redis
|
worker.SetRedis("secret_sync_settings", string(secretSettingsBytes)) //将密钥信息存入redis
|
||||||
|
|
||||||
if secretSettings.Curr != "" && secretSettings.Curr != proto.Config.TOKEN_SECRET && secretSettings.Next == "" { //如果当前密钥不为空且不等于配置文件中的密钥,并且下一个密钥为空,则需要更新配置文件中的密钥
|
if err != nil {
|
||||||
log.Printf("SyncTokenSecretFromUserCenter current secret is not equal to config secret, current: %s, config: %s\n", secretSettings.Curr, proto.Config.TOKEN_SECRET)
|
log.Println("SyncTokenSecretFromUserCenter error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if secretSettings.Curr != "" && secretSettings.Curr != proto.TOKEN_SECRET && secretSettings.Next == "" { //如果当前密钥不为空且不等于配置文件中的密钥,并且下一个密钥为空,则需要更新配置文件中的密钥
|
||||||
|
log.Printf("SyncTokenSecretFromUserCenter current secret is not equal to config secret, current: %s, config: %s\n", secretSettings.Curr, proto.TOKEN_SECRET)
|
||||||
//如果当前密钥与配置文件中的密钥不一致,则需要更新配置文件中的密钥
|
//如果当前密钥与配置文件中的密钥不一致,则需要更新配置文件中的密钥
|
||||||
proto.SigningKeyRWLock.Lock()
|
proto.SigningKeyRWLock.Lock()
|
||||||
proto.SigningKey = []byte(secretSettings.Curr)
|
proto.SigningKey = []byte(secretSettings.Curr)
|
||||||
|
|
@ -227,6 +227,7 @@ func SyncTokenSecretFromUserCenter() {
|
||||||
|
|
||||||
proto.SyncSecretReqLog++ //记录同步密钥请求次数
|
proto.SyncSecretReqLog++ //记录同步密钥请求次数
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetNextSecretToCurrent(secret_copy proto.SecretSyncSettings) {
|
func SetNextSecretToCurrent(secret_copy proto.SecretSyncSettings) {
|
||||||
var secret_sync_settings proto.SecretSyncSettings
|
var secret_sync_settings proto.SecretSyncSettings
|
||||||
redisKey := "secret_sync_settings"
|
redisKey := "secret_sync_settings"
|
||||||
|
|
@ -279,7 +280,7 @@ func GetTokenSecretFromUserCenter() (*proto.SecretSyncSettings, error) {
|
||||||
proto.SigningKeyRWLock.Lock()
|
proto.SigningKeyRWLock.Lock()
|
||||||
defer proto.SigningKeyRWLock.Unlock()
|
defer proto.SigningKeyRWLock.Unlock()
|
||||||
req.SecretKeyMd5 = worker.GenerateMD5(string(proto.SigningKey))
|
req.SecretKeyMd5 = worker.GenerateMD5(string(proto.SigningKey))
|
||||||
req.DeviceApp = proto.Config.APP_ID
|
req.DeviceApp = "StuAcaWorksAI"
|
||||||
req.Timestamp = worker.GetCurrentTimestamp()
|
req.Timestamp = worker.GetCurrentTimestamp()
|
||||||
req.Sign = worker.GenerateMD5(req.SecretKeyMd5 + req.DeviceApp + strconv.FormatInt(req.Timestamp, 10))
|
req.Sign = worker.GenerateMD5(req.SecretKeyMd5 + req.DeviceApp + strconv.FormatInt(req.Timestamp, 10))
|
||||||
reqBytes, err2 := json.Marshal(req)
|
reqBytes, err2 := json.Marshal(req)
|
||||||
|
|
@ -299,18 +300,13 @@ func GetTokenSecretFromUserCenter() (*proto.SecretSyncSettings, error) {
|
||||||
log.Println("GetTokenSecretFromUserCenter json unmarshal error:", err)
|
log.Println("GetTokenSecretFromUserCenter json unmarshal error:", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if respObject.Code != 0 {
|
|
||||||
log.Println("GetTokenSecretFromUserCenter error code:", respObject.Code, "\t, message:", respObject.Message)
|
|
||||||
return nil, fmt.Errorf("GetTokenSecretFromUserCenter error code: %d, message: %s", respObject.Code, respObject.Message)
|
|
||||||
}
|
|
||||||
|
|
||||||
//对称加密密钥。通过密钥加 secret_key 取md5
|
//对称加密密钥。通过密钥加 secret_key 取md5
|
||||||
secretKeyMd5 := worker.GenerateMD5(proto.Config.TOKEN_SECRET + "_sync_secret")
|
secretKeyMd5 := worker.GenerateMD5(proto.TOKEN_SECRET + "_sync_secret")
|
||||||
|
|
||||||
//解密返回数据
|
//解密返回数据
|
||||||
dataContent, err2 := worker.AESDecrypt(respObject.Data, []byte(secretKeyMd5))
|
dataContent, err2 := worker.AESDecrypt(respObject.Data, []byte(secretKeyMd5))
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
log.Println("GetTokenSecretFromUserCenter aes decrypt error:", err2, "\t, secret:", proto.Config.TOKEN_SECRET, "\t, secretKey:", secretKeyMd5, "\t, data:", respObject.Data)
|
log.Println("GetTokenSecretFromUserCenter aes decrypt error:", err2)
|
||||||
return nil, err2
|
return nil, err2
|
||||||
}
|
}
|
||||||
var secretResp proto.SecretSyncSettings
|
var secretResp proto.SecretSyncSettings
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue