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"
) )
var ( var (
serial string serial string
runningAddr *net.IPNet runningAddr *net.IPNet
) )
func Broadcast() { func Broadcast() {
var pai pai_service.Pai var pai pai_service.Pai
send := "hello world" send := "hello world"
if serial != "" { if serial != "" {
...@@ -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)
} }
This diff is collapsed.
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,26 +69,25 @@ func RaspberryChan() { ...@@ -69,26 +69,25 @@ 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
} }
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
} }
rollheight := pai.LocalLastHeight - 1000 rollheight := pai.LocalLastHeight - 1000
...@@ -97,25 +96,25 @@ func rollback() error { ...@@ -97,25 +96,25 @@ func rollback() error {
} }
isrun := MakeSureBtyIsNotRun() isrun := MakeSureBtyIsNotRun()
if isrun { if isrun {
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 {
...@@ -138,11 +137,11 @@ func backup() error { ...@@ -138,11 +137,11 @@ func backup() error {
} }
isrun := MakeSureBtyIsNotRun() isrun := MakeSureBtyIsNotRun()
if isrun { if isrun {
BityuanFlag.Flag = false BityuanFlag.Flag = false
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
} }
...@@ -150,7 +149,7 @@ func backup() error { ...@@ -150,7 +149,7 @@ func backup() error {
if err != nil { if err != nil {
return err return err
} }
BityuanFlag.Flag = false BityuanFlag.Flag = false
StartProcess(setting.Chain33Pai.Auto) StartProcess(setting.Chain33Pai.Auto)
return nil return nil
} }
...@@ -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
} }
...@@ -247,13 +245,13 @@ func restartNode() error { ...@@ -247,13 +245,13 @@ func restartNode() error {
return errors.New("bty is running") return errors.New("bty is running")
} }
StartProcess(setting.Chain33Pai.Auto) StartProcess(setting.Chain33Pai.Auto)
return nil return nil
} }
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
} }
\ No newline at end of file
...@@ -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,57 +2,55 @@ package chain33 ...@@ -2,57 +2,55 @@ 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 (
paiClient types.Chain33Client paiClient types.Chain33Client
paiNetgrpcAddr = "localhost:8802" paiNetgrpcAddr = "localhost:8802"
) )
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{})
} }
...@@ -5,21 +5,21 @@ const ( ...@@ -5,21 +5,21 @@ const (
ERROR = 500 ERROR = 500
INVALID_PARAMS = 400 INVALID_PARAMS = 400
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
CP_ERROR = 5007 CP_ERROR = 5007
RM_ERROR = 5008 RM_ERROR = 5008
MV_ERROR = 5009 MV_ERROR = 5009
TRY_LATER = 5010 TRY_LATER = 5010
DF_ERROR = 5011 DF_ERROR = 5011
VERSION_UPDATE_ERROR = 5012 VERSION_UPDATE_ERROR = 5012
NO_JOB = 5013 NO_JOB = 5013
UNDONE = 5014 UNDONE = 5014
ERROR_AUTH = 5015 ERROR_AUTH = 5015
ERROR_EXIST_TAG = 10001 ERROR_EXIST_TAG = 10001
ERROR_EXIST_TAG_FAIL = 10002 ERROR_EXIST_TAG_FAIL = 10002
ERROR_NOT_EXIST_TAG = 10003 ERROR_NOT_EXIST_TAG = 10003
......
...@@ -4,14 +4,14 @@ var MsgFlags = map[int]string{ ...@@ -4,14 +4,14 @@ var MsgFlags = map[int]string{
SUCCESS: "ok", SUCCESS: "ok",
ERROR: "fail", ERROR: "fail",
INVALID_PARAMS: "请求参数错误", INVALID_PARAMS: "请求参数错误",
DOWNLOAD_ERROR: "下载出错", DOWNLOAD_ERROR: "下载出错",
TAR_XVF_ERROR: "解压文件出错", TAR_XVF_ERROR: "解压文件出错",
CP_ERROR: "拷贝文件出错", CP_ERROR: "拷贝文件出错",
RM_ERROR: "删除文件出错", RM_ERROR: "删除文件出错",
MV_ERROR: "移动文件出错", MV_ERROR: "移动文件出错",
TRY_LATER: "其他任务进行中,稍后再试", TRY_LATER: "其他任务进行中,稍后再试",
DF_ERROR: "df命令执行异常", DF_ERROR: "df命令执行异常",
VERSION_UPDATE_ERROR: "版本更新异常,请检查当前版本和更新版本", VERSION_UPDATE_ERROR: "版本更新异常,请检查当前版本和更新版本",
ERROR_EXIST_TAG: "已存在该标签名称", ERROR_EXIST_TAG: "已存在该标签名称",
ERROR_EXIST_TAG_FAIL: "获取已存在标签失败", ERROR_EXIST_TAG_FAIL: "获取已存在标签失败",
ERROR_NOT_EXIST_TAG: "该标签不存在", ERROR_NOT_EXIST_TAG: "该标签不存在",
......
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]
} }
\ No newline at end of file
...@@ -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,40 +62,42 @@ type Redis struct { ...@@ -63,40 +62,42 @@ 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 {
Path string Path string
Name string Name string
GitPath string GitPath string
Passwd string Passwd string
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
Path string Path string
Auto string Auto string
Start string Start string
StartUp string StartUp string
Scripts string Scripts string
DownloadUrl string DownloadUrl string
VersionUrl string VersionUrl string
FeedBackUrl string FeedBackUrl string
IsCompleteUrl string IsCompleteUrl string
FeedBackNosshUrl string FeedBackNosshUrl string
IsCompleteNosshUrl string IsCompleteNosshUrl string
RaspberryServer string RaspberryServer string
StopPai string StopPai string
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,48 +46,47 @@ func GetLocalIP() (ipv4 *net.IPNet, err error) { ...@@ -46,48 +46,47 @@ 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
} }
//两个以上空格替换成一个空格 //两个以上空格替换成一个空格
func DeleteExtraSpace(s string) string { func DeleteExtraSpace(s string) string {
//删除字符串中的多余空格,有多个空格时,仅保留一个空格 //删除字符串中的多余空格,有多个空格时,仅保留一个空格
s1 := strings.Replace(s, " ", " ", -1) //替换tab为空格 s1 := strings.Replace(s, " ", " ", -1) //替换tab为空格
regstr := "\\s{2,}" //两个及两个以上空格的正则表达式 regstr := "\\s{2,}" //两个及两个以上空格的正则表达式
reg, _ := regexp.Compile(regstr) //编译正则表达式 reg, _ := regexp.Compile(regstr) //编译正则表达式
s2 := make([]byte, len(s1)) //定义字符数组切片 s2 := make([]byte, len(s1)) //定义字符数组切片
...@@ -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,
})
}
This diff is collapsed.
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,12 +257,12 @@ func GetExternal(c *gin.Context) { ...@@ -258,12 +257,12 @@ 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
} }
app.ServerStatus.Disks = disks app.ServerStatus.Disks = disks
appG.Response(http.StatusOK, e.SUCCESS, app.ServerStatus) appG.Response(http.StatusOK, e.SUCCESS, app.ServerStatus)
} }
\ No newline at end of file
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"
) )
// InitRouter initialize routing information // InitRouter initialize routing information
func InitRouter() *gin.Engine { func InitRouter() *gin.Engine {
r := gin.New() r := gin.New()
r.Use(gin.Logger()) r.Use(gin.Logger())
r.Use(gin.Recovery()) r.Use(gin.Recovery())
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 (
pai_serial string pai_serial string
tlog = log.New("service", "pai_Service") tlog = log.New("service", "pai_Service")
) )
//在网络通畅的情况下 ENum 每30s +1 20=>restart 40 => rollback 60 =>recover //在网络通畅的情况下 ENum 每30s +1 20=>restart 40 => rollback 60 =>recover
type Pai struct { type Pai struct {
Hardware string `json:"hardware"` Hardware string `json:"hardware"`
Revision string `json:"revision"` Revision string `json:"revision"`
Serial string `json:"serial"` Serial string `json:"serial"`
//PeerList *types.PeerList //PeerList *types.PeerList
LocalLastHeight int64 `json:"local_last_height"` LocalLastHeight int64 `json:"local_last_height"`
LastHeight int64 `json:"last_height"` LastHeight int64 `json:"last_height"`
IsNtpSync bool `json:"is_ntp_sync"` IsNtpSync bool `json:"is_ntp_sync"`
WalletStatus *types.WalletStatus `json:"wallet_status"` WalletStatus *types.WalletStatus `json:"wallet_status"`
NetInfo *types.NodeNetInfo `json:"net_info"` NetInfo *types.NodeNetInfo `json:"net_info"`
BtyVersion *types.VersionInfo `json:"bty_version"` BtyVersion *types.VersionInfo `json:"bty_version"`
Err string `json:"err"` Err string `json:"err"`
Arch string `json:"arch"` Arch string `json:"arch"`
Disks []*pai.Disk Disks []*pai.Disk
IsBackup bool `json:"is_backup"` IsBackup bool `json:"is_backup"`
ENum int64 `json:"e_num"` ENum int64 `json:"e_num"`
LocalLastHeight2 int64 `json:"local_last_height_2"` LocalLastHeight2 int64 `json:"local_last_height_2"`
ProLevel int64 `json:"pro_level"` ProLevel int64 `json:"pro_level"`
Temp int64 `json:"temp"` Temp int64 `json:"temp"`
} }
type ReqUpdatePai struct { type ReqUpdatePai struct {
...@@ -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,33 +188,33 @@ func getPaiConfig(command string ,arg ...string) (config map[string]string,err e ...@@ -188,33 +188,33 @@ 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
Msg string Msg string
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,16 +245,16 @@ func (p *Pai) CheckBackup() error { ...@@ -245,16 +245,16 @@ 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
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment