ProjectWIND/utils.go

348 lines
8.9 KiB
Go
Raw Permalink 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 main
import (
"ProjectWIND/LOG"
"ProjectWIND/core"
"ProjectWIND/database"
"ProjectWIND/typed"
"encoding/json"
"errors"
"fmt"
"io"
"log"
"os"
"time"
)
func initCore() string {
// 初始化日志记录器
log.SetFlags(log.Ldate | log.Ltime)
log.SetPrefix("[WIND] ")
LOG.Info("正在初始化WIND配置文件...")
err := checkAndUpdateConfig("./data/core.json")
if err != nil {
LOG.Fatal("初始化时,加载配置文件 ./data/core.json 失败: %v", 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.Fatal("初始化时,创建日志文件失败: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭日志文件: %v", err)
}
}(file)
}
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
LOG.Fatal("初始化时,无法打开日志文件: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭日志文件: %v", err)
}
}(file)
// 设置日志输出到文件
log.SetOutput(io.MultiWriter(os.Stdout, file))
LOG.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("初始化时创建data文件夹失败: %v", err)
}
}
// 检查./data/文件夹中是否存在core.json文件
if _, err := os.Stat("./data/core.json"); os.IsNotExist(err) {
// 如果不存在,则创建该文件
file, err := os.Create("./data/core.json")
if err != nil {
LOG.Fatal("初始化时,创建 ./data/core.json 配置文件失败: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("关闭 ./data/core.json 配置文件失败: %v", err)
}
}(file)
}
// 检查并更新配置文件
var coreConfig typed.CoreConfigInfo
var defaultProtocol typed.Protocol
defaultProtocol.Name = "EXAMPLE"
defaultProtocol.Platform = "在这里输入协议平台"
defaultProtocol.Addr = "在这里输入协议地址,如'ws://127.0.0.1:8080'"
defaultProtocol.Token = "在这里输入协议的Token"
defaultProtocol.Enable = true
var defaultConfig typed.CoreConfigInfo
defaultConfig.CoreName = "windCore"
defaultConfig.WebUIPort = 3211
defaultConfig.Protocol = defaultProtocol
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.Fatal("无法关闭配置文件 ./data/core.json: %v", err)
}
}(file)
// 解码JSON配置
decoder := json.NewDecoder(file)
err = decoder.Decode(&coreConfig)
if err != nil {
if !errors.Is(err, io.EOF) {
return err
}
}
// 检查并更新配置
if coreConfig.Protocol == (typed.Protocol{}) {
coreConfig.Protocol = defaultConfig.Protocol
}
if coreConfig.WebUIPort == 0 {
coreConfig.WebUIPort = defaultConfig.WebUIPort
}
if coreConfig.CoreName == "" {
coreConfig.CoreName = defaultConfig.CoreName
}
if coreConfig.ServiceName == "" {
coreConfig.ServiceName = defaultConfig.ServiceName
}
if coreConfig.PasswordHash == "" {
coreConfig.PasswordHash = ""
}
//if coreConfig.Token == "" {
// coreConfig.Token = ""
//}
formattedJSON, err := json.MarshalIndent(coreConfig, "", " ")
if err != nil {
return err
}
// 将格式化后的JSON字符串写入文件
file, err = os.Create("./data/core.json")
if err != nil {
LOG.Fatal("初始化时,创建 ./data/core.json 配置文件失败: %v", err)
return err
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭配置文件 ./data/core.json: %v", err)
}
}(file)
_, err = file.Write(formattedJSON)
if err != nil {
LOG.Fatal("初始化时,写入 ./data/core.json 配置文件失败: %v", 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.Fatal("创建应用文件夹 ./data/app/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/images/")
if err != nil {
LOG.Fatal("创建图片文件夹 ./data/images/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/files/")
if err != nil {
LOG.Fatal("创建文件文件夹 ./data/files/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/videos/")
if err != nil {
LOG.Fatal("创建视频文件夹 ./data/videos/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/audios/")
if err != nil {
LOG.Fatal("创建音频文件夹 ./data/audios/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/database/")
if err != nil {
LOG.Fatal("创建数据库文件夹 ./data/database/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/log/")
if err != nil {
LOG.Fatal("创建日志文件夹 ./data/log/ 失败: %v", err)
return err
}
err = checkDataFolderExistence("./data/app/configs/")
if err != nil {
LOG.Fatal("创建应用配置文件夹 ./data/app/configs/ 失败: %v", err)
}
return nil
}
func startWebUI() {
{
//初始化
logFile := initCore()
// 设置日志输出到文件
log.SetFlags(log.Ldate | log.Ltime)
log.SetPrefix("[WIND] ")
// 打开日志文件
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
LOG.Fatal("打开日志文件失败: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭日志文件: %v", err)
}
}(file)
// 设置日志输出到文件
log.SetOutput(io.MultiWriter(os.Stdout, file))
LOG.Info("正在启动WIND核心服务...")
// 启动 WebSocket 处理程序
//TODO: 这里要添加webUI的启动代码
}
}
func registerService() {
//初始化
logFile := initCore()
// 设置日志输出到文件
log.SetFlags(log.Ldate | log.Ltime)
log.SetPrefix("[WIND] ")
// 打开日志文件
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
LOG.Fatal("无法打开日志文件: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭日志文件: %v", err)
}
}(file)
// 设置日志输出到文件
log.SetOutput(io.MultiWriter(os.Stdout, file))
//在/etc/systemd/system/下创建服务文件
}
func startProtocol() {
//初始化
logFile := initCore()
// 设置日志输出到文件
log.SetFlags(log.Ldate | log.Ltime)
log.SetPrefix("[WIND] ")
// 打开日志文件
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
LOG.Fatal("无法打开日志文件: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭日志文件: %v", err)
}
}(file)
// 设置日志输出到文件
log.SetOutput(io.MultiWriter(os.Stdout, file))
ReloadApps()
//从配置文件中读取配置信息
LOG.Info("正在启动WIND协议服务...")
var config typed.CoreConfigInfo
file, err = os.Open("./data/core.json")
if err != nil {
LOG.Fatal("无法打开配置文件 ./data/core.json: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
LOG.Fatal("无法关闭配置文件 ./data/core.json: %v", err)
}
}(file)
decoder := json.NewDecoder(file)
err = decoder.Decode(&config)
if err != nil {
LOG.Fatal("连接协议时,解析配置文件 ./data/core.json 失败: %v", err)
}
LOG.Info("正在启动WebSocket链接程序...")
protocol := config.Protocol
if protocol.Name == "EXAMPLE" {
LOG.Warn("未找到协议配置信息")
return
}
if protocol.Name == "" {
LOG.Warn("连接协议 %s 时,协议名称为空", protocol.Name)
return
}
//获取协议地址
protocolAddr := protocol.Addr
if protocolAddr == "" {
LOG.Warn("连接协议 %s 时,协议地址为空", protocol.Name)
return
}
if protocol.Enable == false {
LOG.Warn("连接协议 %s 时,协议已禁用", protocol.Name)
return
}
// 启动 WebSocket 处理程序
err = core.WebSocketHandler(protocol)
if err != nil {
LOG.Error("连接协议时 %s启动 WebSocket 处理程序失败: %v", protocol.Name, err)
}
}
func ReloadApps() {
LOG.Info("正在重新加载应用...")
total, success := core.ReloadApps()
LOG.Info("应用重新加载完成,共加载%d个应用成功加载%d个应用。", total, success)
}
func startDatabase() {
go database.Start()
time.Sleep(time.Second * 1)
select {}
}