mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-12 13:10:05 +00:00
feat: add periodic client traffic reset job and schedule tasks
This commit is contained in:
parent
7d75cfc947
commit
10d57d9502
3 changed files with 56 additions and 6 deletions
42
web/job/periodic_client_traffic_reset_job.go
Normal file
42
web/job/periodic_client_traffic_reset_job.go
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
package job
|
||||||
|
|
||||||
|
import (
|
||||||
|
"x-ui/logger"
|
||||||
|
"x-ui/web/service"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PeriodicClientTrafficResetJob struct {
|
||||||
|
inboundService service.InboundService
|
||||||
|
period Period
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPeriodicClientTrafficResetJob(period Period) *PeriodicClientTrafficResetJob {
|
||||||
|
return &PeriodicClientTrafficResetJob{
|
||||||
|
period: period,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (j *PeriodicClientTrafficResetJob) Run() {
|
||||||
|
clients, err := j.inboundService.GetClientsByTrafficReset(string(j.period))
|
||||||
|
logger.Infof("Running periodic client traffic reset job for period: %s", j.period)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warning("Failed to get clients for traffic reset:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resetCount := 0
|
||||||
|
|
||||||
|
for _, client := range clients {
|
||||||
|
if err := j.inboundService.ResetClientTrafficByEmail(client.Email); err != nil {
|
||||||
|
logger.Warning("Failed to reset traffic for client", client.Email, ":", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
resetCount++
|
||||||
|
logger.Infof("Reset traffic for client %s", client.Email)
|
||||||
|
}
|
||||||
|
|
||||||
|
if resetCount > 0 {
|
||||||
|
logger.Infof("Periodic client traffic reset completed: %d clients reseted", resetCount)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
package job
|
package job
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"x-ui/database/model"
|
|
||||||
"x-ui/logger"
|
"x-ui/logger"
|
||||||
"x-ui/web/service"
|
"x-ui/web/service"
|
||||||
)
|
)
|
||||||
|
@ -20,7 +19,7 @@ func NewPeriodicTrafficResetJob(period Period) *PeriodicTrafficResetJob {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *PeriodicTrafficResetJob) Run() {
|
func (j *PeriodicTrafficResetJob) Run() {
|
||||||
inbounds, err := j.inboundService.GetInboundsByPeriodicTrafficReset(string(j.period))
|
inbounds, err := j.inboundService.GetInboundsByTrafficReset(string(j.period))
|
||||||
logger.Infof("Running periodic traffic reset job for period: %s", j.period)
|
logger.Infof("Running periodic traffic reset job for period: %s", j.period)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warning("Failed to get inbounds for traffic reset:", err)
|
logger.Warning("Failed to get inbounds for traffic reset:", err)
|
||||||
|
@ -43,7 +42,3 @@ func (j *PeriodicTrafficResetJob) Run() {
|
||||||
logger.Infof("Periodic traffic reset completed: %d inbounds reseted", resetCount)
|
logger.Infof("Periodic traffic reset completed: %d inbounds reseted", resetCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *PeriodicTrafficResetJob) getResetKey(inbound *model.Inbound) string {
|
|
||||||
return inbound.PeriodicTrafficReset + "_" + inbound.Tag
|
|
||||||
}
|
|
||||||
|
|
13
web/web.go
13
web/web.go
|
@ -269,13 +269,26 @@ func (s *Server) startTask() {
|
||||||
// Periodic traffic resets
|
// Periodic traffic resets
|
||||||
logger.Info("Scheduling periodic traffic reset jobs")
|
logger.Info("Scheduling periodic traffic reset jobs")
|
||||||
{
|
{
|
||||||
|
// Inbound traffic reset jobs
|
||||||
// Run once a day, midnight
|
// Run once a day, midnight
|
||||||
|
// TODO: for testing, run every minute, change back to daily later
|
||||||
// s.cron.AddJob("@daily", job.NewPeriodicTrafficResetJob("daily"))
|
// s.cron.AddJob("@daily", job.NewPeriodicTrafficResetJob("daily"))
|
||||||
s.cron.AddJob("* * * * *", job.NewPeriodicTrafficResetJob("daily"))
|
s.cron.AddJob("* * * * *", job.NewPeriodicTrafficResetJob("daily"))
|
||||||
// Run once a week, midnight between Sat/Sun
|
// Run once a week, midnight between Sat/Sun
|
||||||
s.cron.AddJob("@weekly", job.NewPeriodicTrafficResetJob("weekly"))
|
s.cron.AddJob("@weekly", job.NewPeriodicTrafficResetJob("weekly"))
|
||||||
// Run once a month, midnight, first of month
|
// Run once a month, midnight, first of month
|
||||||
s.cron.AddJob("@monthly", job.NewPeriodicTrafficResetJob("monthly"))
|
s.cron.AddJob("@monthly", job.NewPeriodicTrafficResetJob("monthly"))
|
||||||
|
|
||||||
|
// Client traffic reset jobs
|
||||||
|
logger.Info("Scheduling periodic client traffic reset jobs")
|
||||||
|
// Run once a day, midnight
|
||||||
|
// TODO: for testing, run every minute, change back to daily later
|
||||||
|
// s.cron.AddJob("@daily", job.NewPeriodicClientTrafficResetJob("daily"))
|
||||||
|
s.cron.AddJob("* * * * *", job.NewPeriodicClientTrafficResetJob("daily"))
|
||||||
|
// Run once a week, midnight between Sat/Sun
|
||||||
|
s.cron.AddJob("@weekly", job.NewPeriodicClientTrafficResetJob("weekly"))
|
||||||
|
// Run once a month, midnight, first of month
|
||||||
|
s.cron.AddJob("@monthly", job.NewPeriodicClientTrafficResetJob("monthly"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make a traffic condition every day, 8:30
|
// Make a traffic condition every day, 8:30
|
||||||
|
|
Loading…
Reference in a new issue