Compare commits

..

No commits in common. "a824875c4ff7e774beb994866cfff5b10fbe79fd" and "b65ec83c397d366157631f257b2c93a543cf9d63" have entirely different histories.

5 changed files with 28 additions and 44 deletions

View file

@ -53,7 +53,7 @@ install_base() {
arch | manjaro | parch) arch | manjaro | parch)
pacman -Syu && pacman -Syu --noconfirm wget curl tar tzdata pacman -Syu && pacman -Syu --noconfirm wget curl tar tzdata
;; ;;
opensuse-tumbleweed | opensuse-leap) opensuse-tumbleweed)
zypper refresh && zypper -q install -y wget curl tar timezone zypper refresh && zypper -q install -y wget curl tar timezone
;; ;;
alpine) alpine)

View file

@ -76,7 +76,7 @@ install_base() {
ubuntu | debian | armbian) ubuntu | debian | armbian)
apt-get update >/dev/null 2>&1 && apt-get install -y -q wget curl tar tzdata >/dev/null 2>&1 apt-get update >/dev/null 2>&1 && apt-get install -y -q wget curl tar tzdata >/dev/null 2>&1
;; ;;
centos | rhel | almalinux | rocky | ol) centos | almalinux | rocky | ol)
yum -y update >/dev/null 2>&1 && yum install -y -q wget curl tar tzdata >/dev/null 2>&1 yum -y update >/dev/null 2>&1 && yum install -y -q wget curl tar tzdata >/dev/null 2>&1
;; ;;
fedora | amzn | virtuozzo) fedora | amzn | virtuozzo)
@ -85,7 +85,7 @@ install_base() {
arch | manjaro | parch) arch | manjaro | parch)
pacman -Syu >/dev/null 2>&1 && pacman -Syu --noconfirm wget curl tar tzdata >/dev/null 2>&1 pacman -Syu >/dev/null 2>&1 && pacman -Syu --noconfirm wget curl tar tzdata >/dev/null 2>&1
;; ;;
opensuse-tumbleweed | opensuse-leap) opensuse-tumbleweed)
zypper refresh >/dev/null 2>&1 && zypper -q install -y wget curl tar timezone >/dev/null 2>&1 zypper refresh >/dev/null 2>&1 && zypper -q install -y wget curl tar timezone >/dev/null 2>&1
;; ;;
alpine) alpine)

View file

