a lot of improvement

This commit is contained in:
MHSanaei 2023-05-23 02:43:15 +03:30
parent f36034541e
commit c38e1e0cfe
6 changed files with 111 additions and 74 deletions

View file

@ -17,7 +17,16 @@ import (
var db *gorm.DB var db *gorm.DB
var initializers = []func() error{
initUser,
initInbound,
initSetting,
initInboundClientIps,
initClientTraffic,
}
func initUser() error { func initUser() error {
err := db.AutoMigrate(&model.User{}) err := db.AutoMigrate(&model.User{})
if err != nil { if err != nil {
return err return err
@ -54,7 +63,7 @@ func initClientTraffic() error {
func InitDB(dbPath string) error { func InitDB(dbPath string) error {
dir := path.Dir(dbPath) dir := path.Dir(dbPath)
err := os.MkdirAll(dir, fs.ModeDir) err := os.MkdirAll(dir, fs.ModePerm)
if err != nil { if err != nil {
return err return err
} }
@ -75,25 +84,10 @@ func InitDB(dbPath string) error {
return err return err
} }
err = initUser() for _, initialize := range initializers {
if err != nil { if err := initialize(); err != nil {
return err return err
} }
err = initInbound()
if err != nil {
return err
}
err = initSetting()
if err != nil {
return err
}
err = initInboundClientIps()
if err != nil {
return err
}
err = initClientTraffic()
if err != nil {
return err
} }
return nil return nil
@ -107,10 +101,10 @@ func IsNotFound(err error) bool {
return err == gorm.ErrRecordNotFound return err == gorm.ErrRecordNotFound
} }
func IsSQLiteDB(file io.Reader) (bool, error) { func IsSQLiteDB(file io.ReaderAt) (bool, error) {
signature := []byte("SQLite format 3\x00") signature := []byte("SQLite format 3\x00")
buf := make([]byte, len(signature)) buf := make([]byte, len(signature))
_, err := file.Read(buf) _, err := file.ReadAt(buf, 0)
if err != nil { if err != nil {
return false, err return false, err
} }

View file

@ -2,17 +2,28 @@ package logger
import ( import (
"os" "os"
"sync"
"github.com/op/go-logging" "github.com/op/go-logging"
) )
var logger *logging.Logger var (
logger *logging.Logger
mu sync.Mutex
)
func init() { func init() {
InitLogger(logging.INFO) InitLogger(logging.INFO)
} }
func InitLogger(level logging.Level) { func InitLogger(level logging.Level) {
mu.Lock()
defer mu.Unlock()
if logger != nil {
return
}
format := logging.MustStringFormatter( format := logging.MustStringFormatter(
`%{time:2006/01/02 15:04:05} %{level} - %{message}`, `%{time:2006/01/02 15:04:05} %{level} - %{message}`,
) )
@ -21,39 +32,55 @@ func InitLogger(level logging.Level) {
backendFormatter := logging.NewBackendFormatter(backend, format) backendFormatter := logging.NewBackendFormatter(backend, format)
backendLeveled := logging.AddModuleLevel(backendFormatter) backendLeveled := logging.AddModuleLevel(backendFormatter)
backendLeveled.SetLevel(level, "") backendLeveled.SetLevel(level, "")
newLogger.SetBackend(backendLeveled) newLogger.SetBackend(logging.MultiLogger(backendLeveled))
logger = newLogger logger = newLogger
} }
func Debug(args ...interface{}) { func Debug(args ...interface{}) {
if logger != nil {
logger.Debug(args...) logger.Debug(args...)
}
} }
func Debugf(format string, args ...interface{}) { func Debugf(format string, args ...interface{}) {
if logger != nil {
logger.Debugf(format, args...) logger.Debugf(format, args...)
}
} }
func Info(args ...interface{}) { func Info(args ...interface{}) {
if logger != nil {
logger.Info(args...) logger.Info(args...)
}
} }
func Infof(format string, args ...interface{}) { func Infof(format string, args ...interface{}) {
if logger != nil {
logger.Infof(format, args...) logger.Infof(format, args...)
}
} }
func Warning(args ...interface{}) { func Warning(args ...interface{}) {
if logger != nil {
logger.Warning(args...) logger.Warning(args...)
}
} }
func Warningf(format string, args ...interface{}) { func Warningf(format string, args ...interface{}) {
if logger != nil {
logger.Warningf(format, args...) logger.Warningf(format, args...)
}
} }
func Error(args ...interface{}) { func Error(args ...interface{}) {
if logger != nil {
logger.Error(args...) logger.Error(args...)
}
} }
func Errorf(format string, args ...interface{}) { func Errorf(format string, args ...interface{}) {
if logger != nil {
logger.Errorf(format, args...) logger.Errorf(format, args...)
}
} }

View file

@ -24,8 +24,8 @@ func getLinesNum(filename string) (int, error) {
var buffPosition int var buffPosition int
for { for {
i := bytes.IndexByte(buf[buffPosition:], '\n') i := bytes.IndexByte(buf[buffPosition:n], '\n')
if i < 0 || n == buffPosition { if i < 0 {
break break
} }
buffPosition += i + 1 buffPosition += i + 1
@ -33,11 +33,12 @@ func getLinesNum(filename string) (int, error) {
} }
if err == io.EOF { if err == io.EOF {
return sum, nil break
} else if err != nil { } else if err != nil {
return sum, err return 0, err
} }
} }
return sum, nil
} }
func GetTCPCount() (int, error) { func GetTCPCount() (int, error) {
@ -45,11 +46,11 @@ func GetTCPCount() (int, error) {
tcp4, err := getLinesNum(fmt.Sprintf("%v/net/tcp", root)) tcp4, err := getLinesNum(fmt.Sprintf("%v/net/tcp", root))
if err != nil { if err != nil {
return tcp4, err return 0, err
} }
tcp6, err := getLinesNum(fmt.Sprintf("%v/net/tcp6", root)) tcp6, err := getLinesNum(fmt.Sprintf("%v/net/tcp6", root))
if err != nil { if err != nil {
return tcp4 + tcp6, nil return 0, err
} }
return tcp4 + tcp6, nil return tcp4 + tcp6, nil
@ -60,11 +61,11 @@ func GetUDPCount() (int, error) {
udp4, err := getLinesNum(fmt.Sprintf("%v/net/udp", root)) udp4, err := getLinesNum(fmt.Sprintf("%v/net/udp", root))
if err != nil { if err != nil {
return udp4, err return 0, err
} }
udp6, err := getLinesNum(fmt.Sprintf("%v/net/udp6", root)) udp6, err := getLinesNum(fmt.Sprintf("%v/net/udp6", root))
if err != nil { if err != nil {
return udp4 + udp6, nil return 0, err
} }
return udp4 + udp6, nil return udp4 + udp6, nil

View file

@ -4,21 +4,27 @@
package sys package sys
import ( import (
"errors"
"github.com/shirou/gopsutil/v3/net" "github.com/shirou/gopsutil/v3/net"
) )
func GetTCPCount() (int, error) { func GetConnectionCount(proto string) (int, error) {
stats, err := net.Connections("tcp") if proto != "tcp" && proto != "udp" {
return 0, errors.New("invalid protocol")
}
stats, err := net.Connections(proto)
if err != nil { if err != nil {
return 0, err return 0, err
} }
return len(stats), nil return len(stats), nil
} }
func GetUDPCount() (int, error) { func GetTCPCount() (int, error) {
stats, err := net.Connections("udp") return GetConnectionCount("tcp")
if err != nil { }
return 0, err
} func GetUDPCount() (int, error) {
return len(stats), nil return GetConnectionCount("udp")
} }

46
x-ui.sh
View file

@ -644,27 +644,37 @@ warp_fixchatgpt() {
run_speedtest() { run_speedtest() {
# Check if Speedtest is already installed # Check if Speedtest is already installed
if ! command -v speedtest &>/dev/null; then if ! command -v speedtest &> /dev/null; then
# If not installed, install it # If not installed, install it
if command -v dnf &>/dev/null; then local pkg_manager=""
sudo dnf install -y curl local curl_install_cmd=""
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash local speedtest_install_script=""
sudo dnf install -y speedtest
elif command -v yum &>/dev/null; then if command -v dnf &> /dev/null; then
sudo yum install -y curl pkg_manager="dnf"
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash curl_install_cmd="sudo dnf install -y curl"
sudo yum install -y speedtest speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh"
elif command -v apt-get &>/dev/null; then elif command -v yum &> /dev/null; then
sudo apt-get update && sudo apt-get install -y curl pkg_manager="yum"
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash curl_install_cmd="sudo yum install -y curl"
sudo apt-get install -y speedtest speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh"
elif command -v apt &>/dev/null; then elif command -v apt-get &> /dev/null; then
sudo apt update && sudo apt install -y curl pkg_manager="apt-get"
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash curl_install_cmd="sudo apt-get update && sudo apt-get install -y curl"
sudo apt install -y speedtest speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
else elif command -v apt &> /dev/null; then
pkg_manager="apt"
curl_install_cmd="sudo apt update && sudo apt install -y curl"
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
fi
if [[ -z $pkg_manager ]]; then
echo "Error: Package manager not found. You may need to install Speedtest manually." echo "Error: Package manager not found. You may need to install Speedtest manually."
return 1 return 1
else
$curl_install_cmd
curl -s $speedtest_install_script | sudo bash
sudo $pkg_manager install -y speedtest
fi fi
fi fi

View file

@ -13,6 +13,7 @@ import (
"regexp" "regexp"
"runtime" "runtime"
"strings" "strings"
"sync"
"time" "time"
"x-ui/config" "x-ui/config"
"x-ui/util/common" "x-ui/util/common"
@ -184,11 +185,11 @@ func (p *process) Start() (err error) {
return err return err
} }
var wg sync.WaitGroup
wg.Add(2)
go func() { go func() {
defer func() { defer wg.Done()
common.Recover("")
stdReader.Close()
}()
reader := bufio.NewReaderSize(stdReader, 8192) reader := bufio.NewReaderSize(stdReader, 8192)
for { for {
line, _, err := reader.ReadLine() line, _, err := reader.ReadLine()
@ -203,10 +204,7 @@ func (p *process) Start() (err error) {
}() }()
go func() { go func() {
defer func() { defer wg.Done()
common.Recover("")
errReader.Close()
}()
reader := bufio.NewReaderSize(errReader, 8192) reader := bufio.NewReaderSize(errReader, 8192)
for { for {
line, _, err := reader.ReadLine() line, _, err := reader.ReadLine()
@ -225,6 +223,7 @@ func (p *process) Start() (err error) {
if err != nil { if err != nil {
p.exitErr = err p.exitErr = err
} }
wg.Wait()
}() }()
p.refreshVersion() p.refreshVersion()