Initial commit (code only without large binaries)

This commit is contained in:
robin
2026-02-15 18:58:44 +08:00
commit 35df75498f
9442 changed files with 1495866 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
package updates
import (
"encoding/json"
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
)
type IgnoreVersionAction struct {
actionutils.ParentAction
}
func (this *IgnoreVersionAction) RunPost(params struct {
Version string
}) {
defer this.CreateLogInfo(codes.AdminUpdate_LogIgnoreVersion, params.Version)
if len(params.Version) == 0 {
this.Fail("请输入要忽略的版本号")
return
}
valueResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeCheckUpdates})
if err != nil {
this.ErrorPage(err)
return
}
var valueJSON = valueResp.ValueJSON
var config = systemconfigs.NewCheckUpdatesConfig()
if len(valueJSON) > 0 {
err = json.Unmarshal(valueJSON, config)
if err != nil {
this.ErrorPage(err)
return
}
}
config.IgnoredVersion = params.Version
configJSON, err := json.Marshal(config)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{
Code: systemconfigs.SettingCodeCheckUpdates,
ValueJSON: configJSON,
})
if err != nil {
this.ErrorPage(err)
return
}
// 清除状态
teaconst.NewVersionCode = ""
this.Success()
}

View File

@@ -0,0 +1,171 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package updates
import (
"encoding/json"
"fmt"
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
"github.com/iwind/TeaGo/maps"
)
type IndexAction struct {
actionutils.ParentAction
}
func (this *IndexAction) Init() {
this.Nav("", "updates", "")
}
func (this *IndexAction) RunGet(params struct {
DoCheck bool
}) {
this.Data["version"] = teaconst.Version
this.Data["doCheck"] = params.DoCheck
// 是否正在升级
this.Data["isUpgrading"] = isUpgrading
this.Data["isUpgradingDB"] = isUpgradingDB
this.Data["upgradeProgress"] = fmt.Sprintf("%.2f", upgradeProgress*100)
if isUpgrading {
this.Data["doCheck"] = false
}
valueResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeCheckUpdates})
if err != nil {
this.ErrorPage(err)
return
}
var valueJSON = valueResp.ValueJSON
var config = systemconfigs.NewCheckUpdatesConfig()
if len(valueJSON) > 0 {
err = json.Unmarshal(valueJSON, config)
if err != nil {
this.ErrorPage(err)
return
}
}
this.Data["config"] = config
this.Show()
}
func (this *IndexAction) RunPost(params struct {
}) {
// valueResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeCheckUpdates})
// if err != nil {
// this.ErrorPage(err)
// return
// }
// var valueJSON = valueResp.ValueJSON
// var config = systemconfigs.NewCheckUpdatesConfig()
// if len(valueJSON) > 0 {
// err = json.Unmarshal(valueJSON, config)
// if err != nil {
// this.ErrorPage(err)
// return
// }
// }
// type Response struct {
// Code int `json:"code"`
// Message string `json:"message"`
// Data interface{} `json:"data"`
// }
// var apiURL = teaconst.UpdatesURL
// apiURL = strings.ReplaceAll(apiURL, "${os}", runtime.GOOS)
// apiURL = strings.ReplaceAll(apiURL, "${arch}", runtime.GOARCH)
// apiURL = strings.ReplaceAll(apiURL, "${version}", teaconst.Version)
// resp, err := http.Get(apiURL)
// if err != nil {
// this.Data["result"] = maps.Map{
// "isOk": false,
// "message": "读取更新信息失败:" + err.Error(),
// }
// this.Success()
// return
// }
// defer func() {
// _ = resp.Body.Close()
// }()
// data, err := io.ReadAll(resp.Body)
// if err != nil {
// this.Data["result"] = maps.Map{
// "isOk": false,
// "message": "读取更新信息失败:" + err.Error(),
// }
// this.Success()
// return
// }
// var apiResponse = &Response{}
// err = json.Unmarshal(data, apiResponse)
// if err != nil {
// this.Data["result"] = maps.Map{
// "isOk": false,
// "message": "解析更新信息失败:" + err.Error(),
// }
// this.Success()
// return
// }
// if apiResponse.Code != 200 {
// this.Data["result"] = maps.Map{
// "isOk": false,
// "message": "解析更新信息失败:" + apiResponse.Message,
// }
// this.Success()
// return
// }
// var m = maps.NewMap(apiResponse.Data)
// var dlHost = m.GetString("host")
// var versions = m.GetSlice("versions")
// if len(versions) > 0 {
// for _, version := range versions {
// var vMap = maps.NewMap(version)
// if vMap.GetString("code") == "admin" {
// var latestVersion = vMap.GetString("version")
// if stringutil.VersionCompare(teaconst.Version, latestVersion) < 0 {
// // 是否已忽略
// if len(config.IgnoredVersion) > 0 && stringutil.VersionCompare(config.IgnoredVersion, latestVersion) >= 0 {
// continue
// }
// this.Data["result"] = maps.Map{
// "isOk": true,
// "version": latestVersion,
// "message": "有最新的版本 v" + latestVersion + " 可以更新",
// "hasNew": true,
// "dlURL": dlHost + vMap.GetString("url"),
// "day": vMap.GetString("day"),
// "description": vMap.GetString("description"),
// "docURL": vMap.GetString("docURL"),
// }
// this.Success()
// return
// } else {
// this.Data["result"] = maps.Map{
// "isOk": true,
// "message": "你已安装最新版本,无需更新",
// }
// this.Success()
// return
// }
// }
// }
// }
this.Data["result"] = maps.Map{
"isOk": false,
"message": "没有发现更新的版本",
}
this.Success()
}

View File

