Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
chain33-pai
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
szh
chain33-pai
Commits
bc010eaf
Commit
bc010eaf
authored
Aug 03, 2020
by
szh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
节点操作接口 改成消息机制 支持任务查询情况
parent
87b7d166
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
180 additions
and
107 deletions
+180
-107
init.go
pkg/app/init.go
+1
-0
raspberryChan.go
pkg/app/raspberryChan.go
+57
-20
code.go
pkg/e/code.go
+1
-0
util.go
pkg/util/util.go
+11
-0
node.go
routers/api/v1/node.go
+108
-87
router.go
routers/router.go
+2
-0
No files found.
pkg/app/init.go
View file @
bc010eaf
...
...
@@ -4,6 +4,7 @@ var JobChan chan MsgType
type
MsgType
struct
{
Name
string
JobID
int32
}
func
Setup
()
{
...
...
pkg/app/raspberryChan.go
View file @
bc010eaf
...
...
@@ -14,6 +14,8 @@ import (
var
(
btyPath
string
JobID
int32
JobDoneMap
map
[
int32
]
string
)
func
RaspberryChan
()
{
...
...
@@ -30,53 +32,62 @@ func RaspberryChan() {
switch
value
.
Name
{
case
"ROLLBACK"
:
err
:=
rollback
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan rollback success"
,
"err"
,
nil
)
}
else
{
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan rollback fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan rollback success"
,
"err"
,
nil
)
case
"BACKUP"
:
err
:=
backup
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan backup success"
,
"err"
,
nil
)
}
else
{
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan backup fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan backup success"
,
"err"
,
nil
)
case
"RECOVER"
:
err
:=
recoverNode
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan recover success"
,
"err"
,
nil
)
}
else
{
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan recover fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan recover success"
,
"err"
,
nil
)
case
"DELETEBACKUP"
:
err
:=
deleteBackup
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan deleteBackup success"
,
"err"
,
nil
)
}
else
{
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan deleteBackup fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan deleteBackup success"
,
"err"
,
nil
)
case
"RESTART"
:
err
:=
restartNode
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan deleteBackup success"
,
"err"
,
nil
)
}
else
{
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan deleteBackup fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan deleteBackup success"
,
"err"
,
nil
)
case
"RESET"
:
err
:=
resetNode
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan resetNode success"
,
"err"
,
nil
)
}
else
{
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan resetNode fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan resetNode success"
,
"err"
,
nil
)
case
"RESETWALLET"
:
err
:=
resetWallet
()
if
err
!=
nil
{
tlog
.
Error
(
"RaspberryChan resetWallet fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan resetWallet success"
,
"err"
,
nil
)
case
"CLOSE"
:
err
:=
closeNode
()
if
err
==
nil
{
tlog
.
Info
(
"RaspberryChan resetWallet success"
,
"err"
,
nil
)
}
else
{
tlog
.
Error
(
"RaspberryChan resetWallet fail "
,
"err"
,
err
)
}
updateJobMap
(
value
.
JobID
,
err
)
tlog
.
Info
(
"RaspberryChan resetWallet success"
,
"err"
,
nil
)
}
}
...
...
@@ -309,6 +320,32 @@ func resetWallet() error {
return
nil
}
func
closeNode
()
error
{
BityuanFlag
.
Lock
.
Lock
()
defer
BityuanFlag
.
Lock
.
Unlock
()
if
btyPath
==
""
{
tlog
.
Error
(
"btyPath empty"
,
"err"
,
"node not exists"
)
return
errors
.
New
(
"node not exists"
)
}
_
,
err
:=
SafeCloseNode
()
if
err
!=
nil
{
return
err
}
isrun
:=
MakeSureBtyIsNotRun
()
if
isrun
{
return
errors
.
New
(
"bty is running"
)
}
return
nil
}
func
updateJobMap
(
id
int32
,
err
error
)
{
if
_
,
exists
:=
JobDoneMap
[
id
];
!
exists
{
JobDoneMap
[
id
]
=
err
.
Error
()
return
}
tlog
.
Error
(
"updateJobMap error"
,
"jobid"
,
id
)
}
func
MakeSureBtyIsNotRun
()
bool
{
s
:=
time
.
Now
()
defer
func
()
{
...
...
pkg/e/code.go
View file @
bc010eaf
...
...
@@ -5,6 +5,7 @@ const (
ERROR
=
500
INVALID_PARAMS
=
400
JOB_NOT_DONE
=
300
NETWORK_ERROR
=
5004
NODE_ERROR
=
5000
SUCCESS_RUNNING
=
5002
...
...
pkg/util/util.go
View file @
bc010eaf
...
...
@@ -8,6 +8,7 @@ import (
"net/http"
"regexp"
"strings"
"sync/atomic"
)
// Setup Initialize the util
...
...
@@ -128,3 +129,12 @@ func VersionCompare(version string) string {
}
return
string
(
vo
)
}
func
AddValue
(
addr
*
int32
,
delta
int32
){
for
{
v
:=
atomic
.
LoadInt32
(
addr
)
if
atomic
.
CompareAndSwapInt32
(
&
v
,
*
addr
,(
delta
+
v
)){
break
;
}
}
}
\ No newline at end of file
routers/api/v1/node.go
View file @
bc010eaf
...
...
@@ -17,15 +17,16 @@ import (
"os"
"os/exec"
"reflect"
"strconv"
"strings"
"time"
"chain33-pai/pkg/util"
)
func
ResetWallet
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RESETWALLET"
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"bityuan wallet reset"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RESETWALLET"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
}
//钱包更新,只替换执行文件和配置文件
...
...
@@ -154,8 +155,9 @@ func UpdateNodeNew(c *gin.Context) {
//重置节点只需要删除datadir 然后重启节点
func
ResetNode
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RESET"
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"bityuan reset"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RESET"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
}
func
UpdateDetail
(
c
*
gin
.
Context
)
{
...
...
@@ -198,34 +200,16 @@ func NodeInfo(c *gin.Context) {
func
RestartNode
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
app
.
BityuanFlag
.
Flag
=
true
_
,
err
:=
app
.
SafeCloseNode
()
if
err
!=
nil
{
appG
.
Response
(
http
.
StatusOK
,
e
.
NODE_ERROR
,
"node err"
)
app
.
BityuanFlag
.
Flag
=
false
return
}
app
.
BityuanFlag
.
Flag
=
false
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"node close safe"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RESTART"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
}
func
CloseNode
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
app
.
BityuanFlag
.
Flag
=
true
_
,
err
:=
app
.
SafeCloseNode
()
if
err
!=
nil
{
appG
.
Response
(
http
.
StatusOK
,
e
.
NODE_ERROR
,
"node err"
)
app
.
BityuanFlag
.
Flag
=
false
return
}
//防止其他模块未关闭
//time.Sleep(time.Second * 2)
if
!
app
.
MakeSureBtyIsNotRun
()
{
appG
.
Response
(
http
.
StatusOK
,
e
.
NODE_ERROR
,
"node stop err"
)
app
.
BityuanFlag
.
Flag
=
false
return
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"node close safe"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"CLOSE"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
}
//反馈信息
...
...
@@ -505,35 +489,40 @@ func Test(c *gin.Context) {
func
Rollback
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"ROLLBACK"
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"bityuan rollback"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"ROLLBACK"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
}
func
NodeBackup
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
var
pai
pai_service
.
Pai
err
:=
pai
.
GetDiskUseage
()
if
err
!=
nil
{
tlog
.
Error
(
"GetDiskUseage"
,
"err"
,
err
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"get diskuseage err"
)
return
}
if
len
(
pai
.
Disks
)
==
0
{
tlog
.
Error
(
"disk "
,
"err"
,
"disk not find"
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"disk not find"
)
return
}
tlog
.
Info
(
"disk info"
,
"ssd"
,
pai
.
Disks
[
0
])
p
:=
pai
.
Disks
[
0
]
.
Use
ps
:=
strings
.
Split
(
p
,
"%"
)
pint
,
_
:=
strconv
.
Atoi
(
ps
[
0
])
if
pint
*
2
>
80
{
tlog
.
Error
(
"disk space "
,
"err"
,
"space not enough to backup"
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"disk space not enough"
)
return
}
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"BACKUP"
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"bityuan ready to backup"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"BACKUP"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
//appG := app.Gin{C: c}
//var pai pai_service.Pai
//err := pai.GetDiskUseage()
//if err != nil {
// tlog.Error("GetDiskUseage", "err", err)
// appG.Response(http.StatusOK, e.ENV_ERROR, "get diskuseage err")
// return
//}
//if len(pai.Disks) == 0 {
// tlog.Error("disk ", "err", "disk not find")
// appG.Response(http.StatusOK, e.ENV_ERROR, "disk not find")
// return
//}
//tlog.Info("disk info", "ssd", pai.Disks[0])
//p := pai.Disks[0].Use
//ps := strings.Split(p, "%")
//pint, _ := strconv.Atoi(ps[0])
//if pint*2 > 80 {
// tlog.Error("disk space ", "err", "space not enough to backup")
// appG.Response(http.StatusOK, e.ENV_ERROR, "disk space not enough")
// return
//}
//app.JobChan <- app.MsgType{Name: "BACKUP"}
//appG.Response(http.StatusOK, e.SUCCESS, "bityuan ready to backup")
}
func
CheckBackup
(
c
*
gin
.
Context
)
{
...
...
@@ -553,45 +542,76 @@ func CheckBackup(c *gin.Context) {
func
NodeRecover
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
var
pai
pai_service
.
Pai
err
:=
pai
.
GetDiskUseage
()
if
err
!=
nil
{
tlog
.
Error
(
"GetDiskUseage"
,
"err"
,
err
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"get diskuseage err"
)
return
}
if
len
(
pai
.
Disks
)
==
0
{
tlog
.
Error
(
"disk "
,
"err"
,
"disk not find"
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"disk not find"
)
return
}
tlog
.
Info
(
"disk info"
,
"ssd"
,
pai
.
Disks
[
0
])
p
:=
pai
.
Disks
[
0
]
.
Use
ps
:=
strings
.
Split
(
p
,
"%"
)
pint
,
_
:=
strconv
.
Atoi
(
ps
[
0
])
if
pint
>
90
{
tlog
.
Error
(
"disk "
,
"err"
,
"disk space not enough"
)
//app.JobChan <- app.MsgType{Name:"DELETEBACKUP"}
}
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RECOVER"
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
"bityuan ready to recover"
)
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"RECOVER"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
//appG := app.Gin{C: c}
//var pai pai_service.Pai
//err := pai.GetDiskUseage()
//if err != nil {
// tlog.Error("GetDiskUseage", "err", err)
// appG.Response(http.StatusOK, e.ENV_ERROR, "get diskuseage err")
// return
//}
//if len(pai.Disks) == 0 {
// tlog.Error("disk ", "err", "disk not find")
// appG.Response(http.StatusOK, e.ENV_ERROR, "disk not find")
// return
//}
//tlog.Info("disk info", "ssd", pai.Disks[0])
//p := pai.Disks[0].Use
//ps := strings.Split(p, "%")
//pint, _ := strconv.Atoi(ps[0])
//if pint > 90 {
// tlog.Error("disk ", "err", "disk space not enough")
// //app.JobChan <- app.MsgType{Name:"DELETEBACKUP"}
//}
//app.JobChan <- app.MsgType{Name: "RECOVER"}
//appG.Response(http.StatusOK, e.SUCCESS, "bityuan ready to recover")
}
func
DelBackup
(
c
*
gin
.
Context
)
{
appG
:=
app
.
Gin
{
C
:
c
}
var
pai
pai_service
.
Pai
err
:=
pai
.
GetDiskUseage
()
util
.
AddValue
(
&
app
.
JobID
,
1
)
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"DELETEBACKUP"
,
JobID
:
app
.
JobID
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobID
)
//appG := app.Gin{C: c}
//var pai pai_service.Pai
//err := pai.GetDiskUseage()
//if err != nil {
// tlog.Error("GetDiskUseage", "err", err)
// appG.Response(http.StatusOK, e.ENV_ERROR, "get diskuseage err")
// return
//}
//if len(pai.Disks) == 0 {
// tlog.Error("disk ", "err", "disk not find")
// appG.Response(http.StatusOK, e.ENV_ERROR, "disk not find")
// return
//}
//tlog.Info("disk info", "ssd", pai.Disks[0])
//app.JobChan <- app.MsgType{Name: "DELETEBACKUP"}
//appG.Response(http.StatusOK, e.ENV_ERROR, "del backup")
}
func
JobStatus
(
c
*
gin
.
Context
)
{
type
JReq
struct
{
JobID
int32
`json:"job_id" binding:"required"`
}
var
req
JReq
appG
:=
app
.
Gin
{
C
:
c
}
err
:=
appG
.
C
.
ShouldBindJSON
(
&
req
)
if
err
!=
nil
{
tlog
.
Error
(
"GetDiskUseage"
,
"err"
,
err
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"get diskuseage err
"
)
appG
.
Response
(
http
.
StatusOK
,
e
.
INVALID_PARAMS
,
nil
)
tlog
.
Info
(
"invalid params
"
)
return
}
if
len
(
pai
.
Disks
)
==
0
{
tlog
.
Error
(
"disk "
,
"err"
,
"disk not find"
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"disk not find"
)
if
_
,
exists
:=
app
.
JobDoneMap
[
req
.
JobID
];
exists
{
if
app
.
JobDoneMap
[
req
.
JobID
]
!=
""
{
appG
.
Response
(
http
.
StatusOK
,
e
.
ERROR
,
app
.
JobDoneMap
[
req
.
JobID
])
return
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
app
.
JobDoneMap
[
req
.
JobID
])
return
}
tlog
.
Info
(
"disk info"
,
"ssd"
,
pai
.
Disks
[
0
])
app
.
JobChan
<-
app
.
MsgType
{
Name
:
"DELETEBACKUP"
}
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
"del backup"
)
}
appG
.
Response
(
http
.
StatusOK
,
e
.
JOB_NOT_DONE
,
nil
)
}
\ No newline at end of file
routers/router.go
View file @
bc010eaf
...
...
@@ -67,6 +67,8 @@ func InitRouter() *gin.Engine {
apiv1
.
POST
(
"/delbackup"
,
v1
.
DelBackup
)
//是否备份
apiv1
.
POST
(
"/isbackup"
,
v1
.
CheckBackup
)
//获取任务完成情况
apiv1
.
POST
(
"/jobstatus"
,
v1
.
JobStatus
)
return
r
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment