|
@@ -1,7 +1,6 @@
|
|
|
package xray
|
|
|
|
|
|
import (
|
|
|
- "bufio"
|
|
|
"bytes"
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
@@ -10,16 +9,12 @@ import (
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
"runtime"
|
|
|
- "strings"
|
|
|
- "sync"
|
|
|
"syscall"
|
|
|
"time"
|
|
|
|
|
|
"x-ui/config"
|
|
|
"x-ui/logger"
|
|
|
"x-ui/util/common"
|
|
|
-
|
|
|
- "github.com/Workiva/go-datastructures/queue"
|
|
|
)
|
|
|
|
|
|
func GetBinaryName() string {
|
|
@@ -101,7 +96,7 @@ type process struct {
|
|
|
onlineClients []string
|
|
|
|
|
|
config *Config
|
|
|
- lines *queue.Queue
|
|
|
+ logWriter *LogWriter
|
|
|
exitErr error
|
|
|
startTime time.Time
|
|
|
}
|
|
@@ -110,7 +105,7 @@ func newProcess(config *Config) *process {
|
|
|
return &process{
|
|
|
version: "Unknown",
|
|
|
config: config,
|
|
|
- lines: queue.New(100),
|
|
|
+ logWriter: NewLogWriter(),
|
|
|
startTime: time.Now(),
|
|
|
}
|
|
|
}
|
|
@@ -130,17 +125,10 @@ func (p *process) GetErr() error {
|
|
|
}
|
|
|
|
|
|
func (p *process) GetResult() string {
|
|
|
- if p.lines.Empty() && p.exitErr != nil {
|
|
|
+ if len(p.logWriter.lastLine) == 0 && p.exitErr != nil {
|
|
|
return p.exitErr.Error()
|
|
|
}
|
|
|
- items, _ := p.lines.TakeUntil(func(item interface{}) bool {
|
|
|
- return true
|
|
|
- })
|
|
|
- lines := make([]string, 0, len(items))
|
|
|
- for _, item := range items {
|
|
|
- lines = append(lines, item.(string))
|
|
|
- }
|
|
|
- return strings.Join(lines, "\n")
|
|
|
+ return p.logWriter.lastLine
|
|
|
}
|
|
|
|
|
|
func (p *process) GetVersion() string {
|
|
@@ -215,54 +203,14 @@ func (p *process) Start() (err error) {
|
|
|
cmd := exec.Command(GetBinaryPath(), "-c", configPath)
|
|
|
p.cmd = cmd
|
|
|
|
|
|
- stdReader, err := cmd.StdoutPipe()
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- errReader, err := cmd.StderrPipe()
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- var wg sync.WaitGroup
|
|
|
- wg.Add(2)
|
|
|
-
|
|
|
- go func() {
|
|
|
- defer wg.Done()
|
|
|
- reader := bufio.NewReaderSize(stdReader, 8192)
|
|
|
- for {
|
|
|
- line, _, err := reader.ReadLine()
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- if p.lines.Len() >= 100 {
|
|
|
- p.lines.Get(1)
|
|
|
- }
|
|
|
- p.lines.Put(string(line))
|
|
|
- }
|
|
|
- }()
|
|
|
-
|
|
|
- go func() {
|
|
|
- defer wg.Done()
|
|
|
- reader := bufio.NewReaderSize(errReader, 8192)
|
|
|
- for {
|
|
|
- line, _, err := reader.ReadLine()
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- if p.lines.Len() >= 100 {
|
|
|
- p.lines.Get(1)
|
|
|
- }
|
|
|
- p.lines.Put(string(line))
|
|
|
- }
|
|
|
- }()
|
|
|
+ cmd.Stdout = p.logWriter
|
|
|
+ cmd.Stderr = p.logWriter
|
|
|
|
|
|
go func() {
|
|
|
err := cmd.Run()
|
|
|
if err != nil {
|
|
|
p.exitErr = err
|
|
|
}
|
|
|
- wg.Wait()
|
|
|
}()
|
|
|
|
|
|
p.refreshVersion()
|