Files
utility_go/cmd/update.go
2025-01-24 12:12:58 +08:00

125 lines
3.1 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 cmd
import (
"context"
"github.com/ayflying/utility_go/s3"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gcfg"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/gctx"
"os"
"time"
)
type serverCfg struct {
Name string `json:"name" dc:"服务名"`
Address string `json:"address" dc:"服务地址"`
Prod bool `json:"prod" dc:"是否生产环境"`
S3 string `json:"s3" dc:"使用哪个对象储存中转"`
}
type UpdateReq struct {
File *ghttp.UploadFile `json:"file" binding:"required" dc:"文件"`
FileUrl string `json:"file_url" dc:"文件地址"`
}
var s3Mod *s3.Mod
var (
Update = gcmd.Command{
Name: "update",
Usage: "update",
Brief: "更新系统",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
g.Log().Info(ctx, "准备上传更新文件")
//加载编辑配置文件
g.Cfg("hack").GetAdapter().(*gcfg.AdapterFile).SetFileName("hack/config.yaml")
getFileName, err := g.Cfg("hack").Get(ctx, "gfcli.build.name")
Filename := getFileName.String()
var list []*serverCfg
serverList := g.Cfg().MustGet(ctx, "server_list")
serverList.Scan(&list)
//如果有p或者prod参数则删除prod字段为true的服务
if parser.GetOpt("a").IsNil() {
var temp []*serverCfg
for _, v := range list {
if v.Prod == false {
temp = append(temp, v)
}
}
list = temp
} else {
g.Dump("升级", parser.GetOpt("a"))
}
g.Dump("需要更新的服务器", list)
//获取上传链接
var url = make(map[string]string)
filename := "linux_amd64/" + Filename
client := g.Client()
client.SetTimeout(time.Minute)
client.SetDiscovery(nil)
//循环服务器,推送更新
for _, v := range list {
address := v.Address
if v.S3 == "" {
v.S3 = "default"
}
//查询当前上传地址是否存在
if _, ok := url[v.S3]; !ok {
url[v.S3], err = UploadS3(v.S3, filename)
if err != nil {
g.Log().Error(ctx, err)
return
}
}
g.Log().Debugf(ctx, "准备同步服务器:%v,url=%v", v.Name, address+"/callback/update")
get, err := client.Post(ctx, address+"/callback/update", &UpdateReq{
FileUrl: url[v.S3],
})
if err != nil {
g.Log().Debugf(ctx, "切换代理进行上传:err=%v", err)
get, err = client.Proxy("http://192.168.50.114:10808").
Post(ctx, address+"/callback/update", &UpdateReq{
FileUrl: url[v.S3],
})
}
if err != nil {
g.Log().Error(ctx, err)
}
defer get.Close()
g.Log().Debugf(ctx, "同步服务器:%v,完成=%v", v.Name, address)
}
return
},
}
)
func UploadS3(typ string, filename string) (res string, err error) {
//updateServerS3Name, _ := g.Config().Get(ctx, "update_server_s3_name")
s3Mod = s3.New(typ)
bucketName := s3Mod.GetCfg().BucketName
obj, err := os.Open(filename)
ff, err := obj.Stat()
_, err = s3Mod.PutObject(obj, filename, bucketName, ff.Size())
if err != nil {
return
}
//上传当前文件
get, err := s3Mod.GetFileUrl(filename, bucketName)
g.Log().Debugf(gctx.New(), "下载地址:%s", get)
res = get.String()
return
}