mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-04-19 21:42:24 +00:00
a lot of improvement
This commit is contained in:
parent
f36034541e
commit
c38e1e0cfe
6 changed files with 111 additions and 74 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
46
x-ui.sh
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue