Skip to content

Commit

Permalink
fix bug
Browse files Browse the repository at this point in the history
  • Loading branch information
Jrohy committed Apr 12, 2020
1 parent 3eb6a32 commit 0258b48
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 29 deletions.
30 changes: 11 additions & 19 deletions trojan/trojan.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,42 +92,34 @@ func Version() string {

// Log 实时打印trojan日志
func Log(line int) {
result, _ := LogChan("-n " + strconv.Itoa(line))
for line := range *result {
result, _ := LogChan("-n "+strconv.Itoa(line), make(chan byte))
for line := range result {
fmt.Println(line)
}
}

// LogChan trojan实时日志, 返回chan
func LogChan(param string) (*chan string, error) {
func LogChan(param string, closeChan chan byte) (chan string, error) {
cmd := exec.Command("bash", "-c", "journalctl -f -u trojan "+param)

stdout, _ := cmd.StdoutPipe()
stderr, _ := cmd.StderrPipe()

if err := cmd.Start(); err != nil {
fmt.Println("Error:The command is err: ", err.Error())
return nil, err
}
ch := make(chan string, 100)
stdoutScan := bufio.NewScanner(stdout)
stderrScan := bufio.NewScanner(stderr)
go func() {
for stdoutScan.Scan() {
line := stdoutScan.Text()
ch <- line
select {
case <-closeChan:
stdout.Close()
return
default:
ch <- stdoutScan.Text()
}
}
}()
go func() {
for stderrScan.Scan() {
line := stderrScan.Text()
ch <- line
}
}()
var err error
go func() {
err = cmd.Wait()
close(ch)
}()
return &ch, err
return ch, nil
}
15 changes: 7 additions & 8 deletions util/websocket.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type WsConnection struct {

mutex sync.Mutex // 避免重复关闭管道
isClosed bool
closeChan chan byte // 关闭通知
CloseChan chan byte // 关闭通知
}

// 读取协程
Expand All @@ -57,7 +57,7 @@ func (wsConn *WsConnection) wsReadLoop() {
if string(data) == "exit" {
goto CLOSED
}
case <-wsConn.closeChan:
case <-wsConn.CloseChan:
goto CLOSED
}
}
Expand All @@ -80,7 +80,7 @@ func (wsConn *WsConnection) wsWriteLoop() {
fmt.Println(err)
goto CLOSED
}
case <-wsConn.closeChan:
case <-wsConn.CloseChan:
goto CLOSED
}
}
Expand All @@ -101,7 +101,7 @@ func InitWebsocket(resp http.ResponseWriter, req *http.Request) (wsConn *WsConne
wsSocket: wsSocket,
inChan: make(chan *WsMessage, 1000),
outChan: make(chan *WsMessage, 1000),
closeChan: make(chan byte),
CloseChan: make(chan byte),
isClosed: false,
}

Expand All @@ -117,7 +117,7 @@ func InitWebsocket(resp http.ResponseWriter, req *http.Request) (wsConn *WsConne
func (wsConn *WsConnection) WsWrite(messageType int, data []byte) (err error) {
select {
case wsConn.outChan <- &WsMessage{messageType, data}:
case <-wsConn.closeChan:
case <-wsConn.CloseChan:
err = errors.New("websocket closed")
}
return
Expand All @@ -128,7 +128,7 @@ func (wsConn *WsConnection) WsRead() (msg *WsMessage, err error) {
select {
case msg = <-wsConn.inChan:
return
case <-wsConn.closeChan:
case <-wsConn.CloseChan:
err = errors.New("websocket closed")
}
return
Expand All @@ -137,11 +137,10 @@ func (wsConn *WsConnection) WsRead() (msg *WsMessage, err error) {
// WsClose 关闭连接
func (wsConn *WsConnection) WsClose() {
wsConn.wsSocket.Close()

wsConn.mutex.Lock()
defer wsConn.mutex.Unlock()
if !wsConn.isClosed {
wsConn.isClosed = true
close(wsConn.closeChan)
close(wsConn.CloseChan)
}
}
4 changes: 2 additions & 2 deletions web/controller/trojan.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,13 @@ func Log(c *gin.Context) {
} else {
param = "-n " + param
}
result, err := trojan.LogChan(param)
result, err := trojan.LogChan(param, wsConn.CloseChan)
if err != nil {
fmt.Println(err)
wsConn.WsClose()
return
}
for line := range *result {
for line := range result {
if err := wsConn.WsWrite(ws.TextMessage, []byte(line+"\n")); err != nil {
log.Println("can't send: ", line)
break
Expand Down

0 comments on commit 0258b48

Please sign in to comment.