From 59330cb3a2dc988d5ccfc7081c0da56d8a18cade Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:47:52 +0300 Subject: [PATCH 1/5] 2 / GetLogsSniffedDomains --- logger/logger.go | 17 +++++++++++++++++ web/controller/server.go | 7 +++++++ web/service/server.go | 9 +++++++++ 3 files changed, 33 insertions(+) diff --git a/logger/logger.go b/logger/logger.go index 35c5c0ac..2d23abaf 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "time" + "strings" "github.com/op/go-logging" ) @@ -126,3 +127,19 @@ func GetLogs(c int, level string) []string { } return output } + +func GetLogsSniffedDomains(c int) []string { + var output []string + logLevel, _ := logging.LogLevel("info") + + for i := len(logBuffer) - 1; i >= 0 && len(output) <= c; i-- { + if logBuffer[i].level <= logLevel && strings.Contains(logBuffer[i].log, "sniffed domain: ") { + index := strings.LastIndex(log, ": ") + if index != -1 { + domain := log[index+2:] + output = append(output, fmt.Sprintf("%s - %s", logBuffer[i].time, domain)) + } + } + } + return output +} diff --git a/web/controller/server.go b/web/controller/server.go index fc7756ba..4e2d752d 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -45,6 +45,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) { g.POST("/restartXrayService", a.restartXrayService) g.POST("/installXray/:version", a.installXray) g.POST("/logs/:count", a.getLogs) + g.GET("/logs-sniffed/:count", a.getLogsSniffedDomains) g.POST("/getConfigJson", a.getConfigJson) g.GET("/getDb", a.getDb) g.POST("/importDB", a.importDB) @@ -125,6 +126,12 @@ func (a *ServerController) getLogs(c *gin.Context) { jsonObj(c, logs, nil) } +func (a *ServerController) getLogsSniffedDomains(c *gin.Context) { + count := c.Param("count") + logs := a.serverService.GetLogsSniffedDomains(count) + jsonObj(c, logs, nil) +} + func (a *ServerController) getConfigJson(c *gin.Context) { configJson, err := a.serverService.GetConfigJson() if err != nil { diff --git a/web/service/server.go b/web/service/server.go index eab5d700..63158252 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -442,6 +442,15 @@ func (s *ServerService) GetLogs(count string, level string, syslog string) []str return lines } +func (s *ServerService) GetLogsSniffedDomains(count string) []string { + c, _ := strconv.Atoi(count) + var lines []string + + lines = logger.GetLogsSniffedDomains(c) + + return lines +} + func (s *ServerService) GetConfigJson() (interface{}, error) { config, err := s.xrayService.GetXrayConfig() if err != nil { From b484bfd4cbcc8e22f3c728f05e8ed098bd565828 Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:00:09 +0300 Subject: [PATCH 2/5] 2 / fix --- logger/logger.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logger/logger.go b/logger/logger.go index 2d23abaf..5ef0a5c9 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -134,9 +134,9 @@ func GetLogsSniffedDomains(c int) []string { for i := len(logBuffer) - 1; i >= 0 && len(output) <= c; i-- { if logBuffer[i].level <= logLevel && strings.Contains(logBuffer[i].log, "sniffed domain: ") { - index := strings.LastIndex(log, ": ") + index := strings.LastIndex(logBuffer[i].log, ": ") if index != -1 { - domain := log[index+2:] + domain := logBuffer[i].log[index+2:] output = append(output, fmt.Sprintf("%s - %s", logBuffer[i].time, domain)) } } From e386ef62323ec3f2a41520798cb4dd348dbbf457 Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:21:56 +0300 Subject: [PATCH 3/5] 2 / logs-blocked --- logger/logger.go | 16 ++++++++++++++++ web/controller/server.go | 7 +++++++ web/service/server.go | 9 +++++++++ 3 files changed, 32 insertions(+) diff --git a/logger/logger.go b/logger/logger.go index 5ef0a5c9..52b1977a 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -143,3 +143,19 @@ func GetLogsSniffedDomains(c int) []string { } return output } + +func GetLogsBlockedDomains(c int) []string { + var output []string + logLevel, _ := logging.LogLevel("info") + + for i := len(logBuffer) - 1; i >= 0 && len(output) <= c; i-- { + if logBuffer[i].level <= logLevel && strings.Contains(logBuffer[i].log, "[blocked] for ") { + index := strings.LastIndex(logBuffer[i].log, "for [") + if index != -1 { + domain := strings.Replace(logBuffer[i].log[index+5:], "]", "", -1) + output = append(output, fmt.Sprintf("%s - %s", logBuffer[i].time, domain)) + } + } + } + return output +} diff --git a/web/controller/server.go b/web/controller/server.go index 4e2d752d..15ccb258 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -46,6 +46,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) { g.POST("/installXray/:version", a.installXray) g.POST("/logs/:count", a.getLogs) g.GET("/logs-sniffed/:count", a.getLogsSniffedDomains) + g.GET("/logs-blocked/:count", a.getLogsBlockedDomains) g.POST("/getConfigJson", a.getConfigJson) g.GET("/getDb", a.getDb) g.POST("/importDB", a.importDB) @@ -132,6 +133,12 @@ func (a *ServerController) getLogsSniffedDomains(c *gin.Context) { jsonObj(c, logs, nil) } +func (a *ServerController) getLogsBlockedDomains(c *gin.Context) { + count := c.Param("count") + logs := a.serverService.GetLogsBlockedDomains(count) + jsonObj(c, logs, nil) +} + func (a *ServerController) getConfigJson(c *gin.Context) { configJson, err := a.serverService.GetConfigJson() if err != nil { diff --git a/web/service/server.go b/web/service/server.go index 63158252..7f078bfd 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -451,6 +451,15 @@ func (s *ServerService) GetLogsSniffedDomains(count string) []string { return lines } +func (s *ServerService) GetLogsBlockedDomains(count string) []string { + c, _ := strconv.Atoi(count) + var lines []string + + lines = logger.GetLogsBlockedDomains(c) + + return lines +} + func (s *ServerService) GetConfigJson() (interface{}, error) { config, err := s.xrayService.GetXrayConfig() if err != nil { From a300e131f36f8940af8096c2a993652172ab53ac Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Wed, 13 Nov 2024 14:06:55 +0300 Subject: [PATCH 4/5] 2 / log domains front --- web/html/xui/index.html | 89 ++++++++++++++++++++++++++++ web/translation/translate.en_US.toml | 1 + web/translation/translate.es_ES.toml | 1 + web/translation/translate.fa_IR.toml | 1 + web/translation/translate.id_ID.toml | 1 + web/translation/translate.pt_BR.toml | 1 + web/translation/translate.ru_RU.toml | 1 + web/translation/translate.tr_TR.toml | 1 + web/translation/translate.uk_UA.toml | 1 + web/translation/translate.vi_VN.toml | 1 + web/translation/translate.zh_CN.toml | 1 + web/translation/translate.zh_TW.toml | 1 + 12 files changed, 100 insertions(+) diff --git a/web/html/xui/index.html b/web/html/xui/index.html index 2e57277a..dee6e8d3 100644 --- a/web/html/xui/index.html +++ b/web/html/xui/index.html @@ -125,6 +125,7 @@ {{ i18n "menu.link" }}: {{ i18n "pages.index.logs" }} + {{ i18n "pages.index.logDomains" }} {{ i18n "pages.index.config" }} {{ i18n "pages.index.backup" }} @@ -314,6 +315,43 @@
+ + + + + + + Few + Medium + Many + + + Sniffed + Blocked + + + + + + + + +
+
@@ -490,6 +528,47 @@ }, }; + const logDomainsModal = { + visible: false, + logs: [], + rows: 500, + type: 'sniffed', + loading: false, + show(logs) { + this.visible = true; + this.logs = logs; + this.formattedLogs = this.logs?.length > 0 ? this.formatLogs(this.logs, this.type) : "No Record..."; + }, + formatLogs(logs, type) { + let formattedLogs = ''; + + logs.forEach((log, index) => { + let [data, message] = log.split(" - ",2); + const parts = data.split(" "); + if(index>0) formattedLogs += '
'; + + if (parts.length === 2) { + const d = parts[0]; + const t = parts[1]; + formattedLogs += `${d} ${t}`; + } else { + formattedLogs += `${data}`; + } + + if (message) { + message = ""+(type === 'sniffed' ? 'Sniffed' : 'Blocked')+": " + message; + } + + formattedLogs += message ? ' - ' + message : ''; + }); + + return formattedLogs; + }, + hide() { + this.visible = false; + }, + }; + const backupModal = { visible: false, title: '', @@ -595,6 +674,16 @@ await PromiseUtil.sleep(500); logModal.loading = false; }, + async openLogDomains(){ + logDomainsModal.loading = true; + const msg = await HttpUtil.get('server/logs-'.+(logDomainsModal.type==='blocked'?'blocked':'sniffed')+.'/'+logDomainsModal.rows); + if (!msg.success) { + return; + } + logDomainsModal.show(msg.obj); + await PromiseUtil.sleep(500); + logDomainsModal.loading = false; + }, async openConfig() { this.loading(true); const msg = await HttpUtil.post('server/getConfigJson'); diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index 1d9d0067..0d8defd1 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Are you sure you want to change the Xray version to" "dontRefresh" = "Installation is in progress, please do not refresh this page" "logs" = "Logs" +"logDomains" = "Log Domains" "config" = "Config" "backup" = "Backup & Restore" "backupTitle" = "Database Backup & Restore" diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml index b9af3272..76719614 100644 --- a/web/translation/translate.es_ES.toml +++ b/web/translation/translate.es_ES.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "¿Estás seguro de que deseas cambiar la versión de Xray a" "dontRefresh" = "La instalación está en progreso, por favor no actualices esta página." "logs" = "Registros" +"logDomains" = "Log Domains" "config" = "Configuración" "backup" = "Copia de Seguridad y Restauración" "backupTitle" = "Copia de Seguridad y Restauración de la Base de Datos" diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml index c7fad84e..538c2fbd 100644 --- a/web/translation/translate.fa_IR.toml +++ b/web/translation/translate.fa_IR.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "آیا از تغییر نسخه‌ مطمئن هستید؟" "dontRefresh" = "در حال نصب، لطفا صفحه را رفرش نکنید" "logs" = "گزارش‌ها" +"logDomains" = "Log Domains" "config" = "پیکربندی" "backup" = "پشتیبان‌گیری" "backupTitle" = "پشتیبان‌گیری دیتابیس" diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml index 85f8f967..cbaa0654 100644 --- a/web/translation/translate.id_ID.toml +++ b/web/translation/translate.id_ID.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Apakah Anda yakin ingin mengubah versi Xray menjadi" "dontRefresh" = "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini" "logs" = "Log" +"logDomains" = "Log Domains" "config" = "Konfigurasi" "backup" = "Cadangan & Pulihkan" "backupTitle" = "Cadangan & Pulihkan Database" diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml index 5effdecb..b7a9d6d5 100644 --- a/web/translation/translate.pt_BR.toml +++ b/web/translation/translate.pt_BR.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Tem certeza de que deseja alterar a versão do Xray para" "dontRefresh" = "Instalação em andamento, por favor não atualize a página" "logs" = "Logs" +"logDomains" = "Log Domains" "config" = "Configuração" "backup" = "Backup e Restauração" "backupTitle" = "Backup e Restauração do Banco de Dados" diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index 91fd2853..acb2e402 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?" "dontRefresh" = "Идёт установка. Пожалуйста, не обновляйте эту страницу" "logs" = "Логи" +"logDomains" = "Логи доменов" "config" = "Конфигурация" "backup" = "Бэкап и восстановление" "backupTitle" = "База данных бэкапа и восстановления" diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml index bee64b0f..a52a7ca1 100644 --- a/web/translation/translate.tr_TR.toml +++ b/web/translation/translate.tr_TR.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Xray sürümünü değiştirmek istediğinizden emin misiniz" "dontRefresh" = "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin" "logs" = "Günlükler" +"logDomains" = "Log Domains" "config" = "Yapılandırma" "backup" = "Yedekle & Geri Yükle" "backupTitle" = "Veritabanı Yedekleme & Geri Yükleme" diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml index 791d2154..1a9db3ce 100644 --- a/web/translation/translate.uk_UA.toml +++ b/web/translation/translate.uk_UA.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Ви впевнені, що бажаєте змінити версію Xray на" "dontRefresh" = "Інсталяція триває, будь ласка, не оновлюйте цю сторінку" "logs" = "Журнали" +"logDomains" = "Логи доменов" "config" = "Конфігурація" "backup" = "Резервне копіювання та відновлення" "backupTitle" = "Резервне копіювання та відновлення бази даних" diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml index cd750891..a39fa877 100644 --- a/web/translation/translate.vi_VN.toml +++ b/web/translation/translate.vi_VN.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "Bạn có chắc chắn muốn chuyển đổi phiên bản Xray sang" "dontRefresh" = "Đang tiến hành cài đặt, vui lòng không làm mới trang này." "logs" = "Nhật ký" +"logDomains" = "Log Domains" "config" = "Cấu hình" "backup" = "Sao lưu & Khôi phục" "backupTitle" = "Sao lưu & Khôi phục Cơ sở dữ liệu" diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml index b5f5cce1..f2ab78b3 100644 --- a/web/translation/translate.zh_CN.toml +++ b/web/translation/translate.zh_CN.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "是否切换 Xray 版本至" "dontRefresh" = "安装中,请勿刷新此页面" "logs" = "日志" +"logDomains" = "Log Domains" "config" = "配置" "backup" = "备份和恢复" "backupTitle" = "备份和恢复数据库" diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml index 466b2b82..79895314 100644 --- a/web/translation/translate.zh_TW.toml +++ b/web/translation/translate.zh_TW.toml @@ -105,6 +105,7 @@ "xraySwitchVersionDialogDesc" = "是否切換 Xray 版本至" "dontRefresh" = "安裝中,請勿重新整理此頁面" "logs" = "日誌" +"logDomains" = "Log Domains" "config" = "配置" "backup" = "備份和恢復" "backupTitle" = "備份和恢復資料庫" From 4a72e9cae84f7594bc85bec4badcf6d9e6306cf6 Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Wed, 13 Nov 2024 14:25:46 +0300 Subject: [PATCH 5/5] 2 / fix --- web/html/xui/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/html/xui/index.html b/web/html/xui/index.html index dee6e8d3..50902b8a 100644 --- a/web/html/xui/index.html +++ b/web/html/xui/index.html @@ -331,7 +331,7 @@ - Few Medium @@ -676,7 +676,7 @@ }, async openLogDomains(){ logDomainsModal.loading = true; - const msg = await HttpUtil.get('server/logs-'.+(logDomainsModal.type==='blocked'?'blocked':'sniffed')+.'/'+logDomainsModal.rows); + const msg = await HttpUtil.get('server/logs-'+(logDomainsModal.type==='blocked'?'blocked':'sniffed')+'/'+logDomainsModal.rows); if (!msg.success) { return; }