@@ -0,0 +1,4 @@
package updates
// 路由已迁移到 IP 库页面(/settings/ip-library此文件保留以兼容旧代码
// 实际的IP库路由在 EdgeAdmin/internal/web/actions/default/settings/ip-library/init.go 中注册

View File

@@ -0,0 +1,51 @@
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
package updates
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
)
type ResetIgnoredVersionAction struct {
actionutils.ParentAction
}
func (this *ResetIgnoredVersionAction) RunPost(params struct{}) {
defer this.CreateLogInfo(codes.AdminUpdate_LogResetIgnoreVersion)
valueResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeCheckUpdates})
if err != nil {
this.ErrorPage(err)
return
}
var valueJSON = valueResp.ValueJSON
var config = systemconfigs.NewCheckUpdatesConfig()
if len(valueJSON) > 0 {
err = json.Unmarshal(valueJSON, config)
if err != nil {
this.ErrorPage(err)
return
}
}
config.IgnoredVersion = ""
configJSON, err := json.Marshal(config)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{
Code: systemconfigs.SettingCodeCheckUpdates,
ValueJSON: configJSON,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,64 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package updates
import (
"encoding/json"
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
)
type UpdateAction struct {
actionutils.ParentAction
}
func (this *UpdateAction) RunPost(params struct {
AutoCheck bool
}) {
defer this.CreateLogInfo(codes.AdminUpdate_LogUpdateCheckSettings)
// 读取当前设置
valueResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeCheckUpdates})
if err != nil {
this.ErrorPage(err)
return
}
var valueJSON = valueResp.ValueJSON
var config = systemconfigs.NewCheckUpdatesConfig()
if len(valueJSON) > 0 {
err = json.Unmarshal(valueJSON, config)
if err != nil {
this.ErrorPage(err)
return
}
}
config.AutoCheck = params.AutoCheck
configJSON, err := json.Marshal(config)
if err != nil {
this.ErrorPage(err)
return
}
// 修改设置
_, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{
Code: systemconfigs.SettingCodeCheckUpdates,
ValueJSON: configJSON,
})
if err != nil {
this.ErrorPage(err)
return
}
// 重置状态
if !config.AutoCheck {
teaconst.NewVersionCode = ""
teaconst.NewVersionDownloadURL = ""
}
this.Success()
}

View File

@@ -0,0 +1,81 @@
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
package updateutils
import (
"bytes"
"context"
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/maps"
"os"
"os/exec"
)
func CheckLocalAPINode(rpcClient *rpc.RPCClient, ctx context.Context) (exePath string, ok bool) {
resp, err := rpcClient.APINodeRPC().FindCurrentAPINode(ctx, &pb.FindCurrentAPINodeRequest{})
if err != nil {
return
}
if resp.ApiNode == nil {
return
}
var instanceCode = resp.ApiNode.InstanceCode
if len(instanceCode) == 0 {
return
}
var statusJSON = resp.ApiNode.StatusJSON
if len(statusJSON) == 0 {
return
}
var status = &nodeconfigs.NodeStatus{}
err = json.Unmarshal(statusJSON, status)
if err != nil {
return
}
exePath = status.ExePath
if len(exePath) == 0 {
return
}
stat, err := os.Stat(exePath)
if err != nil {
return
}
if stat.IsDir() {
return
}
// 实例信息
{
var outputBuffer = &bytes.Buffer{}
var cmd = exec.Command(exePath, "instance")
cmd.Stdout = outputBuffer
err = cmd.Run()
if err != nil {
return
}
var outputBytes = outputBuffer.Bytes()
if len(outputBytes) == 0 {
return
}
var instanceMap = maps.Map{}
err = json.Unmarshal(bytes.TrimSpace(outputBytes), &instanceMap)
if err != nil {
return
}
if instanceMap.GetString("code") != instanceCode {
return
}
}
ok = true
return
}

View File

@@ -0,0 +1,93 @@
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
package updates
import (
"fmt"
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
executils "github.com/TeaOSLab/EdgeAdmin/internal/utils/exec"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/updates/updateutils"
"os"
"os/exec"
"time"
)
var upgradeProgress float32
var isUpgrading = false
var isUpgradingDB = false
type UpgradeAction struct {
actionutils.ParentAction
}
func (this *UpgradeAction) RunGet(params struct {
}) {
this.Data["isUpgrading"] = isUpgrading
this.Data["isUpgradingDB"] = isUpgradingDB
this.Data["upgradeProgress"] = fmt.Sprintf("%.2f", upgradeProgress*100)
this.Success()
}
func (this *UpgradeAction) RunPost(params struct {
Url string
}) {
if isUpgrading {
this.Success()
return
}
isUpgrading = true
upgradeProgress = 0
defer func() {
isUpgrading = false
}()
var manager = utils.NewUpgradeManager("admin", params.Url)
var ticker = time.NewTicker(1 * time.Second)
go func() {
for range ticker.C {
if manager.IsDownloading() {
var progress = manager.Progress()
if progress >= 0 {
upgradeProgress = progress
}
} else {
return
}
}
}()
err := manager.Start()
if err != nil {
this.Fail("下载失败:" + err.Error())
return
}
// try to exec local 'edge-api upgrade'
exePath, ok := updateutils.CheckLocalAPINode(this.RPC(), this.AdminContext())
if ok && len(exePath) > 0 {
isUpgradingDB = true
var before = time.Now()
var cmd = executils.NewCmd(exePath, "upgrade")
_ = cmd.Run()
var costSeconds = time.Since(before).Seconds()
// sleep to show upgrading status
if costSeconds < 3 {
time.Sleep(3 * time.Second)
}
isUpgradingDB = false
}
// restart
exe, _ := os.Executable()
if len(exe) > 0 {
go func() {
var cmd = exec.Command(exe, "restart")
_ = cmd.Run()
}()
}
this.Success()
}