Commit ebb37e64 authored by szh's avatar szh

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

parent c3469ef8
......@@ -28,25 +28,26 @@ type ProcessInfo struct {
}
type updateInfo struct {
Status bool `json:"status"`
Info string `json:"info"`
Flag bool `json:"flag"` //接口处理完成
Total int64 `json:"total"`
Current int64 `json:"current"`
}
type Server struct {
Disks []*Disk //硬盘信息
NodeProcesssInfo ProcessInfo //节点信息
Error string //错误信息
Disks []*Disk `json:"disks"`//硬盘信息
NodeProcesssInfo ProcessInfo `json:"node_processs_info"`//节点信息
Error string `json:"error"`//错误信息
}
type Disk struct {
Filesystem string
Type string //硬盘格式
SizeK string //硬盘大小
Use string
Filesystem string `json:"filesystem"`
Type string `json:"type"`//硬盘格式
SizeK string `json:"size_k"`//硬盘大小
Use string `json:"use"`
}
var BityuanFlag bool //true表示有任务在占用,禁止其他重复操作
var BityuanFlag bool //true表示有任务在占用,禁止其他重复操作 重置钱包 重置节点 升级节点 不能并发执行
var Bityuan ProcessInfo
var UpdateInfo updateInfo
var NodeError error
......@@ -264,24 +265,7 @@ type DownloadPercent struct {
Flag bool
}
type Reader struct {
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 {
func DownLoadFile(url string,file string,ty int32) error {
var (
buf = make([]byte, 32*1024)
)
......@@ -300,7 +284,12 @@ func DownLoadFile(url string,file string) error {
defer func(){
f.Close()
}()
DPercent.Total = r.ContentLength
if ty == int32(1) {
UpdateInfo.Total = r.ContentLength
} else {
DPercent.Total = r.ContentLength
}
//reader := &Reader{
// Reader:r.Body,
// Total:r.ContentLength,
......@@ -314,7 +303,12 @@ func DownLoadFile(url string,file string) error {
nw, ew := f.Write(buf[0:nr])
//数据长度大于0
if nw > 0 {
DPercent.Current += int64(nw)
if ty == int32(1) {
UpdateInfo.Current += int64(nw)
} else {
DPercent.Current += int64(nw)
}
}
//写入出错
if ew != nil {
......
......@@ -57,10 +57,10 @@ func ResetWallet(c *gin.Context) {
app.BityuanFlag = false
}
//钱包更新涉及到配置文件更新以及是否重新同步等规则不明确,先暂时不开放
//钱包更新,只替换执行文件
func UpdateNode(c *gin.Context){
appG := app.Gin{C: c}
if flag{
if app.BityuanFlag{
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating")
return
}
......@@ -68,57 +68,138 @@ func UpdateNode(c *gin.Context){
appG.Response(http.StatusOK, e.NODE_ERROR,"node internal error,could not start node")
return
}
app.BityuanFlag = true
app.UpdateInfo.Flag = false
setting.FreshVersion()
latestVersion:=app.GetLatestVersion()
app.UpdateInfo.Status=false
var pai pai_service.Pai
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{
app.UpdateInfo.Info="current version is latest"
app.UpdateInfo.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK,e.SUCCESS,"current version is latest")
return
}
if flag{
app.UpdateInfo.Info="Updating..."
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating")
return
}
if latestVersion==""{
flag=false
app.UpdateInfo.Info="network error"
app.UpdateInfo.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK,e.NETWORK_ERROR,"network error,please checkout your network then try again")
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")
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 然后重启节点
......@@ -158,13 +239,6 @@ func ResetNode(c* gin.Context){
func UpdateDetail(c* gin.Context){
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)
}
......
......@@ -65,12 +65,13 @@ func UpdatePai(c *gin.Context) {
err := c.ShouldBindJSON(&req)
if err != nil {
appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
app.DPercent.Flag = false
return
}
name := setting.Chain33Pai.Name+"_"+req.Version+".tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name
//oss下载更新包
err = app.DownLoadFile(url,name)
err = app.DownLoadFile(url,name,int32(2))
if err != nil {
appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, err)
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