forked from ProjectWIND/ProjectWIND
290 lines
7.1 KiB
Go
290 lines
7.1 KiB
Go
package main
|
||
|
||
import (
|
||
"ProjectWIND/protocol"
|
||
"ProjectWIND/typed"
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
"io"
|
||
"log"
|
||
"os"
|
||
"time"
|
||
)
|
||
|
||
func initCore() string {
|
||
// 初始化日志记录器
|
||
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
|
||
log.SetPrefix("[WIND] ")
|
||
|
||
log.Println("[INFO] 正在初始化WIND配置文件...")
|
||
|
||
err := checkAndUpdateConfig("./data/config.json")
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
// 创建日志文件
|
||
logFile := fmt.Sprintf("./data/log/WIND_CORE_%s.log", time.Now().Format("20060102150405"))
|
||
_, err = os.Stat(logFile)
|
||
if os.IsNotExist(err) {
|
||
file, err := os.Create(logFile)
|
||
if err != nil {
|
||
log.Fatalf("[ERROR] Failed to create log file: %v", err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
||
}
|
||
}(file)
|
||
}
|
||
|
||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||
if err != nil {
|
||
log.Fatalf("[ERROR] Failed to create log file: %v", err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
||
}
|
||
}(file)
|
||
|
||
// 设置日志输出到文件
|
||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||
log.Println("[INFO] WIND配置文件初始化完成!")
|
||
return logFile
|
||
}
|
||
|
||
func checkAndUpdateConfig(configPath string) error {
|
||
// 检查并创建必要的目录和文件
|
||
if _, err := os.Stat("./data/"); os.IsNotExist(err) {
|
||
// 如果不存在,则创建该文件夹
|
||
err := os.Mkdir("./data/", 0755)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
}
|
||
|
||
// 检查./data/文件夹中是否存在config.json文件
|
||
if _, err := os.Stat("./data/config.json"); os.IsNotExist(err) {
|
||
// 如果不存在,则创建该文件
|
||
file, err := os.Create("./data/config.json")
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
}(file)
|
||
}
|
||
|
||
// 检查并更新配置文件
|
||
var config typed.ConfigInfo
|
||
|
||
// 定义默认配置
|
||
var defaultConfig typed.ConfigInfo
|
||
defaultConfig.CoreName = "windCore"
|
||
defaultConfig.WebUIPort = 3211
|
||
defaultConfig.ProtocolAddr = ""
|
||
defaultConfig.ServiceName = "wind"
|
||
// 读取配置文件
|
||
file, err := os.Open(configPath)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close config file: %v", err)
|
||
}
|
||
}(file)
|
||
|
||
// 解码JSON配置
|
||
decoder := json.NewDecoder(file)
|
||
err = decoder.Decode(&config)
|
||
if err != nil {
|
||
if !errors.Is(err, io.EOF) {
|
||
return err
|
||
}
|
||
}
|
||
|
||
// 检查并更新配置
|
||
if config.ProtocolAddr == "" {
|
||
config.ProtocolAddr = defaultConfig.ProtocolAddr
|
||
}
|
||
if config.WebUIPort == 0 {
|
||
config.WebUIPort = defaultConfig.WebUIPort
|
||
}
|
||
if config.CoreName == "" {
|
||
config.CoreName = defaultConfig.CoreName
|
||
}
|
||
if config.ServiceName == "" {
|
||
config.ServiceName = defaultConfig.ServiceName
|
||
}
|
||
if config.PasswordHash == "" {
|
||
config.PasswordHash = ""
|
||
}
|
||
|
||
formattedJSON, err := json.MarshalIndent(config, "", " ")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 将格式化后的JSON字符串写入文件
|
||
file, err = os.Create("./data/config.json")
|
||
if err != nil {
|
||
log.Println("Error creating file:", err)
|
||
return err
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("Failed to close config file: %v", err)
|
||
}
|
||
}(file)
|
||
|
||
_, err = file.Write(formattedJSON)
|
||
if err != nil {
|
||
log.Println("[ERROR] Error writing to file:", err)
|
||
return err
|
||
}
|
||
|
||
checkDataFolderExistence := func(dataAddress string) error {
|
||
// 检查./data/文件夹中是否存在dataAddress文件夹
|
||
if _, err := os.Stat(dataAddress); os.IsNotExist(err) {
|
||
err := os.Mkdir(dataAddress, 0755)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
err = checkDataFolderExistence("./data/app/")
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to create app folder: %v", err)
|
||
return err
|
||
}
|
||
err = checkDataFolderExistence("./data/images/")
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to create images folder: %v", err)
|
||
return err
|
||
}
|
||
err = checkDataFolderExistence("./data/database/")
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to create database folder: %v", err)
|
||
return err
|
||
}
|
||
err = checkDataFolderExistence("./data/log/")
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to create database log file: %v", err)
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func startWebUI() {
|
||
{
|
||
//初始化
|
||
logFile := initCore()
|
||
// 设置日志输出到文件
|
||
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
|
||
log.SetPrefix("[WIND] ")
|
||
// 打开日志文件
|
||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||
if err != nil {
|
||
log.Fatalf("[ERROR] Failed to create log file: %v", err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
||
}
|
||
}(file)
|
||
// 设置日志输出到文件
|
||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||
|
||
log.Println("[INFO] 正在启动WIND核心服务...")
|
||
// 启动 WebSocket 处理程序
|
||
|
||
//TODO: 这里要添加webUI的启动代码
|
||
}
|
||
}
|
||
|
||
func registerService() {
|
||
//初始化
|
||
logFile := initCore()
|
||
// 设置日志输出到文件
|
||
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
|
||
log.SetPrefix("[WIND] ")
|
||
// 打开日志文件
|
||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||
if err != nil {
|
||
log.Fatalf("[ERROR] Failed to create log file: %v", err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
||
}
|
||
}(file)
|
||
// 设置日志输出到文件
|
||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||
//TODO: 这里要添加注册服务的代码
|
||
}
|
||
|
||
func startProtocol() {
|
||
//初始化
|
||
logFile := initCore()
|
||
// 设置日志输出到文件
|
||
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
|
||
log.SetPrefix("[WIND] ")
|
||
// 打开日志文件
|
||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||
if err != nil {
|
||
log.Fatalf("[ERROR] Failed to create log file: %v", err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
||
}
|
||
}(file)
|
||
// 设置日志输出到文件
|
||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||
//从配置文件中读取配置信息
|
||
log.Println("[INFO] 正在启动WIND协议服务...")
|
||
var config typed.ConfigInfo
|
||
file, err = os.Open("./data/config.json")
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to open config file when linking to protocol: %v", err)
|
||
}
|
||
defer func(file *os.File) {
|
||
err := file.Close()
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to close config file: %v", err)
|
||
}
|
||
}(file)
|
||
|
||
decoder := json.NewDecoder(file)
|
||
err = decoder.Decode(&config)
|
||
if err != nil {
|
||
log.Printf("[ERROR] Failed to decode config file when linking to protocol: %v", err)
|
||
}
|
||
//获取协议地址
|
||
protocolAddr := config.ProtocolAddr
|
||
//链接协议
|
||
// 启动 WebSocket 处理程序
|
||
log.Println("[INFO] 正在启动WebSocket链接程序...")
|
||
err = protocol.WebSocketHandler(protocolAddr)
|
||
if err != nil {
|
||
// 如果发生错误,记录错误并退出程序
|
||
log.Fatal(err)
|
||
}
|
||
return
|
||
}
|