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
533c92b4
Commit
533c92b4
authored
Jun 01, 2020
by
szh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加备份相关接口
parent
51cba7e4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
298 additions
and
72 deletions
+298
-72
main.go
main.go
+1
-1
init.go
pkg/app/init.go
+6
-2
process.go
pkg/app/process.go
+27
-18
raspberryChan.go
pkg/app/raspberryChan.go
+123
-15
node.go
routers/api/v1/node.go
+119
-36
router.go
routers/router.go
+7
-0
pai.go
service/pai_service/pai.go
+15
-0
No files found.
main.go
View file @
533c92b4
...
...
@@ -44,7 +44,7 @@ func main() {
//树莓派内置程序操作
go
app
.
PaiJob
(
time
.
NewTicker
(
time
.
Second
*
50
))
//go app.ClearLog(time.NewTicker(time.Hour*1))
go
app
.
R
ollbackJob
()
go
app
.
R
aspberryChan
()
//上传统计树莓派信息
go
app
.
UploadInfo
(
time
.
NewTicker
(
time
.
Minute
*
10
))
...
...
pkg/app/init.go
View file @
533c92b4
package
app
var
RollChan
chan
bool
var
JobChan
chan
MsgType
type
MsgType
struct
{
Name
string
}
func
Setup
()
{
RollChan
=
make
(
chan
bool
,
1
)
JobChan
=
make
(
chan
MsgType
,
10
)
}
pkg/app/process.go
View file @
533c92b4
...
...
@@ -24,6 +24,7 @@ import (
"chain33-pai/pkg/chain33"
types2
"github.com/33cn/plugin/plugin/dapp/ticket/types"
"strconv"
"sync"
)
var
tlog
=
log
.
New
(
"pkg"
,
"app"
)
...
...
@@ -60,7 +61,12 @@ type BTYDownloadInfo struct {
Version
string
}
var
BityuanFlag
bool
//true表示有任务在占用,禁止其他重复操作 重置钱包 重置节点 升级节点 不能并发执行
type
BityuanOp
struct
{
Flag
bool
Lock
sync
.
Mutex
}
var
BityuanFlag
BityuanOp
//true表示有任务在占用,禁止其他重复操作
var
Bityuan
ProcessInfo
var
UpdateInfo
updateInfo
var
NodeError
error
...
...
@@ -145,7 +151,8 @@ func BityuanJob(ticker *time.Ticker){
for
{
select
{
case
<-
ticker
.
C
:
if
!
BityuanFlag
{
//有更新,重置等节点重启操作时 禁止运行,防止冲突
BityuanFlag
.
Lock
.
Lock
()
if
!
BityuanFlag
.
Flag
{
//有更新,重置等节点重启操作时 禁止运行,防止冲突
//节点未启动 会调用auto启动
NodeError
=
getWalletInfo
()
//解锁钱包
...
...
@@ -173,6 +180,7 @@ func BityuanJob(ticker *time.Ticker){
//升级6.4.0bityuan
//updateBityuan640()
}
BityuanFlag
.
Lock
.
Unlock
()
}
}
}
...
...
@@ -412,7 +420,7 @@ func SafeCloseNode() (bool,error) {
//return true,nil
path
:=
GetAbsPath
(
setting
.
BityuanSetting
.
Name
)
if
path
==
""
{
return
tru
e
,
nil
return
fals
e
,
nil
}
close
:=
exec
.
Command
(
path
+
"/"
+
setting
.
BityuanSetting
.
Name
+
"-cli"
,
"close"
)
stderr
:=
bytes
.
NewBuffer
(
nil
)
...
...
@@ -782,32 +790,33 @@ func uploadVersion() error {
//update bityuan 6.3.x to 6.4.0
func
updateBityuan640
()
error
{
BityuanFlag
=
true
BityuanFlag
.
Lock
.
Lock
()
defer
BityuanFlag
.
Lock
.
Unlock
()
BityuanFlag
.
Flag
=
true
//2020/4/2 20:0:0
plantime
:=
int64
(
1585828800
)
nowtime
:=
time
.
Now
()
.
Unix
()
if
nowtime
<
plantime
{
tlog
.
Error
(
"waiting plantime to update"
,
"nowtime"
,
nowtime
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
errors
.
New
(
"waiting plantime to update"
)
}
update
:=
GetNodeUpdateStatus
()
if
update
{
tlog
.
Info
(
"updateBityuan640 is updating"
,
"update"
,
update
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
nil
}
var
pai
chain33
.
PaiClient
v
,
err
:=
pai
.
Version
()
if
err
!=
nil
{
tlog
.
Error
(
"get version "
,
"err"
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
if
strings
.
Contains
(
v
.
App
,
"6.4.2"
)
{
tlog
.
Info
(
"bityuan do not need update"
,
"version"
,
v
.
App
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
nil
}
...
...
@@ -820,13 +829,13 @@ func updateBityuan640() error {
err
=
DownLoadFile
(
url
,
name
,
int32
(
1
))
if
err
!=
nil
{
tlog
.
Error
(
"updateBityuan640"
,
"err"
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
dirs
:=
strings
.
Split
(
absPath
,
"wallet-bty"
)
if
len
(
dirs
)
!=
2
{
tlog
.
Error
(
"updateBityuan640"
,
"err"
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
//解压缩文件
...
...
@@ -835,19 +844,19 @@ func updateBityuan640() error {
err
=
tar
.
Start
()
if
err
!=
nil
{
tlog
.
Error
(
"tar"
,
"err"
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
err
=
tar
.
Wait
()
if
err
!=
nil
{
tlog
.
Error
(
"tar"
,
"err"
,
stderr
.
String
())
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
t
,
err
:=
SafeCloseNode
()
if
err
!=
nil
||
!
t
{
tlog
.
Error
(
"updateBityuan640 close node"
,
"err"
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
//其他模块可能没有即时关闭,在高速刷盘的情形下
...
...
@@ -857,23 +866,23 @@ func updateBityuan640() error {
err
=
remove
.
Start
()
if
err
!=
nil
{
tlog
.
Error
(
"rm"
,
"err"
,
stderr
.
String
())
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
err
=
remove
.
Wait
()
if
err
!=
nil
{
tlog
.
Error
(
"rm"
,
"err"
,
stderr
.
String
())
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
err
=
StartProcess
(
setting
.
Chain33Pai
.
Auto
)
if
err
!=
nil
{
tlog
.
Error
(
"updateBityuan640"
,
"auto.sh error "
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
tlog
.
Info
(
"updateBityuan640 success please waiting hours"
,
"version"
,
"6.3.2->6.4.2"
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
nil
}
func
GetNodeUpdateStatus
()
bool
{
...
...
pkg/app/r
ollback
.go
→
pkg/app/r
aspberryChan
.go
View file @
533c92b4
...
...
@@ -7,21 +7,49 @@ import (
"os/exec"
"fmt"
"chain33-pai/service/pai_service"
"errors"
"os"
)
func
R
ollbackJob
()
{
func
R
aspberryChan
()
{
for
{
if
value
,
ok
:=
<-
RollChan
;
ok
{
if
!
value
{
if
value
,
ok
:=
<-
JobChan
;
ok
{
tlog
.
Info
(
"raspberrychan"
,
"msg"
,
value
)
if
value
.
Name
==
""
{
continue
}
err
:=
rollback
()
if
err
==
nil
{
tlog
.
Info
(
"rollback success"
,
"err"
,
nil
)
}
else
{
tlog
.
Error
(
"rollback fail "
,
"err"
,
err
)
switch
value
.
Name
{
case
"ROLLBACK"
:
err
:=
rollback
()
if
err
==
nil
{
tlog
.
Info
(
"rollback success"
,
"err"
,
nil
)
}
else
{
tlog
.
Error
(
"rollback fail "
,
"err"
,
err
)
}
case
"BACKUP"
:
err
:=
backup
()
if
err
==
nil
{
tlog
.
Info
(
"backup success"
,
"err"
,
nil
)
}
else
{
tlog
.
Error
(
"backup fail "
,
"err"
,
err
)
}
case
"RECOVER"
:
err
:=
recoverNode
()
if
err
==
nil
{
tlog
.
Info
(
"recover success"
,
"err"
,
nil
)
}
else
{
tlog
.
Error
(
"recover fail "
,
"err"
,
err
)
}
case
"DELETEBACKUP"
:
err
:=
deleteBackup
()
if
err
==
nil
{
tlog
.
Info
(
"deleteBackup success"
,
"err"
,
nil
)
}
else
{
tlog
.
Error
(
"deleteBackup fail "
,
"err"
,
err
)
}
}
}
time
.
Sleep
(
time
.
Second
*
1
)
}
...
...
@@ -29,22 +57,24 @@ func RollbackJob() {
func
rollback
()
error
{
BityuanFlag
=
true
BityuanFlag
.
Lock
.
Lock
()
defer
BityuanFlag
.
Lock
.
Unlock
()
BityuanFlag
.
Flag
=
true
_
,
err
:=
SafeCloseNode
()
if
err
!=
nil
{
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
var
pai
pai_service
.
Pai
err
=
pai
.
SetPai
()
if
err
!=
nil
{
tlog
.
Error
(
"SetPai"
,
"err"
,
err
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
if
pai
.
LocalLastHeight
==
0
{
tlog
.
Error
(
"LocalLastHeight"
,
"height"
,
pai
.
LocalLastHeight
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
rollheight
:=
pai
.
LocalLastHeight
-
1000
...
...
@@ -57,17 +87,94 @@ func rollback() error {
path
:=
GetAbsPath
(
setting
.
BityuanSetting
.
Name
)
if
path
==
""
{
tlog
.
Error
(
"GetAbsPath"
,
"err"
,
"path not exists"
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
cmd
:=
exec
.
Command
(
path
+
"/"
+
setting
.
BityuanSetting
.
Name
,
"-rollback"
,
fmt
.
Sprintf
(
"%d"
,
rollheight
))
cmd
.
Stdout
=
&
buf
err
=
cmd
.
Run
()
if
err
!=
nil
{
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
err
}
tlog
.
Info
(
"rollback end"
,
"height"
,
pai
.
LocalLastHeight
,
"rollbackheight"
,
rollheight
)
BityuanFlag
=
false
BityuanFlag
.
Flag
=
false
return
nil
}
func
backup
()
error
{
BityuanFlag
.
Lock
.
Lock
()
defer
BityuanFlag
.
Lock
.
Unlock
()
if
BityuanFlag
.
Flag
{
return
errors
.
New
(
"env err"
)
}
BityuanFlag
.
Flag
=
true
ok
,
err
:=
SafeCloseNode
()
if
err
!=
nil
{
BityuanFlag
.
Flag
=
false
return
err
}
if
!
ok
{
BityuanFlag
.
Flag
=
false
return
errors
.
New
(
"env err"
)
}
time
.
Sleep
(
time
.
Second
*
2
)
return
SafeBackup
()
}
func
SafeBackup
()
error
{
backup
:=
exec
.
Command
(
"cp"
,
"-r"
,
"datadir"
,
"datadir_backup"
)
return
backup
.
Run
()
}
func
recoverNode
()
error
{
BityuanFlag
.
Lock
.
Lock
()
defer
BityuanFlag
.
Lock
.
Unlock
()
remove
:=
exec
.
Command
(
"rm"
,
"-rf"
,
"datadir"
)
err
:=
remove
.
Run
()
if
err
!=
nil
{
tlog
.
Error
(
"rm -rf datadir"
,
"err"
,
err
)
return
err
}
path
:=
GetAbsPath
(
setting
.
BityuanSetting
.
Name
)
if
path
==
""
{
tlog
.
Error
(
"path empty"
,
"err"
,
"node not exists"
)
return
errors
.
New
(
"node not exists"
)
}
backupPath
:=
path
+
"/datadir_backup"
if
_
,
err
:=
os
.
Stat
(
backupPath
);
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
tlog
.
Error
(
"backup file not exists"
,
"err"
,
backupPath
)
return
errors
.
New
(
"backup file not exists"
)
}
}
recover
:=
exec
.
Command
(
"cp"
,
"-r"
,
"datadir_backup"
,
"datadir"
)
err
=
recover
.
Run
()
if
err
!=
nil
{
tlog
.
Error
(
"cp -r datadir_backup datadir"
,
"err"
,
err
)
return
err
}
return
nil
}
func
deleteBackup
()
error
{
path
:=
GetAbsPath
(
setting
.
BityuanSetting
.
Name
)
if
path
==
""
{
tlog
.
Error
(
"path empty"
,
"err"
,
"node not exists"
)
return
errors
.
New
(
"node not exists"
)
}
backupPath
:=
path
+
"/datadir_backup"
if
_
,
err
:=
os
.
Stat
(
backupPath
);
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
tlog
.
Error
(
"backup file not exists"
,
"err"
,
backupPath
)
return
errors
.
New
(
"backup file not exists"
)
}
}
remove
:=
exec
.
Command
(
"rm"
,
"-rf"
,
"datadir_backup"
)
err
:=
remove
.
Run
()
if
err
!=
nil
{
tlog
.
Error
(
"rm -rf datadir_backup"
,
"err"
,
err
)
return
err
}
return
nil
}
\ No newline at end of file
routers/api/v1/node.go
View file @
533c92b4
This diff is collapsed.
Click to expand it.
routers/router.go
View file @
533c92b4
...
...
@@ -57,7 +57,14 @@ func InitRouter() *gin.Engine {
apiv1
.
POST
(
"/poweroff"
,
v1
.
PoweroffPai
)
//test
apiv1
.
POST
(
"/test"
,
v1
.
Test
)
//回滚1000区块
apiv1
.
POST
(
"/rollback"
,
v1
.
Rollback
)
//一键备份 40g
apiv1
.
POST
(
"/nodebackup"
,
v1
.
NodeBackup
)
//一键恢复 针对不同步 并且 回滚多次还不同步的情况下拿最近的备份恢复
apiv1
.
POST
(
"/noderecover"
,
v1
.
NodeRecover
)
//删除备份
apiv1
.
POST
(
"/delbackup"
,
v1
.
DelBackup
)
return
r
}
...
...
service/pai_service/pai.go
View file @
533c92b4
...
...
@@ -13,6 +13,7 @@ import (
"io/ioutil"
"encoding/json"
"chain33-pai/pkg/setting"
"chain33-pai/pkg/app"
)
var
(
...
...
@@ -33,6 +34,7 @@ type Pai struct {
BtyVersion
*
types
.
VersionInfo
`json:"bty_version"`
Err
string
`json:"err"`
Arch
string
`json:"arch"`
Disks
[]
*
app
.
Disk
}
type
ReqUpdatePai
struct
{
...
...
@@ -45,6 +47,7 @@ func (p *Pai) SetPai() error {
p
.
GetDevstatus
()
p
.
GetBtyVersion
()
p
.
SetPaiEnv
()
p
.
GetDiskUseage
()
return
nil
}
...
...
@@ -196,4 +199,15 @@ func (p *Pai) GetPaiLatestVersion(t int32) (string,error) {
return
""
,
err
}
return
r
.
Data
,
nil
}
func
(
p
*
Pai
)
GetDiskUseage
()
error
{
err
:=
app
.
MonitorServer
()
if
err
!=
nil
{
return
err
}
if
len
(
app
.
ServerStatus
.
Disks
)
>
0
{
p
.
Disks
=
app
.
ServerStatus
.
Disks
}
return
nil
}
\ No newline at end of file
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