Commit 7884dc8b authored by root's avatar root

fmt

parent 3fb8e362
...@@ -8,10 +8,10 @@ import ( ...@@ -8,10 +8,10 @@ import (
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"net/http"
"time"
clog "github.com/33cn/chain33/common/log" clog "github.com/33cn/chain33/common/log"
log "github.com/33cn/chain33/common/log/log15" log "github.com/33cn/chain33/common/log/log15"
"net/http"
"time"
) )
func init() { func init() {
...@@ -26,7 +26,6 @@ func init() { ...@@ -26,7 +26,6 @@ func init() {
var tlog = log.New("main", "main.go") var tlog = log.New("main", "main.go")
// @title Golang Gin API // @title Golang Gin API
// @version 1.0 // @version 1.0
// @description An example of gin // @description An example of gin
...@@ -38,7 +37,7 @@ func main() { ...@@ -38,7 +37,7 @@ func main() {
//区域网广播设备 //区域网广播设备
go app.Broadcast() go app.Broadcast()
//节点操作 //节点操作
go app.BityuanJob(time.NewTicker(time.Second*30)) go app.BityuanJob(time.NewTicker(time.Second * 30))
//树莓派内置程序操作 //树莓派内置程序操作
go app.PaiJob(time.NewTicker(time.Second * 50)) go app.PaiJob(time.NewTicker(time.Second * 50))
//go app.ClearLog(time.NewTicker(time.Hour*1)) //go app.ClearLog(time.NewTicker(time.Hour*1))
...@@ -60,7 +59,7 @@ func main() { ...@@ -60,7 +59,7 @@ func main() {
MaxHeaderBytes: maxHeaderBytes, MaxHeaderBytes: maxHeaderBytes,
} }
tlog.Info("[info] start http server listening ", "port",endPoint) tlog.Info("[info] start http server listening ", "port", endPoint)
server.ListenAndServe() server.ListenAndServe()
select {} select {}
// If you want Graceful Restart, you need a Unix system and download github.com/fvbock/endless // If you want Graceful Restart, you need a Unix system and download github.com/fvbock/endless
......
package app package app
import ( import (
"chain33-pai/service/pai_service"
"chain33-pai/pkg/util" "chain33-pai/pkg/util"
"chain33-pai/service/pai_service"
"net" "net"
"time" "time"
) )
...@@ -25,10 +25,10 @@ func Broadcast() { ...@@ -25,10 +25,10 @@ func Broadcast() {
} }
} }
//ip 会变化 //ip 会变化
ip,err := util.GetLocalIpByName("wlan0") ip, err := util.GetLocalIpByName("wlan0")
if err != nil || ip == nil { if err != nil || ip == nil {
tlog.Error("broadcast",err) tlog.Error("broadcast", err)
ip,err = util.GetLocalIpByName("eth0") ip, err = util.GetLocalIpByName("eth0")
if err != nil { if err != nil {
panic(err) panic(err)
} }
...@@ -46,21 +46,21 @@ func Broadcast() { ...@@ -46,21 +46,21 @@ func Broadcast() {
} }
conn, err := net.DialUDP("udp", &laddr, &raddr) conn, err := net.DialUDP("udp", &laddr, &raddr)
if err != nil { if err != nil {
tlog.Error("broadcast","net error ",err) tlog.Error("broadcast", "net error ", err)
panic(err) panic(err)
} }
for { for {
//ip 会变化 //ip 会变化
ip,err = util.GetLocalIpByName("wlan0") ip, err = util.GetLocalIpByName("wlan0")
if err != nil || ip == nil { if err != nil || ip == nil {
tlog.Error("broadcast","err","wlan0 not exists") tlog.Error("broadcast", "err", "wlan0 not exists")
ip,err = util.GetLocalIpByName("eth0") ip, err = util.GetLocalIpByName("eth0")
if err != nil { if err != nil {
tlog.Error("broadcast","err","eth0 not exists") tlog.Error("broadcast", "err", "eth0 not exists")
time.Sleep(time.Second*1) time.Sleep(time.Second * 1)
continue continue
} }
tlog.Info("broadcast","eth0",ip.IP.String()) tlog.Info("broadcast", "eth0", ip.IP.String())
} }
if runningAddr != nil && runningAddr.IP.String() != ip.IP.String() { if runningAddr != nil && runningAddr.IP.String() != ip.IP.String() {
...@@ -76,22 +76,22 @@ func Broadcast() { ...@@ -76,22 +76,22 @@ func Broadcast() {
conn.Close() conn.Close()
conn, err = net.DialUDP("udp", &laddr, &raddr) conn, err = net.DialUDP("udp", &laddr, &raddr)
if err != nil { if err != nil {
tlog.Error("broadcast","net error ",err) tlog.Error("broadcast", "net error ", err)
panic(err) panic(err)
} }
tlog.Info("broadcast","oldip",runningAddr.IP.String(),"newip",ip.IP.String()) tlog.Info("broadcast", "oldip", runningAddr.IP.String(), "newip", ip.IP.String())
} }
runningAddr = ip runningAddr = ip
_, err = conn.Write([]byte(send)) _, err = conn.Write([]byte(send))
if err != nil{ if err != nil {
tlog.Error("broadcast ","err",err) tlog.Error("broadcast ", "err", err)
time.Sleep(time.Second*1) time.Sleep(time.Second * 1)
continue continue
} }
tlog.Info("broadcast","ip:",ip.IP.String(),"udp",send) tlog.Info("broadcast", "ip:", ip.IP.String(), "udp", send)
time.Sleep(time.Second*1) time.Sleep(time.Second * 1)
} }
......
...@@ -7,5 +7,5 @@ type MsgType struct { ...@@ -7,5 +7,5 @@ type MsgType struct {
} }
func Setup() { func Setup() {
JobChan = make(chan MsgType,10) JobChan = make(chan MsgType, 10)
} }
...@@ -2,30 +2,30 @@ package app ...@@ -2,30 +2,30 @@ package app
import ( import (
"bytes" "bytes"
"chain33-pai/pkg/chain33"
"chain33-pai/pkg/pai"
"chain33-pai/pkg/setting" "chain33-pai/pkg/setting"
"chain33-pai/pkg/util"
"chain33-pai/service/pai_service"
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"io"
"github.com/33cn/chain33/common/log" "github.com/33cn/chain33/common/log"
"github.com/33cn/chain33/types"
types2 "github.com/33cn/plugin/plugin/dapp/ticket/types"
"io"
"io/ioutil"
"net/http" "net/http"
"os" "os"
"os/exec" "os/exec"
"path" "path"
"strings"
"time"
"io/ioutil"
"chain33-pai/pkg/util"
"github.com/33cn/chain33/types"
"chain33-pai/service/pai_service"
"encoding/json"
"chain33-pai/pkg/chain33"
types2 "github.com/33cn/plugin/plugin/dapp/ticket/types"
"strconv" "strconv"
"strings"
"sync" "sync"
"chain33-pai/pkg/pai" "time"
) )
var tlog = log.New("pkg","app") var tlog = log.New("pkg", "app")
type ProcessInfo struct { type ProcessInfo struct {
PName string `json:"p_name"` PName string `json:"p_name"`
...@@ -38,13 +38,12 @@ type updateInfo struct { ...@@ -38,13 +38,12 @@ type updateInfo struct {
Flag bool `json:"flag"` //接口处理完成 Flag bool `json:"flag"` //接口处理完成
Total int64 `json:"total"` Total int64 `json:"total"`
Current int64 `json:"current"` Current int64 `json:"current"`
} }
type Server struct { type Server struct {
Disks []*pai.Disk `json:"disks"`//硬盘信息 Disks []*pai.Disk `json:"disks"` //硬盘信息
NodeProcesssInfo ProcessInfo `json:"node_processs_info"`//节点信息 NodeProcesssInfo ProcessInfo `json:"node_processs_info"` //节点信息
Error string `json:"error"`//错误信息 Error string `json:"error"` //错误信息
} }
type BTYDownloadInfo struct { type BTYDownloadInfo struct {
...@@ -66,10 +65,10 @@ var NodeError error ...@@ -66,10 +65,10 @@ var NodeError error
var ServerStatus Server var ServerStatus Server
var RebootP bool var RebootP bool
func getProcessInfo(keyfile string)string{ func getProcessInfo(keyfile string) string {
var buffer bytes.Buffer // var buffer bytes.Buffer //
var buffer_res bytes.Buffer // var buffer_res bytes.Buffer //
lsof := exec.Command("ps","aux") lsof := exec.Command("ps", "aux")
grep := exec.Command("grep", keyfile) grep := exec.Command("grep", keyfile)
head := exec.Command("grep", "-v", "grep") head := exec.Command("grep", "-v", "grep")
read, write := io.Pipe() // Create a pipe read, write := io.Pipe() // Create a pipe
...@@ -90,47 +89,46 @@ func getProcessInfo(keyfile string)string{ ...@@ -90,47 +89,46 @@ func getProcessInfo(keyfile string)string{
return strings.Replace(buffer_res.String(), "\n", "", -1) return strings.Replace(buffer_res.String(), "\n", "", -1)
} }
func getWalletInfo()error{ func getWalletInfo() error {
rawProcessInfo:=getProcessInfo(setting.BityuanSetting.Name) rawProcessInfo := getProcessInfo(setting.BityuanSetting.Name)
tlog.Info("getWalletInfo","wallet",rawProcessInfo) tlog.Info("getWalletInfo", "wallet", rawProcessInfo)
if rawProcessInfo==""{ if rawProcessInfo == "" {
//钱包节点未启动 //钱包节点未启动
StartProcess(setting.Chain33Pai.Auto) StartProcess(setting.Chain33Pai.Auto)
var buffer bytes.Buffer var buffer bytes.Buffer
cmd:=exec.Command("find","/media","-name",setting.BityuanSetting.Name) cmd := exec.Command("find", "/media", "-name", setting.BityuanSetting.Name)
cmd.Stdout=&buffer cmd.Stdout = &buffer
cmd.Start() cmd.Start()
cmd.Wait() cmd.Wait()
if buffer.String()==""{ if buffer.String() == "" {
tlog.Info("node dose not exist") tlog.Info("node dose not exist")
return fmt.Errorf("node dose not exist") return fmt.Errorf("node dose not exist")
}else{ } else {
fmt.Println(buffer.String()) fmt.Println(buffer.String())
rawProcessInfo=getProcessInfo(setting.BityuanSetting.Name) rawProcessInfo = getProcessInfo(setting.BityuanSetting.Name)
if rawProcessInfo==""{ if rawProcessInfo == "" {
tlog.Info("node down") tlog.Info("node down")
return errors.New("node down") return errors.New("node down")
} }
} }
} }
record:=StrFilter(strings.Split(rawProcessInfo," "),"") record := StrFilter(strings.Split(rawProcessInfo, " "), "")
{ {
Bityuan.User=record[0] Bityuan.User = record[0]
Bityuan.Pid=record[1] Bityuan.Pid = record[1]
Bityuan.Path=record[10] Bityuan.Path = record[10]
Bityuan.PName=path.Base(Bityuan.Path) Bityuan.PName = path.Base(Bityuan.Path)
ServerStatus.NodeProcesssInfo = Bityuan ServerStatus.NodeProcesssInfo = Bityuan
} }
return nil return nil
} }
func StrFilter(str []string, filter string) (res []string) {
func StrFilter(str []string,filter string)(res []string){ for i := 0; i < len(str); i++ {
for i:=0;i<len(str);i++{ if str[i] != filter {
if str[i]!=filter{ res = append(res, str[i])
res=append(res,str[i])
} }
} }
...@@ -138,27 +136,27 @@ func StrFilter(str []string,filter string)(res []string){ ...@@ -138,27 +136,27 @@ func StrFilter(str []string,filter string)(res []string){
} }
//corn job for collecting chain33 process info //corn job for collecting chain33 process info
func BityuanJob(ticker *time.Ticker){ func BityuanJob(ticker *time.Ticker) {
NodeError = getWalletInfo() NodeError = getWalletInfo()
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
BityuanFlag.Lock.Lock() BityuanFlag.Lock.Lock()
if !BityuanFlag.Flag {//有更新,重置等节点重启操作时 禁止运行,防止冲突 if !BityuanFlag.Flag { //有更新,重置等节点重启操作时 禁止运行,防止冲突
//节点未启动 会调用auto启动 //节点未启动 会调用auto启动
NodeError = getWalletInfo() NodeError = getWalletInfo()
//解锁钱包 //解锁钱包
if NodeError == nil { if NodeError == nil {
status ,err := GetWalletStatus() status, err := GetWalletStatus()
if err != nil { if err != nil {
tlog.Error("GetWalletStatus","err",err) tlog.Error("GetWalletStatus", "err", err)
} else if status != nil && status.IsHasSeed { } else if status != nil && status.IsHasSeed {
if status.IsTicketLock && status.IsWalletLock{ if status.IsTicketLock && status.IsWalletLock {
err := Unlock() err := Unlock()
if err != nil { if err != nil {
tlog.Error("unlock wallet","err",err) tlog.Error("unlock wallet", "err", err)
} }
} }
//if !status.IsAutoMining { //if !status.IsAutoMining {
...@@ -178,23 +176,23 @@ func BityuanJob(ticker *time.Ticker){ ...@@ -178,23 +176,23 @@ func BityuanJob(ticker *time.Ticker){
} }
} }
func Copy(src,dst string){ func Copy(src, dst string) {
cp:=exec.Command("cp","-r",src,dst) cp := exec.Command("cp", "-r", src, dst)
cp.Start() cp.Start()
cp.Wait() cp.Wait()
} }
func StartProcess(scriptsAddr string)(err error){ func StartProcess(scriptsAddr string) (err error) {
cmd:=exec.Command(scriptsAddr) cmd := exec.Command(scriptsAddr)
err=cmd.Start() err = cmd.Start()
if err!=nil{ if err != nil {
tlog.Info("StartProcess","exec shell err",err) tlog.Info("StartProcess", "exec shell err", err)
return return
} }
err=cmd.Wait() err = cmd.Wait()
if err!=nil{ if err != nil {
tlog.Info("StartProcess","exec shell err",err) tlog.Info("StartProcess", "exec shell err", err)
return return
} }
return return
...@@ -208,11 +206,11 @@ type DownloadPercent struct { ...@@ -208,11 +206,11 @@ type DownloadPercent struct {
Flag bool Flag bool
} }
func DownLoadFile(url string,file string,ty int32) error { func DownLoadFile(url string, file string, ty int32) error {
var ( var (
buf = make([]byte, 32*1024) buf = make([]byte, 32*1024)
) )
r,err := http.Get(url) r, err := http.Get(url)
if err != nil { if err != nil {
return err return err
} }
...@@ -220,11 +218,11 @@ func DownLoadFile(url string,file string,ty int32) error { ...@@ -220,11 +218,11 @@ func DownLoadFile(url string,file string,ty int32) error {
r.Body.Close() r.Body.Close()
}() }()
f,err := os.Create(file) f, err := os.Create(file)
if err != nil { if err != nil {
return err return err
} }
defer func(){ defer func() {
f.Close() f.Close()
}() }()
if ty == int32(1) { if ty == int32(1) {
...@@ -278,9 +276,9 @@ func DownLoadFile(url string,file string,ty int32) error { ...@@ -278,9 +276,9 @@ func DownLoadFile(url string,file string,ty int32) error {
func GetAbsPath(key string) string { func GetAbsPath(key string) string {
str := getProcessInfo(key) str := getProcessInfo(key)
sstr := strings.Split(str,"\n") sstr := strings.Split(str, "\n")
regstr := util.DeleteExtraSpace(sstr[0]) regstr := util.DeleteExtraSpace(sstr[0])
params := strings.Split(regstr," ") params := strings.Split(regstr, " ")
if len(params) == 11 { if len(params) == 11 {
if params[10] != "" { if params[10] != "" {
return path.Dir(params[10]) return path.Dir(params[10])
...@@ -292,9 +290,9 @@ func GetAbsPath(key string) string { ...@@ -292,9 +290,9 @@ func GetAbsPath(key string) string {
func GetNodePid(key string) string { func GetNodePid(key string) string {
str := getProcessInfo(key) str := getProcessInfo(key)
sstr := strings.Split(str,"\n") sstr := strings.Split(str, "\n")
regstr := util.DeleteExtraSpace(sstr[0]) regstr := util.DeleteExtraSpace(sstr[0])
params := strings.Split(regstr," ") params := strings.Split(regstr, " ")
if len(params) == 11 { if len(params) == 11 {
if params[1] != "" { if params[1] != "" {
return params[1] return params[1]
...@@ -304,7 +302,7 @@ func GetNodePid(key string) string { ...@@ -304,7 +302,7 @@ func GetNodePid(key string) string {
return "" return ""
} }
func SafeCloseNode() (bool,error) { func SafeCloseNode() (bool, error) {
//var client chain33.PaiClient //var client chain33.PaiClient
//reply,err := client.Close() //reply,err := client.Close()
//if err != nil { //if err != nil {
...@@ -316,60 +314,60 @@ func SafeCloseNode() (bool,error) { ...@@ -316,60 +314,60 @@ func SafeCloseNode() (bool,error) {
//return true,nil //return true,nil
path := GetAbsPath(setting.BityuanSetting.Name) path := GetAbsPath(setting.BityuanSetting.Name)
if path == "" { if path == "" {
return false,nil return false, nil
} }
close := exec.Command(path+"/"+setting.BityuanSetting.Name+"-cli","close") close := exec.Command(path+"/"+setting.BityuanSetting.Name+"-cli", "close")
stderr := bytes.NewBuffer(nil) stderr := bytes.NewBuffer(nil)
close.Stderr = stderr close.Stderr = stderr
err := close.Start() err := close.Start()
if err != nil { if err != nil {
return false,err return false, err
} }
err = close.Wait() err = close.Wait()
if err != nil { if err != nil {
return false,errors.New(stderr.String()) return false, errors.New(stderr.String())
} }
return true,nil return true, nil
} }
func GetPubKey()string{ func GetPubKey() string {
f,err:=os.Open("/root/.ssh/id_rsa.pub") f, err := os.Open("/root/.ssh/id_rsa.pub")
if err!=nil{ if err != nil {
tlog.Info(err.Error()) tlog.Info(err.Error())
} }
r,_:=ioutil.ReadAll(f) r, _ := ioutil.ReadAll(f)
return string(r) return string(r)
} }
func Preprocessing(){//判断密钥对是否存在,存在则删除 func Preprocessing() { //判断密钥对是否存在,存在则删除
_, err := os.Stat("/root/.ssh") _, err := os.Stat("/root/.ssh")
if err == nil || os.IsExist(err){ if err == nil || os.IsExist(err) {
os.RemoveAll("/root/.ssh") os.RemoveAll("/root/.ssh")
} }
} }
func cp(src,dst string,){//复制文件并赋予执行权限 func cp(src, dst string) { //复制文件并赋予执行权限
cp:=exec.Command("cp","-rf",src,dst) cp := exec.Command("cp", "-rf", src, dst)
os.Chmod(src,0755) os.Chmod(src, 0755)
cp.Run() cp.Run()
} }
func MVScripts(src,dst string){//Absolute Path func MVScripts(src, dst string) { //Absolute Path
path,err:=os.Getwd() path, err := os.Getwd()
err=os.Chdir(src) err = os.Chdir(src)
if err!=nil{ if err != nil {
tlog.Info("invalid directory") tlog.Info("invalid directory")
} }
dir,_:=ioutil.ReadDir("./") dir, _ := ioutil.ReadDir("./")
for _,f:=range dir{ for _, f := range dir {
if f.IsDir()&&f.Name()=="scripts"{ if f.IsDir() && f.Name() == "scripts" {
dir2,_:=ioutil.ReadDir(f.Name()+"/") dir2, _ := ioutil.ReadDir(f.Name() + "/")
os.Chdir(f.Name()) os.Chdir(f.Name())
for _,s:=range dir2{ for _, s := range dir2 {
if s.Name()==".gitkeep"{ if s.Name() == ".gitkeep" {
continue continue
} }
cp(s.Name(),path+"/"+f.Name()+"/"+s.Name()) cp(s.Name(), path+"/"+f.Name()+"/"+s.Name())
} }
} }
...@@ -377,20 +375,20 @@ func MVScripts(src,dst string){//Absolute Path ...@@ -377,20 +375,20 @@ func MVScripts(src,dst string){//Absolute Path
os.Chdir(path) os.Chdir(path)
} }
func Unlock() error{ func Unlock() error {
var passwd []byte var passwd []byte
f,err:=os.Open(setting.BityuanSetting.Passwd) f, err := os.Open(setting.BityuanSetting.Passwd)
if err!=nil{ if err != nil {
tlog.Info("password dose not set") tlog.Info("password dose not set")
return err return err
} }
passwd,err=ioutil.ReadAll(f) passwd, err = ioutil.ReadAll(f)
if err!=nil{ if err != nil {
tlog.Info("Read passwd failed") tlog.Info("Read passwd failed")
return err return err
} }
pass := strings.Replace(string(passwd),"\n","",-1) pass := strings.Replace(string(passwd), "\n", "", -1)
reply,err :=setting.PaiClient.Unlock(&types.WalletUnLock{ reply, err := setting.PaiClient.Unlock(&types.WalletUnLock{
Passwd: string(pass), Passwd: string(pass),
Timeout: 0, Timeout: 0,
WalletOrTicket: false, WalletOrTicket: false,
...@@ -398,56 +396,55 @@ func Unlock() error{ ...@@ -398,56 +396,55 @@ func Unlock() error{
XXX_unrecognized: nil, XXX_unrecognized: nil,
XXX_sizecache: 0, XXX_sizecache: 0,
}) })
if err!=nil { if err != nil {
tlog.Info("unlock auth failed") tlog.Info("unlock auth failed")
return err return err
} }
if !reply.IsOk { if !reply.IsOk {
tlog.Error("unlock auth failed","err",string(reply.Msg)) tlog.Error("unlock auth failed", "err", string(reply.Msg))
} }
return nil return nil
} }
type clientRequest struct { type clientRequest struct {
Method string `json:"method"` Method string `json:"method"`
Params [1]interface{} `json:"params"` Params [1]interface{} `json:"params"`
ID uint64 `json:"id"` ID uint64 `json:"id"`
} }
func AutoOpenTicket() error{ func AutoOpenTicket() error {
params := clientRequest{} params := clientRequest{}
params.ID = 1 params.ID = 1
params.Method = "ticket.SetAutoMining" params.Method = "ticket.SetAutoMining"
p := [1]interface{}{} p := [1]interface{}{}
p[0] = types2.MinerFlag{Flag:1} p[0] = types2.MinerFlag{Flag: 1}
params.Params = p params.Params = p
data,err := json.Marshal(params) data, err := json.Marshal(params)
if err != nil { if err != nil {
tlog.Error("AutoOpenTicket","marshal",err) tlog.Error("AutoOpenTicket", "marshal", err)
return err return err
} }
client := &http.Client{} client := &http.Client{}
req ,err := http.NewRequest("POST","http://localhost:8801",bytes.NewReader(data)) req, err := http.NewRequest("POST", "http://localhost:8801", bytes.NewReader(data))
if err != nil { if err != nil {
tlog.Error("AutoOpenTicket","NewRequest",err) tlog.Error("AutoOpenTicket", "NewRequest", err)
return err return err
} }
resp,err:=client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
tlog.Error("AutoOpenTicket","NewRequest do",err) tlog.Error("AutoOpenTicket", "NewRequest do", err)
return err return err
} }
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
tlog.Error("AutoOpenTicket","read",err) tlog.Error("AutoOpenTicket", "read", err)
return err return err
} }
tlog.Info("AutoOpenTicket","err",string(body)) tlog.Info("AutoOpenTicket", "err", string(body))
return nil return nil
} }
func GetWalletStatus() (*types.WalletStatus,error) { func GetWalletStatus() (*types.WalletStatus, error) {
var p chain33.PaiClient var p chain33.PaiClient
return p.GetWalletStatus() return p.GetWalletStatus()
} }
...@@ -470,55 +467,55 @@ type PaiProcessInfo struct { ...@@ -470,55 +467,55 @@ type PaiProcessInfo struct {
} }
func AutoSSHClean() error { func AutoSSHClean() error {
pai,err := getAutoSSHProcessInfo() pai, err := getAutoSSHProcessInfo()
if err != nil { if err != nil {
return err return err
} }
tlog.Info("getAutoSSHProcessInfo","pai",*pai) tlog.Info("getAutoSSHProcessInfo", "pai", *pai)
if pai.Stime > 0 && (time.Now().Unix()-pai.Stime) > 72 * 3600 && pai.Pid > 0 { if pai.Stime > 0 && (time.Now().Unix()-pai.Stime) > 72*3600 && pai.Pid > 0 {
err := KillAutoSsh(pai.Pid) err := KillAutoSsh(pai.Pid)
if err != nil { if err != nil {
tlog.Error("KillAutoSsh","err",err) tlog.Error("KillAutoSsh", "err", err)
return err return err
} }
tlog.Info("KillAutoSsh Success","pid",pai.Pid) tlog.Info("KillAutoSsh Success", "pid", pai.Pid)
} }
return nil return nil
} }
func KillAutoSsh(pid int32) error { func KillAutoSsh(pid int32) error {
ps := fmt.Sprintf("%d",pid) ps := fmt.Sprintf("%d", pid)
cmd := exec.Command("kill",ps) cmd := exec.Command("kill", ps)
return cmd.Run() return cmd.Run()
} }
func getAutoSSHProcessInfo() (*PaiProcessInfo,error) { func getAutoSSHProcessInfo() (*PaiProcessInfo, error) {
var pai PaiProcessInfo var pai PaiProcessInfo
var buf bytes.Buffer var buf bytes.Buffer
cmd := exec.Command("bash","-c","ps -eo pid,lstart,cmd |grep autossh | grep -v grep") cmd := exec.Command("bash", "-c", "ps -eo pid,lstart,cmd |grep autossh | grep -v grep")
cmd.Stdout = &buf cmd.Stdout = &buf
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
tlog.Error("getAutoSSHProcessInfo cmd","err",err) tlog.Error("getAutoSSHProcessInfo cmd", "err", err)
return nil,err return nil, err
} }
trimBuf := strings.Trim(buf.String()," ") trimBuf := strings.Trim(buf.String(), " ")
list := strings.Split(trimBuf," ") list := strings.Split(trimBuf, " ")
if len(list) < 7 { if len(list) < 7 {
return nil, errors.New("ps return exception") return nil, errors.New("ps return exception")
} }
lstart := list[1]+" "+list[2]+" "+ list[3]+" "+ list[4]+" "+list[5] lstart := list[1] + " " + list[2] + " " + list[3] + " " + list[4] + " " + list[5]
location , _ := time.LoadLocation("Local") location, _ := time.LoadLocation("Local")
tt,err := time.ParseInLocation(time.ANSIC,lstart,location) tt, err := time.ParseInLocation(time.ANSIC, lstart, location)
if err != nil { if err != nil {
tlog.Error("getAutoSSHProcessInfo","err",err) tlog.Error("getAutoSSHProcessInfo", "err", err)
return nil,err return nil, err
} }
start := tt.Unix() start := tt.Unix()
p ,_ := strconv.Atoi(list[0]) p, _ := strconv.Atoi(list[0])
pai.Pid = int32(p) pai.Pid = int32(p)
pai.Stime = start pai.Stime = start
...@@ -526,26 +523,26 @@ func getAutoSSHProcessInfo() (*PaiProcessInfo,error) { ...@@ -526,26 +523,26 @@ func getAutoSSHProcessInfo() (*PaiProcessInfo,error) {
} }
func AutoUpdate() { func AutoUpdate() {
if RebootP {//重启pai if RebootP { //重启pai
err := KillPai() err := KillPai()
if err != nil { if err != nil {
tlog.Error("kill pai","err",err) tlog.Error("kill pai", "err", err)
} else { } else {
err := StartProcess(setting.Chain33Pai.Start) err := StartProcess(setting.Chain33Pai.Start)
if err != nil { if err != nil {
tlog.Error("restart pai fail","err",err) tlog.Error("restart pai fail", "err", err)
} else { } else {
tlog.Info("kill restart pai success ") tlog.Info("kill restart pai success ")
} }
} }
} else { } else {
if !DPercent.Flag {//没有其他任务占用 if !DPercent.Flag { //没有其他任务占用
DPercent.Flag = true 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 DPercent.Flag = false
} }
} }
...@@ -556,7 +553,7 @@ func AutoUpdatePai() error { ...@@ -556,7 +553,7 @@ func AutoUpdatePai() error {
version := util.VersionCompare(GetVersion()) version := util.VersionCompare(GetVersion())
//检查最新版本号online数据库 //检查最新版本号online数据库
var pai pai_service.Pai var pai pai_service.Pai
latest,err := pai.GetPaiLatestVersion(int32(2)) latest, err := pai.GetPaiLatestVersion(int32(2))
if err != nil { if err != nil {
return err return err
} }
...@@ -566,36 +563,36 @@ func AutoUpdatePai() error { ...@@ -566,36 +563,36 @@ func AutoUpdatePai() error {
return nil return nil
} }
name := setting.Chain33Pai.Name+"_"+latest+".tar.gz" name := setting.Chain33Pai.Name + "_" + latest + ".tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name url := setting.Chain33Pai.DownloadUrl + name
//oss下载更新包 //oss下载更新包
err = DownLoadFile(url,name,int32(2)) err = DownLoadFile(url, name, int32(2))
if err != nil { if err != nil {
return err return err
} }
var serr bytes.Buffer var serr bytes.Buffer
//解压缩文件 //解压缩文件
tar := exec.Command("tar","-xvf",name,"-C","../") tar := exec.Command("tar", "-xvf", name, "-C", "../")
tar.Stdout = &serr tar.Stdout = &serr
err = tar.Start() err = tar.Start()
if err != nil { if err != nil {
tlog.Error("tar","err",err) tlog.Error("tar", "err", err)
return err return err
} }
err = tar.Wait() err = tar.Wait()
if err != nil { if err != nil {
tlog.Error("tar2","err",serr.String()) tlog.Error("tar2", "err", serr.String())
return err return err
} }
remove := exec.Command("rm","-rf",name) remove := exec.Command("rm", "-rf", name)
err = remove.Start() err = remove.Start()
if err != nil { if err != nil {
tlog.Error("rm ","err",err) tlog.Error("rm ", "err", err)
return err return err
} }
err = remove.Wait() err = remove.Wait()
if err != nil { if err != nil {
tlog.Error("rm wait","err",err) tlog.Error("rm wait", "err", err)
return err return err
} }
RebootP = true RebootP = true
...@@ -605,80 +602,80 @@ func AutoUpdatePai() error { ...@@ -605,80 +602,80 @@ func AutoUpdatePai() error {
func KillPai() error { func KillPai() error {
err := StartProcess(setting.Chain33Pai.StopPai) err := StartProcess(setting.Chain33Pai.StopPai)
if err != nil { if err != nil {
tlog.Error("stop chain33 pai ","err",err) tlog.Error("stop chain33 pai ", "err", err)
} }
return nil return nil
} }
func UploadInfo(tick *time.Ticker) {
func UploadInfo(tick * time.Ticker) {
for { for {
select { select {
case <- tick.C: case <-tick.C:
uploadInfo() uploadInfo()
} }
} }
} }
//上传基本信息 //上传基本信息
func uploadInfo() error { func uploadInfo() error {
params:=make(map[string]string) params := make(map[string]string)
params["version"] = GetVersion() params["version"] = GetVersion()
var pai pai_service.Pai var pai pai_service.Pai
err := pai.SetPai() err := pai.SetPai()
if err != nil { if err != nil {
tlog.Error("SetPai","err",err) tlog.Error("SetPai", "err", err)
return err return err
} }
jpai,_ := json.Marshal(pai) jpai, _ := json.Marshal(pai)
params["addr"] = pai.Serial params["addr"] = pai.Serial
params["info"] = string(jpai) params["info"] = string(jpai)
data,err := json.Marshal(params) data, err := json.Marshal(params)
client := &http.Client{} client := &http.Client{}
req ,err := http.NewRequest("POST",setting.Chain33Pai.UploadVersionUrl,bytes.NewReader(data)) req, err := http.NewRequest("POST", setting.Chain33Pai.UploadVersionUrl, bytes.NewReader(data))
if err != nil { if err != nil {
tlog.Error("uploadInfo","NewRequest",err) tlog.Error("uploadInfo", "NewRequest", err)
return err return err
} }
resp,err:=client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
tlog.Error("uploadInfo","NewRequest do",err) tlog.Error("uploadInfo", "NewRequest do", err)
return err return err
} }
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
tlog.Error("uploadInfo","read",err) tlog.Error("uploadInfo", "read", err)
return err return err
} }
tlog.Info("uploadInfo","result",string(body)) tlog.Info("uploadInfo", "result", string(body))
return nil return nil
} }
func uploadVersion() error { func uploadVersion() error {
client := &http.Client{} client := &http.Client{}
params:=make(map[string]interface{}) params := make(map[string]interface{})
params["version"] = GetVersion() params["version"] = GetVersion()
data,err := json.Marshal(params) data, err := json.Marshal(params)
if err != nil { if err != nil {
tlog.Error("uploadVersion","marshal",err) tlog.Error("uploadVersion", "marshal", err)
return err return err
} }
req ,err := http.NewRequest("POST",setting.Chain33Pai.UploadVersionUrl,bytes.NewReader(data)) req, err := http.NewRequest("POST", setting.Chain33Pai.UploadVersionUrl, bytes.NewReader(data))
if err != nil { if err != nil {
tlog.Error("uploadVersion","NewRequest",err) tlog.Error("uploadVersion", "NewRequest", err)
return err return err
} }
resp,err:=client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
tlog.Error("uploadVersion","NewRequest do",err) tlog.Error("uploadVersion", "NewRequest do", err)
return err return err
} }
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
tlog.Error("uploadVersion","read",err) tlog.Error("uploadVersion", "read", err)
return err return err
} }
tlog.Info("uploadversion","version",string(body)) tlog.Info("uploadversion", "version", string(body))
return nil return nil
} }
...@@ -692,91 +689,91 @@ func updateBityuan640() error { ...@@ -692,91 +689,91 @@ func updateBityuan640() error {
plantime := int64(1585828800) plantime := int64(1585828800)
nowtime := time.Now().Unix() nowtime := time.Now().Unix()
if nowtime < plantime { if nowtime < plantime {
tlog.Error("waiting plantime to update","nowtime",nowtime) tlog.Error("waiting plantime to update", "nowtime", nowtime)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return errors.New("waiting plantime to update") return errors.New("waiting plantime to update")
} }
update := GetNodeUpdateStatus() update := GetNodeUpdateStatus()
if update { if update {
tlog.Info("updateBityuan640 is updating","update",update) tlog.Info("updateBityuan640 is updating", "update", update)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return nil return nil
} }
var pai chain33.PaiClient var pai chain33.PaiClient
v ,err:= pai.Version() v, err := pai.Version()
if err != nil { if err != nil {
tlog.Error("get version ","err",err) tlog.Error("get version ", "err", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
if strings.Contains(v.App,"6.4.2") { if strings.Contains(v.App, "6.4.2") {
tlog.Info("bityuan do not need update","version",v.App) tlog.Info("bityuan do not need update", "version", v.App)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return nil return nil
} }
stderr := bytes.NewBuffer(nil) stderr := bytes.NewBuffer(nil)
absPath := GetAbsPath(setting.BityuanSetting.Name)+"/" absPath := GetAbsPath(setting.BityuanSetting.Name) + "/"
name := setting.BityuanSetting.Name+"_6.4.2.tar.gz" name := setting.BityuanSetting.Name + "_6.4.2.tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name url := setting.Chain33Pai.DownloadUrl + name
tlog.Info("UpdateNode","dir",name) tlog.Info("UpdateNode", "dir", name)
tlog.Info("UpdateNode","path",absPath) tlog.Info("UpdateNode", "path", absPath)
err = DownLoadFile(url,name,int32(1)) err = DownLoadFile(url, name, int32(1))
if err != nil { if err != nil {
tlog.Error("updateBityuan640","err",err) tlog.Error("updateBityuan640", "err", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
dirs := strings.Split(absPath,"wallet-bty") dirs := strings.Split(absPath, "wallet-bty")
if len(dirs) != 2 { if len(dirs) != 2 {
tlog.Error("updateBityuan640","err",err) tlog.Error("updateBityuan640", "err", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
//解压缩文件 //解压缩文件
tar := exec.Command("tar","-xvf",name ,"-C",dirs[0]) tar := exec.Command("tar", "-xvf", name, "-C", dirs[0])
tar.Stderr = stderr tar.Stderr = stderr
err = tar.Start() err = tar.Start()
if err != nil { if err != nil {
tlog.Error("tar","err",err) tlog.Error("tar", "err", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
err = tar.Wait() err = tar.Wait()
if err != nil { if err != nil {
tlog.Error("tar","err",stderr.String()) tlog.Error("tar", "err", stderr.String())
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
t,err := SafeCloseNode() t, err := SafeCloseNode()
if err != nil || !t { if err != nil || !t {
tlog.Error("updateBityuan640 close node","err",err) tlog.Error("updateBityuan640 close node", "err", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
//其他模块可能没有即时关闭,在高速刷盘的情形下 //其他模块可能没有即时关闭,在高速刷盘的情形下
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
remove := exec.Command("rm","-rf",name) remove := exec.Command("rm", "-rf", name)
remove.Stderr = stderr remove.Stderr = stderr
err = remove.Start() err = remove.Start()
if err != nil { if err != nil {
tlog.Error("rm","err",stderr.String()) tlog.Error("rm", "err", stderr.String())
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
err = remove.Wait() err = remove.Wait()
if err != nil { if err != nil {
tlog.Error("rm","err",stderr.String()) tlog.Error("rm", "err", stderr.String())
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
err=StartProcess(setting.Chain33Pai.Auto) err = StartProcess(setting.Chain33Pai.Auto)
if err!=nil{ if err != nil {
tlog.Error("updateBityuan640","auto.sh error ",err) tlog.Error("updateBityuan640", "auto.sh error ", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
tlog.Info("updateBityuan640 success please waiting hours","version","6.3.2->6.4.2") tlog.Info("updateBityuan640 success please waiting hours", "version", "6.3.2->6.4.2")
BityuanFlag.Flag = false BityuanFlag.Flag = false
return nil return nil
} }
...@@ -789,11 +786,10 @@ func GetNodeUpdateStatus() bool { ...@@ -789,11 +786,10 @@ func GetNodeUpdateStatus() bool {
return false return false
} }
//程序运行 + 端口没开启 //程序运行 + 端口没开启
if strings.Contains(buf.String(),"v7-bityuan") && !strings.Contains(buf.String(),":8801") && strings.Contains(buf.String(),":6060") { if strings.Contains(buf.String(), "v7-bityuan") && !strings.Contains(buf.String(), ":8801") && strings.Contains(buf.String(), ":6060") {
return true return true
} else if !strings.Contains(buf.String(),"v7-bityuan") { } else if !strings.Contains(buf.String(), "v7-bityuan") {
return false return false
} }
return false return false
} }
package app package app
import ( import (
"time"
"chain33-pai/pkg/setting"
"bytes" "bytes"
"os/exec" "chain33-pai/pkg/setting"
"fmt"
"chain33-pai/service/pai_service" "chain33-pai/service/pai_service"
"errors" "errors"
"fmt"
"os" "os"
"os/exec"
"time"
) )
var ( var (
...@@ -17,8 +17,8 @@ var ( ...@@ -17,8 +17,8 @@ var (
func RaspberryChan() { func RaspberryChan() {
for { for {
if value,ok := <- JobChan; ok { if value, ok := <-JobChan; ok {
tlog.Info("raspberrychan","msg",value) tlog.Info("raspberrychan", "msg", value)
if value.Name == "" { if value.Name == "" {
continue continue
} }
...@@ -30,37 +30,37 @@ func RaspberryChan() { ...@@ -30,37 +30,37 @@ func RaspberryChan() {
case "ROLLBACK": case "ROLLBACK":
err := rollback() err := rollback()
if err == nil { if err == nil {
tlog.Info("rollback success","err",nil) tlog.Info("rollback success", "err", nil)
} else { } else {
tlog.Error("rollback fail ","err",err) tlog.Error("rollback fail ", "err", err)
} }
case "BACKUP": case "BACKUP":
err := backup() err := backup()
if err == nil { if err == nil {
tlog.Info("backup success","err",nil) tlog.Info("backup success", "err", nil)
} else { } else {
tlog.Error("backup fail ","err",err) tlog.Error("backup fail ", "err", err)
} }
case "RECOVER": case "RECOVER":
err := recoverNode() err := recoverNode()
if err == nil { if err == nil {
tlog.Info("recover success","err",nil) tlog.Info("recover success", "err", nil)
} else { } else {
tlog.Error("recover fail ","err",err) tlog.Error("recover fail ", "err", err)
} }
case "DELETEBACKUP": case "DELETEBACKUP":
err := deleteBackup() err := deleteBackup()
if err == nil { if err == nil {
tlog.Info("deleteBackup success","err",nil) tlog.Info("deleteBackup success", "err", nil)
} else { } else {
tlog.Error("deleteBackup fail ","err",err) tlog.Error("deleteBackup fail ", "err", err)
} }
case "RESTART": case "RESTART":
err := restartNode() err := restartNode()
if err == nil { if err == nil {
tlog.Info("deleteBackup success","err",nil) tlog.Info("deleteBackup success", "err", nil)
} else { } else {
tlog.Error("deleteBackup fail ","err",err) tlog.Error("deleteBackup fail ", "err", err)
} }
} }
...@@ -69,12 +69,11 @@ func RaspberryChan() { ...@@ -69,12 +69,11 @@ func RaspberryChan() {
} }
} }
func rollback() error { func rollback() error {
BityuanFlag.Lock.Lock() BityuanFlag.Lock.Lock()
defer BityuanFlag.Lock.Unlock() defer BityuanFlag.Lock.Unlock()
BityuanFlag.Flag = true BityuanFlag.Flag = true
_,err := SafeCloseNode() _, err := SafeCloseNode()
if err != nil { if err != nil {
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
...@@ -82,12 +81,12 @@ func rollback() error { ...@@ -82,12 +81,12 @@ func rollback() error {
var pai pai_service.Pai var pai pai_service.Pai
err = pai.SetPai() err = pai.SetPai()
if err != nil { if err != nil {
tlog.Error("SetPai","err",err) tlog.Error("SetPai", "err", err)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
if pai.LocalLastHeight == 0 { if pai.LocalLastHeight == 0 {
tlog.Error("LocalLastHeight","height",pai.LocalLastHeight) tlog.Error("LocalLastHeight", "height", pai.LocalLastHeight)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
...@@ -100,21 +99,21 @@ func rollback() error { ...@@ -100,21 +99,21 @@ func rollback() error {
BityuanFlag.Flag = false BityuanFlag.Flag = false
return errors.New("bty is running") return errors.New("bty is running")
} }
tlog.Info("rollback start","height",pai.LocalLastHeight,"rollbackheight",rollheight) tlog.Info("rollback start", "height", pai.LocalLastHeight, "rollbackheight", rollheight)
var buf bytes.Buffer var buf bytes.Buffer
if btyPath == "" { if btyPath == "" {
tlog.Error("GetAbsPath","err","btyPath not exists") tlog.Error("GetAbsPath", "err", "btyPath not exists")
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
cmd := exec.Command(btyPath+"/"+setting.BityuanSetting.Name, "-rollback",fmt.Sprintf("%d",rollheight)) cmd := exec.Command(btyPath+"/"+setting.BityuanSetting.Name, "-rollback", fmt.Sprintf("%d", rollheight))
cmd.Stdout = &buf cmd.Stdout = &buf
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
tlog.Info("rollback end","height",pai.LocalLastHeight,"rollbackheight",rollheight) tlog.Info("rollback end", "height", pai.LocalLastHeight, "rollbackheight", rollheight)
BityuanFlag.Flag = false BityuanFlag.Flag = false
return nil return nil
} }
...@@ -126,10 +125,10 @@ func backup() error { ...@@ -126,10 +125,10 @@ func backup() error {
return errors.New("env err") return errors.New("env err")
} }
BityuanFlag.Flag = true BityuanFlag.Flag = true
ok,err := SafeCloseNode() ok, err := SafeCloseNode()
if err != nil { if err != nil {
BityuanFlag.Flag = false BityuanFlag.Flag = false
tlog.Error("SafeCloseNode","err",err) tlog.Error("SafeCloseNode", "err", err)
return err return err
} }
if !ok { if !ok {
...@@ -142,7 +141,7 @@ func backup() error { ...@@ -142,7 +141,7 @@ func backup() error {
return errors.New("bty is running") return errors.New("bty is running")
} }
err = deleteBackup() err = deleteBackup()
if err != nil && err != errors.New("backup file not exists"){ if err != nil && err != errors.New("backup file not exists") {
BityuanFlag.Flag = false BityuanFlag.Flag = false
return err return err
} }
...@@ -158,13 +157,13 @@ func backup() error { ...@@ -158,13 +157,13 @@ func backup() error {
func SafeBackup() error { func SafeBackup() error {
s := time.Now() s := time.Now()
defer func() { defer func() {
tlog.Info("SafeBackup","cost",time.Since(s)) tlog.Info("SafeBackup", "cost", time.Since(s))
}() }()
var buf bytes.Buffer var buf bytes.Buffer
backup := exec.Command("cp","-r",btyPath+"/datadir",btyPath+"/datadir_backup") backup := exec.Command("cp", "-r", btyPath+"/datadir", btyPath+"/datadir_backup")
backup.Stderr = &buf backup.Stderr = &buf
if err := backup.Run();err != nil { if err := backup.Run(); err != nil {
tlog.Error("SafeBackup","err",buf.String()) tlog.Error("SafeBackup", "err", buf.String())
return err return err
} }
return nil return nil
...@@ -174,10 +173,10 @@ func recoverNode() error { ...@@ -174,10 +173,10 @@ func recoverNode() error {
BityuanFlag.Lock.Lock() BityuanFlag.Lock.Lock()
defer BityuanFlag.Lock.Unlock() defer BityuanFlag.Lock.Unlock()
if btyPath == "" { if btyPath == "" {
tlog.Error("btyPath empty","err","node not exists") tlog.Error("btyPath empty", "err", "node not exists")
return errors.New("node not exists") return errors.New("node not exists")
} }
_,err := SafeCloseNode() _, err := SafeCloseNode()
if err != nil { if err != nil {
return err return err
} }
...@@ -186,23 +185,23 @@ func recoverNode() error { ...@@ -186,23 +185,23 @@ func recoverNode() error {
return errors.New("bty is running") return errors.New("bty is running")
} }
backupPath := btyPath + "/datadir_backup" backupPath := btyPath + "/datadir_backup"
if _,err := os.Stat(backupPath);err != nil { if _, err := os.Stat(backupPath); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
tlog.Error("backup file not exists","err",backupPath) tlog.Error("backup file not exists", "err", backupPath)
return errors.New("backup file not exists") return errors.New("backup file not exists")
} }
} }
remove := exec.Command("rm","-rf",btyPath+"/datadir") remove := exec.Command("rm", "-rf", btyPath+"/datadir")
err = remove.Run() err = remove.Run()
if err != nil { if err != nil {
tlog.Error("rm -rf datadir","err",err) tlog.Error("rm -rf datadir", "err", err)
return err return err
} }
recover := exec.Command("cp","-r",backupPath,btyPath+"/datadir") recover := exec.Command("cp", "-r", backupPath, btyPath+"/datadir")
err = recover.Run() err = recover.Run()
if err != nil { if err != nil {
tlog.Error("cp -r datadir_backup datadir","err",err) tlog.Error("cp -r datadir_backup datadir", "err", err)
return err return err
} }
StartProcess(setting.Chain33Pai.Auto) StartProcess(setting.Chain33Pai.Auto)
...@@ -212,33 +211,32 @@ func recoverNode() error { ...@@ -212,33 +211,32 @@ func recoverNode() error {
func deleteBackup() error { func deleteBackup() error {
s := time.Now() s := time.Now()
defer func() { defer func() {
tlog.Info("deleteBackup","cost",time.Since(s)) tlog.Info("deleteBackup", "cost", time.Since(s))
}() }()
backupPath := btyPath + "/datadir_backup" backupPath := btyPath + "/datadir_backup"
if _,err := os.Stat(backupPath);err != nil { if _, err := os.Stat(backupPath); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
tlog.Error("backup file not exists","err",backupPath) tlog.Error("backup file not exists", "err", backupPath)
return nil return nil
} }
} }
remove := exec.Command("rm","-rf",backupPath) remove := exec.Command("rm", "-rf", backupPath)
err := remove.Run() err := remove.Run()
if err != nil { if err != nil {
tlog.Error("rm -rf datadir_backup","err",err) tlog.Error("rm -rf datadir_backup", "err", err)
return err return err
} }
return nil return nil
} }
func restartNode() error { func restartNode() error {
BityuanFlag.Lock.Lock() BityuanFlag.Lock.Lock()
defer BityuanFlag.Lock.Unlock() defer BityuanFlag.Lock.Unlock()
if btyPath == "" { if btyPath == "" {
tlog.Error("btyPath empty","err","node not exists") tlog.Error("btyPath empty", "err", "node not exists")
return errors.New("node not exists") return errors.New("node not exists")
} }
_,err := SafeCloseNode() _, err := SafeCloseNode()
if err != nil { if err != nil {
return err return err
} }
...@@ -253,7 +251,7 @@ func restartNode() error { ...@@ -253,7 +251,7 @@ func restartNode() error {
func MakeSureBtyIsNotRun() bool { func MakeSureBtyIsNotRun() bool {
s := time.Now() s := time.Now()
defer func() { defer func() {
tlog.Info("MakeSureBtyIsNotRun","cost",time.Since(s)) tlog.Info("MakeSureBtyIsNotRun", "cost", time.Since(s))
}() }()
num := 0 num := 0
for { for {
...@@ -265,7 +263,7 @@ func MakeSureBtyIsNotRun() bool { ...@@ -265,7 +263,7 @@ func MakeSureBtyIsNotRun() bool {
return false return false
} }
num++ num++
time.Sleep(time.Second*1) time.Sleep(time.Second * 1)
} }
return true return true
} }
...@@ -8,7 +8,7 @@ var ( ...@@ -8,7 +8,7 @@ var (
func GetVersion() string { func GetVersion() string {
if GitCommit != "" { if GitCommit != "" {
return version+"-"+GitCommit return version + "-" + GitCommit
} }
return version return version
} }
...@@ -2,13 +2,11 @@ package chain33 ...@@ -2,13 +2,11 @@ package chain33
import ( import (
"context" "context"
"google.golang.org/grpc"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"google.golang.org/grpc"
) )
type PaiClient struct { type PaiClient struct {
} }
var ( var (
...@@ -17,42 +15,42 @@ var ( ...@@ -17,42 +15,42 @@ var (
) )
func init() { func init() {
maxReceLimit := grpc.WithMaxMsgSize(30*1024*1024) maxReceLimit := grpc.WithMaxMsgSize(30 * 1024 * 1024)
conn, err := grpc.Dial(paiNetgrpcAddr, grpc.WithInsecure(),maxReceLimit) conn, err := grpc.Dial(paiNetgrpcAddr, grpc.WithInsecure(), maxReceLimit)
if err != nil { if err != nil {
panic(err) panic(err)
} }
paiClient = types.NewChain33Client(conn) paiClient = types.NewChain33Client(conn)
} }
func (p *PaiClient) GetWalletStatus() (*types.WalletStatus,error) { func (p *PaiClient) GetWalletStatus() (*types.WalletStatus, error) {
return paiClient.GetWalletStatus(context.Background(),&types.ReqNil{}) return paiClient.GetWalletStatus(context.Background(), &types.ReqNil{})
} }
func (p *PaiClient) GetPeerInfo() (*types.PeerList,error) { func (p *PaiClient) GetPeerInfo() (*types.PeerList, error) {
return paiClient.GetPeerInfo(context.Background(),&types.P2PGetPeerReq{}) return paiClient.GetPeerInfo(context.Background(), &types.P2PGetPeerReq{})
} }
func (p *PaiClient) IsNtpClockSync() (*types.Reply,error) { func (p *PaiClient) IsNtpClockSync() (*types.Reply, error) {
return paiClient.IsNtpClockSync(context.Background(),&types.ReqNil{}) return paiClient.IsNtpClockSync(context.Background(), &types.ReqNil{})
} }
func (p *PaiClient) GetNetInfo() (*types.NodeNetInfo,error) { func (p *PaiClient) GetNetInfo() (*types.NodeNetInfo, error) {
return paiClient.NetInfo(context.Background(),&types.P2PGetNetInfoReq{}) return paiClient.NetInfo(context.Background(), &types.P2PGetNetInfoReq{})
} }
func (p *PaiClient) Version()(*types.VersionInfo,error){ func (p *PaiClient) Version() (*types.VersionInfo, error) {
return paiClient.Version(context.Background(),&types.ReqNil{}) return paiClient.Version(context.Background(), &types.ReqNil{})
} }
func (p *PaiClient) Close() (*types.Reply,error) { func (p *PaiClient) Close() (*types.Reply, error) {
return paiClient.CloseQueue(context.Background(),&types.ReqNil{}) return paiClient.CloseQueue(context.Background(), &types.ReqNil{})
} }
func (p *PaiClient) Unlock(lock *types.WalletUnLock)(*types.Reply,error){ func (p *PaiClient) Unlock(lock *types.WalletUnLock) (*types.Reply, error) {
return paiClient.UnLock(context.Background(),lock) return paiClient.UnLock(context.Background(), lock)
} }
func (p *PaiClient) IsSync() (*types.Reply,error) { func (p *PaiClient) IsSync() (*types.Reply, error) {
return paiClient.IsSync(context.Background(),&types.ReqNil{}) return paiClient.IsSync(context.Background(), &types.ReqNil{})
} }
...@@ -7,7 +7,7 @@ const ( ...@@ -7,7 +7,7 @@ const (
NETWORK_ERROR = 5004 NETWORK_ERROR = 5004
NODE_ERROR = 5000 NODE_ERROR = 5000
SUCCESS_RUNNING= 5002 SUCCESS_RUNNING = 5002
ENV_ERROR = 5001 ENV_ERROR = 5001
DOWNLOAD_ERROR = 5005 DOWNLOAD_ERROR = 5005
TAR_XVF_ERROR = 5006 TAR_XVF_ERROR = 5006
......
package logging package logging
import ( import (
"fmt"
"chain33-pai/pkg/file" "chain33-pai/pkg/file"
"fmt"
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
......
package pai package pai
import ( import (
"os/exec" "bytes"
"io/ioutil"
"strings"
"chain33-pai/pkg/util" "chain33-pai/pkg/util"
"github.com/33cn/chain33/common/log" "github.com/33cn/chain33/common/log"
"bytes" "io/ioutil"
"os/exec"
"strings"
) )
var tlog = log.New("pkg","pai") var tlog = log.New("pkg", "pai")
func MonitorServer() ([]*Disk,error) { func MonitorServer() ([]*Disk, error) {
//获取硬盘情况 //获取硬盘情况
cmd := exec.Command("df","-T") cmd := exec.Command("df", "-T")
stdout, err := cmd.StdoutPipe() stdout, err := cmd.StdoutPipe()
err = cmd.Start() err = cmd.Start()
if err != nil { if err != nil {
tlog.Info("MonitorServer","df -T start " ,err) tlog.Info("MonitorServer", "df -T start ", err)
return nil,err return nil, err
} }
content, err := ioutil.ReadAll(stdout) content, err := ioutil.ReadAll(stdout)
if err != nil { if err != nil {
tlog.Info("MonitorServer","ioutil readd err",err) tlog.Info("MonitorServer", "ioutil readd err", err)
return nil,err return nil, err
} }
err = cmd.Wait() err = cmd.Wait()
if err != nil { if err != nil {
tlog.Info("MonitorServer","df -T end" ,err) tlog.Info("MonitorServer", "df -T end", err)
return nil,err return nil, err
} }
tlog.Info("MonitorServer","content",string(content)) tlog.Info("MonitorServer", "content", string(content))
list := strings.Split(string(content),"\n") list := strings.Split(string(content), "\n")
tempDisk := make([]*Disk,0) tempDisk := make([]*Disk, 0)
for _,v := range list { for _, v := range list {
c := strings.Contains(v,"/dev/sd") c := strings.Contains(v, "/dev/sd")
if c { if c {
tempD := &Disk{} tempD := &Disk{}
params := strings.Split(util.DeleteExtraSpace(v)," ") params := strings.Split(util.DeleteExtraSpace(v), " ")
if len(params) == 7 { if len(params) == 7 {
tempD.Filesystem = params[0] tempD.Filesystem = params[0]
tempD.Type = params[1] tempD.Type = params[1]
tempD.SizeK = params[2] tempD.SizeK = params[2]
tempD.Use = params[5] tempD.Use = params[5]
tempDisk = append(tempDisk,tempD) tempDisk = append(tempDisk, tempD)
} else { } else {
break break
} }
} }
} }
return tempDisk,nil return tempDisk, nil
} }
func FindAbsPath(name string) string { func FindAbsPath(name string) string {
var buffer bytes.Buffer var buffer bytes.Buffer
cmd:=exec.Command("find","/media","-name",name) cmd := exec.Command("find", "/media", "-name", name)
cmd.Stdout=&buffer cmd.Stdout = &buffer
cmd.Start() cmd.Start()
cmd.Wait() cmd.Wait()
if buffer.String() == "" { if buffer.String() == "" {
tlog.Error("FindAbsPath","ERR","node path not exists") tlog.Error("FindAbsPath", "ERR", "node path not exists")
return "" return ""
} }
pathlist := strings.Split(buffer.String(),"\n") pathlist := strings.Split(buffer.String(), "\n")
return pathlist[0] return pathlist[0]
} }
...@@ -2,7 +2,7 @@ package pai ...@@ -2,7 +2,7 @@ package pai
type Disk struct { type Disk struct {
Filesystem string `json:"filesystem"` Filesystem string `json:"filesystem"`
Type string `json:"type"`//硬盘格式 Type string `json:"type"` //硬盘格式
SizeK string `json:"size_k"`//硬盘大小 SizeK string `json:"size_k"` //硬盘大小
Use string `json:"use"` Use string `json:"use"`
} }
package setting package setting
import ( import (
"log"
"time"
"os/exec"
"chain33-pai/pkg/chain33" "chain33-pai/pkg/chain33"
"github.com/go-ini/ini"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"github.com/go-ini/ini"
"log"
"os/exec"
"time"
) )
var PaiClient *chain33.PaiClient var PaiClient *chain33.PaiClient
...@@ -63,6 +62,7 @@ type Redis struct { ...@@ -63,6 +62,7 @@ type Redis struct {
MaxActive int MaxActive int
IdleTimeout time.Duration IdleTimeout time.Duration
} }
var RedisSetting = &Redis{} var RedisSetting = &Redis{}
type Bityuan struct { type Bityuan struct {
...@@ -73,7 +73,8 @@ type Bityuan struct { ...@@ -73,7 +73,8 @@ type Bityuan struct {
Version string Version string
VersionPath string VersionPath string
} }
var BityuanSetting=&Bityuan{}
var BityuanSetting = &Bityuan{}
type Chain33_pai struct { type Chain33_pai struct {
Name string Name string
...@@ -93,10 +94,10 @@ type Chain33_pai struct { ...@@ -93,10 +94,10 @@ type Chain33_pai struct {
UploadVersionUrl string UploadVersionUrl string
UploadTestUrl string UploadTestUrl string
} }
var Chain33Pai=&Chain33_pai{}
var Chain33Pai = &Chain33_pai{}
var LogSetting=&types.Log{} var LogSetting = &types.Log{}
var cfg *ini.File var cfg *ini.File
...@@ -110,10 +111,10 @@ func Setup() { ...@@ -110,10 +111,10 @@ func Setup() {
mapTo("app", AppSetting) mapTo("app", AppSetting)
mapTo("redis", RedisSetting) mapTo("redis", RedisSetting)
mapTo("server", ServerSetting) mapTo("server", ServerSetting)
mapTo("chain33-pai",Chain33Pai) mapTo("chain33-pai", Chain33Pai)
mapTo("bityuan",BityuanSetting) mapTo("bityuan", BityuanSetting)
mapTo("database", DatabaseSetting) mapTo("database", DatabaseSetting)
mapTo("log",LogSetting) mapTo("log", LogSetting)
AppSetting.ImageMaxSize = AppSetting.ImageMaxSize * 1024 * 1024 AppSetting.ImageMaxSize = AppSetting.ImageMaxSize * 1024 * 1024
ServerSetting.ReadTimeout = ServerSetting.ReadTimeout * time.Second ServerSetting.ReadTimeout = ServerSetting.ReadTimeout * time.Second
ServerSetting.WriteTimeout = ServerSetting.WriteTimeout * time.Second ServerSetting.WriteTimeout = ServerSetting.WriteTimeout * time.Second
...@@ -121,20 +122,20 @@ func Setup() { ...@@ -121,20 +122,20 @@ func Setup() {
} }
func FreshVersion(){ func FreshVersion() {
version,err:=PaiClient.Version() version, err := PaiClient.Version()
if err!=nil{ if err != nil {
auto:=exec.Command(Chain33Pai.Auto) auto := exec.Command(Chain33Pai.Auto)
err=auto.Start() err = auto.Start()
if err != nil { if err != nil {
log.Fatalf("start node failed,need to start manually") log.Fatalf("start node failed,need to start manually")
} }
err=auto.Wait() err = auto.Wait()
if err != nil { if err != nil {
log.Fatalf("start node failed,need to start manually") log.Fatalf("start node failed,need to start manually")
} }
} }
BityuanSetting.Version=version.App BityuanSetting.Version = version.App
} }
// mapTo map section // mapTo map section
......
package util package util
import ( import (
"github.com/unknwon/com"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/unknwon/com"
"chain33-pai/pkg/setting" "chain33-pai/pkg/setting"
) )
......
...@@ -2,12 +2,12 @@ package util ...@@ -2,12 +2,12 @@ package util
import ( import (
"chain33-pai/pkg/setting" "chain33-pai/pkg/setting"
"net"
"errors" "errors"
"net/http"
"io/ioutil" "io/ioutil"
"strings" "net"
"net/http"
"regexp" "regexp"
"strings"
) )
// Setup Initialize the util // Setup Initialize the util
...@@ -31,10 +31,10 @@ func GetLocalIP() (ipv4 *net.IPNet, err error) { ...@@ -31,10 +31,10 @@ func GetLocalIP() (ipv4 *net.IPNet, err error) {
// 取第一个非lo的网卡IP // 取第一个非lo的网卡IP
for _, addr = range addrs { for _, addr = range addrs {
// 这个网络地址是IP地址: ipv4, ipv6 // 这个网络地址是IP地址: ipv4, ipv6
if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback(){ if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback() {
// 跳过IPV6 // 跳过IPV6
if ipNet.IP.To4() != nil{ if ipNet.IP.To4() != nil {
ipv4 = ipNet// 192.168.1.1 ipv4 = ipNet // 192.168.1.1
return return
} }
} }
...@@ -46,42 +46,41 @@ func GetLocalIP() (ipv4 *net.IPNet, err error) { ...@@ -46,42 +46,41 @@ func GetLocalIP() (ipv4 *net.IPNet, err error) {
func GetLocalIpByName(name string) (ipv4 *net.IPNet, err error) { func GetLocalIpByName(name string) (ipv4 *net.IPNet, err error) {
if name == "" { if name == "" {
return nil,errors.New("name not empty") return nil, errors.New("name not empty")
} }
inter,err := net.InterfaceByName(name) inter, err := net.InterfaceByName(name)
if err != nil { if err != nil {
return nil,err return nil, err
} }
var ( var (
addrs []net.Addr addrs []net.Addr
ipNet *net.IPNet // IP地址 ipNet *net.IPNet // IP地址
isIpNet bool isIpNet bool
) )
if addrs,err = inter.Addrs(); err != nil { if addrs, err = inter.Addrs(); err != nil {
return nil,err return nil, err
} }
for _, addr := range addrs { for _, addr := range addrs {
if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback(){ if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback() {
// 跳过IPV6 // 跳过IPV6
if ipNet.IP.To4() != nil{ if ipNet.IP.To4() != nil {
ipv4 = ipNet// 192.168.1.1 ipv4 = ipNet // 192.168.1.1
return return
} }
} }
} }
return nil,nil return nil, nil
} }
func GetExternal() (string, error) {
func GetExternal() (string,error) {
resp, err := http.Get("http://myexternalip.com/raw") resp, err := http.Get("http://myexternalip.com/raw")
if err != nil { if err != nil {
return "",err return "", err
} }
defer resp.Body.Close() defer resp.Body.Close()
content,_ := ioutil.ReadAll(resp.Body) content, _ := ioutil.ReadAll(resp.Body)
return string(content),nil return string(content), nil
} }
//两个以上空格替换成一个空格 //两个以上空格替换成一个空格
...@@ -129,4 +128,3 @@ func VersionCompare(version string) string { ...@@ -129,4 +128,3 @@ func VersionCompare(version string) string {
} }
return string(vo) return string(vo)
} }
package api
import (
"net/http"
"github.com/astaxie/beego/validation"
"github.com/gin-gonic/gin"
"chain33-pai/pkg/app"
"chain33-pai/pkg/e"
"chain33-pai/pkg/util"
"chain33-pai/service/auth_service"
)
type auth struct {
Username string `valid:"Required; MaxSize(50)"`
Password string `valid:"Required; MaxSize(50)"`
}
// @Summary Get Auth
// @Produce json
// @Param username query string true "userName"
// @Param password query string true "password"
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /auth [get]
func GetAuth(c *gin.Context) {
appG := app.Gin{C: c}
valid := validation.Validation{}
username := c.Query("username")
password := c.Query("password")
a := auth{Username: username, Password: password}
ok, _ := valid.Valid(&a)
if !ok {
app.MarkErrors(valid.Errors)
appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
return
}
authService := auth_service.Auth{Username: username, Password: password}
isExist, err := authService.Check()
if err != nil {
appG.Response(http.StatusInternalServerError, e.ERROR_AUTH_CHECK_TOKEN_FAIL, nil)
return
}
if !isExist {
appG.Response(http.StatusUnauthorized, e.ERROR_AUTH, nil)
return
}
token, err := util.GenerateToken(username, password)
if err != nil {
appG.Response(http.StatusInternalServerError, e.ERROR_AUTH_TOKEN, nil)
return
}
appG.Response(http.StatusOK, e.SUCCESS, map[string]string{
"token": token,
})
}
package v1 package v1
import ( import (
"fmt" "bytes"
"os"
"log"
"path"
"reflect"
"io/ioutil"
"os/exec"
"net/http"
"encoding/json"
"chain33-pai/pkg/e"
"chain33-pai/pkg/app" "chain33-pai/pkg/app"
"chain33-pai/pkg/chain33"
"chain33-pai/pkg/e"
"chain33-pai/pkg/setting" "chain33-pai/pkg/setting"
"github.com/gin-gonic/gin"
"chain33-pai/service/pai_service" "chain33-pai/service/pai_service"
"bytes" "encoding/json"
"chain33-pai/pkg/chain33" "fmt"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"github.com/gin-gonic/gin"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"path"
"reflect"
"strconv"
"strings" "strings"
"time" "time"
"strconv"
) )
var flag bool//判断是否正在更新
var flag bool //判断是否正在更新
func ResetWallet(c *gin.Context) { func ResetWallet(c *gin.Context) {
appG := app.Gin{C: c} appG := app.Gin{C: c}
app.BityuanFlag.Lock.Lock() app.BityuanFlag.Lock.Lock()
defer app.BityuanFlag.Lock.Unlock() defer app.BityuanFlag.Lock.Unlock()
if app.BityuanFlag.Flag { if app.BityuanFlag.Flag {
appG.Response(http.StatusOK, e.TRY_LATER,"other job is busy,please try later") appG.Response(http.StatusOK, e.TRY_LATER, "other job is busy,please try later")
return return
} }
app.BityuanFlag.Flag = true app.BityuanFlag.Flag = true
if app.NodeError!=nil{ if app.NodeError != nil {
tlog.Error(app.NodeError.Error()) tlog.Error(app.NodeError.Error())
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")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
t,err := app.SafeCloseNode() t, err := app.SafeCloseNode()
if err != nil || !t { if err != nil || !t {
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
appG.Response(http.StatusOK,e.NODE_ERROR,err) 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)))
if err!=nil{ if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR, "fail to remove wallet") appG.Response(http.StatusOK, e.NODE_ERROR, "fail to remove wallet")
tlog.Error("ResetWallet","remove error",err) tlog.Error("ResetWallet", "remove error", err)
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
err=app.StartProcess(setting.Chain33Pai.Auto) err = app.StartProcess(setting.Chain33Pai.Auto)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR,"fail to restart node") appG.Response(http.StatusOK, e.NODE_ERROR, "fail to restart node")
tlog.Error("ResetWallet","auto.sh error ",err) tlog.Error("ResetWallet", "auto.sh error ", err)
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
appG.Response(http.StatusOK, e.SUCCESS,"reset complete") appG.Response(http.StatusOK, e.SUCCESS, "reset complete")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
} }
//钱包更新,只替换执行文件和配置文件 //钱包更新,只替换执行文件和配置文件
//具体更新逻辑不再代码实现 //具体更新逻辑不再代码实现
//oss下载包打包要保持执行权限 //oss下载包打包要保持执行权限
func UpdateNodeNew(c *gin.Context){ func UpdateNodeNew(c *gin.Context) {
appG := app.Gin{C: c} appG := app.Gin{C: c}
app.BityuanFlag.Lock.Lock() app.BityuanFlag.Lock.Lock()
defer app.BityuanFlag.Lock.Unlock() defer app.BityuanFlag.Lock.Unlock()
if app.BityuanFlag.Flag { if app.BityuanFlag.Flag {
appG.Response(http.StatusOK,e.SUCCESS_RUNNING,"node is updating") appG.Response(http.StatusOK, e.SUCCESS_RUNNING, "node is updating")
return return
} }
if app.NodeError!=nil{ if app.NodeError != nil {
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
} }
absPath := app.GetAbsPath(setting.BityuanSetting.Name)+"/" absPath := app.GetAbsPath(setting.BityuanSetting.Name) + "/"
pwd,err := os.Getwd() pwd, err := os.Getwd()
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.ERROR,"get pwd err") appG.Response(http.StatusOK, e.ERROR, "get pwd err")
return return
} }
pwd = pwd + "/" pwd = pwd + "/"
...@@ -91,39 +92,39 @@ func UpdateNodeNew(c *gin.Context){ ...@@ -91,39 +92,39 @@ func UpdateNodeNew(c *gin.Context){
setting.FreshVersion() setting.FreshVersion()
var pai pai_service.Pai var pai pai_service.Pai
latestVersion,err := pai.GetPaiLatestVersion(int32(1)) latestVersion, err := pai.GetPaiLatestVersion(int32(1))
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR,"get online version err") appG.Response(http.StatusOK, e.NODE_ERROR, "get online version err")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
return return
} }
if latestVersion==setting.BityuanSetting.Version{ if latestVersion == setting.BityuanSetting.Version {
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
appG.Response(http.StatusOK,e.SUCCESS,"current version is latest") appG.Response(http.StatusOK, e.SUCCESS, "current version is latest")
return return
} }
if latestVersion==""{ if latestVersion == "" {
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = 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
} }
stderr := bytes.NewBuffer(nil) stderr := bytes.NewBuffer(nil)
name := setting.BityuanSetting.Name+"_"+latestVersion+".tar.gz" name := setting.BityuanSetting.Name + "_" + latestVersion + ".tar.gz"
url := setting.Chain33Pai.DownloadUrl+ name url := setting.Chain33Pai.DownloadUrl + name
tlog.Info("UpdateNode","dir",setting.BityuanSetting.Name+"_"+latestVersion) tlog.Info("UpdateNode", "dir", setting.BityuanSetting.Name+"_"+latestVersion)
tlog.Info("UpdateNode","path",absPath) tlog.Info("UpdateNode", "path", absPath)
err = app.DownLoadFile(url,name,int32(1)) err = app.DownLoadFile(url, name, int32(1))
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, err) appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, err)
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
dirs := strings.Split(absPath,"wallet-bty") dirs := strings.Split(absPath, "wallet-bty")
if len(dirs) != 2 { if len(dirs) != 2 {
appG.Response(http.StatusOK, e.ERROR, err) appG.Response(http.StatusOK, e.ERROR, err)
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
...@@ -131,11 +132,11 @@ func UpdateNodeNew(c *gin.Context){ ...@@ -131,11 +132,11 @@ func UpdateNodeNew(c *gin.Context){
return return
} }
//解压缩文件 //解压缩文件
tar := exec.Command("tar","-xvf",name ,"-C",dirs[0]) tar := exec.Command("tar", "-xvf", name, "-C", dirs[0])
tar.Stderr = stderr tar.Stderr = stderr
err = tar.Start() err = tar.Start()
if err != nil { if err != nil {
tlog.Error("tar","err",err) tlog.Error("tar", "err", err)
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err) appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err)
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
...@@ -143,22 +144,22 @@ func UpdateNodeNew(c *gin.Context){ ...@@ -143,22 +144,22 @@ func UpdateNodeNew(c *gin.Context){
} }
err = tar.Wait() err = tar.Wait()
if err != nil { if err != nil {
tlog.Error("tar","err",stderr.String()) tlog.Error("tar", "err", stderr.String())
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, stderr.String()) appG.Response(http.StatusOK, e.TAR_XVF_ERROR, stderr.String())
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
t,err := app.SafeCloseNode() t, err := app.SafeCloseNode()
if err != nil || !t { if err != nil || !t {
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
appG.Response(http.StatusOK,e.NODE_ERROR,err) appG.Response(http.StatusOK, e.NODE_ERROR, err)
return return
} }
time.Sleep(time.Second*2) time.Sleep(time.Second * 2)
remove := exec.Command("rm","-rf",setting.BityuanSetting.Name+"_"+latestVersion,name) remove := exec.Command("rm", "-rf", setting.BityuanSetting.Name+"_"+latestVersion, name)
remove.Stderr = stderr remove.Stderr = stderr
err = remove.Start() err = remove.Start()
if err != nil { if err != nil {
...@@ -174,308 +175,308 @@ func UpdateNodeNew(c *gin.Context){ ...@@ -174,308 +175,308 @@ func UpdateNodeNew(c *gin.Context){
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
err=app.StartProcess(setting.Chain33Pai.Auto) err = app.StartProcess(setting.Chain33Pai.Auto)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK, e.NODE_ERROR,"fail to restart node") appG.Response(http.StatusOK, e.NODE_ERROR, "fail to restart node")
tlog.Error("UpdateNodeNew","auto.sh error ",err) tlog.Error("UpdateNodeNew", "auto.sh error ", err)
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
//app.UpdateInfo.Flag = true //app.UpdateInfo.Flag = true
appG.Response(http.StatusOK,e.SUCCESS,"update job ok") appG.Response(http.StatusOK, e.SUCCESS, "update job ok")
} }
//重置节点只需要删除datadir 然后重启节点 //重置节点只需要删除datadir 然后重启节点
func ResetNode(c* gin.Context){ func ResetNode(c *gin.Context) {
appG := app.Gin{C: c} appG := app.Gin{C: c}
app.BityuanFlag.Lock.Lock() app.BityuanFlag.Lock.Lock()
defer app.BityuanFlag.Lock.Unlock() defer app.BityuanFlag.Lock.Unlock()
if app.BityuanFlag.Flag { if app.BityuanFlag.Flag {
appG.Response(http.StatusOK, e.TRY_LATER,"other job is busy,please try later") appG.Response(http.StatusOK, e.TRY_LATER, "other job is busy,please try later")
return return
} }
app.BityuanFlag.Flag = true app.BityuanFlag.Flag = true
_,err := app.SafeCloseNode() _, err := app.SafeCloseNode()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,"node err") appG.Response(http.StatusOK, e.NODE_ERROR, "node err")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return 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.Flag = false app.BityuanFlag.Flag = false
tlog.Error("ResetNode","remove datadir err",err) tlog.Error("ResetNode", "remove datadir err", err)
appG.Response(http.StatusOK, e.RM_ERROR,"remove datadir err") appG.Response(http.StatusOK, e.RM_ERROR, "remove datadir err")
return return
} }
err=app.StartProcess(setting.Chain33Pai.Auto) err = app.StartProcess(setting.Chain33Pai.Auto)
if err != nil { if err != nil {
tlog.Error("ResetNode","start node err",err) tlog.Error("ResetNode", "start node err", err)
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
appG.Response(http.StatusOK, e.NODE_ERROR,"start auto sh err") appG.Response(http.StatusOK, e.NODE_ERROR, "start auto sh err")
return return
} }
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
appG.Response(http.StatusOK,e.SUCCESS,"reset job ok") appG.Response(http.StatusOK, e.SUCCESS, "reset job ok")
} }
func UpdateDetail(c* gin.Context){ func UpdateDetail(c *gin.Context) {
appG := app.Gin{C: c} appG := app.Gin{C: c}
appG.Response(http.StatusOK,e.SUCCESS,gin.H{ appG.Response(http.StatusOK, e.SUCCESS, gin.H{
"total":app.UpdateInfo.Total, "total": app.UpdateInfo.Total,
"current":app.UpdateInfo.Current, "current": app.UpdateInfo.Current,
}) })
} }
//get current version and latest version //get current version and latest version
func Version(c* gin.Context){ func Version(c *gin.Context) {
appG := app.Gin{C: c} appG := app.Gin{C: c}
setting.FreshVersion() setting.FreshVersion()
//latestVersion:=app.GetLatestVersion() //latestVersion:=app.GetLatestVersion()
var pai pai_service.Pai var pai pai_service.Pai
//1 bityuan 2 chain33-pai //1 bityuan 2 chain33-pai
latestVersion,err := pai.GetPaiLatestVersion(int32(1)) latestVersion, err := pai.GetPaiLatestVersion(int32(1))
if latestVersion=="" || err != nil{ if latestVersion == "" || err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"network error,please try again") appG.Response(http.StatusOK, e.NETWORK_ERROR, "network error,please try again")
return return
} }
appG.Response(http.StatusOK,e.SUCCESS,gin.H{ appG.Response(http.StatusOK, e.SUCCESS, gin.H{
"current":setting.BityuanSetting.Version, "current": setting.BityuanSetting.Version,
"latest" :latestVersion, "latest": latestVersion,
}) })
} }
func NodeInfo(c *gin.Context){ 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
} }
appG.Response(http.StatusOK,e.SUCCESS,"node is running") appG.Response(http.StatusOK, e.SUCCESS, "node is running")
} }
func RestartNode(c* gin.Context){ func RestartNode(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
app.BityuanFlag.Flag = true app.BityuanFlag.Flag = true
_,err := app.SafeCloseNode() _, err := app.SafeCloseNode()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,"node err") appG.Response(http.StatusOK, e.NODE_ERROR, "node err")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
appG.Response(http.StatusOK,e.SUCCESS,"node close safe") appG.Response(http.StatusOK, e.SUCCESS, "node close safe")
} }
func CloseNode(c* gin.Context){ func CloseNode(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
app.BityuanFlag.Flag = true app.BityuanFlag.Flag = true
_,err := app.SafeCloseNode() _, err := app.SafeCloseNode()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,"node err") appG.Response(http.StatusOK, e.NODE_ERROR, "node err")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
//防止其他模块未关闭 //防止其他模块未关闭
//time.Sleep(time.Second * 2) //time.Sleep(time.Second * 2)
if !app.MakeSureBtyIsNotRun() { if !app.MakeSureBtyIsNotRun() {
appG.Response(http.StatusOK,e.NODE_ERROR,"node stop err") appG.Response(http.StatusOK, e.NODE_ERROR, "node stop err")
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
appG.Response(http.StatusOK,e.SUCCESS,"node close safe") appG.Response(http.StatusOK, e.SUCCESS, "node close safe")
} }
//反馈信息 //反馈信息
func FeedBack(c *gin.Context){ func FeedBack(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
app.Preprocessing() app.Preprocessing()
ssh_keygen:=exec.Command(fmt.Sprintf("%s%sssh-keygen.sh",setting.Chain33Pai.Path,setting.Chain33Pai.Scripts)) ssh_keygen := exec.Command(fmt.Sprintf("%s%sssh-keygen.sh", setting.Chain33Pai.Path, setting.Chain33Pai.Scripts))
err:=ssh_keygen.Start() err := ssh_keygen.Start()
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.ENV_ERROR,nil) appG.Response(http.StatusOK, e.ENV_ERROR, nil)
log.Println(err) log.Println(err)
return return
} }
err=ssh_keygen.Wait() err = ssh_keygen.Wait()
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.ENV_ERROR,nil) appG.Response(http.StatusOK, e.ENV_ERROR, nil)
log.Println(err) log.Println(err)
return return
} }
local_keyPair:=make(map[string]string) local_keyPair := make(map[string]string)
results:=make(map[string]string) results := make(map[string]string)
keyPairStream,_:=ioutil.ReadAll(appG.C.Request.Body) keyPairStream, _ := ioutil.ReadAll(appG.C.Request.Body)
err=json.Unmarshal(keyPairStream,&local_keyPair) err = json.Unmarshal(keyPairStream, &local_keyPair)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.INVALID_PARAMS,nil) appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
log.Println(err) log.Println(err)
return return
} }
local_keyPair["public"]=app.GetPubKey() local_keyPair["public"] = app.GetPubKey()
keyPairStream,_=json.Marshal(local_keyPair) keyPairStream, _ = json.Marshal(local_keyPair)
resp,err:=http.Post(setting.Chain33Pai.FeedBackUrl,"application/json",bytes.NewReader(keyPairStream)) resp, err := http.Post(setting.Chain33Pai.FeedBackUrl, "application/json", bytes.NewReader(keyPairStream))
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络错误") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络错误")
log.Println(err) log.Println(err)
return return
} }
keyPairStream,_=ioutil.ReadAll(resp.Body) keyPairStream, _ = ioutil.ReadAll(resp.Body)
//log.Println(string(keyPairStream)) //log.Println(string(keyPairStream))
err=json.Unmarshal(keyPairStream,&results) err = json.Unmarshal(keyPairStream, &results)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.ENV_ERROR,"系统错误") appG.Response(http.StatusOK, e.ENV_ERROR, "系统错误")
log.Println(err) log.Println(err)
return return
} }
if results["code"]=="200"{ if results["code"] == "200" {
setting.ReverseTunnelPort=results["port"] setting.ReverseTunnelPort = results["port"]
//log.Println(results) //log.Println(results)
ssh := exec.Command(fmt.Sprintf("%s%sautosshdaemon.sh",setting.Chain33Pai.Path,setting.Chain33Pai.Scripts),results["daemon"],results["port"], setting.Chain33Pai.RaspberryServer) ssh := exec.Command(fmt.Sprintf("%s%sautosshdaemon.sh", setting.Chain33Pai.Path, setting.Chain33Pai.Scripts), results["daemon"], results["port"], setting.Chain33Pai.RaspberryServer)
//log.Println(ssh.String()) //log.Println(ssh.String())
err=ssh.Run() err = ssh.Run()
if err!=nil{ if err != nil {
log.Println(err) log.Println(err)
appG.Response(http.StatusOK,e.ENV_ERROR,nil) appG.Response(http.StatusOK, e.ENV_ERROR, nil)
return return
} }
appG.Response(http.StatusOK,e.SUCCESS,nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
return return
} }
appG.Response(http.StatusOK,e.NETWORK_ERROR,nil) appG.Response(http.StatusOK, e.NETWORK_ERROR, nil)
} }
//反馈信息 //反馈信息
func FeedBackWithoutSSH(c *gin.Context){ func FeedBackWithoutSSH(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
local_keyPair:=make(map[string]string) local_keyPair := make(map[string]string)
results:=make(map[string]string) results := make(map[string]string)
keyPairStream,_:=ioutil.ReadAll(appG.C.Request.Body) keyPairStream, _ := ioutil.ReadAll(appG.C.Request.Body)
err:=json.Unmarshal(keyPairStream,&local_keyPair) err := json.Unmarshal(keyPairStream, &local_keyPair)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.INVALID_PARAMS,nil) appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
log.Println(err) log.Println(err)
return return
} }
keyPairStream,_=json.Marshal(local_keyPair) keyPairStream, _ = json.Marshal(local_keyPair)
resp,err:=http.Post(setting.Chain33Pai.FeedBackNosshUrl,"application/json",bytes.NewReader(keyPairStream)) resp, err := http.Post(setting.Chain33Pai.FeedBackNosshUrl, "application/json", bytes.NewReader(keyPairStream))
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络错误") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络错误")
log.Println(err) log.Println(err)
return return
} }
keyPairStream,_=ioutil.ReadAll(resp.Body) keyPairStream, _ = ioutil.ReadAll(resp.Body)
log.Println(string(keyPairStream)) log.Println(string(keyPairStream))
err=json.Unmarshal(keyPairStream,&results) err = json.Unmarshal(keyPairStream, &results)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.ENV_ERROR,"系统错误") appG.Response(http.StatusOK, e.ENV_ERROR, "系统错误")
log.Println(err) log.Println(err)
return return
} }
if results["code"]=="200"{ if results["code"] == "200" {
appG.Response(http.StatusOK,e.SUCCESS,nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
return return
} }
appG.Response(http.StatusOK,e.NETWORK_ERROR,nil) appG.Response(http.StatusOK, e.NETWORK_ERROR, nil)
} }
func FeedBackStatusWithoutSSH(c *gin.Context){ func FeedBackStatusWithoutSSH(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
results := make(map[string]interface{}) results := make(map[string]interface{})
var pai pai_service.Pai var pai pai_service.Pai
pai.GetConfig() pai.GetConfig()
results["addr"] = pai.Serial results["addr"] = pai.Serial
keyPairStream,_ :=json.Marshal(results) keyPairStream, _ := json.Marshal(results)
resp,err:=http.Post(setting.Chain33Pai.IsCompleteNosshUrl,"application/json",bytes.NewReader(keyPairStream)) resp, err := http.Post(setting.Chain33Pai.IsCompleteNosshUrl, "application/json", bytes.NewReader(keyPairStream))
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络错误") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络错误")
log.Println(err) log.Println(err)
return return
} }
data,_ :=ioutil.ReadAll(resp.Body) data, _ := ioutil.ReadAll(resp.Body)
err=json.Unmarshal(data,&results) err = json.Unmarshal(data, &results)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络错误") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络错误")
log.Println(err) log.Println(err)
return return
} }
if results["code"]==float64(e.UNDONE){ if results["code"] == float64(e.UNDONE) {
appG.Response(http.StatusOK,e.UNDONE,"未解决") appG.Response(http.StatusOK, e.UNDONE, "未解决")
return return
} }
if results["msg"]=="ok"{ if results["msg"] == "ok" {
appG.Response(http.StatusOK,e.SUCCESS,nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
return return
} }
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络出错") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络出错")
log.Println(results) log.Println(results)
} }
func FeedBackStatus(c *gin.Context){ func FeedBackStatus(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
results:=make(map[string]interface{}) results := make(map[string]interface{})
//results_port:=make(map[string]interface{}) //results_port:=make(map[string]interface{})
results["port"]=setting.ReverseTunnelPort results["port"] = setting.ReverseTunnelPort
if results["port"]==""{ if results["port"] == "" {
appG.Response(http.StatusOK,e.NO_JOB,"没有反馈记录") appG.Response(http.StatusOK, e.NO_JOB, "没有反馈记录")
return return
} }
data,_:=json.Marshal(&results) data, _ := json.Marshal(&results)
resp,err:=http.Post(setting.Chain33Pai.IsCompleteUrl,"application/json",bytes.NewReader(data)) resp, err := http.Post(setting.Chain33Pai.IsCompleteUrl, "application/json", bytes.NewReader(data))
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络错误") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络错误")
log.Println(err) log.Println(err)
return return
} }
data,_=ioutil.ReadAll(resp.Body) data, _ = ioutil.ReadAll(resp.Body)
err=json.Unmarshal(data,&results) err = json.Unmarshal(data, &results)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络错误") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络错误")
log.Println(err) log.Println(err)
return return
} }
fmt.Println(reflect.TypeOf(e.UNDONE)) fmt.Println(reflect.TypeOf(e.UNDONE))
if results["code"]==float64(e.UNDONE){ if results["code"] == float64(e.UNDONE) {
appG.Response(http.StatusOK,e.UNDONE,"未解决") appG.Response(http.StatusOK, e.UNDONE, "未解决")
return return
} }
if results["msg"]=="ok"{ if results["msg"] == "ok" {
appG.Response(http.StatusOK,e.SUCCESS,nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
breakConn:=exec.Command(fmt.Sprintf("%s%sautossh.sh",setting.Chain33Pai.Path,setting.Chain33Pai.Scripts)) breakConn := exec.Command(fmt.Sprintf("%s%sautossh.sh", setting.Chain33Pai.Path, setting.Chain33Pai.Scripts))
err:=breakConn.Start() err := breakConn.Start()
if err!=nil{ if err != nil {
return return
} }
err=breakConn.Wait() err = breakConn.Wait()
return return
} }
appG.Response(http.StatusOK,e.NETWORK_ERROR,"网络出错") appG.Response(http.StatusOK, e.NETWORK_ERROR, "网络出错")
log.Println(results) log.Println(results)
} }
func EscrowPasswd(c *gin.Context){ func EscrowPasswd(c *gin.Context) {
type Password struct { type Password struct {
Password string `json:"password" binding:"required"` Password string `json:"password" binding:"required"`
} }
var passwd Password var passwd Password
appG:=app.Gin{C:c} appG := app.Gin{C: c}
err:=appG.C.ShouldBindJSON(&passwd) err := appG.C.ShouldBindJSON(&passwd)
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.INVALID_PARAMS,nil) appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
tlog.Info("invalid params") tlog.Info("invalid params")
return return
} }
r,errs:=setting.PaiClient.Unlock(&types.WalletUnLock{ r, errs := setting.PaiClient.Unlock(&types.WalletUnLock{
Passwd: passwd.Password, Passwd: passwd.Password,
Timeout: 0, Timeout: 0,
WalletOrTicket: false, WalletOrTicket: false,
...@@ -483,59 +484,60 @@ func EscrowPasswd(c *gin.Context){ ...@@ -483,59 +484,60 @@ func EscrowPasswd(c *gin.Context){
XXX_unrecognized: nil, XXX_unrecognized: nil,
XXX_sizecache: 0, XXX_sizecache: 0,
}) })
if errs!=nil{ if errs != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,nil) appG.Response(http.StatusOK, e.NODE_ERROR, nil)
tlog.Info("节点故障",err) tlog.Info("节点故障", err)
return return
}//覆盖原有密码 } //覆盖原有密码
if !r.IsOk{ if !r.IsOk {
appG.Response(http.StatusOK,e.ERROR_AUTH,r.Msg) appG.Response(http.StatusOK, e.ERROR_AUTH, r.Msg)
tlog.Info("Auth Faild","password",passwd.Password) tlog.Info("Auth Faild", "password", passwd.Password)
return return
} }
f,err:=os.OpenFile(setting.BityuanSetting.Passwd,os.O_WRONLY|os.O_TRUNC|os.O_CREATE,0666) f, err := os.OpenFile(setting.BityuanSetting.Passwd, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666)
defer f.Close() defer f.Close()
if err!=nil{ if err != nil {
appG.Response(http.StatusOK,e.ENV_ERROR,nil) appG.Response(http.StatusOK, e.ENV_ERROR, nil)
tlog.Info(err.Error()) tlog.Info(err.Error())
return return
} }
f.WriteString(passwd.Password) f.WriteString(passwd.Password)
appG.Response(http.StatusOK,e.SUCCESS,nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
} }
//如果bityuan进程开启 端口没开启 默认认为是在版本内部升级过程中 确定是否还在版本更新中 status false 表示已同步完成 true 表示还在版本同步中 //如果bityuan进程开启 端口没开启 默认认为是在版本内部升级过程中 确定是否还在版本更新中 status false 表示已同步完成 true 表示还在版本同步中
func UpdateNodeStatus(c *gin.Context){ func UpdateNodeStatus(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
var update bool var update bool
var buf bytes.Buffer var buf bytes.Buffer
cmd := exec.Command("netstat", "-tunlp") cmd := exec.Command("netstat", "-tunlp")
cmd.Stdout = &buf cmd.Stdout = &buf
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,nil) appG.Response(http.StatusOK, e.NODE_ERROR, nil)
return return
} }
//程序运行 + 端口没开启 //程序运行 + 端口没开启
if strings.Contains(buf.String(),"v7-bityuan") && !strings.Contains(buf.String(),":8801") { if strings.Contains(buf.String(), "v7-bityuan") && !strings.Contains(buf.String(), ":8801") {
update = true update = true
} else if !strings.Contains(buf.String(),"v7-bityuan") { } else if !strings.Contains(buf.String(), "v7-bityuan") {
appG.Response(http.StatusOK,e.NODE_ERROR,nil) appG.Response(http.StatusOK, e.NODE_ERROR, nil)
return return
} }
appG.Response(http.StatusOK,e.SUCCESS,gin.H{ appG.Response(http.StatusOK, e.SUCCESS, gin.H{
"status":update, "status": update,
}) })
} }
func PoweroffPai(c *gin.Context) { func PoweroffPai(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
app.BityuanFlag.Lock.Lock() app.BityuanFlag.Lock.Lock()
defer app.BityuanFlag.Lock.Unlock() defer app.BityuanFlag.Lock.Unlock()
app.BityuanFlag.Flag = true app.BityuanFlag.Flag = true
_,err := app.SafeCloseNode() _, err := app.SafeCloseNode()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,err) appG.Response(http.StatusOK, e.NODE_ERROR, err)
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
...@@ -544,117 +546,117 @@ func PoweroffPai(c *gin.Context) { ...@@ -544,117 +546,117 @@ func PoweroffPai(c *gin.Context) {
cmd.Stdout = &buf cmd.Stdout = &buf
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
appG.Response(http.StatusOK,e.NODE_ERROR,err) appG.Response(http.StatusOK, e.NODE_ERROR, err)
app.BityuanFlag.Flag = false app.BityuanFlag.Flag = false
return return
} }
appG.Response(http.StatusOK,e.SUCCESS,"pai restarted") appG.Response(http.StatusOK, e.SUCCESS, "pai restarted")
} }
func Test(c *gin.Context) { func Test(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
report ,_:= ioutil.ReadAll(appG.C.Request.Body) report, _ := ioutil.ReadAll(appG.C.Request.Body)
tlog.Info("test","report",string(report)) tlog.Info("test", "report", string(report))
client := &http.Client{} client := &http.Client{}
params:=make(map[string]interface{}) params := make(map[string]interface{})
params["report"] = string(report) params["report"] = string(report)
data,_ := json.Marshal(params) data, _ := json.Marshal(params)
req ,_ := http.NewRequest("post",setting.Chain33Pai.UploadTestUrl,bytes.NewReader(data)) req, _ := http.NewRequest("post", setting.Chain33Pai.UploadTestUrl, bytes.NewReader(data))
resp,_:=client.Do(req) resp, _ := client.Do(req)
body, _ := ioutil.ReadAll(resp.Body) body, _ := ioutil.ReadAll(resp.Body)
tlog.Info("uploadtest","report",string(body)) tlog.Info("uploadtest", "report", string(body))
appG.Response(http.StatusOK,e.SUCCESS,"") appG.Response(http.StatusOK, e.SUCCESS, "")
} }
func Rollback(c *gin.Context) { func Rollback(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
app.JobChan <- app.MsgType{Name:"ROLLBACK"} app.JobChan <- app.MsgType{Name: "ROLLBACK"}
appG.Response(http.StatusOK,e.SUCCESS,"bityuan rollback") appG.Response(http.StatusOK, e.SUCCESS, "bityuan rollback")
} }
func NodeBackup(c *gin.Context) { func NodeBackup(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
var pai pai_service.Pai var pai pai_service.Pai
err := pai.GetDiskUseage() err := pai.GetDiskUseage()
if err != nil { if err != nil {
tlog.Error("GetDiskUseage","err",err) tlog.Error("GetDiskUseage", "err", err)
appG.Response(http.StatusOK,e.ENV_ERROR,"get diskuseage err") appG.Response(http.StatusOK, e.ENV_ERROR, "get diskuseage err")
return return
} }
if len(pai.Disks) == 0 { if len(pai.Disks) == 0 {
tlog.Error("disk ","err","disk not find") tlog.Error("disk ", "err", "disk not find")
appG.Response(http.StatusOK,e.ENV_ERROR,"disk not find") appG.Response(http.StatusOK, e.ENV_ERROR, "disk not find")
return return
} }
tlog.Info("disk info","ssd",pai.Disks[0]) tlog.Info("disk info", "ssd", pai.Disks[0])
p := pai.Disks[0].Use p := pai.Disks[0].Use
ps := strings.Split(p,"%") ps := strings.Split(p, "%")
pint,_ := strconv.Atoi(ps[0]) pint, _ := strconv.Atoi(ps[0])
if pint * 2 > 80 { if pint*2 > 80 {
tlog.Error("disk space ","err","space not enough to backup") tlog.Error("disk space ", "err", "space not enough to backup")
appG.Response(http.StatusOK,e.ENV_ERROR,"disk space not enough") appG.Response(http.StatusOK, e.ENV_ERROR, "disk space not enough")
return return
} }
app.JobChan <- app.MsgType{Name:"BACKUP"} app.JobChan <- app.MsgType{Name: "BACKUP"}
appG.Response(http.StatusOK,e.SUCCESS,"bityuan ready to backup") appG.Response(http.StatusOK, e.SUCCESS, "bityuan ready to backup")
} }
func CheckBackup(c *gin.Context) { func CheckBackup(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
path := app.GetAbsPath(setting.BityuanSetting.Name) path := app.GetAbsPath(setting.BityuanSetting.Name)
backupPath := path + "/datadir_backup" backupPath := path + "/datadir_backup"
if _,err := os.Stat(backupPath);err != nil { if _, err := os.Stat(backupPath); err != nil {
tlog.Info("CheckBackup","err",err) tlog.Info("CheckBackup", "err", err)
if os.IsNotExist(err) { if os.IsNotExist(err) {
tlog.Error("CheckBackup file not exists","err",backupPath) tlog.Error("CheckBackup file not exists", "err", backupPath)
appG.Response(http.StatusOK,e.ERROR,false) appG.Response(http.StatusOK, e.ERROR, false)
return return
} }
} }
appG.Response(http.StatusOK,e.SUCCESS,true) appG.Response(http.StatusOK, e.SUCCESS, true)
} }
func NodeRecover(c *gin.Context) { func NodeRecover(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
var pai pai_service.Pai var pai pai_service.Pai
err := pai.GetDiskUseage() err := pai.GetDiskUseage()
if err != nil { if err != nil {
tlog.Error("GetDiskUseage","err",err) tlog.Error("GetDiskUseage", "err", err)
appG.Response(http.StatusOK,e.ENV_ERROR,"get diskuseage err") appG.Response(http.StatusOK, e.ENV_ERROR, "get diskuseage err")
return return
} }
if len(pai.Disks) == 0 { if len(pai.Disks) == 0 {
tlog.Error("disk ","err","disk not find") tlog.Error("disk ", "err", "disk not find")
appG.Response(http.StatusOK,e.ENV_ERROR,"disk not find") appG.Response(http.StatusOK, e.ENV_ERROR, "disk not find")
return return
} }
tlog.Info("disk info","ssd",pai.Disks[0]) tlog.Info("disk info", "ssd", pai.Disks[0])
p := pai.Disks[0].Use p := pai.Disks[0].Use
ps := strings.Split(p,"%") ps := strings.Split(p, "%")
pint,_ := strconv.Atoi(ps[0]) pint, _ := strconv.Atoi(ps[0])
if pint > 90 { if pint > 90 {
tlog.Error("disk ","err","disk space not enough") tlog.Error("disk ", "err", "disk space not enough")
//app.JobChan <- app.MsgType{Name:"DELETEBACKUP"} //app.JobChan <- app.MsgType{Name:"DELETEBACKUP"}
} }
app.JobChan <- app.MsgType{Name:"RECOVER"} app.JobChan <- app.MsgType{Name: "RECOVER"}
appG.Response(http.StatusOK,e.SUCCESS,"bityuan ready to recover") appG.Response(http.StatusOK, e.SUCCESS, "bityuan ready to recover")
} }
func DelBackup(c *gin.Context) { func DelBackup(c *gin.Context) {
appG:=app.Gin{C:c} appG := app.Gin{C: c}
var pai pai_service.Pai var pai pai_service.Pai
err := pai.GetDiskUseage() err := pai.GetDiskUseage()
if err != nil { if err != nil {
tlog.Error("GetDiskUseage","err",err) tlog.Error("GetDiskUseage", "err", err)
appG.Response(http.StatusOK,e.ENV_ERROR,"get diskuseage err") appG.Response(http.StatusOK, e.ENV_ERROR, "get diskuseage err")
return return
} }
if len(pai.Disks) == 0 { if len(pai.Disks) == 0 {
tlog.Error("disk ","err","disk not find") tlog.Error("disk ", "err", "disk not find")
appG.Response(http.StatusOK,e.ENV_ERROR,"disk not find") appG.Response(http.StatusOK, e.ENV_ERROR, "disk not find")
return return
} }
tlog.Info("disk info","ssd",pai.Disks[0]) tlog.Info("disk info", "ssd", pai.Disks[0])
app.JobChan <- app.MsgType{Name:"DELETEBACKUP"} app.JobChan <- app.MsgType{Name: "DELETEBACKUP"}
appG.Response(http.StatusOK,e.ENV_ERROR,"del backup") appG.Response(http.StatusOK, e.ENV_ERROR, "del backup")
} }
package v1 package v1
import ( import (
"os"
"net/http"
"chain33-pai/pkg/e"
"chain33-pai/pkg/app" "chain33-pai/pkg/app"
"github.com/gin-gonic/gin" "chain33-pai/pkg/e"
"chain33-pai/service/pai_service" "chain33-pai/pkg/pai"
"chain33-pai/pkg/setting" "chain33-pai/pkg/setting"
"os/exec"
log "github.com/33cn/chain33/common/log/log15"
"chain33-pai/pkg/util" "chain33-pai/pkg/util"
"chain33-pai/pkg/pai" "chain33-pai/service/pai_service"
log "github.com/33cn/chain33/common/log/log15"
"github.com/gin-gonic/gin"
"net/http"
"os"
"os/exec"
) )
var tlog = log.New("api", "v1") var tlog = log.New("api", "v1")
...@@ -40,18 +40,18 @@ func GetDevstatus(c *gin.Context) { ...@@ -40,18 +40,18 @@ func GetDevstatus(c *gin.Context) {
//获取chain33-pai程序版本 //获取chain33-pai程序版本
func GetPaiVersion(c *gin.Context) { func GetPaiVersion(c *gin.Context) {
appG := app.Gin{C:c} appG := app.Gin{C: c}
version := app.GetVersion() version := app.GetVersion()
var pai pai_service.Pai var pai pai_service.Pai
latest,err := pai.GetPaiLatestVersion(int32(2)) latest, err := pai.GetPaiLatestVersion(int32(2))
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.NETWORK_ERROR, nil) appG.Response(http.StatusOK, e.NETWORK_ERROR, nil)
return return
} }
appG.Response(http.StatusOK, e.SUCCESS, gin.H{ appG.Response(http.StatusOK, e.SUCCESS, gin.H{
"current":version, "current": version,
"latest":latest, "latest": latest,
}) })
} }
...@@ -59,7 +59,7 @@ func GetPaiVersion(c *gin.Context) { ...@@ -59,7 +59,7 @@ func GetPaiVersion(c *gin.Context) {
//具体更新逻辑写在代码 更新迭代比较麻烦 改为下面new方法 //具体更新逻辑写在代码 更新迭代比较麻烦 改为下面new方法
//下载地址阿里云oss地址 固定ip格式+/+chain33-pai+x.x.x+.tar.gz //下载地址阿里云oss地址 固定ip格式+/+chain33-pai+x.x.x+.tar.gz
func UpdatePai(c *gin.Context) { func UpdatePai(c *gin.Context) {
appG := app.Gin{C:c} appG := app.Gin{C: c}
if app.DPercent.Flag { if app.DPercent.Flag {
appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, "正在升级中,不要重复点击") appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, "正在升级中,不要重复点击")
return return
...@@ -83,7 +83,7 @@ func UpdatePai(c *gin.Context) { ...@@ -83,7 +83,7 @@ func UpdatePai(c *gin.Context) {
} }
//检查版本号是否存在于online数据库 //检查版本号是否存在于online数据库
var pai pai_service.Pai var pai pai_service.Pai
latest,err := pai.GetPaiLatestVersion(int32(2)) latest, err := pai.GetPaiLatestVersion(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
...@@ -96,102 +96,102 @@ func UpdatePai(c *gin.Context) { ...@@ -96,102 +96,102 @@ func UpdatePai(c *gin.Context) {
app.DPercent.Flag = false 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,int32(2)) 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
return return
} }
//解压缩文件 //解压缩文件
tar := exec.Command("tar","-xvf",name) tar := exec.Command("tar", "-xvf", name)
err = tar.Start() err = tar.Start()
if err != nil { if err != nil {
tlog.Error("tar","err",err) tlog.Error("tar", "err", err)
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err) appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
err = tar.Wait() err = tar.Wait()
if err != nil { if err != nil {
tlog.Error("tar","err",err) tlog.Error("tar", "err", err)
appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err) appG.Response(http.StatusOK, e.TAR_XVF_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
//备份原文件 确保没有alias 关联 //备份原文件 确保没有alias 关联
bak := exec.Command("cp",setting.Chain33Pai.Name,setting.Chain33Pai.Name+".bak") bak := exec.Command("cp", setting.Chain33Pai.Name, setting.Chain33Pai.Name+".bak")
err = bak.Start() err = bak.Start()
if err != nil { if err != nil {
tlog.Error("bak","err",err) tlog.Error("bak", "err", err)
appG.Response(http.StatusOK, e.CP_ERROR, err) appG.Response(http.StatusOK, e.CP_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
err = bak.Wait() err = bak.Wait()
if err != nil { if err != nil {
tlog.Error("bak","err",err) tlog.Error("bak", "err", err)
appG.Response(http.StatusOK, e.CP_ERROR, err) appG.Response(http.StatusOK, e.CP_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
//备份配置文件 //备份配置文件
bakconf := exec.Command("cp","conf/app.ini","conf/app.ini.bak") bakconf := exec.Command("cp", "conf/app.ini", "conf/app.ini.bak")
err = bakconf.Start() err = bakconf.Start()
if err != nil { if err != nil {
tlog.Error("bakconf","err",err) tlog.Error("bakconf", "err", err)
appG.Response(http.StatusOK, e.CP_ERROR, err) appG.Response(http.StatusOK, e.CP_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
err = bakconf.Wait() err = bakconf.Wait()
if err != nil { if err != nil {
tlog.Error("bakconf","err",err) tlog.Error("bakconf", "err", err)
appG.Response(http.StatusOK, e.CP_ERROR, err) appG.Response(http.StatusOK, e.CP_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
//替换原执行文件 //替换原执行文件
mv := exec.Command("mv",setting.Chain33Pai.Name+"_"+req.Version+"/"+setting.Chain33Pai.Name,".") mv := exec.Command("mv", setting.Chain33Pai.Name+"_"+req.Version+"/"+setting.Chain33Pai.Name, ".")
err = mv.Start() err = mv.Start()
if err != nil { if err != nil {
tlog.Error("mv","err",err) tlog.Error("mv", "err", err)
appG.Response(http.StatusOK, e.MV_ERROR, err) appG.Response(http.StatusOK, e.MV_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
err = mv.Wait() err = mv.Wait()
if err != nil { if err != nil {
tlog.Error("mv","err",err) tlog.Error("mv", "err", err)
appG.Response(http.StatusOK, e.MV_ERROR, err) appG.Response(http.StatusOK, e.MV_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
//替换配置文件 //替换配置文件
mvconf := exec.Command("mv",setting.Chain33Pai.Name+"_"+req.Version+"/conf/app.ini","conf") mvconf := exec.Command("mv", setting.Chain33Pai.Name+"_"+req.Version+"/conf/app.ini", "conf")
err = mvconf.Start() err = mvconf.Start()
if err != nil { if err != nil {
tlog.Error("mvconf","err",err) tlog.Error("mvconf", "err", err)
appG.Response(http.StatusOK, e.MV_ERROR, err) appG.Response(http.StatusOK, e.MV_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
err = mvconf.Wait() err = mvconf.Wait()
if err != nil { if err != nil {
tlog.Error("mvconf","err",err) tlog.Error("mvconf", "err", err)
appG.Response(http.StatusOK, e.MV_ERROR, err) appG.Response(http.StatusOK, e.MV_ERROR, err)
app.DPercent.Flag = false app.DPercent.Flag = false
return return
} }
os.RemoveAll("scripts") os.RemoveAll("scripts")
os.Mkdir("scripts",0600) os.Mkdir("scripts", 0600)
//删除temp文件夹 //删除temp文件夹
//替换原执行文件 //替换原执行文件
app.MVScripts(setting.Chain33Pai.Name+"_"+req.Version,".") app.MVScripts(setting.Chain33Pai.Name+"_"+req.Version, ".")
remove := exec.Command("rm","-rf",setting.Chain33Pai.Name+"_"+req.Version,name) remove := exec.Command("rm", "-rf", setting.Chain33Pai.Name+"_"+req.Version, name)
err = remove.Start() err = remove.Start()
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.RM_ERROR, err) appG.Response(http.StatusOK, e.RM_ERROR, err)
...@@ -212,7 +212,7 @@ func UpdatePai(c *gin.Context) { ...@@ -212,7 +212,7 @@ func UpdatePai(c *gin.Context) {
//忽略req.Version 对比自己版本和最新版本 直接更新覆盖最新版本 //忽略req.Version 对比自己版本和最新版本 直接更新覆盖最新版本
//下载地址阿里云oss地址 固定ip格式+/+chain33-pai+x.x.x+.tar.gz //下载地址阿里云oss地址 固定ip格式+/+chain33-pai+x.x.x+.tar.gz
func UpdatePaiNew(c *gin.Context) { func UpdatePaiNew(c *gin.Context) {
appG := app.Gin{C:c} appG := app.Gin{C: c}
if app.DPercent.Flag { if app.DPercent.Flag {
appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, "正在升级中,不要重复点击") appG.Response(http.StatusOK, e.DOWNLOAD_ERROR, "正在升级中,不要重复点击")
return return
...@@ -238,18 +238,17 @@ func UpdatePaiNew(c *gin.Context) { ...@@ -238,18 +238,17 @@ func UpdatePaiNew(c *gin.Context) {
appG.Response(http.StatusOK, e.SUCCESS, nil) appG.Response(http.StatusOK, e.SUCCESS, nil)
} }
func GetDPercent(c *gin.Context) { func GetDPercent(c *gin.Context) {
appG := app.Gin{C:c} appG := app.Gin{C: c}
appG.Response(http.StatusOK, e.SUCCESS, gin.H{ appG.Response(http.StatusOK, e.SUCCESS, gin.H{
"total":app.DPercent.Total, "total": app.DPercent.Total,
"current":app.DPercent.Current, "current": app.DPercent.Current,
}) })
} }
func GetExternal(c *gin.Context) { func GetExternal(c *gin.Context) {
appG := app.Gin{C:c} appG := app.Gin{C: c}
ip,err := util.GetExternal() ip, err := util.GetExternal()
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.ERROR, "get external ip err") appG.Response(http.StatusOK, e.ERROR, "get external ip err")
return return
...@@ -258,8 +257,8 @@ func GetExternal(c *gin.Context) { ...@@ -258,8 +257,8 @@ func GetExternal(c *gin.Context) {
} }
func GetServerStatus(c *gin.Context) { func GetServerStatus(c *gin.Context) {
appG := app.Gin{C:c} appG := app.Gin{C: c}
disks,err := pai.MonitorServer() disks, err := pai.MonitorServer()
if err != nil { if err != nil {
appG.Response(http.StatusOK, e.ERROR, err) appG.Response(http.StatusOK, e.ERROR, err)
return return
......
package routers package routers
import ( import (
"github.com/gin-gonic/gin"
_ "chain33-pai/docs" _ "chain33-pai/docs"
"chain33-pai/routers/api/v1" "chain33-pai/routers/api/v1"
"github.com/gin-gonic/gin"
"net/http" "net/http"
) )
...@@ -15,58 +15,58 @@ func InitRouter() *gin.Engine { ...@@ -15,58 +15,58 @@ func InitRouter() *gin.Engine {
r.Use(Cors()) r.Use(Cors())
apiv1 := r.Group("/pai") apiv1 := r.Group("/pai")
//获取树莓派基本信息 //获取树莓派基本信息
apiv1.POST("/devdetail",v1.GetDevdetail) apiv1.POST("/devdetail", v1.GetDevdetail)
//获取树莓派基本信息 //获取树莓派基本信息
apiv1.POST("/resetwallet",v1.ResetWallet) apiv1.POST("/resetwallet", v1.ResetWallet)
//更新bityuan节点 下载替换 重启 //更新bityuan节点 下载替换 重启
apiv1.POST("/updatenode",v1.UpdateNodeNew) apiv1.POST("/updatenode", v1.UpdateNodeNew)
//检查节点是否还在更新同步 节点6.4.0大版本更新可能需要十几个小时 故加此接口 //检查节点是否还在更新同步 节点6.4.0大版本更新可能需要十几个小时 故加此接口
apiv1.POST("/nodeupdate",v1.UpdateNodeStatus) apiv1.POST("/nodeupdate", v1.UpdateNodeStatus)
apiv1.POST("/devstatus",v1.GetDevstatus) apiv1.POST("/devstatus", v1.GetDevstatus)
apiv1.POST("/updatedetail",v1.UpdateDetail) apiv1.POST("/updatedetail", v1.UpdateDetail)
apiv1.POST("/version",v1.Version) apiv1.POST("/version", v1.Version)
apiv1.POST("/reset",v1.ResetNode) apiv1.POST("/reset", v1.ResetNode)
apiv1.POST("/nodeinfo",v1.NodeInfo) apiv1.POST("/nodeinfo", v1.NodeInfo)
//本程序版本 //本程序版本
apiv1.POST("/paiversion",v1.GetPaiVersion) apiv1.POST("/paiversion", v1.GetPaiVersion)
//本程序下载新版本 //本程序下载新版本
apiv1.POST("/updatepai",v1.UpdatePaiNew) apiv1.POST("/updatepai", v1.UpdatePaiNew)
//获取下载进度 //获取下载进度
apiv1.POST("/dpercent",v1.GetDPercent) apiv1.POST("/dpercent", v1.GetDPercent)
//获取外网ip //获取外网ip
apiv1.POST("/external",v1.GetExternal) apiv1.POST("/external", v1.GetExternal)
//服务器状态 //服务器状态
apiv1.POST("/serverstatus",v1.GetServerStatus) apiv1.POST("/serverstatus", v1.GetServerStatus)
//反馈信息 //反馈信息
apiv1.POST("/feedback",v1.FeedBackWithoutSSH) apiv1.POST("/feedback", v1.FeedBackWithoutSSH)
//反馈处理进度 //反馈处理进度
apiv1.POST("/iscomplete",v1.FeedBackStatusWithoutSSH) apiv1.POST("/iscomplete", v1.FeedBackStatusWithoutSSH)
//反馈信息 //反馈信息
apiv1.POST("/feedback1",v1.FeedBack) apiv1.POST("/feedback1", v1.FeedBack)
//反馈处理进度 //反馈处理进度
apiv1.POST("/iscomplete1",v1.FeedBackStatus) apiv1.POST("/iscomplete1", v1.FeedBackStatus)
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) apiv1.POST("/restartnode", v1.RestartNode)
//安全关闭节点,不会再重启 除非是重启树莓派 //安全关闭节点,不会再重启 除非是重启树莓派
apiv1.POST("/closenode",v1.CloseNode) apiv1.POST("/closenode", v1.CloseNode)
//sudo poweroff //sudo poweroff
apiv1.POST("/poweroff",v1.PoweroffPai) apiv1.POST("/poweroff", v1.PoweroffPai)
//test //test
apiv1.POST("/test",v1.Test) apiv1.POST("/test", v1.Test)
//回滚1000区块 //回滚1000区块
apiv1.POST("/rollback",v1.Rollback) apiv1.POST("/rollback", v1.Rollback)
//一键备份 40g //一键备份 40g
apiv1.POST("/nodebackup",v1.NodeBackup) apiv1.POST("/nodebackup", v1.NodeBackup)
//一键恢复 针对不同步 并且 回滚多次还不同步的情况下拿最近的备份恢复 //一键恢复 针对不同步 并且 回滚多次还不同步的情况下拿最近的备份恢复
apiv1.POST("/noderecover",v1.NodeRecover) apiv1.POST("/noderecover", v1.NodeRecover)
//删除备份 //删除备份
apiv1.POST("/delbackup",v1.DelBackup) apiv1.POST("/delbackup", v1.DelBackup)
//是否备份 //是否备份
apiv1.POST("/isbackup",v1.CheckBackup) apiv1.POST("/isbackup", v1.CheckBackup)
return r return r
} }
......
package pai_service package pai_service
import ( import (
"os/exec"
"io"
"strings"
"bufio" "bufio"
"bytes"
"chain33-pai/pkg/chain33" "chain33-pai/pkg/chain33"
"github.com/33cn/chain33/types" "chain33-pai/pkg/pai"
"chain33-pai/pkg/setting"
"encoding/json"
"errors"
log "github.com/33cn/chain33/common/log/log15" log "github.com/33cn/chain33/common/log/log15"
"net/http" "github.com/33cn/chain33/types"
"bytes" "io"
"io/ioutil" "io/ioutil"
"encoding/json" "net/http"
"chain33-pai/pkg/setting"
"chain33-pai/pkg/pai"
"os" "os"
"errors" "os/exec"
"strconv" "strconv"
"strings"
) )
var ( var (
...@@ -69,13 +69,13 @@ func (p *Pai) SetPaiEnv() error { ...@@ -69,13 +69,13 @@ func (p *Pai) SetPaiEnv() error {
cmd.Stdout = &buf cmd.Stdout = &buf
cmd.Run() cmd.Run()
arch := buf.String() arch := buf.String()
p.Arch = strings.Replace(arch,"\n","",-1) p.Arch = strings.Replace(arch, "\n", "", -1)
return nil return nil
} }
func (p *Pai) GetBtyVersion() error { func (p *Pai) GetBtyVersion() error {
client := &chain33.PaiClient{} client := &chain33.PaiClient{}
v,err := client.Version() v, err := client.Version()
if err != nil { if err != nil {
p.Err = err.Error() p.Err = err.Error()
return err return err
...@@ -91,12 +91,12 @@ func (p *Pai) GetConfig() bool { ...@@ -91,12 +91,12 @@ func (p *Pai) GetConfig() bool {
if p.Serial != "" { if p.Serial != "" {
return true return true
} }
config ,err := getPaiConfig("cat","/proc/cpuinfo") config, err := getPaiConfig("cat", "/proc/cpuinfo")
if err != nil { if err != nil {
p.Err = err.Error() p.Err = err.Error()
return false return false
} }
if _,ok := config["serial"];ok { if _, ok := config["serial"]; ok {
p.Serial = config["serial"] p.Serial = config["serial"]
p.Hardware = config["hardware"] p.Hardware = config["hardware"]
p.Revision = config["revision"] p.Revision = config["revision"]
...@@ -107,14 +107,14 @@ func (p *Pai) GetConfig() bool { ...@@ -107,14 +107,14 @@ func (p *Pai) GetConfig() bool {
func (p *Pai) GetDevstatus() error { func (p *Pai) GetDevstatus() error {
client := &chain33.PaiClient{} client := &chain33.PaiClient{}
peerinfo,err := client.GetPeerInfo() peerinfo, err := client.GetPeerInfo()
if err != nil { if err != nil {
tlog.Error("GetDevstatus peerinfo ","err",err) tlog.Error("GetDevstatus peerinfo ", "err", err)
p.Err = err.Error() p.Err = err.Error()
return err return err
} }
for _,v := range peerinfo.Peers { for _, v := range peerinfo.Peers {
if p.LastHeight < v.Header.Height { if p.LastHeight < v.Header.Height {
p.LastHeight = v.Header.Height p.LastHeight = v.Header.Height
} }
...@@ -122,31 +122,31 @@ func (p *Pai) GetDevstatus() error { ...@@ -122,31 +122,31 @@ func (p *Pai) GetDevstatus() error {
p.LocalLastHeight = v.Header.Height p.LocalLastHeight = v.Header.Height
} }
} }
sync ,err := client.IsNtpClockSync() sync, err := client.IsNtpClockSync()
if err != nil { if err != nil {
p.Err = err.Error() p.Err = err.Error()
tlog.Error("GetDevstatus IsNtpClockSync"," err",err) tlog.Error("GetDevstatus IsNtpClockSync", " err", err)
return err return err
} }
p.IsNtpSync = sync.IsOk p.IsNtpSync = sync.IsOk
netinfo,err := client.GetNetInfo() netinfo, err := client.GetNetInfo()
if err != nil { if err != nil {
p.Err = err.Error() p.Err = err.Error()
tlog.Error("GetDevstatus GetNetInfo"," err",err) tlog.Error("GetDevstatus GetNetInfo", " err", err)
return err return err
} }
p.NetInfo = netinfo p.NetInfo = netinfo
walletstatus,err := client.GetWalletStatus() walletstatus, err := client.GetWalletStatus()
if err != nil { if err != nil {
p.Err = err.Error() p.Err = err.Error()
tlog.Error("GetDevstatus GetWalletStatus ","err",err) tlog.Error("GetDevstatus GetWalletStatus ", "err", err)
return err return err
} }
p.WalletStatus = walletstatus p.WalletStatus = walletstatus
return nil return nil
} }
func getPaiConfig(command string ,arg ...string) (config map[string]string,err error) { func getPaiConfig(command string, arg ...string) (config map[string]string, err error) {
//获取操作系统版本信息 //获取操作系统版本信息
list := make(map[string]string, 0) list := make(map[string]string, 0)
...@@ -154,20 +154,20 @@ func getPaiConfig(command string ,arg ...string) (config map[string]string,err e ...@@ -154,20 +154,20 @@ func getPaiConfig(command string ,arg ...string) (config map[string]string,err e
stdout, err := cmd.StdoutPipe() stdout, err := cmd.StdoutPipe()
//tlog.Info(stdout) //tlog.Info(stdout)
if err != nil { if err != nil {
tlog.Info("getPaiConfig",err) tlog.Info("getPaiConfig", err)
return nil,err return nil, err
} }
defer stdout.Close() defer stdout.Close()
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
tlog.Info("getPaiConfig",err) tlog.Info("getPaiConfig", err)
return nil,err return nil, err
} }
rd := bufio.NewReader(stdout) rd := bufio.NewReader(stdout)
for { for {
line, err := rd.ReadString('\n') line, err := rd.ReadString('\n')
if err!=nil || io.EOF==err{ if err != nil || io.EOF == err {
break break
}else{ } else {
//tlog.Info("line", line) //tlog.Info("line", line)
l := strings.Split(line, ":") l := strings.Split(line, ":")
...@@ -188,17 +188,17 @@ func getPaiConfig(command string ,arg ...string) (config map[string]string,err e ...@@ -188,17 +188,17 @@ func getPaiConfig(command string ,arg ...string) (config map[string]string,err e
return list, nil return list, nil
} }
func (p *Pai) GetPaiLatestVersion(t int32) (string,error) { func (p *Pai) GetPaiLatestVersion(t int32) (string, error) {
data := make(map[string]interface{}) data := make(map[string]interface{})
data["type"] = t data["type"] = t
bytesData, _ := json.Marshal(data) bytesData, _ := json.Marshal(data)
resp, err := http.Post(setting.Chain33Pai.VersionUrl,"application/json", bytes.NewReader(bytesData)) resp, err := http.Post(setting.Chain33Pai.VersionUrl, "application/json", bytes.NewReader(bytesData))
if err != nil { if err != nil {
return "",err return "", err
} }
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
return "",err return "", err
} }
type res struct { type res struct {
Code int64 Code int64
...@@ -206,15 +206,15 @@ func (p *Pai) GetPaiLatestVersion(t int32) (string,error) { ...@@ -206,15 +206,15 @@ func (p *Pai) GetPaiLatestVersion(t int32) (string,error) {
Data string Data string
} }
var r res var r res
err = json.Unmarshal(body,&r) err = json.Unmarshal(body, &r)
if err != nil { if err != nil {
return "",err return "", err
} }
return r.Data,nil return r.Data, nil
} }
func (p *Pai) GetDiskUseage() error { func (p *Pai) GetDiskUseage() error {
disks,err := pai.MonitorServer() disks, err := pai.MonitorServer()
if err != nil { if err != nil {
return err return err
} }
...@@ -227,14 +227,14 @@ func (p *Pai) GetDiskUseage() error { ...@@ -227,14 +227,14 @@ func (p *Pai) GetDiskUseage() error {
func (p *Pai) CheckBackup() error { func (p *Pai) CheckBackup() error {
path := pai.FindAbsPath("wallet-bty") path := pai.FindAbsPath("wallet-bty")
if path == "" { if path == "" {
tlog.Error("IsBackup","path","node not exists") tlog.Error("IsBackup", "path", "node not exists")
//p.IsBackup = false //p.IsBackup = false
return errors.New("node not exists") return errors.New("node not exists")
} }
backupPath := path + "/datadir_backup" backupPath := path + "/datadir_backup"
if _,err := os.Stat(backupPath);err != nil { if _, err := os.Stat(backupPath); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
tlog.Error("backup file not exists","err",backupPath) tlog.Error("backup file not exists", "err", backupPath)
p.IsBackup = false p.IsBackup = false
return errors.New("backup file not exists") return errors.New("backup file not exists")
} }
...@@ -245,15 +245,15 @@ func (p *Pai) CheckBackup() error { ...@@ -245,15 +245,15 @@ func (p *Pai) CheckBackup() error {
func (p *Pai) GetTemp() error { func (p *Pai) GetTemp() error {
var b bytes.Buffer var b bytes.Buffer
cmd := exec.Command("cat","/sys/class/thermal/thermal_zone0/temp") cmd := exec.Command("cat", "/sys/class/thermal/thermal_zone0/temp")
cmd.Stdout = &b cmd.Stdout = &b
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
return err return err
} }
list := strings.Split(b.String(),"\n") list := strings.Split(b.String(), "\n")
if list[0] != "" { if list[0] != "" {
temp,_ := strconv.Atoi(list[0]) temp, _ := strconv.Atoi(list[0])
p.Temp = int64(temp) p.Temp = int64(temp)
} }
return nil return 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