@ -37,19 +37,13 @@ func (j *PeriodicTrafficResetJob) Run() {
resetCount := 0 resetCount := 0
for _, inbound := range inbounds { for _, inbound := range inbounds {
resetInboundErr := j.inboundService.ResetAllTraffics() if err := j.inboundService.ResetAllClientTraffics(inbound.Id); err != nil {
if resetInboundErr != nil { logger.Warning("Failed to reset traffic for inbound", inbound.Id, ":", err)
logger.Warning("Failed to reset traffic for inbound", inbound.Id, ":", resetInboundErr) continue
} }
resetClientErr := j.inboundService.ResetAllClientTraffics(inbound.Id) resetCount++
if resetClientErr != nil { logger.Infof("Reset traffic for inbound %d (%s)", inbound.Id, inbound.Remark)
logger.Warning("Failed to reset traffic for all users of inbound", inbound.Id, ":", resetClientErr)
}
if resetInboundErr == nil && resetClientErr == nil {
resetCount++
}
} }
if resetCount > 0 { if resetCount > 0 {

View file

@ -110,7 +110,6 @@ type ServerService struct {
mu sync.Mutex mu sync.Mutex
lastCPUTimes cpu.TimesStat lastCPUTimes cpu.TimesStat
hasLastCPUSample bool hasLastCPUSample bool
hasNativeCPUSample bool
emaCPU float64 emaCPU float64
cpuHistory []CPUSample cpuHistory []CPUSample
cachedCpuSpeedMhz float64 cachedCpuSpeedMhz float64
@ -433,27 +432,23 @@ func (s *ServerService) AppendCpuSample(t time.Time, v float64) {
} }
func (s *ServerService) sampleCPUUtilization() (float64, error) { func (s *ServerService) sampleCPUUtilization() (float64, error) {
// Try native platform-specific CPU implementation first (Windows, Linux, macOS) // Prefer native Windows API to avoid external deps for CPU percent
if pct, err := sys.CPUPercentRaw(); err == nil { if runtime.GOOS == "windows" {
s.mu.Lock() if pct, err := sys.CPUPercentRaw(); err == nil {
// First call to native method returns 0 (initializes baseline) s.mu.Lock()
if !s.hasNativeCPUSample { // Smooth with EMA
s.hasNativeCPUSample = true const alpha = 0.3
if s.emaCPU == 0 {
s.emaCPU = pct
} else {
s.emaCPU = alpha*pct + (1-alpha)*s.emaCPU
}
val := s.emaCPU
s.mu.Unlock() s.mu.Unlock()
return 0, nil return val, nil
} }
// Smooth with EMA // If native call fails, fall back to gopsutil times
const alpha = 0.3
if s.emaCPU == 0 {
s.emaCPU = pct
} else {
s.emaCPU = alpha*pct + (1-alpha)*s.emaCPU
}
val := s.emaCPU
s.mu.Unlock()
return val, nil
} }
// If native call fails, fall back to gopsutil times
// Read aggregate CPU times (all CPUs combined) // Read aggregate CPU times (all CPUs combined)
times, err := cpu.Times(false) times, err := cpu.Times(false)
if err != nil { if err != nil {
@ -476,16 +471,17 @@ func (s *ServerService) sampleCPUUtilization() (float64, error) {
} }
// Compute busy and total deltas // Compute busy and total deltas
// Note: Guest and GuestNice times are already included in User and Nice respectively,
// so we exclude them to avoid double-counting (Linux kernel accounting)
idleDelta := cur.Idle - s.lastCPUTimes.Idle idleDelta := cur.Idle - s.lastCPUTimes.Idle
// Sum of busy deltas (exclude Idle)
busyDelta := (cur.User - s.lastCPUTimes.User) + busyDelta := (cur.User - s.lastCPUTimes.User) +
(cur.System - s.lastCPUTimes.System) + (cur.System - s.lastCPUTimes.System) +
(cur.Nice - s.lastCPUTimes.Nice) + (cur.Nice - s.lastCPUTimes.Nice) +
(cur.Iowait - s.lastCPUTimes.Iowait) + (cur.Iowait - s.lastCPUTimes.Iowait) +
(cur.Irq - s.lastCPUTimes.Irq) + (cur.Irq - s.lastCPUTimes.Irq) +
(cur.Softirq - s.lastCPUTimes.Softirq) + (cur.Softirq - s.lastCPUTimes.Softirq) +
(cur.Steal - s.lastCPUTimes.Steal) (cur.Steal - s.lastCPUTimes.Steal) +
(cur.Guest - s.lastCPUTimes.Guest) +
(cur.GuestNice - s.lastCPUTimes.GuestNice)
totalDelta := busyDelta + idleDelta totalDelta := busyDelta + idleDelta

10
x-ui.sh
View file

@ -189,9 +189,9 @@ reset_user() {
fi fi
read -rp "Please set the login username [default is a random username]: " config_account read -rp "Please set the login username [default is a random username]: " config_account
[[ -z $config_account ]] && config_account=$(gen_random_string 10) [[ -z $config_account ]] && config_account=$(date +%s%N | md5sum | cut -c 1-8)
read -rp "Please set the login password [default is a random password]: " config_password read -rp "Please set the login password [default is a random password]: " config_password
[[ -z $config_password ]] && config_password=$(gen_random_string 18) [[ -z $config_password ]] && config_password=$(date +%s%N | md5sum | cut -c 1-8)
read -rp "Do you want to disable currently configured two-factor authentication? (y/n): " twoFactorConfirm read -rp "Do you want to disable currently configured two-factor authentication? (y/n): " twoFactorConfirm
if [[ $twoFactorConfirm != "y" && $twoFactorConfirm != "Y" ]]; then if [[ $twoFactorConfirm != "y" && $twoFactorConfirm != "Y" ]]; then
@ -518,9 +518,6 @@ enable_bbr() {
arch | manjaro | parch) arch | manjaro | parch)
pacman -Sy --noconfirm ca-certificates pacman -Sy --noconfirm ca-certificates
;; ;;
opensuse-tumbleweed | opensuse-leap)
zypper refresh && zypper -q install -y ca-certificates
;;
alpine) alpine)
apk add ca-certificates apk add ca-certificates
;; ;;
@ -1076,9 +1073,6 @@ ssl_cert_issue() {
arch | manjaro | parch) arch | manjaro | parch)
pacman -Sy --noconfirm socat pacman -Sy --noconfirm socat
;; ;;
opensuse-tumbleweed | opensuse-leap)
zypper refresh && zypper -q install -y socat
;;
alpine) alpine)
apk add socat apk add socat
;; ;;