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
7884dc8b
Commit
7884dc8b
authored
Jul 08, 2020
by
root
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fmt
parent
3fb8e362
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
867 additions
and
946 deletions
+867
-946
main.go
main.go
+4
-5
broadcast.go
pkg/app/broadcast.go
+20
-20
init.go
pkg/app/init.go
+1
-1
process.go
pkg/app/process.go
+211
-215
raspberryChan.go
pkg/app/raspberryChan.go
+59
-62
version.go
pkg/app/version.go
+1
-1
client.go
pkg/chain33/client.go
+20
-22
code.go
pkg/e/code.go
+15
-15
msg.go
pkg/e/msg.go
+8
-8
log.go
pkg/logging/log.go
+1
-1
pai.go
pkg/pai/pai.go
+26
-28
types.go
pkg/pai/types.go
+3
-3
setting.go
pkg/setting/setting.go
+45
-44
pagination.go
pkg/util/pagination.go
+1
-1
util.go
pkg/util/util.go
+20
-22
auth.go
routers/api/auth.go
+0
-64
node.go
routers/api/v1/node.go
+293
-292
pai.go
routers/api/v1/pai.go
+45
-47
router.go
routers/router.go
+33
-33
pai.go
service/pai_service/pai.go
+61
-62
No files found.
main.go
View file @
7884dc8b
...
@@ -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
...
...
pkg/app/broadcast.go
View file @
7884dc8b
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
)
}
}
...
...
pkg/app/init.go
View file @
7884dc8b
...
@@ -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
)
}
}
pkg/app/process.go
View file @
7884dc8b
...
@@ -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"`
...
@@ -35,21 +35,20 @@ type ProcessInfo struct {
...
@@ -35,21 +35,20 @@ type ProcessInfo struct {
}
}
type
updateInfo
struct
{
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
{
IsDownload
bool
IsDownload
bool
Version
string
Version
string
}
}
type
BityuanOp
struct
{
type
BityuanOp
struct
{
...
@@ -60,16 +59,16 @@ type BityuanOp struct {
...
@@ -60,16 +59,16 @@ type BityuanOp struct {
var
paiJobs
pai_service
.
Pai
var
paiJobs
pai_service
.
Pai
var
BityuanFlag
BityuanOp
//true表示有任务在占用,禁止其他重复操作
var
BityuanFlag
BityuanOp
//true表示有任务在占用,禁止其他重复操作
var
Bityuan
ProcessInfo
var
Bityuan
ProcessInfo
var
UpdateInfo
updateInfo
var
UpdateInfo
updateInfo
var
NodeError
error
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
...
@@ -87,50 +86,49 @@ func getProcessInfo(keyfile string)string{
...
@@ -87,50 +86,49 @@ func getProcessInfo(keyfile string)string{
head
.
Stdout
=
&
buffer_res
head
.
Stdout
=
&
buffer_res
head
.
Start
()
head
.
Start
()
head
.
Wait
()
head
.
Wait
()
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
...
@@ -203,16 +201,16 @@ func StartProcess(scriptsAddr string)(err error){
...
@@ -203,16 +201,16 @@ func StartProcess(scriptsAddr string)(err error){
var
DPercent
DownloadPercent
var
DPercent
DownloadPercent
type
DownloadPercent
struct
{
type
DownloadPercent
struct
{
Total
int64
Total
int64
Current
int64
Current
int64
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,77 +375,76 @@ func MVScripts(src,dst string){//Absolute Path
...
@@ -377,77 +375,76 @@ 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
,
XXX_NoUnkeyedLiteral
:
struct
{}{},
XXX_NoUnkeyedLiteral
:
struct
{}{},
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
()
}
}
...
@@ -464,61 +461,61 @@ func PaiJob(tick *time.Ticker) {
...
@@ -464,61 +461,61 @@ func PaiJob(tick *time.Ticker) {
}
}
type
PaiProcessInfo
struct
{
type
PaiProcessInfo
struct
{
Pid
int32
Pid
int32
Stime
int64
Stime
int64
Cmd
string
Cmd
string
}
}
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
}
}
pkg/app/raspberryChan.go
View file @
7884dc8b
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
pkg/app/version.go
View file @
7884dc8b
...
@@ -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
}
}
pkg/chain33/client.go
View file @
7884dc8b
...
@@ -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
{})
}
}
pkg/e/code.go
View file @
7884dc8b
...
@@ -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
...
...
pkg/e/msg.go
View file @
7884dc8b
...
@@ -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
:
"该标签不存在"
,
...
...
pkg/logging/log.go
View file @
7884dc8b
package
logging
package
logging
import
(
import
(
"fmt"
"chain33-pai/pkg/file"
"chain33-pai/pkg/file"
"fmt"
"log"
"log"
"os"
"os"
"path/filepath"
"path/filepath"
...
...
pkg/pai/pai.go
View file @
7884dc8b
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
pkg/pai/types.go
View file @
7884dc8b
...
@@ -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"`
}
}
pkg/setting/setting.go
View file @
7884dc8b
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
...
...
pkg/util/pagination.go
View file @
7884dc8b
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"
)
)
...
...
pkg/util/util.go
View file @
7884dc8b
...
@@ -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
)
}
}
routers/api/auth.go
deleted
100644 → 0
View file @
3fb8e362
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
,
})
}
routers/api/v1/node.go
View file @
7884dc8b
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
)
return
}
if
results
[
"code"
]
==
"200"
{
setting
.
ReverseTunnelPort
=
results
[
"port"
]
//log.Println(results)
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())
err
=
ssh
.
Run
()
if
err
!=
nil
{
log
.
Println
(
err
)
log
.
Println
(
err
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
nil
)
return
return
}
}
if
results
[
"code"
]
==
"200"
{
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
nil
)
setting
.
ReverseTunnelPort
=
results
[
"port"
]
return
//log.Println(results)
}
ssh
:=
exec
.
Command
(
fmt
.
Sprintf
(
"%s%sautosshdaemon.sh"
,
setting
.
Chain33Pai
.
Path
,
setting
.
Chain33Pai
.
Scripts
),
results
[
"daemon"
],
results
[
"port"
],
setting
.
Chain33Pai
.
RaspberryServer
)
appG
.
Response
(
http
.
StatusOK
,
e
.
NETWORK_ERROR
,
nil
)
//log.Println(ssh.String())
err
=
ssh
.
Run
()
if
err
!=
nil
{
log
.
Println
(
err
)
appG
.
Response
(
http
.
StatusOK
,
e
.
ENV_ERROR
,
nil
)
return
}
appG
.
Response
(
http
.
StatusOK
,
e
.
SUCCESS
,
nil
)
return
}
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,60 +484,61 @@ func EscrowPasswd(c *gin.Context){
...
@@ -483,60 +484,61 @@ 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
}
}
var
buf
bytes
.
Buffer
var
buf
bytes
.
Buffer
...
@@ -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"
)
}
}
\ No newline at end of file
routers/api/v1/pai.go
View file @
7884dc8b
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
routers/router.go
View file @
7884dc8b
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
}
}
...
...
service/pai_service/pai.go
View file @
7884dc8b
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
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