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
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
363 additions
and
439 deletions
+363
-439
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
+0
-0
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
+0
-0
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
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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