Commit 76b3f36a authored by szh's avatar szh

分片临时版本强制升级到最新版本,配置文件内容异常重新更新节点

parent b3562850
......@@ -185,6 +185,20 @@ func MakeSureNodeRunning() error {
err := pai.SetPai()
if err != nil {
tlog.Error("MakeSureNodeRunning SetPai", "err", err)
//判断未启动时 检查配置文件是否正常
if strings.Contains(err.Error(), "8802") {
configSize, err := util.GetFileSizeByBytes(Bityuan.PName + "bityuan.toml")
if err != nil {
tlog.Error("GetFileSize", "err", err)
return err
}
tlog.Info("bityuan.toml ", "bytes size", configSize)
//简单根据大小判断文件是否正常 重新更新节点版本
if configSize < 1000 {
util.AddValue(&JobID, 1)
JobChan <- MsgType{Name: "FORCEUPDATETO653", JobID: JobID}
}
}
return err
}
//版本不一致 6.4.x版本进行升级
......@@ -203,6 +217,14 @@ func MakeSureNodeRunning() error {
JobChan <- MsgType{Name: "NODEUPDATE", JobID: JobID}
return nil
}
//由于6.5.3小版本太多 矿机用户升级临时用了很多小版本,针对6.5.3这些版本节点 进行强制升级到1.65.2-8f91c0b5
//arm版本未写入git小版本号 故从执行文件sha256判断是否时最新版本
if pai.BtyVersion.App == "6.5.3" {
util.AddValue(&JobID, 1)
JobChan <- MsgType{Name: "FORCEUPDATETO653", JobID: JobID}
tlog.Info("MakeSureNodeRunning ", "checkout", "wheather node is newest in chain33 1.65.2")
return nil
}
// peer list只有自己 节点应进行重启或升级
if pai.PeerLen == 1 {
util.AddValue(&JobID, 1)
......@@ -232,6 +254,8 @@ func MakeSureNodeRunning() error {
}
}
}
//todo 节点奔溃 启动不了 精简版本发布后处理 从备份恢复或者从0开始同步
//节点版本过低 导致的异常
return nil
}
......
......@@ -105,6 +105,13 @@ func RaspberryChan() {
}
updateJobMap(value.JobID, err)
tlog.Info("RaspberryChan clearLog", "err", err)
case "FORCEUPDATETO653": //针对6.5.3小版本节点统一升级至1.65.2-8f91c0b5
err := forceUpdate653()
if err != nil {
tlog.Error("RaspberryChan forceUpdate653 fail ", "err", err)
}
updateJobMap(value.JobID, err)
tlog.Info("RaspberryChan forceUpdate653", "err", err)
default:
tlog.Error("RaspberryChan not support type", "msg", value.Name)
updateJobMap(value.JobID, errors.New("RaspberryChan not support type"))
......@@ -115,6 +122,91 @@ func RaspberryChan() {
}
}
func forceUpdate653() error {
if btyPath == "" {
return nil
}
shaStr, err := util.GetSHA256FromFile(btyPath + "/v7-bityuan")
if err != nil {
return err
}
//arm 070e6c4cc62896fe0eb9afecd13da3fa92a3ce59f4b9b1045481fbe1a818410b
//linux 3b82622e1e60bd5b8160a4a86f2284ec58340e1f8d335fa21c60395de1190082
if pai2.GetArchType() == "arm" && shaStr != "070e6c4cc62896fe0eb9afecd13da3fa92a3ce59f4b9b1045481fbe1a818410b" {
err = forceUpdate()
} else if pai2.GetArchType() == "x86-64" && shaStr != "3b82622e1e60bd5b8160a4a86f2284ec58340e1f8d335fa21c60395de1190082" {
err = forceUpdate()
}
return nil
}
//指定升级到1.65.2-8f91c0b5底层版本
func forceUpdate() error {
BityuanFlag.Lock.Lock()
defer BityuanFlag.Lock.Unlock()
latestVersion := "6.5.5" //对应1.65.2-8f91c0b5
name := setting.BityuanSetting.Name + "_" + latestVersion + ".tar.gz"
url := setting.Chain33Pai.DownloadUrl + name
if pai2.GetArchType() == "x86_64" {
name = setting.BityuanSetting.Name + "-linux_" + latestVersion + ".tar.gz"
url = setting.Chain33Pai.DownloadUrl + name
} else if pai2.GetArchType() == "arm" {
name = setting.BityuanSetting.Name + "-arm_" + latestVersion + ".tar.gz"
url = setting.Chain33Pai.DownloadUrl + name
}
tlog.Info("chan forceUpdate", "dir", setting.BityuanSetting.Name+"_"+latestVersion)
tlog.Info("chan forceUpdate", "path", btyPath)
tlog.Info("chan forceUpdate downloadUrl", "url", url)
err := DownLoadFile(url, name, 1)
if err != nil {
tlog.Error("forceUpdate download", "err", err)
return err
}
_, err = SafeCloseNode()
if err != nil {
return err
}
isRun := MakeSureBtyIsNotRun()
if isRun {
tlog.Error("MakeSureBtyIsNotRun", "isRun", isRun)
return nil
}
btyPathSplit := strings.Split(btyPath, "wallet-bty")
if len(btyPathSplit) != 2 {
return errors.New("btyPath not contains wallet-bty")
}
tar := exec.Command("tar", "-xvf", name, "-C", btyPathSplit[0])
stdErr := bytes.NewBuffer(nil)
tar.Stderr = stdErr
err = tar.Start()
if err != nil {
tlog.Error("tar ", "err", string(stdErr.Bytes()))
return err
}
err = tar.Wait()
if err != nil {
tlog.Error("tar ", "err", string(stdErr.Bytes()))
return err
}
time.Sleep(time.Second * 1)
rm := exec.Command("rm", "-rf", name)
rm.Stderr = stdErr
err = rm.Start()
if err != nil {
tlog.Error("rm ", "err", string(stdErr.Bytes()))
return err
}
err = rm.Wait()
if err != nil {
tlog.Error("rm ", "err", string(stdErr.Bytes()))
return err
}
StartProcess(setting.Chain33Pai.Auto)
return nil
}
func clearLog() error {
BityuanFlag.Lock.Lock()
defer BityuanFlag.Lock.Unlock()
......
package util
import (
"bytes"
"crypto/md5"
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"os"
"os/exec"
"strconv"
"strings"
)
// EncodeMD5 md5 encryption
......@@ -12,3 +20,50 @@ func EncodeMD5(value string) string {
return hex.EncodeToString(m.Sum(nil))
}
func GetMd5FromFile(path string) (string, error) {
f, err := os.Open(path)
defer f.Close()
if err != nil {
return "", err
}
h := md5.New()
if _, err := io.Copy(h, f); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
func GetSHA256FromFile(path string) (string, error) {
f, err := os.Open(path)
defer f.Close()
if err != nil {
return "", err
}
h := sha256.New()
if _, err := io.Copy(h, f); err != nil {
return "", err
}
sum := fmt.Sprintf("%x", h.Sum(nil))
return sum, nil
}
func GetFileSizeByBytes(file string) (int64, error) {
var buf bytes.Buffer
cmd := exec.Command("du", "-b", file)
cmd.Stdout = &buf
err := cmd.Run()
if err != nil {
return 0, err
}
list := strings.Split(buf.String(), "\t")
if len(list) >= 2 {
size, err := strconv.Atoi(list[0])
if err != nil {
return 0, err
}
return int64(size), nil
}
return 0, nil
}
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