Commit ebb37e64 authored by szh's avatar szh

更新节点更新接口逻辑 和 对应进度接口

parent c3469ef8
...@@ -28,25 +28,26 @@ type ProcessInfo struct { ...@@ -28,25 +28,26 @@ type ProcessInfo struct {
} }
type updateInfo struct { type updateInfo struct {
Status bool `json:"status"` Flag bool `json:"flag"` //接口处理完成
Info string `json:"info"` Total int64 `json:"total"`
Current int64 `json:"current"`
} }
type Server struct { type Server struct {
Disks []*Disk //硬盘信息 Disks []*Disk `json:"disks"`//硬盘信息
NodeProcesssInfo ProcessInfo //节点信息 NodeProcesssInfo ProcessInfo `json:"node_processs_info"`//节点信息
Error string //错误信息 Error string `json:"error"`//错误信息
} }
type Disk struct { type Disk struct {
Filesystem string Filesystem string `json:"filesystem"`
Type string //硬盘格式 Type string `json:"type"`//硬盘格式
SizeK string //硬盘大小 SizeK string `json:"size_k"`//硬盘大小
Use string Use string `json:"use"`
} }
var BityuanFlag bool //true表示有任务在占用,禁止其他重复操作 var BityuanFlag bool //true表示有任务在占用,禁止其他重复操作 重置钱包 重置节点 升级节点 不能并发执行
var Bityuan ProcessInfo var Bityuan ProcessInfo
var UpdateInfo updateInfo var UpdateInfo updateInfo
var NodeError error var NodeError error
...@@ -264,24 +265,7 @@ type DownloadPercent struct { ...@@ -264,24 +265,7 @@ type DownloadPercent struct {
Flag bool Flag bool
} }
type Reader struct { func DownLoadFile(url string,file string,ty int32) error {
io.Reader
Total int64
Current int64
}
func (r *Reader) Read(p []byte) (n int,err error) {
n,err = r.Reader.Read(p)
if err != nil {
return 0,err
}
r.Current += int64(n)
DPercent.Current += int64(n)
log.Printf("\r进度%.2f%%",float64(r.Current*100000/r.Total)/100)
return
}
func DownLoadFile(url string,file string) error {
var ( var (
buf = make([]byte, 32*1024) buf = make([]byte, 32*1024)
) )
...@@ -300,7 +284,12 @@ func DownLoadFile(url string,file string) error { ...@@ -300,7 +284,12 @@ func DownLoadFile(url string,file string) error {
defer func(){ defer func(){
f.Close() f.Close()
}() }()
DPercent.Total = r.ContentLength if ty == int32(1) {
UpdateInfo.Total = r.ContentLength
} else {
DPercent.Total = r.ContentLength
}
//reader := &Reader{ //reader := &Reader{
// Reader:r.Body, // Reader:r.Body,
// Total:r.ContentLength, // Total:r.ContentLength,
...@@ -314,7 +303,12 @@ func DownLoadFile(url string,file string) error { ...@@ -314,7 +303,12 @@ func DownLoadFile(url string,file string) error {
nw, ew := f.Write(buf[0:nr]) nw, ew := f.Write(buf[0:nr])
//数据长度大于0 //数据长度大于0
if nw > 0 { if nw > 0 {
DPercent.Current += int64(nw) if ty == int32(1) {
UpdateInfo.Current += int64(nw)
} else {
DPercent.Current += int64(nw)
}
} }
//写入出错 //写入出错
if ew != nil { if ew != nil {
......
...@@ -57,10 +57,10 @@ func ResetWallet(c *gin.Context) { ...@@ -57,10 +57,10 @@ func ResetWallet(c *gin.Context) {
app.BityuanFlag = false app.BityuanFlag = false
} }
//钱包更新涉及到配置文件更新以及是否重新同步等规则不明确,先暂时不开放 //钱包更新,只替换执行文件
func UpdateNode(c *gin.Context){ func UpdateNode(c *gin.Context){
appG := app.Gin{C: c} appG := app.Gin{C: c}
if flag{ if app.BityuanFlag{
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating") appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating")
return return
} }
...@@ -68,57 +68,138 @@ func UpdateNode(c *gin.Context){ ...@@ -68,57 +68,138 @@ func UpdateNode(c *gin.Context){
appG.Response(http.StatusOK, e.NODE_ERROR,"node internal error,could not start node") appG.Response(http.StatusOK, e.NODE_ERROR,"node internal error,could not start node")
return return
} }
app.BityuanFlag = true
app.UpdateInfo.Flag = false
setting.FreshVersion() setting.FreshVersion()
latestVersion:=app.GetLatestVersion() var pai pai_service.Pai
app.UpdateInfo.Status=false
latestVersion,err := pai.GetPaiLatestVersion(int32(1))
if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR,"get online version err")
app.BityuanFlag = false
app.UpdateInfo.Flag = true
return
}
if latestVersion==setting.BityuanSetting.Version{ if latestVersion==setting.BityuanSetting.Version{
app.UpdateInfo.Info="current version is latest" app.UpdateInfo.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK,e.SUCCESS,"current version is latest") appG.Response(http.StatusOK,e.SUCCESS,"current version is latest")
return return
} }
if flag{
app.UpdateInfo.Info="Updating..."
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating")
return
}
if latestVersion==""{ if latestVersion==""{
flag=false app.UpdateInfo.Flag = true
app.UpdateInfo.Info="network error" app.BityuanFlag = false
appG.Response(http.StatusOK,e.NETWORK_ERROR,"network error,please checkout your network then try again") appG.Response(http.StatusOK,e.NETWORK_ERROR,"network error,please checkout your network then try again")
return return
} }
name := setting.BityuanSetting.Name+"_"+latestVersion+".tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name
err = app.DownLoadFile(url,name,int32(1))
if err != nil {
appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//解压缩文件
tar := exec.Command("tar","-xvf",name)
err = tar.Start()
if err != nil {
log.Println("tar",err)
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = tar.Wait()
if err != nil {
log.Println("tar",err)
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//备份原文件 确保没有alias 关联
bak := exec.Command("cp",setting.BityuanSetting.Name,setting.BityuanSetting.Name+".bak")
err = bak.Start()
if err != nil {
log.Println("bak",err)
appG.Response(http.StatusOK, e.CP_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = bak.Wait()
if err != nil {
log.Println("bak",err)
appG.Response(http.StatusOK, e.CP_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//备份配置文件
bakconf := exec.Command("cp","bityuan.toml","bityuan.toml.bak")
err = bakconf.Start()
if err != nil {
log.Println("bakconf",err)
appG.Response(http.StatusOK, e.CP_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = bakconf.Wait()
if err != nil {
log.Println("bakconf",err)
appG.Response(http.StatusOK, e.CP_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//替换原执行文件
mv := exec.Command("mv",setting.BityuanSetting.Name+"_"+latestVersion+"/"+setting.BityuanSetting.Name,".")
err = mv.Start()
if err != nil {
log.Println("mv",err)
appG.Response(http.StatusOK, e.MV_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = mv.Wait()
if err != nil {
log.Println("mv",err)
appG.Response(http.StatusOK, e.MV_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
mv2 := exec.Command("mv",setting.BityuanSetting.Name+"_"+latestVersion+"/"+"bityuan.toml",".")
err = mv2.Start()
if err != nil {
log.Println("mv2",err)
appG.Response(http.StatusOK, e.MV_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = mv2.Wait()
if err != nil {
log.Println("mv2",err)
appG.Response(http.StatusOK, e.MV_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err=app.StartProcess(setting.Chain33Pai.Auto)
if err != nil {
app.UpdateInfo.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK, e.NODE_ERROR,"start auto sh err")
return
}
appG.Response(http.StatusOK,e.SUCCESS,"update job started") appG.Response(http.StatusOK,e.SUCCESS,"update job started")
go func(){
flag=true
err:=app.DownLoadLatestVersion()
if err!=nil{
flag=false
app.UpdateInfo.Info=err.Error()
return
}
app.Copy(setting.BityuanSetting.Name,app.Bityuan.Path)
app.Copy(fmt.Sprintf("%s-cli",setting.BityuanSetting.Name),app.Bityuan.Path)
os.Chdir("..")
os.RemoveAll(setting.BityuanSetting.Name)
kill:=exec.Command("kill","-9",app.Bityuan.Pid)
kill.Start()
err=kill.Wait()
if err!=nil{
flag=false
app.UpdateInfo.Info="fail to update node "
return
}
err=app.StartProcess(setting.Chain33Pai.Auto)
if err!=nil{
flag=false
app.UpdateInfo.Info="fail to update node "
return
}
app.UpdateInfo.Status=true
app.UpdateInfo.Info="complete"
flag=false
}()
} }
//重置节点只需要删除datadir 然后重启节点 //重置节点只需要删除datadir 然后重启节点
...@@ -158,13 +239,6 @@ func ResetNode(c* gin.Context){ ...@@ -158,13 +239,6 @@ func ResetNode(c* gin.Context){
func UpdateDetail(c* gin.Context){ func UpdateDetail(c* gin.Context){
appG := app.Gin{C: c} appG := app.Gin{C: c}
if flag{
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,app.UpdateInfo)
return
}
if app.UpdateInfo.Info=="download latest version failed"{
appG.Response(http.StatusOK,e.NETWORK_ERROR,app.UpdateInfo)
}
appG.Response(http.StatusOK,e.SUCCESS,app.UpdateInfo) appG.Response(http.StatusOK,e.SUCCESS,app.UpdateInfo)
} }
......
...@@ -65,12 +65,13 @@ func UpdatePai(c *gin.Context) { ...@@ -65,12 +65,13 @@ func UpdatePai(c *gin.Context) {
err := c.ShouldBindJSON(&req) err := c.ShouldBindJSON(&req)
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.INVALID_PARAMS, nil) appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
app.DPercent.Flag = false
return return
} }
name := setting.Chain33Pai.Name+"_"+req.Version+".tar.gz" name := setting.Chain33Pai.Name+"_"+req.Version+".tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name url := setting.Chain33Pai.DownloadUrl+ name
//oss下载更新包 //oss下载更新包
err = app.DownLoadFile(url,name) err = app.DownLoadFile(url,name,int32(2))
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, err) appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment