From f734c821d6e62eca5a206b6048f3cd7d65f3e665 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Mon, 4 Dec 2023 19:13:21 +0100 Subject: online users backend #1286 --- web/service/inbound.go | 18 ++++++++++++++++++ web/service/server.go | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 1646b5ed..5972d9a5 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -716,9 +716,15 @@ func (s *InboundService) addInboundTraffic(tx *gorm.DB, traffics []*xray.Traffic func (s *InboundService) addClientTraffic(tx *gorm.DB, traffics []*xray.ClientTraffic) (err error) { if len(traffics) == 0 { + // Empty onlineUsers + if p != nil { + p.SetOnlineClients(nil) + } return nil } + var onlineClients []string + emails := make([]string, 0, len(traffics)) for _, traffic := range traffics { emails = append(emails, traffic.Email) @@ -744,11 +750,19 @@ func (s *InboundService) addClientTraffic(tx *gorm.DB, traffics []*xray.ClientTr if dbClientTraffics[dbTraffic_index].Email == traffics[traffic_index].Email { dbClientTraffics[dbTraffic_index].Up += traffics[traffic_index].Up dbClientTraffics[dbTraffic_index].Down += traffics[traffic_index].Down + + // Add user in onlineUsers array on traffic + if traffics[traffic_index].Up+traffics[traffic_index].Down > 0 { + onlineClients = append(onlineClients, traffics[traffic_index].Email) + } break } } } + // Set onlineUsers + p.SetOnlineClients(onlineClients) + err = tx.Save(dbClientTraffics).Error if err != nil { logger.Warning("AddClientTraffic update data ", err) @@ -1675,3 +1689,7 @@ func (s *InboundService) MigrateDB() { s.MigrationRequirements() s.MigrationRemoveOrphanedTraffics() } + +func (s *InboundService) GetOnlineClinets() []string { + return p.GetOnlineClients() +} diff --git a/web/service/server.go b/web/service/server.go index d88fa098..629d9253 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -230,7 +230,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { status.AppStats.Mem = rtm.Sys status.AppStats.Threads = uint32(runtime.NumGoroutine()) - if p.IsRunning() { + if p != nil && p.IsRunning() { status.AppStats.Uptime = p.GetUptime() } else { status.AppStats.Uptime = 0 -- cgit v1.2.3 From a8b7063647c055988f3768a35af59ca391928b9b Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Mon, 4 Dec 2023 19:20:16 +0100 Subject: auto renew feature #1286 --- web/service/inbound.go | 148 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 125 insertions(+), 23 deletions(-) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 5972d9a5..4ce93f31 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -263,7 +263,18 @@ func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound, tag := oldInbound.Tag - err = s.updateClientTraffics(oldInbound, inbound) + db := database.GetDB() + tx := db.Begin() + + defer func() { + if err != nil { + tx.Rollback() + } else { + tx.Commit() + } + }() + + err = s.updateClientTraffics(tx, oldInbound, inbound) if err != nil { return inbound, false, err } @@ -304,11 +315,10 @@ func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound, } s.xrayApi.Close() - db := database.GetDB() - return inbound, needRestart, db.Save(oldInbound).Error + return inbound, needRestart, tx.Save(oldInbound).Error } -func (s *InboundService) updateClientTraffics(oldInbound *model.Inbound, newInbound *model.Inbound) error { +func (s *InboundService) updateClientTraffics(tx *gorm.DB, oldInbound *model.Inbound, newInbound *model.Inbound) error { oldClients, err := s.GetClients(oldInbound) if err != nil { return err @@ -318,17 +328,6 @@ func (s *InboundService) updateClientTraffics(oldInbound *model.Inbound, newInbo return err } - db := database.GetDB() - tx := db.Begin() - - defer func() { - if err != nil { - tx.Rollback() - } else { - tx.Commit() - } - }() - var emailExists bool for _, oldClient := range oldClients { @@ -601,7 +600,7 @@ func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId strin if len(clients[0].Email) > 0 { if len(oldEmail) > 0 { - err = s.UpdateClientStat(oldEmail, &clients[0]) + err = s.UpdateClientStat(tx, oldEmail, &clients[0]) if err != nil { return false, err } @@ -676,6 +675,13 @@ func (s *InboundService) AddTraffic(inboundTraffics []*xray.Traffic, clientTraff return err, false } + needRestart0, count, err := s.autoRenewClients(tx) + if err != nil { + logger.Warning("Error in renew clients:", err) + } else if count > 0 { + logger.Debugf("%v clients renewed", count) + } + needRestart1, count, err := s.disableInvalidClients(tx) if err != nil { logger.Warning("Error in disabling invalid clients:", err) @@ -689,7 +695,7 @@ func (s *InboundService) AddTraffic(inboundTraffics []*xray.Traffic, clientTraff } else if count > 0 { logger.Debugf("%v inbounds disabled", count) } - return nil, (needRestart1 || needRestart2) + return nil, (needRestart0 || needRestart1 || needRestart2) } func (s *InboundService) addInboundTraffic(tx *gorm.DB, traffics []*xray.Traffic) error { @@ -823,6 +829,102 @@ func (s *InboundService) adjustTraffics(tx *gorm.DB, dbClientTraffics []*xray.Cl return dbClientTraffics, nil } +func (s *InboundService) autoRenewClients(tx *gorm.DB) (bool, int64, error) { + // check for time expired + var traffics []*xray.ClientTraffic + now := time.Now().Unix() * 1000 + var err, err1 error + + err = tx.Model(xray.ClientTraffic{}).Where("reset > 0 and expiry_time > 0 and expiry_time <= ?", now).Find(&traffics).Error + if err != nil { + return false, 0, err + } + // return if there is no client to renew + if len(traffics) == 0 { + return false, 0, nil + } + + var inbound_ids []int + var inbounds []*model.Inbound + needRestart := false + var clientsToAdd []struct { + protocol string + tag string + client map[string]interface{} + } + + for _, traffic := range traffics { + inbound_ids = append(inbound_ids, traffic.InboundId) + } + err = tx.Model(model.Inbound{}).Where("id IN ?", inbound_ids).Find(&inbounds).Error + if err != nil { + return false, 0, err + } + for inbound_index := range inbounds { + settings := map[string]interface{}{} + json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) + clients := settings["clients"].([]interface{}) + for client_index := range clients { + c := clients[client_index].(map[string]interface{}) + for traffic_index, traffic := range traffics { + if traffic.Email == c["email"].(string) { + newExpiryTime := traffic.ExpiryTime + for newExpiryTime < now { + newExpiryTime += (int64(traffic.Reset) * 86400000) + } + c["expiryTime"] = newExpiryTime + traffics[traffic_index].ExpiryTime = newExpiryTime + traffics[traffic_index].Down = 0 + traffics[traffic_index].Up = 0 + if !traffic.Enable { + traffics[traffic_index].Enable = true + clientsToAdd = append(clientsToAdd, + struct { + protocol string + tag string + client map[string]interface{} + }{ + protocol: string(inbounds[inbound_index].Protocol), + tag: inbounds[inbound_index].Tag, + client: c, + }) + } + clients[client_index] = interface{}(c) + break + } + } + } + settings["clients"] = clients + newSettings, err := json.MarshalIndent(settings, "", " ") + if err != nil { + return false, 0, err + } + inbounds[inbound_index].Settings = string(newSettings) + } + err = tx.Save(inbounds).Error + if err != nil { + return false, 0, err + } + err = tx.Save(traffics).Error + if err != nil { + return false, 0, err + } + if p != nil { + err1 = s.xrayApi.Init(p.GetAPIPort()) + if err1 != nil { + return true, int64(len(traffics)), nil + } + for _, clientToAdd := range clientsToAdd { + err1 = s.xrayApi.AddUser(clientToAdd.protocol, clientToAdd.tag, clientToAdd.client) + if err1 != nil { + needRestart = true + } + } + s.xrayApi.Close() + } + return needRestart, int64(len(traffics)), nil +} + func (s *InboundService) disableInvalidInbounds(tx *gorm.DB) (bool, int64, error) { now := time.Now().Unix() * 1000 needRestart := false @@ -916,6 +1018,7 @@ func (s *InboundService) AddClientStat(tx *gorm.DB, inboundId int, client *model clientTraffic.Enable = true clientTraffic.Up = 0 clientTraffic.Down = 0 + clientTraffic.Reset = client.Reset result := tx.Create(&clientTraffic) err := result.Error if err != nil { @@ -924,16 +1027,15 @@ func (s *InboundService) AddClientStat(tx *gorm.DB, inboundId int, client *model return nil } -func (s *InboundService) UpdateClientStat(email string, client *model.Client) error { - db := database.GetDB() - - result := db.Model(xray.ClientTraffic{}). +func (s *InboundService) UpdateClientStat(tx *gorm.DB, email string, client *model.Client) error { + result := tx.Model(xray.ClientTraffic{}). Where("email = ?", email). Updates(map[string]interface{}{ "enable": true, "email": client.Email, "total": client.TotalGB, - "expiry_time": client.ExpiryTime}) + "expiry_time": client.ExpiryTime, + "reset": client.Reset}) err := result.Error if err != nil { return err @@ -1429,7 +1531,7 @@ func (s *InboundService) DelDepletedClients(id int) (err error) { } }() - whereText := "inbound_id " + whereText := "reset = 0 and inbound_id " if id < 0 { whereText += "> ?" } else { -- cgit v1.2.3 From 2a8da2ba3cbfbf7ac46e5ba7ba071588f3f2d8b5 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Mon, 4 Dec 2023 19:20:46 +0100 Subject: separate xray page #1286 --- web/service/setting.go | 11 ++++++++++- web/service/xraySettings.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 web/service/xraySettings.go (limited to 'web/service') diff --git a/web/service/setting.go b/web/service/setting.go index b1565e1f..933fff1b 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -70,7 +70,7 @@ func (s *SettingService) GetDefaultJsonConfig() (interface{}, error) { func (s *SettingService) GetAllSetting() (*entity.AllSetting, error) { db := database.GetDB() settings := make([]*model.Setting, 0) - err := db.Model(model.Setting{}).Find(&settings).Error + err := db.Model(model.Setting{}).Not("key = ?", "xrayTemplateConfig").Find(&settings).Error if err != nil { return nil, err } @@ -426,3 +426,12 @@ func (s *SettingService) UpdateAllSetting(allSetting *entity.AllSetting) error { } return common.Combine(errs...) } + +func (s *SettingService) GetDefaultXrayConfig() (interface{}, error) { + var jsonData interface{} + err := json.Unmarshal([]byte(xrayTemplateConfig), &jsonData) + if err != nil { + return nil, err + } + return jsonData, nil +} diff --git a/web/service/xraySettings.go b/web/service/xraySettings.go new file mode 100644 index 00000000..4550bde2 --- /dev/null +++ b/web/service/xraySettings.go @@ -0,0 +1,28 @@ +package service + +import ( + _ "embed" + "encoding/json" + "x-ui/util/common" + "x-ui/xray" +) + +type XraySettingService struct { + SettingService +} + +func (s *XraySettingService) SaveXraySetting(newXraySettings string) error { + if err := s.CheckXrayConfig(newXraySettings); err != nil { + return err + } + return s.SettingService.saveSetting("xrayTemplateConfig", newXraySettings) +} + +func (s *XraySettingService) CheckXrayConfig(XrayTemplateConfig string) error { + xrayConfig := &xray.Config{} + err := json.Unmarshal([]byte(XrayTemplateConfig), xrayConfig) + if err != nil { + return common.NewError("xray template config invalid:", err) + } + return nil +} -- cgit v1.2.3 From c419eadf15630518606ab434387079172070d340 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Tue, 5 Dec 2023 18:13:36 +0100 Subject: xray setting enhancements #1286 --- web/service/inbound.go | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 4ce93f31..5ff88d38 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -997,6 +997,16 @@ func (s *InboundService) disableInvalidClients(tx *gorm.DB) (bool, int64, error) return needRestart, count, err } +func (s *InboundService) GetInboundTags() (string, error) { + db := database.GetDB() + var inboundTags []string + err := db.Model(model.Inbound{}).Select("tag").Find(&inboundTags).Error + if err != nil && err != gorm.ErrRecordNotFound { + return "", err + } + return "[\"" + strings.Join(inboundTags, "\", \"") + "\"]", nil +} + func (s *InboundService) MigrationRemoveOrphanedTraffics() { db := database.GetDB() db.Exec(` -- cgit v1.2.3 From 5e47b4e94925c2272a7f0a4cc355cede72c671a4 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 17:18:51 +0100 Subject: pagination and sub URI support #1300 --- web/service/setting.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'web/service') diff --git a/web/service/setting.go b/web/service/setting.go index 933fff1b..d6cf193e 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -31,6 +31,7 @@ var defaultValueMap = map[string]string{ "secret": random.Seq(32), "webBasePath": "/", "sessionMaxAge": "0", + "pageSize": "0", "expireDiff": "0", "trafficDiff": "0", "timeLocation": "Asia/Tehran", @@ -53,6 +54,7 @@ var defaultValueMap = map[string]string{ "subUpdates": "12", "subEncrypt": "true", "subShowInfo": "true", + "subURI": "", } type SettingService struct { @@ -406,6 +408,14 @@ func (s *SettingService) GetSubShowInfo() (bool, error) { return s.getBool("subShowInfo") } +func (s *SettingService) GetSubURI() (string, error) { + return s.getString("subURI") +} + +func (s *SettingService) GetPageSize() (int, error) { + return s.getInt("pageSize") +} + func (s *SettingService) UpdateAllSetting(allSetting *entity.AllSetting) error { if err := allSetting.CheckValid(); err != nil { return err @@ -435,3 +445,61 @@ func (s *SettingService) GetDefaultXrayConfig() (interface{}, error) { } return jsonData, nil } + +func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) { + type settingFunc func() (interface{}, error) + settings := map[string]settingFunc{ + "expireDiff": func() (interface{}, error) { return s.GetExpireDiff() }, + "trafficDiff": func() (interface{}, error) { return s.GetTrafficDiff() }, + "pageSize": func() (interface{}, error) { return s.GetPageSize() }, + "defaultCert": func() (interface{}, error) { return s.GetCertFile() }, + "defaultKey": func() (interface{}, error) { return s.GetKeyFile() }, + "tgBotEnable": func() (interface{}, error) { return s.GetTgbotenabled() }, + "subEnable": func() (interface{}, error) { return s.GetSubEnable() }, + "subURI": func() (interface{}, error) { return s.GetSubURI() }, + } + + result := make(map[string]interface{}) + + for key, fn := range settings { + value, err := fn() + if err != nil { + return "", err + } + result[key] = value + } + + if result["subEnable"].(bool) && result["subURI"].(string) == "" { + subURI := "" + subPort, _ := s.GetSubPort() + subPath, _ := s.GetSubPath() + subDomain, _ := s.GetSubDomain() + subKeyFile, _ := s.GetSubKeyFile() + subCertFile, _ := s.GetSubCertFile() + subTLS := false + if subKeyFile != "" && subCertFile != "" { + subTLS = true + } + if subDomain == "" { + subDomain = strings.Split(host, ":")[0] + } + if subTLS { + subURI = "https://" + } else { + subURI = "http://" + } + if (subPort == 443 && subTLS) || (subPort == 80 && !subTLS) { + subURI += subDomain + } else { + subURI += fmt.Sprintf("%s:%d", subDomain, subPort) + } + if subPath[0] == byte('/') { + subURI += subPath + } else { + subURI += "/" + subPath + } + result["subURI"] = subURI + } + + return result, nil +} -- cgit v1.2.3 From bcc897640e68f7a731d39bee04c8930d7d7196c6 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 17:21:43 +0100 Subject: del x-ui settings in final tls/reality #1300 --- web/service/xray.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'web/service') diff --git a/web/service/xray.go b/web/service/xray.go index 2dbc092d..1d046a44 100644 --- a/web/service/xray.go +++ b/web/service/xray.go @@ -134,6 +134,27 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { inbound.Settings = string(modifiedSettings) } + + // Unmarshal stream JSON + var stream map[string]interface{} + json.Unmarshal([]byte(inbound.StreamSettings), &stream) + + // Remove the "settings" field under "tlsSettings" and "realitySettings" + tlsSettings, ok1 := stream["tlsSettings"].(map[string]interface{}) + realitySettings, ok2 := stream["realitySettings"].(map[string]interface{}) + if ok1 || ok2 { + if ok1 { + delete(tlsSettings, "settings") + } else if ok2 { + delete(realitySettings, "settings") + } + newStream, err := json.MarshalIndent(stream, "", " ") + if err != nil { + return nil, err + } + inbound.StreamSettings = string(newStream) + } + inboundConfig := inbound.GenXrayInboundConfig() xrayConfig.InboundConfigs = append(xrayConfig.InboundConfigs, *inboundConfig) } -- cgit v1.2.3 From 5fbf8f0d535b131ad6de22a0d1dda0f2167d5ee0 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 18:45:21 +0100 Subject: Expand multiDomain to externalProxy #1300 --- web/service/inbound.go | 40 ++++++++++++++++++++++++++++++++++++++++ web/service/xray.go | 29 +++++++++++++++++------------ 2 files changed, 57 insertions(+), 12 deletions(-) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 5ff88d38..58a3de9f 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -1795,6 +1795,46 @@ func (s *InboundService) MigrationRequirements() { // Remove orphaned traffics tx.Where("inbound_id = 0").Delete(xray.ClientTraffic{}) + + // Migrate old MultiDomain to External Proxy + var externalProxy []struct { + Id int + Port int + StreamSettings []byte + } + err = tx.Raw(`select id, port, stream_settings + from inbounds + WHERE protocol in ('vmess','vless','trojan') + AND json_extract(stream_settings, '$.security') = 'tls' + AND json_extract(stream_settings, '$.tlsSettings.settings.domains') IS NOT NULL`).Scan(&externalProxy).Error + if err != nil || len(externalProxy) == 0 { + return + } + + for _, ep := range externalProxy { + var reverses interface{} + var stream map[string]interface{} + json.Unmarshal(ep.StreamSettings, &stream) + if tlsSettings, ok := stream["tlsSettings"].(map[string]interface{}); ok { + if settings, ok := tlsSettings["settings"].(map[string]interface{}); ok { + if domains, ok := settings["domains"].([]interface{}); ok { + for _, domain := range domains { + if domainMap, ok := domain.(map[string]interface{}); ok { + domainMap["forceTls"] = "same" + domainMap["port"] = ep.Port + domainMap["dest"] = domainMap["domain"].(string) + delete(domainMap, "domain") + } + } + } + reverses = settings["domains"] + delete(settings, "domains") + } + } + stream["externalProxy"] = reverses + newStream, _ := json.MarshalIndent(stream, " ", " ") + tx.Model(model.Inbound{}).Where("id = ?", ep.Id).Update("stream_settings", newStream) + } } func (s *InboundService) MigrateDB() { diff --git a/web/service/xray.go b/web/service/xray.go index 1d046a44..7233cec5 100644 --- a/web/service/xray.go +++ b/web/service/xray.go @@ -135,19 +135,24 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { inbound.Settings = string(modifiedSettings) } - // Unmarshal stream JSON - var stream map[string]interface{} - json.Unmarshal([]byte(inbound.StreamSettings), &stream) - - // Remove the "settings" field under "tlsSettings" and "realitySettings" - tlsSettings, ok1 := stream["tlsSettings"].(map[string]interface{}) - realitySettings, ok2 := stream["realitySettings"].(map[string]interface{}) - if ok1 || ok2 { - if ok1 { - delete(tlsSettings, "settings") - } else if ok2 { - delete(realitySettings, "settings") + if len(inbound.StreamSettings) > 0 { + // Unmarshal stream JSON + var stream map[string]interface{} + json.Unmarshal([]byte(inbound.StreamSettings), &stream) + + // Remove the "settings" field under "tlsSettings" and "realitySettings" + tlsSettings, ok1 := stream["tlsSettings"].(map[string]interface{}) + realitySettings, ok2 := stream["realitySettings"].(map[string]interface{}) + if ok1 || ok2 { + if ok1 { + delete(tlsSettings, "settings") + } else if ok2 { + delete(realitySettings, "settings") + } } + + delete(stream, "externalProxy") + newStream, err := json.MarshalIndent(stream, "", " ") if err != nil { return nil, err -- cgit v1.2.3 From e5fc20b8ae357c7ddb456a17b39ab406cc6ad585 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 19:44:52 +0100 Subject: small fixes #1300 --- web/service/inbound.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 58a3de9f..73dd17e5 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -1004,7 +1004,8 @@ func (s *InboundService) GetInboundTags() (string, error) { if err != nil && err != gorm.ErrRecordNotFound { return "", err } - return "[\"" + strings.Join(inboundTags, "\", \"") + "\"]", nil + tags, _ := json.Marshal(inboundTags) + return string(tags), nil } func (s *InboundService) MigrationRemoveOrphanedTraffics() { -- cgit v1.2.3 From 35feef650f793ffbec2af51a18fd25d8b0beefb1 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 20:08:44 +0100 Subject: import-export inbound #1300 --- web/service/inbound.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 73dd17e5..01d4eb57 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -168,9 +168,13 @@ func (s *InboundService) AddInbound(inbound *model.Inbound) (*model.Inbound, boo err = tx.Save(inbound).Error if err == nil { - for _, client := range clients { - s.AddClientStat(tx, inbound.Id, &client) + if len(inbound.ClientStats) == 0 { + for _, client := range clients { + s.AddClientStat(tx, inbound.Id, &client) + } } + } else { + return inbound, false, err } needRestart := false -- cgit v1.2.3 From c980a06969c9595f0b0b7d5db301f2413506eb6f Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 20:31:17 +0100 Subject: customizable remark #1300 --- web/service/setting.go | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'web/service') diff --git a/web/service/setting.go b/web/service/setting.go index d6cf193e..8b60d166 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -34,6 +34,7 @@ var defaultValueMap = map[string]string{ "pageSize": "0", "expireDiff": "0", "trafficDiff": "0", + "remarkModel": "-ieo", "timeLocation": "Asia/Tehran", "tgBotEnable": "false", "tgBotToken": "", @@ -311,6 +312,10 @@ func (s *SettingService) GetSessionMaxAge() (int, error) { return s.getInt("sessionMaxAge") } +func (s *SettingService) GetRemarkModel() (string, error) { + return s.getString("remarkModel") +} + func (s *SettingService) GetSecretStatus() (bool, error) { return s.getBool("secretEnable") } @@ -457,6 +462,7 @@ func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) { "tgBotEnable": func() (interface{}, error) { return s.GetTgbotenabled() }, "subEnable": func() (interface{}, error) { return s.GetSubEnable() }, "subURI": func() (interface{}, error) { return s.GetSubURI() }, + "remarkModel": func() (interface{}, error) { return s.GetRemarkModel() }, } result := make(map[string]interface{}) -- cgit v1.2.3 From 6411facf6af1ad1ad264f0e73303d472cc004635 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 20:35:10 +0100 Subject: Update DB WAL before backup #1300 --- web/service/server.go | 5 +++++ web/service/tgbot.go | 7 +++++++ 2 files changed, 12 insertions(+) (limited to 'web/service') diff --git a/web/service/server.go b/web/service/server.go index 629d9253..49e6a2c0 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -435,6 +435,11 @@ func (s *ServerService) GetConfigJson() (interface{}, error) { } func (s *ServerService) GetDb() ([]byte, error) { + // Update by manually trigger a checkpoint operation + err := database.Checkpoint() + if err != nil { + return nil, err + } // Open the file for reading file, err := os.Open(config.GetDBPath()) if err != nil { diff --git a/web/service/tgbot.go b/web/service/tgbot.go index b54ceb1c..0847e418 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -9,6 +9,7 @@ import ( "strings" "time" "x-ui/config" + "x-ui/database" "x-ui/database/model" "x-ui/logger" "x-ui/util/common" @@ -1417,6 +1418,12 @@ func (t *Tgbot) sendBackup(chatId int64) { output := t.I18nBot("tgbot.messages.backupTime", "Time=="+time.Now().Format("2006-01-02 15:04:05")) t.SendMsgToTgbot(chatId, output) + // Update by manually trigger a checkpoint operation + err := database.Checkpoint() + if err != nil { + logger.Warning("Error in trigger a checkpoint operation: ", err) + } + file, err := os.Open(config.GetDBPath()) if err != nil { logger.Warning("Error in opening db file for backup: ", err) -- cgit v1.2.3 From e69c224ad30d068e18fba3b8bb4447a579f1b7bf Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 8 Dec 2023 22:13:32 +0100 Subject: remove xray embeded geo files #1300 --- web/service/server.go | 8 -------- 1 file changed, 8 deletions(-) (limited to 'web/service') diff --git a/web/service/server.go b/web/service/server.go index 49e6a2c0..822918a8 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -380,14 +380,6 @@ func (s *ServerService) UpdateXray(version string) error { if err != nil { return err } - err = copyZipFile("geosite.dat", xray.GetGeositePath()) - if err != nil { - return err - } - err = copyZipFile("geoip.dat", xray.GetGeoipPath()) - if err != nil { - return err - } return nil -- cgit v1.2.3 From 4cb67fd1c3129b83f3750f863caba081453f42b1 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Sun, 10 Dec 2023 12:57:39 +0100 Subject: [xray] show xray errors #1300 --- web/service/xraySettings.go | 28 ---------------------------- web/service/xray_setting.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 28 deletions(-) delete mode 100644 web/service/xraySettings.go create mode 100644 web/service/xray_setting.go (limited to 'web/service') diff --git a/web/service/xraySettings.go b/web/service/xraySettings.go deleted file mode 100644 index 4550bde2..00000000 --- a/web/service/xraySettings.go +++ /dev/null @@ -1,28 +0,0 @@ -package service - -import ( - _ "embed" - "encoding/json" - "x-ui/util/common" - "x-ui/xray" -) - -type XraySettingService struct { - SettingService -} - -func (s *XraySettingService) SaveXraySetting(newXraySettings string) error { - if err := s.CheckXrayConfig(newXraySettings); err != nil { - return err - } - return s.SettingService.saveSetting("xrayTemplateConfig", newXraySettings) -} - -func (s *XraySettingService) CheckXrayConfig(XrayTemplateConfig string) error { - xrayConfig := &xray.Config{} - err := json.Unmarshal([]byte(XrayTemplateConfig), xrayConfig) - if err != nil { - return common.NewError("xray template config invalid:", err) - } - return nil -} diff --git a/web/service/xray_setting.go b/web/service/xray_setting.go new file mode 100644 index 00000000..4550bde2 --- /dev/null +++ b/web/service/xray_setting.go @@ -0,0 +1,28 @@ +package service + +import ( + _ "embed" + "encoding/json" + "x-ui/util/common" + "x-ui/xray" +) + +type XraySettingService struct { + SettingService +} + +func (s *XraySettingService) SaveXraySetting(newXraySettings string) error { + if err := s.CheckXrayConfig(newXraySettings); err != nil { + return err + } + return s.SettingService.saveSetting("xrayTemplateConfig", newXraySettings) +} + +func (s *XraySettingService) CheckXrayConfig(XrayTemplateConfig string) error { + xrayConfig := &xray.Config{} + err := json.Unmarshal([]byte(XrayTemplateConfig), xrayConfig) + if err != nil { + return common.NewError("xray template config invalid:", err) + } + return nil +} -- cgit v1.2.3