Commit 5be21cb2 authored by szh's avatar szh

部分需手动重启树莓派的操作都改成自动重启

parent 79c54d0e
...@@ -82,3 +82,4 @@ VersionUrl=https://raspserver.biqianbao.net/pai/latestversion ...@@ -82,3 +82,4 @@ VersionUrl=https://raspserver.biqianbao.net/pai/latestversion
FeedBackUrl=https://raspserver.biqianbao.net/pai/feedback FeedBackUrl=https://raspserver.biqianbao.net/pai/feedback
IsCompleteUrl=https://raspserver.biqianbao.net/pai/iscomplete IsCompleteUrl=https://raspserver.biqianbao.net/pai/iscomplete
RaspberryServer=112.124.4.47 RaspberryServer=112.124.4.47
StopPai=/home/pi/chain33-pai/stop-pai.sh
...@@ -61,7 +61,7 @@ var Bityuan ProcessInfo ...@@ -61,7 +61,7 @@ var Bityuan ProcessInfo
var UpdateInfo updateInfo var UpdateInfo updateInfo
var NodeError error var NodeError error
var ServerStatus Server var ServerStatus Server
var IsReboot bool //当更新完成 true表示 还没有重启 需要用户手动重启树莓派 var RebootP bool
func getProcessInfo(keyfile string)string{ func getProcessInfo(keyfile string)string{
var buffer bytes.Buffer // var buffer bytes.Buffer //
...@@ -480,20 +480,31 @@ func AutoUpdate(tick *time.Ticker) { ...@@ -480,20 +480,31 @@ func AutoUpdate(tick *time.Ticker) {
for { for {
select { select {
case <-tick.C: case <-tick.C:
if !DPercent.Flag {//没有其他任务占用 if RebootP {//重启pai
if IsReboot { err := KillPai()
//更新没有reboot 需要reboot if err != nil {
//先安全close 节点 防止节点数据异常 tlog.Error("kill pai","err",err)
SafeCloseNode() } else {
//再reboot err := StartProcess(setting.Chain33Pai.Start)
RebootPai() if err != nil {
tlog.Error("restart pai fail","err",err)
} else {
tlog.Info("kill restart pai success ")
}
} }
} else {
if !DPercent.Flag {//没有其他任务占用
DPercent.Flag = true
err := AutoUpdatePai() err := AutoUpdatePai()
if err != nil { if err != nil {
tlog.Error("autoupdatepai","err",err) tlog.Error("autoupdatepai","err",err)
} }
tlog.Info("autoupdatepai","err",GetVersion()) tlog.Info("autoupdatepai","err",GetVersion())
DPercent.Flag = false
}
} }
} }
} }
} }
...@@ -543,11 +554,15 @@ func AutoUpdatePai() error { ...@@ -543,11 +554,15 @@ func AutoUpdatePai() error {
tlog.Error("rm wait","err",err) tlog.Error("rm wait","err",err)
return err return err
} }
IsReboot = true RebootP = true
return nil return nil
} }
func RebootPai() { func KillPai() error {
cmd := exec.Command("reboot") err := StartProcess(setting.Chain33Pai.StopPai)
cmd.Run() if err != nil {
tlog.Error("stop chain33 pai ","err",err)
}
return nil
} }
...@@ -87,6 +87,7 @@ type Chain33_pai struct { ...@@ -87,6 +87,7 @@ type Chain33_pai struct {
FeedBackUrl string FeedBackUrl string
IsCompleteUrl string IsCompleteUrl string
RaspberryServer string RaspberryServer string
StopPai string
} }
var Chain33Pai=&Chain33_pai{} var Chain33Pai=&Chain33_pai{}
......
...@@ -35,12 +35,10 @@ func ResetWallet(c *gin.Context) { ...@@ -35,12 +35,10 @@ func ResetWallet(c *gin.Context) {
app.BityuanFlag = false app.BityuanFlag = false
return return
} }
cmd:=exec.Command("kill","-9",app.Bityuan.Pid) t,err := app.SafeCloseNode()
err:=cmd.Start() if err != nil || !t {
if err!=nil{
appG.Response(http.StatusOK, e.ENV_ERROR, "fail to reset wallet")
tlog.Error("ResetWallet","kill error ",err)
app.BityuanFlag = false app.BityuanFlag = false
appG.Response(http.StatusOK,e.NODE_ERROR,err)
return return
} }
err=os.RemoveAll(fmt.Sprintf("%s/wallet",path.Dir(app.Bityuan.Path))) err=os.RemoveAll(fmt.Sprintf("%s/wallet",path.Dir(app.Bityuan.Path)))
...@@ -62,220 +60,6 @@ func ResetWallet(c *gin.Context) { ...@@ -62,220 +60,6 @@ func ResetWallet(c *gin.Context) {
app.BityuanFlag = false app.BityuanFlag = false
} }
//钱包更新
func UpdateNode(c *gin.Context){
appG := app.Gin{C: c}
if app.BityuanFlag{
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating")
return
}
if app.NodeError!=nil{
appG.Response(http.StatusOK, e.NODE_ERROR,"node internal error,could not start node")
return
}
absPath := app.GetAbsPath(setting.BityuanSetting.Name)+"/"
pwd,err := os.Getwd()
if err != nil {
appG.Response(http.StatusOK, e.ERROR,"get pwd err")
return
}
pwd = pwd + "/"
app.BityuanFlag = true
app.UpdateInfo.Flag = false
setting.FreshVersion()
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.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK,e.SUCCESS,"current version is latest")
return
}
if latestVersion==""{
app.UpdateInfo.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK,e.NETWORK_ERROR,"network error,please checkout your network then try again")
return
}
stderr := bytes.NewBuffer(nil)
name := setting.BityuanSetting.Name+"_"+latestVersion+".tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name
tlog.Info("UpdateNode","dir",setting.BityuanSetting.Name+"_"+latestVersion)
tlog.Info("UpdateNode","path",absPath)
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)
tar.Stderr = stderr
err = tar.Start()
if err != nil {
tlog.Error("tar","err",err)
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = tar.Wait()
if err != nil {
tlog.Error("tar","err",stderr.String())
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, stderr.String())
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//备份原文件 确保没有alias 关联
bak := exec.Command("cp",absPath+setting.BityuanSetting.Name,absPath+setting.BityuanSetting.Name+".bak")
bak.Stderr = stderr
err = bak.Start()
if err != nil {
tlog.Error("bak","err",err)
appG.Response(http.StatusOK, e.CP_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = bak.Wait()
if err != nil {
tlog.Error("bak","err",stderr.String())
appG.Response(http.StatusOK, e.CP_ERROR, stderr.String())
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//备份配置文件
bakconf := exec.Command("cp",absPath+"bityuan.toml",absPath+"bityuan.toml.bak")
bakconf.Stderr = stderr
err = bakconf.Start()
if err != nil {
tlog.Error("bakconf","err",err)
appG.Response(http.StatusOK, e.CP_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = bakconf.Wait()
if err != nil {
tlog.Error("bakconf","err",stderr.String())
appG.Response(http.StatusOK, e.CP_ERROR, stderr.String())
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
t,err := app.SafeCloseNode()
if err != nil || !t {
app.UpdateInfo.Flag = true
app.BityuanFlag = false
appG.Response(http.StatusOK,e.NODE_ERROR,err)
return
}
//替换原执行文件
err = os.Chmod(pwd+setting.BityuanSetting.Name+"_"+latestVersion+"/"+setting.BityuanSetting.Name,0755)
if err != nil {
appG.Response(http.StatusOK, e.ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = os.Chmod(pwd+setting.BityuanSetting.Name+"_"+latestVersion+"/"+setting.BityuanSetting.Name+"-cli",0755)
if err != nil {
appG.Response(http.StatusOK, e.ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
mv := exec.Command("mv",pwd+setting.BityuanSetting.Name+"_"+latestVersion+"/"+setting.BityuanSetting.Name,absPath)
mv.Stderr = stderr
err = mv.Start()
if err != nil {
tlog.Error("mv","err",err)
appG.Response(http.StatusOK, e.MV_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = mv.Wait()
if err != nil {
tlog.Error("stderr:","err",stderr.String())
appG.Response(http.StatusOK, e.MV_ERROR, stderr.String())
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
mv2 := exec.Command("mv",pwd+setting.BityuanSetting.Name+"_"+latestVersion+"/"+setting.BityuanSetting.Name+"-cli",absPath)
mv2.Stderr = stderr
err = mv2.Start()
if err != nil {
tlog.Error("mv2","err",err)
appG.Response(http.StatusOK, e.MV_ERROR, err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
err = mv2.Wait()
if err != nil {
tlog.Error("stderr2:","err",stderr.String())
appG.Response(http.StatusOK, e.MV_ERROR, stderr.String())
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
//mv2 := exec.Command("mv",setting.BityuanSetting.Name+"_"+latestVersion+"/"+"bityuan.toml",".")
//err = mv2.Start()
//if err != nil {
// tlog.Error("mv2",err)
// appG.Response(http.StatusOK, e.MV_ERROR, err)
// app.UpdateInfo.Flag = true
// app.BityuanFlag = false
// return
//}
//err = mv2.Wait()
//if err != nil {
// tlog.Error("mv2",err)
// appG.Response(http.StatusOK, e.MV_ERROR, err)
// app.UpdateInfo.Flag = true
// app.BityuanFlag = false
// return
//}
remove := exec.Command("rm","-rf",setting.BityuanSetting.Name+"_"+latestVersion,name)
remove.Stderr = stderr
err = remove.Start()
if err != nil {
appG.Response(http.StatusOK, e.RM_ERROR, err)
app.DPercent.Flag = false
return
}
err = remove.Wait()
if err != nil {
appG.Response(http.StatusOK, e.RM_ERROR, stderr.String())
app.DPercent.Flag = 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
//}
app.BityuanFlag = false
appG.Response(http.StatusOK,e.SUCCESS,"update job started")
}
//钱包更新,只替换执行文件和配置文件 //钱包更新,只替换执行文件和配置文件
//具体更新逻辑不再代码实现 //具体更新逻辑不再代码实现
//oss下载包打包要保持执行权限 //oss下载包打包要保持执行权限
...@@ -384,9 +168,16 @@ func UpdateNodeNew(c *gin.Context){ ...@@ -384,9 +168,16 @@ func UpdateNodeNew(c *gin.Context){
app.BityuanFlag = false app.BityuanFlag = false
return return
} }
err=app.StartProcess(setting.Chain33Pai.Auto)
if err!=nil{
appG.Response(http.StatusOK, e.NODE_ERROR,"fail to restart node")
tlog.Error("UpdateNodeNew","auto.sh error ",err)
app.UpdateInfo.Flag = true
app.BityuanFlag = false
return
}
app.BityuanFlag = false app.BityuanFlag = false
app.UpdateInfo.Flag = true app.UpdateInfo.Flag = true
app.IsReboot = true //需要重启
appG.Response(http.StatusOK,e.SUCCESS,"update job started") appG.Response(http.StatusOK,e.SUCCESS,"update job started")
} }
...@@ -398,21 +189,12 @@ func ResetNode(c* gin.Context){ ...@@ -398,21 +189,12 @@ func ResetNode(c* gin.Context){
return return
} }
app.BityuanFlag = true app.BityuanFlag = true
kill := exec.Command("kill", "-9", app.Bityuan.Pid) _,err := app.SafeCloseNode()
err:=kill.Start()
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR,"kill node err") appG.Response(http.StatusOK,e.NODE_ERROR,"node err")
app.BityuanFlag = false app.BityuanFlag = false
return return
} }
err=kill.Wait()
if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR,"kill node cmd wait err")
app.BityuanFlag = false
return
}
err = os.RemoveAll(fmt.Sprintf("%s/datadir",path.Dir(app.Bityuan.Path))) err = os.RemoveAll(fmt.Sprintf("%s/datadir",path.Dir(app.Bityuan.Path)))
if err != nil { if err != nil {
app.BityuanFlag = false app.BityuanFlag = false
...@@ -463,7 +245,6 @@ func NodeInfo(c *gin.Context){ ...@@ -463,7 +245,6 @@ func NodeInfo(c *gin.Context){
appG:=app.Gin{C:c} appG:=app.Gin{C:c}
var client chain33.PaiClient var client chain33.PaiClient
_,err := client.Version() _,err := client.Version()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,"node down") appG.Response(http.StatusOK,e.NODE_ERROR,"node down")
return return
...@@ -471,6 +252,16 @@ func NodeInfo(c *gin.Context){ ...@@ -471,6 +252,16 @@ func NodeInfo(c *gin.Context){
appG.Response(http.StatusOK,e.SUCCESS,"node is running") appG.Response(http.StatusOK,e.SUCCESS,"node is running")
} }
func RestartNode(c* gin.Context){
appG:=app.Gin{C:c}
_,err := app.SafeCloseNode()
if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,"node err")
return
}
appG.Response(http.StatusOK,e.SUCCESS,"node restarted")
}
//反馈信息 //反馈信息
func FeedBack(c *gin.Context){ func FeedBack(c *gin.Context){
appG:=app.Gin{C:c} appG:=app.Gin{C:c}
......
...@@ -234,7 +234,6 @@ func UpdatePaiNew(c *gin.Context) { ...@@ -234,7 +234,6 @@ func UpdatePaiNew(c *gin.Context) {
} }
app.DPercent.Flag = false app.DPercent.Flag = false
app.IsReboot = true
appG.Response(http.StatusOK, e.SUCCESS, nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
} }
......
...@@ -45,6 +45,8 @@ func InitRouter() *gin.Engine { ...@@ -45,6 +45,8 @@ func InitRouter() *gin.Engine {
apiv1.POST("/escrowpassword",v1.EscrowPasswd) apiv1.POST("/escrowpassword",v1.EscrowPasswd)
//pai更新完成用户手动重启设备 //pai更新完成用户手动重启设备
//apiv1.POST("/isreboot",v1.IsReBoot) //apiv1.POST("/isreboot",v1.IsReBoot)
//重启节点
apiv1.POST("/restartnode",v1.RestartNode)
return r return r
} }
......
#!/bin/bash
ps aux | grep "chain33-pai" | grep -v grep | awk '{print $2}' | xargs -i kill {}
\ No newline at end of file
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